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

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

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

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

Вот код:

#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);
  }



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

Alexey Viktorov
25787
Alexey Viktorov  
jaffer wilson:

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

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

Вот код:



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

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

jaffer wilson
2425
jaffer wilson  
Alexey Viktorov :

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

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

Fast235
2002
Fast235  
jaffer wilson:

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

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

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

Slava
Модератор
13448
Slava  
jaffer wilson:

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

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

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

Igor Zakharov
6490
Igor Zakharov  
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

Artyom Trishkin
Модератор
52428
Artyom Trishkin  
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...
jaffer wilson
2425
jaffer wilson  
Fast235 :

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

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

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

jaffer wilson
2425
jaffer wilson  
Slava :

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

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

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

jaffer wilson
2425
jaffer wilson  
Igor Zakharov :

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

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

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

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

jaffer wilson
2425
jaffer wilson  
Artyom Trishkin :

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

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

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

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