Объект не работает в тестере стратегий MQL5

 

У меня есть следующий пример кода.

Я пытаюсь запустить его в тестере стратегий. Это не работает. В реальном режиме это работает.

Вот код:

#include <Trade\Trade.mqh>
CTrade         trade;


//+------------------------------------------------------------------+
int OnInit()
  {
//---
   trade.SetExpertMagicNumber(111);    // sets magic number
   ButtonCreate(ChartID(),"Buy",0,0,30,50,18,0,"BUY");
   ButtonCreate(ChartID(),"Sell",0,70,30,50,18,0,"SELL");

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(
   const int       id,       // event ID
   const long&     lparam,   // long type event parameter
   const double&   dparam,   // double type event parameter
   const string&   sparam    // string type event parameter
)
  {
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string symb=Symbol();
      if(sparam=="Buy")
        {
         ObjectSetInteger(ChartID(),sparam,OBJPROP_STATE,0);
         double Ask=SymbolInfoDouble(symb,SYMBOL_ASK);
         double Bid=SymbolInfoDouble(symb,SYMBOL_BID);
         trade.PositionOpen(symb,0,NormalizeDouble(0.1,2),Ask,0,0);

        }
      if(sparam=="Sell")
        {
         ObjectSetInteger(ChartID(),sparam,OBJPROP_STATE,0);
         double Ask=SymbolInfoDouble(symb,SYMBOL_ASK);
         double Bid=SymbolInfoDouble(symb,SYMBOL_BID);
         Print("***Selling***");
         trade.PositionOpen(symb,1,NormalizeDouble(0.1,2),Bid,0,0);
        }
     }
   ChartRedraw();
  }

void OnTick()
  {
//---

  }
bool ButtonCreate(const long              chart_ID=0,               // chart's ID
                  const string            name="Button",            // button name
                  const int               sub_window=0,             // subwindow index
                  const int               x=0,                      // X coordinate
                  const int               y=0,                      // Y coordinate
                  const int               width=50,                 // button width
                  const int               height=18,                // button height
                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // chart corner for anchoring
                  const string            text="Button",            // text
                  const string            font="Arial",             // font
                  const int               font_size=10,             // font size
                  const color             clr=clrBlack,             // text color
                  const color             back_clr=C'236,233,216',  // background color
                  const color             border_clr=clrNONE,       // border color
                  const bool              state=false,              // pressed/released
                  const bool              back=false,               // in the background
                  const bool              selection=false,          // highlight to move
                  const bool              hidden=true,              // hidden in the object list
                  const long              z_order=0)                // priority for mouse click
  {
//--- reset the error value
   ResetLastError();
//--- create the button
   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": failed to create the button! Error code = ",GetLastError());
      return(false);
     }
