All pages
Powered by GitBook
1 of 1

Loading...

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ стратСгии ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰ΠΈΡ… срСдних

using System;
using System.Collections.Generic;
using System.Linq;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Helpers;
using TSLab.Script.Optimization;

namespace MyLib
{
    public class CrossMA : IExternalScript
    {
        // ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
        public OptimProperty PeriodFast = new OptimProperty(10, 10, 50, 5);
        public OptimProperty PeriodSlow = new OptimProperty(50, 50, 200, 10);

        // ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, запускаСтся ΠΏΡ€ΠΈ пСрСсчСтС скрипта
        public virtual void Execute(IContext ctx, ISecurity sec)
        {
            // ВычисляСм Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡƒΡŽ SMA
            // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ GetData для ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ускорСния ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
            var smaSlow = ctx.GetData("SMA", new[] { PeriodSlow.ToString() },
                () => Series.SMA(sec.GetClosePrices(ctx), PeriodSlow));
            var smaFast = ctx.GetData("SMA", new[] { PeriodFast.ToString() },
                () => Series.SMA(sec.GetClosePrices(ctx), PeriodFast));

            // Если послСдняя свСча Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π½Π΅ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ, Π΅Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ Ρ‚ΠΎΡ€Π³ΠΎΠ²Π»ΠΈ
            var barsCount = sec.Bars.Count;
            if (!ctx.IsLastBarUsed)
            {
                barsCount--;
            }

            var startBar = Math.Max(PeriodSlow, ctx.TradeFromBar);

            // Ворговля
            for (int i = startBar; i < barsCount; i++)
            {
                // ВычисляСм сигналы
                var sLong = smaFast[i] > smaSlow[i] && smaFast[i - 1] <= smaSlow[i - 1];
                var sShort = smaFast[i] < smaSlow[i] && smaFast[i - 1] >= smaSlow[i - 1];

                // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ
                var posLong = sec.Positions.GetLastActiveForSignal("LE", i);
                var posShort = sec.Positions.GetLastActiveForSignal("SE", i);

                if (posLong == null)
                {
                    // Если Π½Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ Π΅ΡΡ‚ΡŒ сигнал Π½Π° ΠΏΠΎΠΊΡƒΠΏΠΊΡƒ, Ρ‚ΠΎ ΠΏΠΎΠΊΡƒΠΏΠ°Π΅ΠΌ ΠΏΠΎ Ρ€Ρ‹Π½ΠΊΡƒ
                    if (sLong)
                    {
                        sec.Positions.BuyAtMarket(i + 1, 1, "LE");
                    }
                }
                else
                {
                    // Если Π΅ΡΡ‚ΡŒ длинная позиция ΠΈ Π΅ΡΡ‚ΡŒ сигнал Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΆΡƒ, Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΠΌ Π»ΠΎΠ½Π³ ΠΏΠΎ Ρ€Ρ‹Π½ΠΊΡƒ
                    if (sShort)
                    {
                        posLong.CloseAtMarket(i + 1, "LX");
                    }
                }


                if (posShort == null)
                {
                    // Если Π½Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈ Π΅ΡΡ‚ΡŒ сигнал Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΆΡƒ, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΄Π°Π΅ΠΌ ΠΏΠΎ Ρ€Ρ‹Π½ΠΊΡƒ
                    if (sShort)
                    {
                        sec.Positions.SellAtMarket(i + 1, 1, "SE");
                    }
                }
                else
                {
                    // Если Π΅ΡΡ‚ΡŒ короткая позиция ΠΈ Π΅ΡΡ‚ΡŒ сигнал Π½Π° ΠΏΠΎΠΊΡƒΠΏΠΊΡƒ, Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΡˆΠΎΡ€Ρ‚ ΠΏΠΎ Ρ€Ρ‹Π½ΠΊΡƒ
                    if (sLong)
                    {
                        posShort.CloseAtMarket(i + 1, "SX");
                    }
                }
            }

            // Если ΠΈΠ΄Π΅Ρ‚ процСсс ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, это замСдляСт Ρ€Π°Π±ΠΎΡ‚Ρƒ
            if (ctx.IsOptimization)
            {
                return;
            }

            // ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ²
            ctx.First.AddList(string.Format("SMAFast({0})", PeriodFast), smaFast, ListStyles.LINE, ScriptColors.Green,
                LineStyles.SOLID, PaneSides.RIGHT);
            ctx.First.AddList(string.Format("SMASlow({0})", PeriodSlow), smaSlow, ListStyles.LINE, ScriptColors.Red,
                LineStyles.SOLID, PaneSides.RIGHT);
        }
    }
}