Некорректная работа торговой панели в МТ4

 

Добрый день!

Озаботился созданием панели управления для своего советника. С недавних пор в стандартной поставке МТ4 имеются классы для создания графических элементов управления. Логично предположить, что они могут быть использованы для создания торговой панели. Я попробовал создать её, но потерпел фиаско.

Прежде всего я предпринял попытку найти описание работы с этими классами и примеры их использования в документации МТ4, но не нашёл. Тогда я подумал, что, возможно, стоит поискать в документации МТ5. Там действительно описаны эти классы. Более того, в стандартной поставке есть пример советника с работающей панелью (Controls.mq5). Также есть очень хорошая статья на эту тему. Забегая вперёд, скажу, что я позаимствовал некоторые фрагменты кода оттуда (в частности, изменение позиционирования свёрнутого окна) и они успешно работают в МТ4.

Я подумал, что, возможно, разработчики МТ4, включив в стандартную поставку все необходимые для создания панелей классы, просто забыли приложить пример советника. Тогда я просто взял его из МТ5, скопировал в МТ4, изменил расширение на .mq4, скомпилировал и запустил. И всё заработало! Но радовался я недолго.

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

Вот как это выглядит:


Я нашел в CodeBase эксперт, в котором автор демонстрирует создание панели для МТ4. Но эта панель тоже рассыпается при переинициализации (хотя и находится в CodeBase). В обсуждении этого эксперта в начале 2016 года люди задавали автору вопрос, почему панель рассыпается при переинициализации графика. Он обещал разобраться за неделю, но, к сожалению, после этого пропал из обсуждения навсегда (прошло 3.5 года). 

Пожалуйста, подскажите, как решить эту проблему? Возможно, где-то есть готовый пример создания торговой панели в МТ4 при помощи классов из стандартной поставки терминала?

 
историю по всем ТФ нужно подкачивать, чтобы панелька не разъезжалась 
 

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

Любопытства ради - а как недостаток истории может быть связан с неверным позиционированием элементов управления

 
Alexey Gudima:

Любопытства ради - а как недостаток истории может быть связан с неверным позиционированием элементов управления? 

да, влияет,

в таймере сделайте так и все будет работать:

//+------------------------------------------------------------------+
int OnInit()
  {
   OnTimer();
   EventSetTimer(49);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   const ENUM_TIMEFRAMES PeriodTF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   datetime t[];
   int i,startpos=0;
   for(i=0;i<9;i++) CopyTime(_Symbol,PeriodTF[i],startpos,iBars(_Symbol,PeriodTF[i]),t);
  }
//+------------------------------------------------------------------+
 

Используйте указатели. Поищите на форуме тут уже было несколько тем по этой проблеме. 

Вот одна из них https://www.mql5.com/ru/forum/313896#comment_11757136

Торговая панель глючит при смене таймфрейма.
Торговая панель глючит при смене таймфрейма.
  • 2019.05.20
  • www.mql5.com
Панель нормально перетаскивается по графику мышкой, все работает, но на второй смене таймфрейма кнопки уезжают от фона, если менять дальше - окно г...
 
Vitalii Ananev:
Используйте указатели. Поищите на форуме тут уже была тема по этой проблеме.

да, я тоже панельку через указатель создаю, но если история не будет подгружена с другого ТФ, указатель не поможет - я проверял, из 5 ти раз 1-2 раза будут кнопки разьзжаться, чтобы проверить это или удалите историю с других ТФ или откройте какой-нибудь символ которым не пользуетесь - на текущем ТФ будет норм, при переключении ТФ пока не подгрузится история, будет картинка как у ТС


тут в общем в чем отличие работы в МТ4 от МТ5 - в МТ5 всегда при работе панельки будет подгружена история, при переключении ТФ терминал просто из уже загруженных минуток формирует только новые бары ТФ

а в МТ4 - каждый ТФ скачивается с сервера и вот этот момент закачки и синхронизации с сервером и происходит сдвиг графических элементов

 
К сожалению, ничего не изменилось. Код советника прилагаю. Для таймера пробовал разные значения в диапазоне от 1 до 60.
Файлы:
Controls2.mq4  3 kb
 
Igor Makanu:

а в МТ4 - каждый ТФ скачивается с сервера и вот этот момент закачки и синхронизации с сервером и происходит сдвиг графических элементов

Игорь, скажите, пожалуйста, а почему этот сдвиг происходит без изменения таймфрейма? Например, при открытии окна настроек советника и нажатии там кнопки ОК.

 
Alexey Gudima:
К сожалению, ничего не изменилось. Код советника прилагаю. Для таймера пробовал разные значения в диапазоне от 1 до 60.

не все фалы приатачили и у меня так написано в моем примере

int OnInit()
  {
   OnTimer();

вот так попробуйте:

CControlsDialog *ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
     OnTimer();
     ExtDialog = new CControlsDialog;
   if (!EventSetTimer(50)) return (INIT_FAILED);
//--- create application dialog
   if(!ExtDialog.Create(0,"Controls",0,20,20,360,324))
     return(INIT_FAILED);
//--- run application
   ExtDialog.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy dialog
   EventKillTimer();
   ExtDialog.Destroy(reason);
   delete ExtDialog;
  }

Alexey Gudima:

Игорь, скажите, пожалуйста, а почему этот сдвиг происходит без изменения таймфрейма? Например, при открытии окна настроек советника и нажатии там кнопки ОК.

у меня не было такой ситуации, было как у Вас на скриншоте, сделал: подкачку истории и создание обьекта через указатель - все работает в МТ4

я правда панельку создаю через #include <Controls\Dialog.mqh> и добавляю элементы управления на нее

 
Vitalii Ananev:

Используйте указатели. 

Igor Makanu:

вот так попробуйте:

Вот теперь всё работает! @Igor Makanu и @Vitalii Ananev, огромное вам спасибо!


Приложу оба файла, вдруг ещё кому-то пригодится.

Файлы:
 
Кстати, код, предложенный @Igor Makanu помог решить ещё одну проблему, о которой я только собирался спросить - при удалении советника с графика (путём закрытия окна панели) он удалялся вместе с графиком. Теперь всё в порядке - советник удаляется, а график остается!
Причина обращения: