Ошибки, баги, вопросы - страница 1868

 

билд 1589

Как сделать,чтобы OnTimer в индикаторе переставал работать при смене счета/брокера при условии,что у того нет вообще такого тикера,или он не добавлен в обзор рынка, без использования IndicatorDelete ?

Ошибка в документации - функции IndicatorDelete нет, есть ChartIndicatorDelete!

https://www.mql5.com/ru/docs/standardlibrary/cchart/cchartindicatordelete

bool  IndicatorDelete(
   int            sub_win      // номер подокна
   const string   name         // короткое имя индикатора
   );

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

при этом он не пишет причину деинициализации 

REASON_ACCOUNT

6

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета


2017.04.21 12:10:31.810 TF through OnTimer (DDM7,M1)    Работаем
2017.04.21 12:10:31.810 TF through OnTimer (DDM7,M1)    Аккаунт = AMPGlobalClearing-Demo-CQG
тут сменили брокера,причины деинициализации нет
2017.04.21 12:10:36.809 TF through OnTimer (DDM7,M1)    Работаем
2017.04.21 12:10:36.809 TF through OnTimer (DDM7,M1)    Аккаунт = FXOpen-MT5
//+------------------------------------------------------------------+
//|                                           TF through OnTimer.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
string server;
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
   Print("Причина деинициализации = ",reason);
   
  }
//+------------------------------------------------------------------+
int OnInit()
  {
  server=AccountInfoString(ACCOUNT_SERVER);
   EventSetMillisecondTimer(5000);
   IndicatorSetString(INDICATOR_SHORTNAME,"name");
   
//--- indicator buffers mapping
//---
   return(INIT_SUCCEEDED);
  }  
  
  ////////////
  void OnTimer ()
  {
  Print("Работаем");
  Print("Аккаунт = ",AccountInfoString(ACCOUNT_SERVER));
//  if ( server!=AccountInfoString(ACCOUNT_SERVER) ) ChartIndicatorDelete(0,0,"name");
  }
Документация по MQL5: Стандартная библиотека / Ценовые графики / IndicatorDelete
Документация по MQL5: Стандартная библиотека / Ценовые графики / IndicatorDelete
  • www.mql5.com
Стандартная библиотека / Ценовые графики / IndicatorDelete - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
kaus_bonus:

билд 1589

OnDeinit не вызывается.
 
в смысле
fxsaber:
OnDeinit не вызывается.

в смысле? совсем не вызывается, или в данном коде?

 
kaus_bonus:

билд 1589

Как сделать,чтобы OnTimer в индикаторе переставал работать при смене счета/брокера при условии,что у того нет вообще такого тикера,или он не добавлен в обзор рынка, без использования IndicatorDelete ?

Ошибка в документации - функции IndicatorDelete нет, есть ChartIndicatorDelete!

https://www.mql5.com/ru/docs/standardlibrary/cchart/cchartindicatordelete

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

при этом он не пишет причину деинициализации 

REASON_ACCOUNT

6

Активирован другой счет либо произошло переподключение к торговому серверу вследствие изменения настроек счета



Загрузка и выгрузка индикаторов

Индикаторы загружаются в следующих случаях:

  • прикрепление индикатора к графику;
  • запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
  • загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
  • смена профиля (если индикатор прикреплен к одному из графиков профиля);
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
  • изменение входных параметров индикатора.

Индикаторы выгружаются в следующих случаях:

  • при откреплении индикатора от графика;
  • закрытие терминала (если индикатор был прикреплен к графику);
  • загрузка шаблона, если к графику прикреплен индикатор;
  • закрытие графика, к которому был прикреплен индикатор;
  • смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • изменение входных параметров индикатора.


Причины "смена счёта нет", значит индикатор при смене счёта не выгружается и следовательно OnDeinit() для индикатора при смене торгового счета тоже не будет.

 
kaus_bonus:

в смысле? совсем не вызывается, или в данном коде?

В Вашей ситуации.
 
Vladimir Karputov:

Загрузка и выгрузка индикаторов


Индикаторы выгружаются в следующих случаях:

  • при откреплении индикатора от графика;
  • закрытие терминала (если индикатор был прикреплен к графику);
  • загрузка шаблона, если к графику прикреплен индикатор;
  • закрытие графика, к которому был прикреплен индикатор;
  • смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • изменение входных параметров индикатора.


Причины "смена счёта нет", значит индикатор при смене счёта не выгружается и следовательно OnDeinit() для индикатора при смене торгового счета тоже не будет.

В самом деле указанная мной причина работает только для экспертов

Коды причины деинициализации эксперта ....

Тогда остается вопрос - как заставить перестать работать таймер без радикального удаления индикатора с чарта?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
kaus_bonus:

В самом деле указанная мной причина работает только для экспертов

Тогда остается вопрос - как заставить перестать работать таймер без радикального удаления индикатора с чарта?


В OnInit() запомнить счёт. В таймере проверять номер счёта. Если счёт изменился - выходить из таймера.
 
kaus_bonus:

Тогда остается вопрос - как заставить перестать работать таймер без радикального удаления индикатора с чарта?

Использовать ACCOUNT_LOGIN и ACCOUNT_SERVER.
 

согласитесь,кривенькое решение?!

предположим, мы делаем ACCOUNT_LOGIN!=ACCOUNT_LOGIN_NEW, убиваем таймер,а затем возвращаемся обратно к этому счета,что произойдет? таймер ведь не запустится снова?

проще добавить причину "смена счета"  к индикаторам так же,или я в чем-то не прав ,и это приведет к каким-то сложностям?

 
kaus_bonus:

согласитесь,кривенькое решение?!

Это ход конем!

предположим, мы делаем ACCOUNT_LOGIN!=ACCOUNT_LOGIN_NEW, убиваем таймер,а затем возвращаемся обратно к этому счета,что произойдет? таймер ведь не запустится снова?

При обнаружении смены счета запоминаете уже новые характеристики.

Можете оформить в виде маленькой библиотеки по принципу, что здесь (макросы). Тогда "кривенькое" не будет мозолить глаза.