Нюансы обработки событий в Тестере стратегий

 

Добрый день, форумчане.

Есть ли какая-нибудь возможность создать рабочие кнопки и обрабатывать ими события OnChartEvent() ?

Везде в документации написано, что нельзя, однако в Маркете есть продукт: https://www.mql5.com/ru/market/product/15164

Этот человек как-то умудрился заставить работать кнопки во время тестирования (если демо скачать и проверять его), но блин, как??)

p.s Мой код функции:

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
   if(id == CHARTEVENT_OBJECT_CLICK)
   {
      double trade_volume = calculate_volume();
      double trade_tp;
      double trade_sl;
    
      if(IsTradeAllowed())
      {
         if(sparam == "BUTTON_BUY_ET")
         {
            trade_tp = calculate_tp(OP_BUY);
            trade_sl = calculate_sl(OP_BUY);
            
            ResetLastError();
            if (OrderSend(Symbol(), OP_BUY, trade_volume, Ask, 0, trade_sl, trade_tp, "EasyTrader") < 0)
               Print("ET OrderSend ERROR: ", GetLastError());
         }
         else if (sparam == "BUTTON_SELL_ET")
         {
            trade_tp = calculate_tp(OP_SELL);
            trade_sl = calculate_sl(OP_SELL);
            
            ResetLastError();

            if (OrderSend(Symbol(), OP_SELL, trade_volume, Bid, 0, trade_sl, trade_tp, "EasyTrader") < 0)
               Print("ET OrderSend ERROR: ", GetLastError());
         }
      }
      else
         Print("ET ERROR: trade didn't allowed");
   }
}
 
Denis Glaz:

Добрый день, форумчане.

Есть ли какая-нибудь возможность создать рабочие кнопки и обрабатывать ими события OnChartEvent() ?

Везде в документации написано, что нельзя, однако в Маркете есть продукт: https://www.mql5.com/ru/market/product/15164

Этот человек как-то умудрился заставить работать кнопки во время тестирования (если демо скачать и проверять его), но блин, как??)

p.s Мой код функции:


  Думаю что тот человек не использовал OnChartEvent в тестере.

 
Andrey Barinov:

  Думаю что тот человек не использовал OnChartEvent в тестере.

Допустим. Но что тогда? Мне не известны другие способы симулировать нажатие
 
Denis Glaz:
Мне не известны другие способы симулировать нажатие

Ну ведь все вводные даны, надо только немного кода написать, чтобы понять.

string GetProperties( const string Name )
{
  static const ENUM_OBJECT_PROPERTY_INTEGER Property[] = {OBJPROP_COLOR, OBJPROP_STYLE, OBJPROP_WIDTH, OBJPROP_BACK, OBJPROP_ZORDER, OBJPROP_HIDDEN,
                                                          OBJPROP_SELECTED, OBJPROP_READONLY, OBJPROP_TYPE, OBJPROP_TIME, OBJPROP_SELECTABLE, OBJPROP_CREATETIME,
                                                          OBJPROP_LEVELS, OBJPROP_LEVELCOLOR, OBJPROP_LEVELSTYLE, OBJPROP_LEVELWIDTH, OBJPROP_ALIGN,
                                                          OBJPROP_FONTSIZE, OBJPROP_RAY_RIGHT, OBJPROP_ELLIPSE, OBJPROP_ARROWCODE, OBJPROP_TIMEFRAMES,
                                                          OBJPROP_ANCHOR, OBJPROP_XDISTANCE, OBJPROP_YDISTANCE, OBJPROP_STATE, OBJPROP_XSIZE, OBJPROP_YSIZE,
                                                          OBJPROP_XOFFSET, OBJPROP_YOFFSET, OBJPROP_BGCOLOR, OBJPROP_CORNER, OBJPROP_BORDER_TYPE, OBJPROP_BORDER_COLOR};
  
  string Str = NULL;
  
  for (int i = 0; i < ArraySize(Property); i++)
    Str += EnumToString(Property[i]) + " = " + (string)ObjectGetInteger(0, Name, Property[i]) + "\n";
    
  return(Str);
}

void OnTick()
{
  static const bool Init = ObjectCreate(0, __FILE__, OBJ_BUTTON, 0, 0, 0);
  
  Comment(GetProperties(__FILE__));
}


Запускаем в тестере и нажимаем на кнопочку. Все станет очевидно.


ЗЫ О чудо, это и в пятерке работает! Всем страждущим написать эмулятор ручной торговли в MT5 - Welcome.

 
fxsaber:

Ну ведь все вводные даны, надо только немного кода написать, чтобы понять.


Запускаем в тестере и нажимаем на кнопочку. Все станет очевидно.


ЗЫ О чудо, это и в пятерке работает! Всем страждущим написать эмулятор ручной торговли в MT5 - Welcome.

Я правильно понял, нужно считывать свойство OBJPROP_STATE чтобы понять что кнопку я нажал, и если значение true, то открыть ордер? Только тут есть но, а если я успею нажать и отпустить кнопку между тиками (т.е между вызовами функции), то функция не успеет задетектить нажатие, так?
 

Denis Glaz:
Я правильно понял, нужно считывать свойство OBJPROP_STATE чтобы понять что кнопку я нажал, и если значение true, то открыть ордер?

Да.

Только тут есть но, а если я успею нажать и отпустить кнопку между тиками (т.е между вызовами функции), то функция не успеет задетектить нажатие, так?

OnTimer.

 
Соответственно, легко реализуются в MT5-тестере многие ручные графические построения.
 
fxsaber:
Соответственно, легко реализуются в MT5-тестере многие ручные графические построения.
Крутое решение, спс)) ещё один момент: клавиша ведь нажата некоторое время, а не успеет оно 2 ордера отправить если таймер сработает дважды, пока я мышц держу нажатой?
 
Denis Glaz:
Крутое решение, спс)) ещё один момент: клавиша ведь нажата некоторое время, а не успеет оно 2 ордера отправить если таймер сработает дважды, пока я мышц держу нажатой?

Вы еще ничего не начали писать, а уже пытаетесь решить гипотетические вопросы. Начните ваять и все получится само-собой.

 
fxsaber:

Вы еще ничего не начали писать, а уже пытаетесь решить гипотетические вопросы. Начните ваять и все получится само-собой.

Мозг так работает)) сразу вижу всю перспективу проблем)
 
fxsaber:

Вы еще ничего не начали писать, а уже пытаетесь решить гипотетические вопросы. Начните ваять и все получится само-собой.


я пробовал такое в мт5 - не работает. 

в мт4 - работает без проблем. 
Файлы:
Причина обращения: