Pregunta sobre la función OnTradeTransaction - página 7

 
votor:

Algo que no se me da bien explicar, por lo visto. He aquí un ejemplo de la vida real. Aquí está el código:

void OnTradeTransaction(const MqlTradeTransaction& trans,

                        const MqlTradeRequest& request,

                        const MqlTradeResult& result)

  {

      Count++;   

  Print("Ontrade_test = ",Count);

 }

Обработчик стоит в двух советниках, при совершении 1 сделки он отрабатывается множество раз в двух советниках. Код выдает:

   18:31:06.495 ontrade_trans_functions (MXI-12.17,H1)  Ontrade_test = 1

   18:31:06.495 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 1

   18:31:06.497 ontrade_trans_functions (MXI-12.17,H1)  Ontrade_test = 2

   18:31:06.497 ontrade_trans_functions2 (MXI-12.17,M5) Ontrade_test = 2

   18:31:06.498 ontrade_trans_functions (MXI-12.17,M5)  Ontrade_test = 3

   18:31:06.498 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 3

   18:31:06.500 ontrade_trans_functions (MXI-12.17,M5)  Ontrade_test = 4

   18:31:06.500 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 4 ...

y así sucesivamente.

Podemos ver que el tiempo de respuesta de OnTradeTransaction en dos Asesores Expertos coincide en milisegundos. Entonces, tengo una pregunta: ¿el evento "deal" llega primero a un OnTradeTransaction en un EA y luego al siguiente en otro EA o de alguna manera llega a todos los manejadores de todos los EAs a la vez? Bueno, es como una operación paralela multihilo o como se llame en programación. Estoy seguro de que todo sucede secuencialmente, sólo se procesa en un milisegundo, pero lo he preguntado por si acaso.

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   // Здесь надо поставить фильтр по типу транзакции
   // По символу и магику
   // и только если всё совпало, тогда 
      Count++;   
  Print("Ontrade_test = ",Count);
 }
 
votor:

Algo que no se me da bien explicar, por lo visto. He aquí un ejemplo de la vida real. Aquí está el código:

void OnTradeTransaction(const MqlTradeTransaction& trans,

const MqlTradeRequest& request,

const MqlTradeResult& result)

{

Cuenta++;

Print("Prueba_de_ontrade = ",Cuenta);

}

El manejador se implementa en dos Asesores Expertos por lo que se ejecuta múltiples veces en dos Asesores Expertos cuando se realiza una operación. El código sale:

18:31:06.495 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 1

18:31:06.495 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 1

18:31:06.497 ontrade_trans_functions (MXI-12.17,H1) Ontrade_test = 2

18:31:06.497 ontrade_trans_functions2 (MXI-12.17,M5) Ontrade_test = 2

18:31:06.498 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 3

18:31:06.498 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 3

18:31:06.500 ontrade_trans_functions (MXI-12.17,M5) Ontrade_test = 4

18:31:06.500 ontrade_trans_functions2 (MXI-12.17,H1) Ontrade_test = 4 ...

y así sucesivamente.

Puede ver que el tiempo de respuesta de OnTradeTransaction en los dos Asesores Expertos es el mismo en milisegundos. Entonces, tengo una pregunta: ¿el evento de comercio llega primero a un OnTradeTransaction en un EA y luego al siguiente en otro EA o de alguna manera llega a todos los manejadores de todos los EAs a la vez? Bueno, es como una operación paralela multihilo o como se llame en programación. Estoy seguro de que todo sucede secuencialmente, sólo funciona rápido en un milisegundo, pero lo pregunté por si acaso.


Manejador OnTradeTransaction para UN símbolo (m_symbol.Name()) y una magia (m_magic).

Atrapar la transacción primero

TRADE_TRANSACTION_DEAL_ADD

Añade la transacción al historial. Esto se hace como resultado de la ejecución de una orden o de las operaciones de saldo de la cuenta.


entonces miramos si es un comercio

DEAL_ENTRY_OUT

Salida del mercado


//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_ticket       =0;
      long     deal_order        =0;
      long     deal_time         =0;
      long     deal_time_msc     =0;
      long     deal_type         =-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      long     deal_reason       =-1;
      long     deal_position_id  =0;
      double   deal_volume       =0.0;
      double   deal_price        =0.0;
      double   deal_commission   =0.0;
      double   deal_swap         =0.0;
      double   deal_profit       =0.0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      string   deal_external_id  ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);
         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);
         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);

         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
        }
      else
         return;
      if(deal_reason!=-1)
         DebugBreak();
      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_OUT)
           {

           }
     }
  }
 
Alexey Viktorov:

El eventoOnTradeTransaction es un evento de difusión, todas las acciones que realiza su terminal se "vuelcan" allí.

Lo que ocurre es que cada EA tiene que filtrar sus propias acciones.

void OnTradeTransaction( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{  
  switch(trans.type)
  {
    case TRADE_TRANSACTION_REQUEST:
    break;
    case TRADE_TRANSACTION_DEAL_ADD:
    break;
    case TRADE_TRANSACTION_HISTORY_ADD:
    break;
    case TRADE_TRANSACTION_ORDER_UPDATE:
    break;
  }  
}

Luego, en cada tipo, filtramos por ticket, si el pedido se envía de forma asíncrona, entonces

primero, obtenemos el ticket por su ID de solicitud y luego filtramos por el ticket.

case TRADE_TRANSACTION_REQUEST:
  if((my_request_id > 0) && (result.request_id == my_request_id))
      {
        if(result.order > 0)
          {
            my_order_ticket = result.order;
          }
      }
break;

El eventoTRADE_TRANSACTION_REQUEST siempre va primero, los demás "como quieran".

Añadido

Esto se ha discutido muchas veces.

Búsquelo en Exchange Trading

 

Gracias, parece que se están "anotando" los tratos correctos.