Событие нажатия кнопки на панели не работает в тестере стратегий MT5

 

Вот мой код:

//+------------------------------------------------------------------+
//|                                 AppWindowCorrectMinimization.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.000"
#property description "Control Panels and Dialogs. Demonstration class CButton"
#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT                         (11) 
#define INDENT_TOP                          (11) 
#define CONTROLS_GAP_X                      (5)  
//--- for buttons
#define BUTTON_WIDTH                        (100)
#define BUTTON_HEIGHT                       (20)
class CAppWindowCorrectMinimization : public CAppDialog
  {
private:
   CButton           m_button1;          
   CButton           m_button2;          


public:
   string            button_name[2];
                     CAppWindowCorrectMinimization(void);
                    ~CAppWindowCorrectMinimization(void);
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);

   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
   void              print(void);
protected:
   bool              CreateButton1(void);
   bool              CreateButton2(void);

  };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CAppWindowCorrectMinimization)
ON_EVENT(ON_CLICK,m_button1,print)
ON_EVENT(ON_CLICK,m_button2,print)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CAppWindowCorrectMinimization::CAppWindowCorrectMinimization(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CAppWindowCorrectMinimization::~CAppWindowCorrectMinimization(void)
  {
  }
//+------------------------------------------------------------------+
//| Create                                                           |
//+------------------------------------------------------------------+
bool CAppWindowCorrectMinimization::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- create dependent controls
   if(!CreateButton1())
      return(false);
   if(!CreateButton2())
      return(false);
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Global Variable                                                  |
//+------------------------------------------------------------------+
CAppWindowCorrectMinimization ExtDialog;
;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create application dialog
   int x = int(ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS));
   if(!ExtDialog.Create(0,"AppWindowClass with Two Buttons",0,x-280,20,x,324))
      return(INIT_FAILED);
//--- run application

   ExtDialog.Run();
//--- succeed
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Comment("");
//--- destroy dialog
   ExtDialog.Destroy(reason);
  }
  void OnTick()
  {
   if(MQLInfoInteger(MQL_TESTER) && MQLInfoInteger(MQL_VISUAL_MODE))
      OnTimer();
  
  }
  void OnTimer()
  {
  int total_obj = ArraySize(ExtDialog.button_name);
   for(int i=0; i<total_obj; i++)
     {
      if(ObjectGetInteger(ChartID(),ExtDialog.button_name[i],OBJPROP_STATE)==true)
        {
         if(i==0)
         ExtDialog.print();
         if(i==1)
         ExtDialog.print();
         ObjectSetInteger(ChartID(),ExtDialog.button_name[i],OBJPROP_STATE,false);
         break;
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+
//| Create the "Button1" button                                      |
//+------------------------------------------------------------------+
bool CAppWindowCorrectMinimization::CreateButton1(void)
  {
//--- coordinates
   int x1=INDENT_LEFT;        // x1            = 11  pixels
   int y1=INDENT_TOP;         // y1            = 11  pixels
   int x2=x1+BUTTON_WIDTH;    // x2 = 11 + 100 = 111 pixels
   int y2=y1+BUTTON_HEIGHT;   // y2 = 11 + 20  = 32  pixels
//--- create
   if(!m_button1.Create(0,"Button1",0,x1,y1,x2,y2))
      return(false);
   if(!m_button1.Text("Button1"))
      return(false);
   if(!Add(m_button1))
      return(false);
   button_name[0]="Button1";
//--- succeed
   return(true);
  }
//+------------------------------------------------------------------+
//| Create the "Button2"                                             |
//+------------------------------------------------------------------+
bool CAppWindowCorrectMinimization::CreateButton2(void)
  {
//--- coordinates
   int x1=INDENT_LEFT+2*(BUTTON_WIDTH+CONTROLS_GAP_X);   // x1 = 11  + 2 * (100 + 5) = 221 pixels
   int y1=INDENT_TOP;                                    // y1                       = 11  pixels
   int x2=x1+BUTTON_WIDTH;                               // x2 = 221 + 100           = 321 pixels
   int y2=y1+BUTTON_HEIGHT;                              // y2 = 11  + 20            = 31  pixels
//--- create
   if(!m_button2.Create(0,"Button2",0,x1,y1,x2,y2))
      return(false);
   if(!m_button2.Text("Button2"))
      return(false);
   if(!Add(m_button2))
      return(false);
   button_name[1] = "Button2";
//--- succeed
   return(true);
  }

void CAppWindowCorrectMinimization::print(void)
{
Print("Button_Clicked");
}

Событие нажатия кнопки не работает в тестере стратегий MT5. Тот же код работает в MT4 Strategy Tester.

Пожалуйста, посоветуйте мне, что я могу сделать, чтобы улучшить его. Я не хочу никакой библиотеки, но причина, почему она не работает в MT5.

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

 
jaffer wilson:

Вот мой код:

Событие нажатия кнопки не работает в тестере стратегий MT5. Тот же код работает в MT4 Strategy Tester.

Пожалуйста, посоветуйте мне, что я могу сделать, чтобы улучшить его. Я не хочу никакой библиотеки, но причина, почему она не работает в MT5.

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

Спорно, конечно, но мне представляется, что в тестере стратегий интерактивности быть не должно. Поэтому, голосую за вариант MT5.

ЗЫ: Реально тестер стратегий используется для отладки кода и тестирования автоматических советников. Полуавтоматы никто в расчет не берет, хотя, они работают. 

Пользуются единицы. Просто, почти никто не умеет делать полуавтомат и не понимает, зачем. 

 
Алексей Тарабанов :

Спорно, конечно, но мне представляется, что в тестере стратегий интерактивности быть не должно. Поэтому, голосую за вариант MT5.

ЗЫ: Реально тестер стратегий используется для отладки кода и тестирования автоматических советников. Полуавтоматы никто в расчет не берет, хотя, они работают. 

Пользуются единицы. Просто, почти никто не умеет делать полуавтомат и не понимает, зачем. 

Что, если я хочу проверить ручную кнопку для покупки / продажи сделки? Если я хочу проверить, как работает ручной советник, то это плохая идея? Пожалуйста, уточните это.

 
Кто-нибудь, пожалуйста, помогите мне в этой теме?
 
jaffer wilson:
Кто-нибудь, пожалуйста, помогите мне в этой теме?

Не будет это в тестере работать. Графические объекты в тестере - кнопки в частности, нужно проверять самостоятельно - их состояние.

 
Artyom Trishkin :

Не будет это в тестере работать. Графические объекты в тестере - кнопки в частности, нужно проверять самостоятельно - их состояние.

Пожалуйста, Артём, можешь отредактировать мой код, чтобы показать, как я могу это сделать? Я знаю, что вы делитесь замечательной библиотекой DoEasy. Но я попытался использовать его в своем исходном коде, мой торговый результат был грязным. Пример, который я упомянул здесь, является его частью. Поэтому, пожалуйста, вы можете показать мне, что я могу сделать, чтобы поймать событие в тестере стратегий.

Я пытался изучить вашу библиотеку, но, возможно, я не настолько умен, чтобы правильно ее понять.

Пожалуйста, помогите мне в этой теме.

 
Кто-нибудь может подсказать мне пример, которым я поделился здесь?
 
jaffer wilson:
Кто-нибудь может подсказать мне пример, которым я поделился здесь?

Держи. Мне удобнее было кнопки в отдельный класс вынести.

Не ожидал, что в МТ5-тестере ZOrder определяет будет или нет нажиматься кнопка.

Помимо этого метод ZOrder() объекта "Кнопка"  не срабатывал, а напрямую через ObjectSetInteger() получилось. Наверное, баг.

Делал наспех, поэтому косметические поправки и проверки, уже самостоятельно.
Файлы:
TestPush.mq5  17 kb
cMyButton.mqh  7 kb
 
Vasiliy Pushkaryov:

Держи. Мне удобнее было кнопки в отдельный класс вынести.

Не ожидал, что в МТ5-тестере ZOrder определяет будет или нет нажиматься кнопка.

Помимо этого метод ZOrder() объекта "Кнопка"  не срабатывал, а напрямую через ObjectSetInteger() получилось. Наверное, баг.

Делал наспех, поэтому косметические поправки и проверки, уже самостоятельно.

Я делал проверку состояния кнопки в OnTick(), нажата она на данном тике или нет. В классе cMyButton за это отвечает метод isButtonPushed().

Так как кнопок может быть много, то я объединил вызовы проверки состояния в один метод checkPushingButttons(), который вызывается в OnTick в режиме визуализации тестирования.

Я примерно таким образом в МТ4 обработку в тестере делал.

Может в МТ5 можно как-то и более продвинуто через OnTimer или OnChartEvent делать, я еще в этом не разбирался.

 
Vasiliy Pushkaryov :

Я делал проверку состояния кнопки в OnTick(), нажата она на данном тике или нет. В классе cMyButton за это отвечает метод isButtonPushed().

Так как кнопок может быть много, то я объединил вызовы проверки состояния в один метод checkPushingButttons(), который вызывается в OnTick в режиме визуализации тестирования.

Я примерно таким образом в МТ4 обработку в тестере делал.

Может в МТ5 можно как-то и более продвинуто через OnTimer или OnChartEvent делать, я еще в этом не разбирался.

Спасибо, я попробую.

 
Vasiliy Pushkaryov #:

Держи. Мне удобнее было кнопки в отдельный класс вынести.

Не ожидал, что в МТ5-тестере ZOrder определяет будет или нет нажиматься кнопка.

Здравствуйте.

У меня вот кнопка в тестере MT5 в принципе не нажимается. То есть вообще никак не реагирует на клики. Не понимаю почему.

Ставил OBJPROP_ZORDER значение 99, но не помогает.

Причина обращения: