Пример на сжатие/расжатие:
Code:
public void Execute(IContext ctx, ISecurity sec)
        {
            //"сжимаем" до дневок-то есть получаем дневные данные
            ISecurity dailySec = sec.CompressTo(1440);
            //если мало баров-выходим, чтобы не было ошибки
            if (dailySec.Bars.Count < 1) return;
            //номер бара предыдущего дня
            int prevDateBarNum = 0;
            double dailyHigh;
            double dailyLow;
            DateTime curDate;
            for (int i = 0; i < sec.Bars.Count; i++)
            {
                //дата текущего бара
                curDate=sec.Bars[i].Date.Date;
                //получаем номер дневного бара текущего дня
                while (prevDateBarNum<dailySec.Bars.Count&&
                    dailySec.Bars[prevDateBarNum].Date.Date < curDate)
                    prevDateBarNum++;
                //тут возникает проблема: поскольку мы выставляем ордера на закрытии,
                //то на последнем баре дня нужно выставить заявку уже с 
                //учетом хая текущего дневного бара.
                if (((i + 1) < sec.Bars.Count && sec.Bars[i + 1].Date.Date == curDate)
                    || prevDateBarNum == dailySec.Bars.Count)
                {
                    //все нормально-у нас не последний бар текущего дня
                    prevDateBarNum--;
                }
                if (prevDateBarNum < 0)
                {
                    prevDateBarNum = 0;
                    continue;
                }
                //номер дневного бара предыдущего дня
                dailyHigh = dailySec.HighPrices[prevDateBarNum];
                dailyLow = dailySec.LowPrices[prevDateBarNum];
                //условие того, что сегодня открывалось не более одной позиции
                if (sec.Positions.LastPositionActive == null ||
                    sec.Positions.LastPositionActive.EntryBar.Date.Date != curDate ||
                    sec.Positions.LastPositionClosed == null
                    || sec.Positions.LastPositionClosed.EntryBar.Date.Date != curDate)
                {
                    bool sell;
                    bool buy;
                    if(sec.Positions.LastPositionActive==null)
                    {
                        //если мы еще ни разу не делали сделок, то ставим двойную.
                        //предполагаем, что обе заявки в течение одного бара
                        //выполниться не смогут!
                        buy=true;
                        sell=true;
                    }
                    else
                    {
                        buy=sec.Positions.LastPositionActive.IsShort;
                        sell=sec.Positions.LastPositionActive.IsLong;
                    }
                    if (buy)
                        sec.Positions.BuyIfGreater(i + 1, 1, dailyHigh, "Long");
                    if(sell)
                        sec.Positions.SellIfLess(i+1,1,dailyLow,"Short");
                }
                
            }
        }