Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Хочешь написать торгового робота? Загляни в Справочник MQL5!
Алексей
36
Алексей 2010.04.14 13:58 
День добрый,

На днях натолкнулся на неприятную ситуацию. Прицепил эксперт на график, разрешил торговать - всё работает. Вот только потом руки потянулись сменить таймфрейм на этом графике, просто ради интереса. Как результат - вызов deinit()->init()->start(). Иначе говоря, при смене таймфрема на графике, к которому прицеплен эксперт, происходит "перезагрузка" этого самого эксперта. Кто-нибудь знает, как можно заблокировать такое поведение? По сути, проблема не критическая, но неприятная.
techno
1226
techno 2010.04.14 14:29  
нельзя заблокировать, если только терминал декомпилировать и переписать
Petro Mohyla
1150
Petro Mohyla 2010.04.14 14:33  

... может пропишите, на каком таймфрейме работать в самом эксперте, что-бы по крайней мере не пробовал торговать не на том таймфрейме?

Алексей
36
Алексей 2010.04.14 14:57  
Обидно, что всё так плохо. Спасибо за совет.
o_O
Модератор
23267
o_O 2010.04.14 16:49  
av.onuchin >>:
Обидно, что всё так плохо. Спасибо за совет.


решение проблемы только одно - не выполнять никакие инициализации переменных в инит и не деинициализировать в деинит.
Если у вас обнуляются параметры, то их надо хранить в глобальных переменных и считывать от туда.
Shadow
47
Shadow 2011.03.13 08:54  
Для себя решил проблему как то элементарно.
int run = 0;            //Признак "запущенности"
//+------------------------------------------------------------------+
int OnInit()//Если запуск советника
  {
   if(run==0)
     {
      //Выполняется если еще не выполнялось
       run=1;
     }
   return(0);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)//Если выключение советника
  {
   if(reason==REASON_REMOVE)
     {
      // Выполняется только в случае удаления советника
     }
  }
//+------------------------------------------------------------------+
FION2
1072
FION2 2011.03.13 09:58  
sergeev:


решение проблемы только одно - не выполнять никакие инициализации переменных в инит и не деинициализировать в деинит.
Если у вас обнуляются параметры, то их надо хранить в глобальных переменных и считывать от туда.
Это не просто решение, а необходимое для надежности построение советника на все форсмажорные случаи в том числе и перезапуск терминала. Можно еще использовать хранение всех переменных в обновляемом файле.
o_O
Модератор
23267
o_O 2011.03.13 10:01  


опять некрофилы поперли... (предупреждение)
ветки древности поднимают с завидной регулярностью. (для тех, кто не понял юмора)

---------------------------------------

что касается варианта

int run = 0;            //Признак "запущенности"
//+------------------------------------------------------------------+
int OnInit()//Если запуск советника
  {
   if(run==0)
     {
      //Выполняется если еще не выполнялось
       run=1;
     }
   return(0);
  }

он работать не будет. и вы все также потеряете данные в ините
Andrey F. Zelinsky
29892
Andrey F. Zelinsky 2011.03.13 10:04  
7134956:
Для себя решил проблему как то элементарно.

int run = 0;            //Признак "запущенности"
//+------------------------------------------------------------------+
int OnInit()//Если запуск советника
  {
   if(run==0)
     {
      //Выполняется если еще не выполнялось
       run=1;
     }
   return(0);
  }
при смене таймфрейма run станет =0
keekkenen
1128
keekkenen 2011.03.13 10:11  

у меня никогда такой проблемы не возникало, т.к. в init только то, что действительно необходимо инициализировать

и переинициализация никак не влияет на советника и то, что он успел наработать..

IgorM М
4801
IgorM М 2011.03.13 11:56  
abolk:

при смене таймфрейма run станет =0

думаю не станет, нужно в лог запринтить ;)

12:51:20 Compiling 'test'
12:51:44 test AUDCAD,M5: loaded successfully
12:51:51 test AUDCAD,M5: ТФ = 5, запуск № 1
12:51:51 test AUDCAD,M5: initialized
12:52:01 test AUDCAD,M5: deinitialized
12:52:01 test AUDCAD,M5: uninit reason 3
12:52:01 test AUDCAD,M15: ТФ = 15, запуск № 2
12:52:01 test AUDCAD,M15: initialized
12:52:01 test AUDCAD,M15: deinitialized
12:52:01 test AUDCAD,M15: uninit reason 3
12:52:03 test AUDCAD,M30: ТФ = 30, запуск № 3
12:52:03 test AUDCAD,M30: initialized
12:52:04 test AUDCAD,M30: deinitialized
12:52:04 test AUDCAD,M30: uninit reason 3
12:52:04 test AUDCAD,H1: ТФ = 60, запуск № 4
12:52:04 test AUDCAD,H1: initialized
12:52:05 test AUDCAD,H1: deinitialized
12:52:05 test AUDCAD,H1: uninit reason 3
12:52:05 test AUDCAD,H4: ТФ = 240, запуск № 5
12:52:05 test AUDCAD,H4: initialized
12:52:07 test AUDCAD,H4: deinitialized
12:52:07 test AUDCAD,H4: uninit reason 3
12:52:07 test AUDCAD,Daily: ТФ = 1440, запуск № 6
12:52:07 test AUDCAD,Daily: initialized
12:52:09 test AUDCAD,Daily: deinitialized
12:52:09 test AUDCAD,Daily: uninit reason 3
12:52:09 test AUDCAD,Weekly: ТФ = 10080, запуск № 7
12:52:09 test AUDCAD,Weekly: initialized
12:52:12 test AUDCAD,Weekly: deinitialized
12:52:12 test AUDCAD,Weekly: uninit reason 3
12:52:13 test AUDCAD,Monthly: ТФ = 43200, запуск № 8
12:52:13 test AUDCAD,Monthly: initialized

у меня примерно так:

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                               https://www.mql5.com/ru/users/igorm |
//|                               https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "https://www.mql5.com/ru/users/igorm"
#property link      "https://www.mql5.com/ru/users/igorm"
int run=-1;
int init(){
   if(run<0) run=1; else run++; 
   Print("ТФ = ",Period(),", запуск № ",run);
return(0);
}
//________________________________________________________
int deinit(){
return(0);
}
//________________________________________________________
int start(){
   Comment("ТФ = ",Period(),", запуск № ",run);
return(0);
}
//________________________________________________________
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий