public void Execute(IContext ctx, ISecurity sec)
{
int SMAPeriod = this.SMAPeriodParam;
int atrDailyPeriod = this.atrDailyPeriodParam;
int atrStopPercent = this.atrStopPercentParam;
int winLoss = this.winLossParam;
IList<double> SMA = ctx.GetData("SMA", new[] { SMAPeriod.ToString() }, delegate { return Series.SMA(sec.ClosePrices, SMAPeriod); });
var dailySec = sec.CompressTo(1440); //Делаю компрессию до дня
IList<double> atrDaily = ctx.GetData("atrDaily", new[] { atrDailyPeriod.ToString() }, delegate { return Series.AverageTrueRange(dailySec.Bars, atrDailyPeriod); }); //вычисляю дневной ATR
IList<double> hourlyATR = dailySec.Decompress(atrDaily, DecompressMethodWithDef.Default);//Синхронизирую дневной ATR с часовым интервалом
for (int bar = 60; bar < sec.Bars.Count - 1; bar++)
{
IPosition lastActivePosition = sec.Positions.LastPositionActive;
if (lastActivePosition != null)
{
if (sec.Positions.LastPositionActive.IsLong)
{
double takeProfit = lastActivePosition.EntryPrice + atrStopPercent * winLoss * hourlyATR[lastActivePosition.EntryBarNum] / 100;
double stopLoss = lastActivePosition.EntryPrice - atrStopPercent * hourlyATR[lastActivePosition.EntryBarNum] / 100;
if (lastActivePosition.IsActive)
{
lastActivePosition.CloseAtProfit(bar + 1, takeProfit, "Long"); //Выставляю Take Profit
}
if (lastActivePosition.IsActive)
{
lastActivePosition.CloseAtStop(bar + 1, stopLoss, "Long"); //Выставляю Stop Loss
}
}
else
{
double takeProfit = lastActivePosition.EntryPrice - atrStopPercent * winLoss * hourlyATR[lastActivePosition.EntryBarNum] / 100;
double stopLoss = lastActivePosition.EntryPrice + atrStopPercent * hourlyATR[lastActivePosition.EntryBarNum] / 100;
if (lastActivePosition.IsActive)
{
lastActivePosition.CloseAtProfit(bar + 1, takeProfit, "Short");
}
if (lastActivePosition.IsActive)
{
lastActivePosition.CloseAtStop(bar + 1, stopLoss, "Short");
}
}
}
else
{
if (CrossOver(bar, sec.ClosePrices, SMA)) //Вхожу в длинную позицию
{
sec.Positions.BuyAtMarket(bar + 1, 1, "Long");
}
else if (CrossUnder(bar, sec.ClosePrices, SMA))
{
sec.Positions.SellAtMarket(bar + 1, 1, "Short");
}
}
}
}