ФОРТС: OnTradeTransaction() коды возврата - страница 7

 
Михаил:

Дело в том, что когда исполняется ордер, Вы не контролируете его исполнение и поэтому не блокируете OnTick() или OnBookEvent()

Что бы быстро контролировать исполненный ордер, нужно обрабатывать событие сделки в OnTradeTransaction()

Скоро выложу код, как это сделать... 

Гм. Надо подумать, спасибо!
 
Alexey Kozitsyn:
Гм. Надо подумать, спасибо!
#property copyright "Copyright 2015, Mikalas"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
//
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_busy = false;
  return( INIT_SUCCEEDED ); 
}
//----------------------------
void OnBookEvent( const string &a_symbol ) 
{
  if ( ( a_symbol == _Symbol ) && ( !is_busy ) )
  {
    //Работаем дальше
  }
}  
//------------
void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
  switch( trans.type )
  {
    case TRADE_TRANSACTION_DEAL_ADD: if ( trans.order_state == ORDER_STATE_STARTED )
                                     {
                                       is_busy = true;
                                       //Обнуляем билет этого ордера, если одер залился полностью
                                       is_busy = false;
                                     }
                                     break; 
                                          
  }
}  
 

Вернее так:

#property copyright "Copyright 2015, Mikalas"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_busy = false;
  return( INIT_SUCCEEDED ); 
}
//----------------------------
void OnBookEvent( const string &a_symbol ) 
{
  if ( ( a_symbol == _Symbol ) && ( !is_busy ) )
  {
    //Работаем дальше
  }
}  
//------------
void OnTradeTransaction( const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result )
{
  switch( trans.type )
  {
    case TRADE_TRANSACTION_DEAL_ADD: if ( trans.order_state == ORDER_STATE_STARTED )
                                     {
                                       if ( result.order == order_ticket )
                                       { 
                                         is_busy = true;
                                         //Обнуляем билет этого ордера, если одер залился полностью
                                         is_busy = false;
                                       }  
                                     }
                                     break; 
                                          
  }
}
 
Михаил:
Понятно, только есть сомнения, что данная конструкция успеет заблокировать OnBookEvent(). Событие изменения стакана ведь может пачками подряд идти. Буду проверять, спасибо еще раз.
 
Alexey Kozitsyn:
Понятно, только есть сомнения, что данная конструкция успеет заблокировать OnBookEvent(). Событие изменения стакана ведь может пачками подряд идти. Буду проверять, спасибо еще раз.
Есть сомнение - не используйте совет, но у меня было то же самое как у Вас, пока не поставил "подпорку".
 
Михаил:
Есть сомнение - не используйте совет, но у меня было то же самое как у Вас, пока не поставил "подпорку".
Нет, мысль интересная, и качество ее работы будет тем выше, чем дольше исполняется ордер. Просто в конкретно приведенном мной случае и исполнение ордера и его удаление пришлось на одну мс. Надо еще логику эксперта проверить.
 
Alexey Kozitsyn:
Нет, мысль интересная, и качество ее работы будет тем выше, чем дольше исполняется ордер. Просто в конкретно приведенном мной случае и исполнение ордера и его удаление пришлось на одну мс. Надо еще логику эксперта проверить.
https://www.mql5.com/ru/forum/16832
ФОРТС Отмена ордера в момент его исполнения [что приходит раньше - BookEvent или TradeEvent]
ФОРТС Отмена ордера в момент его исполнения [что приходит раньше - BookEvent или TradeEvent]
  • www.mql5.com
OnBookEvent срабатывает раньше, чем OnTradeTransAction. - - Категория: автоматические торговые системы
 
Alexey Kozitsyn:
OrderSend(). А в чем разница в этом случае?
В реализации "подпорки"
 
Михаил:

Вернее так:

Не вернее.

Два последних параметра request и result заполняются значениями только для транзакции типа TRADE_TRANSACTION_REQUEST, информацию о транзакции можно получить из параметра type переменной trans.

 
Alexey Kozitsyn:

Не вернее.

Описался, конечно trans.order