Как определить замену графика?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
foxmag
698
foxmag  
В OnTick() организован бесконечный цикл. Есть ли возможность программно установить факт смены графика, осуществляемой вручную (например, перетаскиванием мышью)? Установлено, что изменений значений переменных _Symbol и _UninitReason при смене графика не происходит, поэтому их использовать как условие замены графика невозможно. Спасибо.
foxmag
698
foxmag  
И еще. Можно с помощью функции GetWindowTextW(...) прочитать заголовок окна с именем валютной пары. Это получается. Но проблема в том, что при работе этой функции в бесконечном цикле не закрывается МТ5 при попытке его закрыть (например, щелчком по на крестику окна МТ5). Почему?
fxsaber
16702
fxsaber  
Вместо бесконечного цикла используйте OnTimer. Тогда по Reason в OnDeinit сможете определить, что Вам надо.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.11.30 09:48

Памятка

Действие/тип программыСмена ТФ или символаСмена счета
ИндикаторЗапуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).Ничего не происходит, кроме обнуления prev_calculated.
СоветникЗапуск OnDeinit и OnInit, объект глобального класса не меняется.Запуск OnDeinit и OnInit, объект глобального класса меняется (полная перезагрузка).
Dimitr Trifonov
9276
Dimitr Trifonov  
foxmag:
В OnTick() организован бесконечный цикл. Есть ли возможность программно установить факт смены графика, осуществляемой вручную (например, перетаскиванием мышью)? Установлено, что изменений значений переменных _Symbol и _UninitReason при смене графика не происходит, поэтому их использовать как условие замены графика невозможно. Спасибо.
https://www.mql5.com/ru/docs/constants/namedconstants/uninit
При смене периода графика будет възов onDeinit() индикатора. Параметр метода покажет, что бъло причиной, а именно смена периода.. 
foxmag
698
foxmag  
fxsaber:
Вместо бесконечного цикла используйте OnTimer. Тогда по Reason в OnDeinit сможете определить, что Вам надо.

Спасибо за ответ. И все же, теоретически, если оставаться с бесконечным циклом, есть решение? И почему GetWindowTextW(...) "портит" МТ5?

Alexey Viktorov
25687
Alexey Viktorov  
foxmag:

Спасибо за ответ. И все же, теоретически, если оставаться с бесконечным циклом, есть решение? И почему GetWindowTextW(...) "портит" МТ5?

Можно проверить

if(ChartSymbol(0) != _Symbol)
 break;
fxsaber
16702
fxsaber  
foxmag:

Спасибо за ответ. И все же, теоретически, если оставаться с бесконечным циклом, есть решение? И почему GetWindowTextW(...) "портит" МТ5?

void OnTick()
{  
  const long Chart = ChartID();
  string PrevSymbol = _Symbol;
  ENUM_TIMEFRAMES PrevTF = _Period;
    
  while (!IsStopped())
  {
    if ((PrevSymbol != ChartSymbol(Chart)) || (PrevTF != ChartPeriod(Chart))) // ноль указывать НЕЛЬЗЯ!
    {      
      PrevSymbol = ChartSymbol(Chart);
      PrevTF = ChartPeriod(Chart);
      
      Alert(PrevSymbol + " " + EnumToString(PrevTF));      
    }
    
    Sleep(0);
  }
}
Alexey Viktorov
25687
Alexey Viktorov  
foxmag:
И еще. Можно с помощью функции GetWindowTextW(...) прочитать заголовок окна с именем валютной пары. Это получается. Но проблема в том, что при работе этой функции в бесконечном цикле не закрывается МТ5 при попытке его закрыть (например, щелчком по на крестику окна МТ5). Почему?

Надо в условие бесконечного цикла ставить

bool  IsStopped();
foxmag
698
foxmag  
Alexey Viktorov:

Можно проверить

Проверил - не работает. Спасибо.

foxmag
698
foxmag  
Alexey Viktorov:

Надо в условие бесконечного цикла ставить

Имеется. Спасибо за участие.

foxmag
698
foxmag  
fxsaber:

Это решило проблему. Большое спасибо. Казалось бы всего-то ChartSymbol(ChartID()). Но это знание дорогого стоит, экономит уйму времени при самостоятельном поиске. Дай бог Вам здоровья!

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий