Код: Выделить всё
/**Стратегия торговли по сетке содержит три простых правила:
Правило 1. При первом запуске покупаем стартовый объем (StartQ штук) и запоминаем уровень  «покупки».
Правило 2. При снижении цены ниже минимальной покупки на DeltaPrice покупаем еще Q штук, если не набрали допустимую позицию. Добавляем уровень покупки в список.
Правило 3. При росте цены выше минимальной покупки на PL продаем Q штук, если еще не продали все. Удаляем данный уровень покупки из списка.
Примечание: На вкладке отчета "переменные" можно посмотреть список уровней покупки. 
Уровни прописываются на следующем баре. Для первой покупки сформируются несколько уровеней смещенных на DeltaPrice вверх.
Developed by Alfadirect;
Algorithm = ИНВЕСТИЦИИ;**/
function Initialize()
{
   StrategyName = "Invest_Grid";
   AddInput("Input1", Inputs.Candle, 5, true, "GAZP=МБ ЦК");
   AddParameter("StartQ", 100, "Стартовое Кол-во", 1);
   AddParameter("Q", 10, "Кол-во докупки");
   AddParameter("DeltaPrice", 1, "Изм. цены для докупки");
   AddParameter("PL", 1, "Изм. цены для фиксации прибыли ");
         
   AddGlobalVariable("xPrice", Types.Double, 10000000000.0);
   AddGlobalVariable("xPosition", Types.Double, 0.0);
   AddGlobalVariable("LastPrice", Types.DoubleList);
   AddGlobalVariable("Last", Types.Double, 0);
   AddGlobalVariable("Order", Types.Boolean, false);
}
function OnUpdate()
{
double pos = CurrentPosition();
// Правило 1. если первый запуск, покупаем  StartQ
   if ( xPrice == 10000000000.0 )
   {
       if ( Q < LotSize() || StartQ < LotSize() )
       {
          ShowMessage("StartQ или Q меньше лота. Робот остановлен !");
          Stop();
       }
       // Покупка StartQ        
      EnterLong(StartQ); 
      Order = true; 
       xPrice = Input1.Close[0];
    }
   
// Модуль проверки изменение позиции
   // если позиция выросла, добавляем уровень в список
   if ( pos > xPosition )   
   {      
        double a = xPrice; 
        double b = xPosition; 
               
         while (pos - b > 0)
         {
            LastPrice.Add(a);
                a = a + DeltaPrice; 
                b = b + Q; 
          }            
        Last = xPrice;
        xPosition = pos;             
        Order = false;
        LastPrice.Sort();
   }
   // если позиция снизилась, убираем уровень из списка
   else if ( pos < xPosition && LastPrice.Count >= 1 )
   {
       LastPrice.Sort();
      LastPrice.RemoveAt(0);
      Last = xPrice;
      xPosition = pos;             
      Order = false;
   }    
   double MinPrice = 0;
   if ( LastPrice.Count <= 0 )
       MinPrice = Last;
    else
       MinPrice = LastPrice.Min();
                        
//Правило 2. Если цена упала и кол-во меньше допустимого, 
//           то покупаем и добавляем цену покупки в начало списка
   if ( Input1.Close[0] < MinPrice - DeltaPrice && pos + Q <= LongLimit && Order == false)
   {
      EnterLong(Q);
        xPrice =  Input1.Close[0];
        Order = true;
     }
//Правило 3. Если цена выше цены из начала списка, то продаем и удаляем 0-й элемент списка 
   if ( Input1.Close[0] >= MinPrice + PL && pos > 0 && Order == false )
    {
       CloseLong(Q);
         xPrice =  Input1.Close[0];
         Order = true;
     }
}

 ), перезапустить в точке полной распродажи имевшейся позиции, немедленно. Как-то так.
 ), перезапустить в точке полной распродажи имевшейся позиции, немедленно. Как-то так.