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);
}
}
}