SimplePanel проблема при переключении таймфрейма

 

В составе стандартного пакета MT4 имеется пример создания панели управления "Simple Panel". Реализован этот пример в окне индикатора, что не всегда удобно.

Я попытался переделать этот пример в код советника. Панель заработала, но при втором переключении таймфрейма происходит сбой и панель автоматически закрывается вместе с окном графика.

Исходный код панели (индикатор)

#property strict

#property indicator_separate_window
#property indicator_buffers             0
#property indicator_minimum             0.0
#property indicator_maximum             0.0
#include "PanelDialog.mqh"
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CPanelDialog ExtDialog;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- create application dialog
   if(!ExtDialog.Create(0,"Simple Panel",0,50,50,390,200))
     return(INIT_FAILED);
//--- run application
   if(!ExtDialog.Run())
     return(INIT_FAILED);
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy application dialog
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
// do nothing
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

измененный код (советник)

#property strict
#include "PanelDialog.mqh"
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CPanelDialog ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
   if(!ExtDialog.Create(0,"Simple Panel",0,50,50,690,200))
     return(INIT_FAILED);
//--- run application
   if(!ExtDialog.Run())
     return(INIT_FAILED);
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy application dialog
   ExtDialog.Destroy(reason);   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);   
  }
//+------------------------------------------------------------------+

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

в чем проблема MT4?

 
Александр:

В составе стандартного пакета MT4 имеется пример создания панели управления "Simple Panel". Реализован этот пример в окне индикатора, что не всегда удобно.

Я попытался переделать этот пример в код советника. Панель заработала, но при втором переключении таймфрейма происходит сбой и панель автоматически закрывается вместе с окном графика.

Исходный код панели (индикатор)

измененный код (советник)

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

в чем проблема MT4?

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

#property strict
#include "PanelDialog.mqh"
//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
CPanelDialog *ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ExtDialog = new CPanelDialog();
//--- create application dialog
   if(!ExtDialog.Create(0,"Simple Panel",0,50,50,690,200))
     return(INIT_FAILED);
//--- run application
   if(!ExtDialog.Run())
     return(INIT_FAILED);
//--- ok
   return(INIT_SUCCEEDED);
  }

В OnDeinit() потом не забудьте delete(ExtDialog);

 

Виталй, спасибо!

 
Там еще ошибки были в библиотеке - разваливалась панель при переключении периодов/символов.
Может исправили уже.
 
Taras Slobodyanik:
Там еще ошибки были в библиотеке - разваливалась панель при переключении периодов/символов.
Может исправили уже.

Нет. До сих пор так. А вот если использовать указатель то все нормально.

 
Taras Slobodyanik:
Там еще ошибки были в библиотеке - разваливалась панель при переключении периодов/символов.
Может исправили уже.

историю в фоне подкачивайте, я пока не стал историю вот так подкачивать https://www.mql5.com/ru/forum/293724#comment_9790804

такая же беда была

МТ4 проблема с подгрузкой котировок при работе с разными тф
МТ4 проблема с подгрузкой котировок при работе с разными тф
  • 2018.12.06
  • www.mql5.com
Программа работает с разными тф в МТ4 и при простое начинает гнать чушь(хотя вроде текущии котировки по этим тф ходят синхронно), пока не пощёлкаю...
 

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

При запуске панели в тестере стратегий перестают работать кнопки и панель нельзя перемещать по экрану.

При этом на "живом" графике все нормально.

Панель созданная на базе индикатора работает в тестере без проблем.

Подскажите в чем может быть дело?

 
Александр:

Подскажите в чем может быть дело?

в тестере МТ4 не генерируется событие ChartEvent

 
Igor Makanu:

в тестере МТ4 не генерируется событие ChartEvent

не генерируется только для советников? Индикатор ведь нормально работает.

Как тогда реализовать нажатия кнопок панели советника в тестере?

 
Александр:

не генерируется только для советников? Индикатор ведь нормально работает.

Как тогда реализовать нажатия кнопок панели советника в тестере?

Панель в тестере в режиме визуализации действительно в советнике не работает. Я как то начал делать тестер стратегий для ручных торговых систем. Сначала делал в виде советника. Задумка была запустить этот советник  в тестере в режиме визуализации и с помощью панели открывать ордера при нажатии соответствующих кнопок. Но потом выяснилось, что в советнике это не работает. Сделал в виде индикатора, а ордера пришлось открывать уже виртуальные и самому изобретать учет статистики торговли и закрытие этих вирт. позиций. Если интересно этот тестер стратегий для ручных ТС можете у меня в профиле найти.  

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 
Можно попробовать сделать панель в индикаторе, и при нажатии кнопок в этой панели помещать соответствующий код нажатия в буфер индикатора. А в советнике через iCustom() вызывать этот индикатор и получать значения буфера. И уже из советника открывать ордера согласно полученным кодом нажатия. Что из этого получится я не знаю, так как не пробовал так делать. Но одно могу сказать, такая панель будет постоянно "мерцать" ( то появиться то пропадет) на графике. Если вызов iCustom() идет каждый тик, то мерцать будет с частотой генерации тика.