Спасибо за подсказку в пофиксил багу. Вот код
Code:
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");
                    }
                }
            }
        }


Мне правда не нравится большое количество проверок, но пока не придумал как можно отрефакторить. У меня по этому коду ещё пара вопросов есть.
1.Правильно ли я понимаю, что при закрытие позиции через CloseAtProfit и CloseAtStop когда цена коснется цены указанной в заявке, то будет сгенерирован рыночный приказ. То есть, к примеру, я купил сбербанк за 100 рублей тэйк профит поставил на 110, а стоп лосс установил на 90. Когда на рынке совершится первая сделка с ценой к примеру 110.1р. то моя заявка будет исполнена по рынку?
2.Будут ли у меня проблемы при реальной торговле при теперешних модификациях кода. Я имею в виду то что я рассчитываю тейк и стоп каждый раз а не запоминаю значение.
Code:
                        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
                        }