//--- set button coordinates
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- set button size
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- set the chart's corner, relative to which point coordinates are defined
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- set the text
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- set text font
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- set font size
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- set text color
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- set background color
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- set border color
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- display in the foreground (false) or background (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- set button state
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- enable (true) or disable (false) the mode of moving the button by mouse
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- hide (true) or display (false) graphical object name in the object list
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- set the priority for receiving the event of a mouse click in the chart
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Move the button                                                  |
//+------------------------------------------------------------------+
bool ButtonMove(const long   chart_ID=0,    // chart's ID
                const string name="Button", // button name
                const int    x=0,           // X coordinate
                const int    y=0)           // Y coordinate
  {
//--- reset the error value
   ResetLastError();
//--- move the button
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
     {
      Print(__FUNCTION__,
            ": failed to move X coordinate of the button! Error code = ",GetLastError());
      return(false);
     }
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
     {
      Print(__FUNCTION__,
            ": failed to move Y coordinate of the button! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Change button size                                               |
//+------------------------------------------------------------------+
bool ButtonChangeSize(const long   chart_ID=0,    // chart's ID
                      const string name="Button", // button name
                      const int    width=50,      // button width
                      const int    height=18)     // button height
  {
//--- reset the error value
   ResetLastError();
//--- change the button size
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
     {
      Print(__FUNCTION__,
            ": failed to change the button width! Error code = ",GetLastError());
      return(false);
     }
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
     {
      Print(__FUNCTION__,
            ": failed to change the button height! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Change corner of the chart for binding the button                |
//+------------------------------------------------------------------+
bool ButtonChangeCorner(const long             chart_ID=0,               // chart's ID
                        const string           name="Button",            // button name
                        const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER) // chart corner for anchoring
  {
//--- reset the error value
   ResetLastError();
//--- change anchor corner
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner))
     {
      Print(__FUNCTION__,
            ": failed to change the anchor corner! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Change button text                                               |
//+------------------------------------------------------------------+
bool ButtonTextChange(const long   chart_ID=0,    // chart's ID
                      const string name="Button", // button name
                      const string text="Text")   // text
  {
//--- reset the error value
   ResetLastError();
//--- change object text
   if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
     {
      Print(__FUNCTION__,
            ": failed to change the text! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }
//+------------------------------------------------------------------+
//| Delete the button                                                |
//+------------------------------------------------------------------+
bool ButtonDelete(const long   chart_ID=0,    // chart's ID
                  const string name="Button") // button name
  {
//--- reset the error value
   ResetLastError();
//--- delete the button
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": failed to delete the button! Error code = ",GetLastError());
      return(false);
     }
//--- successful execution
   return(true);
  }



Пожалуйста, дайте мне знать причину, почему это не работает.

 
jaffer wilson:

У меня есть следующий пример кода.

Я пытаюсь запустить его в тестере стратегий. Это не работает. В реальном режиме это работает.

Вот код:



Пожалуйста, дайте мне знать причину, почему это не работает.

Функция OnChartEvent в тестере не работает. Надо в OnTick контролировать OBJPROP_STATE

 
Alexey Viktorov :

Функция OnChartEvent в тестере не работает. Надо в OnTick контролировать OBJPROP_STATE

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

 
jaffer wilson:

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

я люблю американцев, и вообще всех,

вам нужно самому работать, не искать каждый шаг помощь

 
jaffer wilson:

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

На данный момент Вам никто не сможет помочь.

В тестере события от объектов не передаются тестируемому эксперту. Но мы планируем, чтобы в визуальном тестере всё работало точно так же, как и в клиентском терминале.

 
jaffer wilson:

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

нужно сделать 2 вещи:

1) переписать код так, чтобы нажатие отслеживалось без использования EVENT и sparam. например, по состоянию кнопки и её имени (кнопка с именем таким-то нажата - отжать и выполнить действие)

      if(ObjectGetInteger(ChartID(),"Buy",OBJPROP_STATE))
        {
         ObjectSetInteger(ChartID(),"Buy",OBJPROP_STATE,false);
         trade.PositionOpen(_Symbol,0,0.1,SymbolInfoDouble(_Symbol,SYMBOL_ASK),0,0);
        }

2) перенести всё содержимое OnChartEvent в отдельную функцию и использовать её в OnTick и/или OnTimer

 
jaffer wilson :

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

Вот тут описан процесс создания и обработки кнопок в тестере, можете ознакомиться:

Here the process of creating and processing buttons in the tester is described, you can find:

Library for easy and quick development of MetaTrader programs (part IV): Trading events
Library for easy and quick development of MetaTrader programs (part IV): Trading events
  • www.mql5.com
In the first article, we started creating a large cross-platform library simplifying the development of programs for MetaTrader 5 and MetaTrader 4. In subsequent articles, we continued the development of the library and completed the base object of the Engine library and the collection of market orders and positions. In this article, we will...
 
Fast235 :

я люблю американцев, и вообще всех,

вам нужно самому работать, не искать каждый шаг помощь

Спасибо за ваши добрые слова. Но я не ищу то, что возможно. Но то, что невозможно, это моя цель. Поэтому я разместил эту проблему.

 
Slava :

На данный момент Вам никто не сможет помочь.

В тестере события от объектов не передаются тестируемому эксперту. Но мы планируем, чтобы в визуальном тестере всё работало точно так же, как и в клиентском терминале.

Спасибо за ваш ответ, мой друг. Если это будет сделано в первую очередь, это будет здорово. Но я могу понять, что у тебя есть твой приоритет, а у меня - мой. Тем не менее, я надеюсь, что это будет сделано раньше.

 
Igor Zakharov :

нужно сделать 2 вещи:

1) переписать код так, чтобы нажатие отслеживалось без использования EVENT и sparam. например, по состоянию кнопки и её имени (кнопка с именем таким-то нажата - отжать и выполнить действие)

2) перенести всё содержимое OnChartEvent в отдельную функцию и использовать её в OnTick и/или OnTimer

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

 
Artyom Trishkin :

Вот тут описан процесс создания и обработки кнопок в тестере, можете ознакомиться:

Here the process of creating and processing buttons in the tester is described, you can find:

Это было здорово, мой друг. Я попробовал это, и это работает. Теперь я могу использовать его и настроить согласно моему требованию. Спасибо.