OnTradeTransaction関数について質問です。 - ページ 7

 
votor:

どうも説明するのが苦手なんです。ここで実例を紹介します。以下はそのコードです。

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

といった具合に。

2 つの Expert Advisor の OnTradeTransaction の応答時間がミリ秒に一致 することがわかります。そこで質問なのですが、「取引」イベントはあるEAのOnTradeTransactionにまず来て、次に別のEAの次のイベントに来るのでしょうか、それとも何らかの方法ですべてのEAのハンドラーに一度に来るのでしょうか?まあ、プログラミングで言うところのマルチスレッドの並列処理みたいなものですね。すべてが順次行われ、1ミリ秒以内に処理されるだけだと思いますが、念のため質問させていただきました。

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

どうも説明するのが苦手なんです。ここで実例を紹介します。以下はそのコードです。

void OnTradeTransaction(constMqlTradeTransaction& trans,

const MqlTradeRequest& request,

コンスタントMqlTradeResult& result)

{

カウント++。

Print("Ontrade_test = ",Count);

}

ハンドラは2つのExpert Advisorに実装されているため、1つのトレードが実行されると2つのExpert Advisorで複数回実行されます。コードが出力されます。

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

といった具合に。

2 つの Expert Advisor の OnTradeTransaction の 応答時間がミリ秒単位で同じ であることがわかります。そこで質問なのですが、トレードイベントはあるEAのOnTradeTransactionにまず来て、次に別のEAのOnTradeTransactionに来るのか、それとも何らかの方法ですべてのEAのハンドラに一度に来るのでしょうか?まあ、プログラミングで言うところのマルチスレッドの並列処理みたいなものですね。すべてが順次行われ、1ミリ秒以内に高速で動作しているだけだと思いますが、念のため質問させていただきました。


1つのシンボル (m_symbol.Name()) と1つのマジック (m_magic) に対する OnTradeTransaction ハンドラです。

トランザクションを最初にキャッチする

貿易取引取引追加

トランザクションを履歴に追加します。注文の執行や口座残高の取引の結果として行われます。


そして、それがトレードであるかどうかを確認します。

DEAL_ENTRY_OUT

市場の出口


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

OnTradeTransaction イベントはブロードキャストイベントであり、端末が実行するすべてのアクションはそこに「ダンプ」されます。

ただ、それぞれのEAが自分の行動をフィルタリングする必要があるのです。

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

そして、それぞれのタイプで、チケットでフィルタリングし、もしオーダーが非同期で送信されるのであれば

まず、リクエストIDでチケットを取得し、そのチケットでフィルタリングを行います。

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;

TRADE_TRANSACTION_REQUESTイベントが常に最初に来て、他のイベントは "好きなように " 来る。

追加

これは何度も議論されてきたことです。

取引所取引で調べる

 

ありがとうございます。正しい取引を「書き留める」ことができるようになったようです。