OnTradeTransaction

この関数はTradeTransactionイベントが発生するときにEAで呼び出され、取引リクエストの実行結果を処理するためのものです。

void  OnTradeTransaction()
  const MqlTradeTransaction&    trans,     // 取引トランザクション構造体
  const MqlTradeRequest&        request,   // リクエスト構造体
  const MqlTradeResult&        result     // 返答構造体
  );

パラメータ

trans

[in] MqlTradeTransaction取引口座で行われた取引を記述する型変数

request

[in] MqlTradeRequestトランザクションにつながった取引リクエストを記述する型変数で、TRADE_TRANSACTION_REQUEST型トランザクション値のみを含む

result

[in] MqlTradeResultトランザクションにつながった取引リクエストの実行結果を含む型変数で、TRADE_TRANSACTION_REQUEST型トランザクション値のみを含む

戻り値

なし

注意事項

OnTradeTransaction()は、下記の場合に取引サーバが端末に送信したTradeTransactionイベントを処理するために呼び出されます。

  • OrderSend()/OrderSendAsync()関数を使ったMQL5プログラムからの取引リクエストの送信とそれに続く実行
  • GUIを介した手動での取引リクエストの送信とそれに続く実行
  • サーバでの指値注文やストップ注文のアクティベーション
  • 取引サーバ側での操作の実行

 

トランザクション型のデータはtrans変数のtypeフィールドに含まれています。トランザクションの型はENUM_TRADE_TRANSACTION_TYPE列挙体に記述されています。

  • TRADE_TRANSACTION_ORDER_ADD – 新規アクティブ注文の追加
  • TRADE_TRANSACTION_ORDER_UPDATE – 既存注文の変更
  • TRADE_TRANSACTION_ORDER_DELETE – アクティブ注文リストからの注文の削除
  • TRADE_TRANSACTION_DEAL_ADD – 履歴への約定の追加
  • TRADE_TRANSACTION_DEAL_UPDATE – 履歴での約定の変更
  • TRADE_TRANSACTION_DEAL_DELETE – 履歴での約定の削除
  • TRADE_TRANSACTION_HISTORY_ADD – 実行またはキャンセルの結果としての履歴への注文の追加
  • TRADE_TRANSACTION_HISTORY_UPDATE – 注文履歴内の注文の変更
  • TRADE_TRANSACTION_HISTORY_DELETE – 注文履歴内の注文の削除
  • TRADE_TRANSACTION_POSITION – 取引の実行に関連していないポジション変更
  • TRADE_TRANSACTION_REQUEST – 取引リクエストがサーバで処理され結果が受け取られたことの通知

TRADE_TRANSACTION_REQUEST型のトランザクションを処理するには、OnTradeTransaction()関数の第2及び第3パラメータ(requestresult)を分析し追加情報を受け取る必要があります。

買い取引リクエストを送信すると、取引口座では下記の一連の取引トランザクションが発生します。1)処理リクエストの受領、2)口座に対した適切な注文書の作成、3)注文実行、4) 実行された注文をアクティブ注文のリストから削除、5)同注文を注文履歴に追加、6)後続のトランザクションを履歴に追加、7)新しいポジションを作成これらの段階はすべて取引トランザクションです。このようなトランザクションの端末への到着がTradeTransactionイベントです。端末におけるこれらのトランザクションの到着の優先順位は保証されません。よって取引アルゴリズムを開発する際にトランザクション到着の順番を仮定すべきではありません。

EAのOnTradeTransaction()ハンドラで取引トランザクションを処理する場合、端末は新たに到着した取引トランザクションの処理を継続します。したがって、取引口座の状態は、OnTradeTransaction()操作の過程で変更される可能性があります。例えば、MQL5 プログラムが新しい注文の追加を処理している間に、注文が実行されて注文のリストから削除され、履歴に移動されることもあります。プログラムは、これらのイベントすべてを通知されます。

トランザクションキューは1,024要素を備えます。OnTradeTransaction()ハンドラーが新しいトランザクションを処理するのに長くかかりすぎると、代わりにキュー内の新しいトランザクションが処理されることがあります。

OnTrade()ハンドラーは適切なOnTradeTransaction()が呼び出された後で呼び出されます。一般に、OnTrade()とOnTradeTransaction()の呼び出しの数には正確な相関関係はありません。1つのOnTrade()コールは、1つまたは複数のOnTradeTransactionコールに対応します。

それぞれの<t1> </t1><li2>Trade</li2><t3>イベントは、1つまたは複数の取引要求の結果として表示されることがあります。取引リクエストは、OrderSend()またはOrderSendAsync()を使用してサーバに送信されます。それぞれのリクエストは、いくつかの取引イベントにつながる可能性があります。イベントの処理はいくつかの段階で実行されることがあり、各操作によって注文、ポジション、取引履歴の状態が変更される可能性があるため、「1つのリクエスト - 1つの取引イベント」という声明に頼ることはできません。

OnTradeTransaction()ハンドラーを持つEAの例

//+------------------------------------------------------------------+
//|                                    OnTradeTransaction_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link     "https://www.mql5.com"
#property version   "1.00"
#property description "Sample listener of TradeTransaction events"
//+------------------------------------------------------------------+
//| エキスパート初期化関数                                                |
//+------------------------------------------------------------------+
int OnInit()
 {
//---
  PrintFormat("LAST PING=%.f ms",
              TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| エキスパートティック関数                                                 |
//+------------------------------------------------------------------+
void OnTick()
 {
//---
 
 }
//+------------------------------------------------------------------+
//| TradeTransaction 関数                                             |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                      const MqlTradeRequest &request,
                      const MqlTradeResult &result)
 {
//---
  static int counter=0;   // OnTradeTransaction()呼び出しのカウンタ
  static uint lasttime=0; // OnTradeTransaction()の最後の呼び出し時刻
//---
  uint time=GetTickCount();
//--- 最後のトランザクションが1秒以上前に実行された場合
  if(time-lasttime>1000)
    {
     counter=0; // これは新しい取引であり、カウンタをリセットできる
    if(IS_DEBUG_MODE)
        Print(" New trade operation");
    }
  lasttime=time;
  counter++;
  Print(counter,". ",__FUNCTION__);
//--- 取引リクエストの実行結果
  ulong            lastOrderID   =trans.order;
  ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
  ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- トランザクションが実行される取引シンボルの名称
  string trans_symbol=trans.symbol;
//--- トランザクションの種類
  ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
  switch(trans.type)
    {
    case TRADE_TRANSACTION_POSITION:   // ポジション修正
       {
        ulong pos_ID=trans.position;
        PrintFormat("MqlTradeTransaction: Position  #%I64u %s modified: SL=%.5f TP=%.5f",
                    pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
       }
    break;
    case TRADE_TRANSACTION_REQUEST:     // 取引リクエストの送信
        PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
        break;
    case TRADE_TRANSACTION_DEAL_ADD:   // 取引の追加
       {
        ulong          lastDealID   =trans.deal;
        ENUM_DEAL_TYPE lastDealType =trans.deal_type;
        double        lastDealVolume=trans.volume;
        //--- 外部システムの取引ID - 取引所で割り当てられたチケット
        string Exchange_ticket="";
        if(HistoryDealSelect(lastDealID))
           Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
        if(Exchange_ticket!="")
           Exchange_ticket=StringFormat("(Exchange deal=%s)",Exchange_ticket);
 
        PrintFormat("MqlTradeTransaction: %s deal #%I64u %s %s %.2f lot   %s",EnumToString(trans_type),
                    lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
       }
    break;
    case TRADE_TRANSACTION_HISTORY_ADD: // 履歴への注文の追加
       {
        //--- 外部システムの注文ID - 取引所で割り当てられたチケット
        string Exchange_ticket="";
        if(lastOrderState==ORDER_STATE_FILLED)
          {
          if(HistoryOrderSelect(lastOrderID))
              Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
          if(Exchange_ticket!="")
              Exchange_ticket=StringFormat("(Exchange ticket=%s)",Exchange_ticket);
          }
        PrintFormat("MqlTradeTransaction: %s order #%I64u %s %s %s   %s",EnumToString(trans_type),
                    lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
       }
    break;
    default: // 他のトランザクション
       {
        //--- 外部システムの注文ID - 取引所で割り当てられたチケット
        string Exchange_ticket="";
        if(lastOrderState==ORDER_STATE_PLACED)
          {
          if(OrderSelect(lastOrderID))
              Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
          if(Exchange_ticket!="")
              Exchange_ticket=StringFormat("Exchange ticket=%s",Exchange_ticket);
          }
        PrintFormat("MqlTradeTransaction: %s order #%I64u %s %s   %s",EnumToString(trans_type),
                    lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
       }
    break;
    }
//--- 注文チケット    
  ulong orderID_result=result.order;
  string retcode_result=GetRetcodeID(result.retcode);
  if(orderID_result!=0)
    PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//---  
 }
//+------------------------------------------------------------------+
//| 数値をテキスト文字列に変換する                                           |
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
 {
  switch(retcode)
    {
    case 10004: return("TRADE_RETCODE_REQUOTE");             break;
    case 10006: return("TRADE_RETCODE_REJECT");             break;
    case 10007: return("TRADE_RETCODE_CANCEL");             break;
    case 10008: return("TRADE_RETCODE_PLACED");             break;
    case 10009: return("TRADE_RETCODE_DONE");               break;
    case 10010: return("TRADE_RETCODE_DONE_PARTIAL");       break;
    case 10011: return("TRADE_RETCODE_ERROR");               break;
    case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
    case 10013: return("TRADE_RETCODE_INVALID");             break;
    case 10014: return("TRADE_RETCODE_INVALID_VOLUME");     break;
    case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
    case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
    case 10017: return("TRADE_RETCODE_TRADE_DISABLED");     break;
    case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
    case 10019: return("TRADE_RETCODE_NO_MONEY");           break;
    case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
    case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
    case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION"); break;
    case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
    case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
    case 10025: return("TRADE_RETCODE_NO_CHANGES");         break;
    case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT"); break;
    case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT"); break;
    case 10028: return("TRADE_RETCODE_LOCKED");             break;
    case 10029: return("TRADE_RETCODE_FROZEN");             break;
    case 10030: return("TRADE_RETCODE_INVALID_FILL");       break;
    case 10031: return("TRADE_RETCODE_CONNECTION");         break;
    case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
    case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");       break;
    case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");       break;
    case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
    case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
    default:
        return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
        break;
    }
//---
 }

参照

OrderSendOrderSendAsyncOnTradeTransactionTrade request structureTrade transaction structureTrade transaction typesTrade operation typesClient terminal events