Баг терминала (тестера) или нет?

 

Доброго ВС!

В эксперте отслеживаю срабатывание стоплосса в событии OnTradeTransaction, чтобы проделать кое-какие манипуляции с переменными.

Не знаю, баг ли это терминала (тестера) или нет. Суть в том, что при срабатывании стопа  следующие функции

HistoryDealGetInteger(deal_ticket, DEAL_ENTRY)

HistoryDealGetInteger(deal_ticket, DEAL_REASON)

должны возвращать соответственно

DEAL_ENTRY_OUT и 

DEAL_REASON_SL

Так чаще всего и получается, но не всегда. Иногда (редко) при срабатывании стопа почему - то возвращаются значения как при открытии позы, то есть

DEAL_ENTRY_IN и

DEAL_REASON_EXPERT

Хотя стоп-лосс закрывается штатно, тестер пишет:

2023.12.18 21:23:43.358 2023.02.24 16:30:00   stop loss triggered #654 buy 0.09 USDJPYrfd 135.758 sl: 135.683 tp: 135.833 [#655 sell 0.09 USDJPYrfd at 135.683]

Ну и дальше мой советник естественно не работает как надо.

С таким сталкивались? В чем может быть проблема?


void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result)
  {
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
     {
      HistorySelect(0, TimeCurrent());
      ulong deal_ticket =  HistoryDealGetTicket(HistoryDealsTotal() - 1);
      ENUM_DEAL_REASON deal_reason = HistoryDealGetInteger(deal_ticket, DEAL_REASON);
      ENUM_DEAL_ENTRY deal_entry = HistoryDealGetInteger(deal_ticket, DEAL_ENTRY);
      Print("deal_reason= ", EnumToString(deal_reason));
      Print("deal_entry= ", EnumToString(deal_entry));
      if(deal_reason == DEAL_REASON_SL)
        {
        //Меняю значения переменных
        }
     }
  }

 
TopSeller:

Доброго ВС!

В эксперте отслеживаю срабатывание стоплосса в событии OnTradeTransaction, чтобы проделать кое-какие манипуляции с переменными.

Не знаю, баг ли это терминала (тестера) или нет. Суть в том, что при срабатывании стопа  следующие функции

HistoryDealGetInteger(deal_ticket, DEAL_ENTRY)

HistoryDealGetInteger(deal_ticket, DEAL_REASON)

должны возвращать соответственно

DEAL_ENTRY_OUT и 

DEAL_REASON_SL

Так чаще всего и получается, но не всегда. Иногда (редко) при срабатывании стопа почему - то возвращаются значения как при открытии позы, то есть

DEAL_ENTRY_IN и

DEAL_REASON_EXPERT

Хотя стоп-лосс закрывается штатно, тестер пишет:

2023.12.18 21:23:43.358 2023.02.24 16:30:00   stop loss triggered #654 buy 0.09 USDJPYrfd 135.758 sl: 135.683 tp: 135.833 [#655 sell 0.09 USDJPYrfd at 135.683]

Ну и дальше мой советник естественно не работает как надо.

С таким сталкивались? В чем может быть проблема?



Не надо выбирать всю историю. Достаточно только сделку выбрать по тикету.

Эта строка

      ulong deal_ticket =  HistoryDealGetTicket(HistoryDealsTotal() - 1);

не всегда даёт правильный результат. Оттого и проблема.

if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
 {
  if(!HistoryDealSelect(trans.deal))
    DebugBreak();
  if(trans.symbol == _Symbol)// && HistoryDealGetInteger(trans.deal, DEAL_MAGIC) == magick)
   {
    /******************** Если открылась позиция*******************/
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)
      Print("********** открытие сделка ", trans.deal, " позиция ", trans.position);
    /******************** Если закрылась позиция*******************/
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
       {
        Print("********** закрытие по тейку сделка ", trans.deal, " позиция ", trans.position);
       }
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
       {
        Print("********** закрытие по стопу сделка ", trans.deal, " позиция ", trans.position);
       }
     }
   }
 }
 
@Alexey Viktorov сработало теперь! Спасибо!
Alexey Viktorov
Alexey Viktorov
  • 2023.12.15
  • www.mql5.com
Профиль трейдера