Frage zur Funktion OnTradeTransaction - Seite 7

 
votor:

Offensichtlich bin ich nicht gut darin, das zu erklären. Hier ein Beispiel aus der Praxis. Hier ist der 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 ...

und so weiter.

Wir können sehen, dass die Reaktionszeit von OnTradeTransaction in zwei Expert Advisors auf Millisekunden zusammenfällt. Also, ich habe eine Frage: kommt das "Deal"-Ereignis zuerst zu einem OnTradeTransaction in einem EA und dann zum nächsten in einem anderen EA oder kommt es irgendwie zu allen Handlern aller EAs auf einmal? Nun, es ist wie eine parallele Multithreading-Operation oder wie auch immer man das in der Programmierung nennt. Ich bin sicher, dass alles nacheinander passiert, es wird nur innerhalb einer Millisekunde verarbeitet, aber ich habe vorsichtshalber gefragt.

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

Offensichtlich bin ich nicht gut darin, das zu erklären. Hier ein Beispiel aus der Praxis. Hier ist der Code:

void OnTradeTransaction(const MqlTradeTransaction& trans,

const MqlTradeRequest& Anfrage,

const MqlTradeResult& result)

{

Graf++;

Print("Ontrade_test = ",Count);

}

Der Handler ist in zwei Expert Advisors implementiert, so dass er mehrfach in zwei Expert Advisors ausgeführt wird, wenn ein Handel durchgeführt wird. Der Code erzeugt:

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

und so weiter.

Sie können sehen, dass die OnTradeTransaction-Antwortzeit in den beiden Expert Advisors in Millisekunden gleich ist. Also, ich habe eine Frage: kommt das Handelsereignis zuerst zu einem OnTradeTransaction in einem EA und dann zum nächsten in einem anderen EA oder irgendwie zu allen Handlern von allen EAs auf einmal erhalten? Nun, es ist wie eine parallele Multithreading-Operation oder wie auch immer man das in der Programmierung nennt. Ich bin sicher, dass alles sequentiell abläuft, es funktioniert nur schnell innerhalb einer Millisekunde, aber ich habe vorsichtshalber gefragt.


OnTradeTransaction-Handler für EIN Symbol (m_symbol.Name()) und eine Magie (m_magic).

Fangen Sie die Transaktion zuerst ab

HANDEL_TRANSAKTION_GESCHAEFT_HINZUFUEGEN

Fügen Sie die Transaktion der Historie hinzu. Dies geschieht als Folge der Ausführung von Aufträgen oder von Kontobewegungen.


dann sehen wir nach, ob es sich um einen Handel handelt

DEAL_ENTRY_OUT

Marktaustritt


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

Das EreignisOnTradeTransaction ist ein Broadcast-Ereignis, alle Aktionen, die Ihr Terminal durchführt, werden dort "abgeladen".

Es ist nur so, dass jeder EA seine eigenen Aktionen filtern muss.

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

Dann filtern wir in jedem Typ nach Ticket, wenn der Auftrag asynchron gesendet wird, dann

Zunächst wird das Ticket anhand seiner Anfrage-ID abgerufen, und dann wird nach dem Ticket gefiltert.

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;

Das EreignisTRADE_TRANSACTION_REQUEST kommt immer zuerst, die anderen nach Bel ieben.

Hinzugefügt

Dies wurde bereits mehrfach erörtert.

Nachschlagen in Exchange Trading

 

Danke, es scheint, als ob ich die richtigen Angebote "aufgeschrieben" bekomme.

Grund der Beschwerde: