FORTS: Códigos de retorno OnTradeTransaction() - página 7

 
Михаил:

O problema é que quando uma ordem está sendo executada, você não controla sua execução e, portanto, não bloqueia OnTick() ou OnBookEvent().

Você precisa lidar com o evento comercial na OnTradeTransaction() para controlar rapidamente a ordem que está sendo executada.

Publicarei o código sobre como fazer isso em breve.

Hm. Terei que pensar sobre isso, obrigado!
 
Alexey Kozitsyn:
Ahem. Terei que pensar sobre isso, obrigado!
#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; 
                                          
  }
}  
 

Ou melhor:

#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; 
                                          
  }
}
 
Михаил:
Estou vendo, mas há dúvidas de que esta construção irá bloquear o OnBookEvent(). Afinal, o evento da troca de vidro pode ocorrer em cachos. Vou checar, obrigado mais uma vez.
 
Alexey Kozitsyn:
Estou vendo, mas há dúvidas de que esta construção irá bloquear o OnBookEvent(). Afinal, o evento da troca de vidro pode ser realizado em cachos. Vou verificar isso, obrigado mais uma vez.
Não tenha dúvidas - não use a dica, mas eu tinha a mesma coisa que você, até colocar um "adereço".
 
Михаил:
Não tenha dúvidas - não use o conselho, mas eu tinha a mesma coisa que você até que eu coloquei um "backstop" no lugar.
Não, é uma idéia interessante e quanto mais tempo uma ordem leva para ser executada, melhor ela funcionará. No meu caso, tanto a execução do pedido quanto sua eliminação levou um ms. Teremos que verificar também a lógica do Expert Advisor.
 
Alexey Kozitsyn:
Não, é uma idéia interessante e quanto mais tempo uma ordem leva para ser executada, melhor é a qualidade de seu trabalho. No caso que citei, tanto a execução quanto a eliminação da ordem ocorreram dentro da mesma ms. Devemos também verificar a lógica do Expert Advisor.
https://www.mql5.com/ru/forum/16832
ФОРТС Отмена ордера в момент его исполнения [что приходит раньше - BookEvent или TradeEvent]
ФОРТС Отмена ордера в момент его исполнения [что приходит раньше - BookEvent или TradeEvent]
  • www.mql5.com
OnBookEvent срабатывает раньше, чем OnTradeTransAction. - - Категория: автоматические торговые системы
 
Alexey Kozitsyn:
OrderSend(). Qual é a diferença neste caso?
Na implementação do "backstop
 
Михаил:

Isso é mais preciso:

Não é mais verdadeiro.

Os dois últimos parâmetros solicitação e resultado são preenchidos com valores somente para o tipo de transação TRADE_TRANSACTION_REQUEST, informações sobre a transação podem ser obtidas do tipo de parâmetro da variável trans.

 
Alexey Kozitsyn:

Não é mais verdadeiro.

Eu mesmo escrevi, é claro, trans.order