Question sur la fonction OnTradeTransaction - page 7

 
votor:

Quelque chose que je ne suis pas doué pour expliquer, apparemment. Voici un exemple concret. Voici le code :

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 ...

et ainsi de suite.

Nous pouvons voir que le temps de réponse de OnTradeTransaction dans deux Expert Advisors coïncide avec des millisecondes. J'ai donc une question : l'événement "deal" arrive-t-il d'abord à un OnTradeTransaction dans un EA et ensuite au suivant dans un autre EA ou arrive-t-il d'une manière ou d'une autre à tous les handlers de tous les EA en même temps ? Eh bien, c'est comme une opération parallèle multithread ou quel que soit le nom qu'on lui donne en programmation. Je suis sûr que tout se passe de manière séquentielle, tout est simplement traité en une milliseconde, mais j'ai posé la question juste au cas où.

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

Quelque chose que je ne suis pas doué pour expliquer, apparemment. Voici un exemple concret. Voici le code :

void OnTradeTransaction(const MqlTradeTransaction& trans,

const MqlTradeRequest& request,

const MqlTradeResult& result)

{

Compte++ ;

Print("Ontrade_test = ",Count) ;

}

Le gestionnaire est implémenté dans deux Expert Advisors, il est donc exécuté plusieurs fois dans deux Expert Advisors lorsqu'une transaction est effectuée. Le code sort :

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 ...

et ainsi de suite.

Vous pouvez voir que le temps de réponse de OnTradeTransaction dans les deux Expert Advisors est le même en millisecondes. J'ai donc une question : l'événement de transaction arrive-t-il d'abord à un OnTradeTransaction dans un EA et ensuite au suivant dans un autre EA ou arrive-t-il d'une manière ou d'une autre à tous les gestionnaires de tous les EA en même temps ? Eh bien, c'est comme une opération parallèle multithread ou quel que soit le nom qu'on lui donne en programmation. Je suis sûr que tout se passe de manière séquentielle, c'est juste que ça marche vite à la milliseconde près, mais j'ai posé la question juste au cas où.


Gestionnaire OnTradeTransaction pour UN symbole (m_symbol.Name()) et une magie (m_magic).

Attrapez d'abord la transaction

TRANSACTION_COMMERCIALE_ADDITIONNELLE

Ajouter la transaction à l'historique. Cela se fait à la suite de l'exécution d'un ordre ou de transactions sur le solde du compte.


puis nous regardons s'il s'agit d'une transaction.

DEAL_ENTRY_OUT

Sortie du marché


//+------------------------------------------------------------------+
//| 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:

L'événementOnTradeTransaction est un événement de diffusion, toutes les actions effectuées par votre terminal y sont "déversées".

C'est juste que chaque EA doit filtrer ses propres actions.

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;
  }  
}

Ensuite, dans chaque type, nous filtrons par ticket, si la commande est envoyée de manière asynchrone, alors

D'abord, nous obtenons le ticket par son ID de demande et ensuite nous filtrons par le 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;

L'événementTRADE_TRANSACTION_REQUEST arrive toujours en premier, les autres "comme ils veulent".

Ajouté

Ce point a été discuté à de nombreuses reprises.

Consultez le site Exchange Trading

 

Merci, il semble que les bonnes affaires soient "écrites".

Raison: