Амиброкер. Учимся программировать циклы. :)

Итак, возьмем простейшую систему и попробуем запрограммировать ее. Если это проделывать без циклов, то все элементарно, для первоклассников. Но возникают проблемы со стопами. Если тестируем портфель акций, то как выяснили ранее, если срабатывает стоп по какой-то из позиций в портфеле, то новая позиция по другим акциям открывается на открытии этой же сессии, если был сигнал на вход перед этой сессией. То есть, налицо подглядывание в будущее. Подробнее было тут
http://jc-trader.livejournal.com/433905.html
Чтобы этого избежать, посоветовали писать циклы. Чем и займемся.

Система гипотетическая с произвольными условиями, на дневных таймфреймах — например:

Вход
1) акция ликвидная, долларовый объем более 10 000 000 долларов
2) цена закрытия больше чем МА(200)
3) цена закрытия меньше чем МА(20)
Если все три условия верны, выставляем лимитный ордер на открытие длинной позиции на следующую сессию по цене LOW последнего дня.

Выход (один по стопу и один по условию)
1) защитный стоп выставляется на следующем баре после бара открытия позиции на расстоянии 1ATR от цены открытия позиции.
2) если цена закрытия больше MA(20), закрываем позицию на открытии следующей сесии.

Пишем циклический код, тестируем, и…… получаем не то что хотим, а что-то непонятное. Что-то не так:

—————————————————————————————
SetFormulaName("zzz");

SetPositionSize( 20, spsPercentOfEquity );
SetOption("MaxOpenPositions", 5 ); 
SetOption("InitialEquity", 100000 );
SetTradeDelays(0,0,0,0);
SetOption( "UsePrevBarEquityForPosSizing", 1 );
RoundLotSize = 1;
ATRr = 1 * Ref(ATR(20), -1);
CLevel = MA(Close, 20);
SetupBuy = MA(  Volume , 20 ) * MA( Close, 20) > 10000000     
                   AND Close > MA(Close, 200)
                   AND Close < CLevel;  
HV40 = round(StDev(log(C/Ref(C,-1)),40)*100*sqrt(252));
PositionScore = HV40;
position = 0;
Sell = BarIndex() == BarCount-1;
/////////////////////////////////////////////////////////
for(i = 201; i < BarCount – 1; i++) 
   if(position!=1) 
      { 
         if(SetupBuy[i-1]  AND Low[i] < Low[i-1])
            { 
               Buy[i] = SetupBuy[i-1];
               BuyPrice[i] = Min(Low[i-1], Open[i]); 
               position = 1; 
               pricebuy = BuyPrice[i]; 
             } 
      } 
   else 
      { 
         Buy[i] = 0; 
         if(Low[i] <= pricebuy – ATRr[i]) 
            {    
               Sell[i] = 1; 
               SellPrice[i] = Min(pricebuy – ATRr[i], Open[i]);   
               position=0; 
            } 
         else 
            {    
               if(Close[i-1] > CLevel[i-1]) 
                  { 
                     Sell[i ]= 1;  
                     position = 0;
                  } 
            } 
      } 
}
  Традиционные способы риск-руководства. Ведает индивидуальный брокер
Пролистать наверх