Подскажите пожалуста по приминению спец функций int init() и int deinit()

 


В эксперте стоит блок привел ниже. Работет хорошо в тестере все устраивает. Он смотрит если позиция убыточная то добавляет лот до определенного момента, я для своей системы сделал чтобы после третего увеличения сново сбрасывал на начальный уровень. В тесте все хорошо. Но когда на демо тестю после того как терминал закрываешь откываешь снова то я понимаю переменная last_time сбивается и он все начинает сначала... для этого надо навнрное использовать спец функции int init() и int deinit(). Подскажите что в них надо делпть в данном случае. спасибо.  

if (TotalHistory <= 0) lot=lot1;
   else
   {
   for(i=(TotalHistory-10); i<TotalHistory ;i++)
   {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
         { 
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber && i > TotalHistory-10)
             {   
              if(OrderCloseTime()>last_time)
               {
               last_time=OrderCloseTime();
               last_profit=(OrderProfit()/(OrderLots()*10));
               last_lot=OrderLots();
               
                
               }
            }  
         }
   }
              if(last_profit<-10) 
                {
                lot=NormalizeDouble( (k*last_lot),MinLots );
                if (lot>lot2) lot=lot1;
                }
              else 
                {
                if(last_profit>= -10 && last_profit<max_profit)                 lot=last_lot;
                else 
                   {
                   if (last_profit>=max_profit)
                     {
                     for(cnt=0;cnt<total;cnt++) 
                    {
                     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                       {
                       if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
                         {
                         OrderDelete( OrderTicket(), CLR_NONE); 
                         }
                       }
                    }
                     lot=lot1;     
                     last_lot=lot1;
                     }
                   else Print("ошибка -  ",last_profit);
                   }
                }
   }



 
где и как объявлена переменная last_time &
 
та не... кончено, когда программу вырубаешь, то внутренние переменные стираются. Выход  - записывать в "спец функции int deinit()" переменные в файл или глобальные переменные.
 
GarF1eld >>:
где и как объявлена переменная last_time &

Вроде с  last_time все в порятке... Чтоже тогда не так?... Блок стоит в функции  int start() и переменнная  last_time тамже обявляется (datetime last_time=0;) как и все остальные.  

 
Dmitrii610 >>:

Вроде с last_time все в порятке... Чтоже тогда не так?... Блок стоит в функции int start() и переменнная last_time тамже обявляется (datetime last_time=0;) как и все остальные.

Нет, не в поряТке. Попробуйте еще и так:



...


static int last_time = 0;



...


int start() {

// datetime last_time = 0; <-- не забудьте закомментировать эту строчку

...

}

 
Reshetov >>:

Нет, не в поряТке. Попробуйте еще и так:



...


static int last_time = 0;



...


int start() {

// datetime last_time = 0; <-- не забудьте закомментировать эту строчку

...

}


попробовал..  работать коряво стало!

 

Надо предусмотреть в советнике три ситуации.

1. last_time ==0 и ордеров в истории нет // Первый запуск

2. last_time ==0 и ордера в истории есть // Повторный запуск на демо или реале

3. last_time !=0 // Рабочий режим

В твоем случае нужно сделать дополнительную обработку второго случая.

например last_time=OrderCloseTime(); Но ордер выбрать который не входит в анализируемую часть истории.

Причина обращения: