取引リクエスト結果の構造体 (MqlTradeResult)

取引リクエストの結果として、取引サーバは MqlTradeResult 型の特殊な事前定義された構造と取引リクエストの処理結果のデータを返します。

struct MqlTradeResult
 {
  uint   retcode;         // 操作のリターンコード
  ulong   deal;             // 実行された場合の 約定チケット
  ulong   order;           // 注文された場合のチケット
  double   volume;           // ブローカーによって確認された約定ボリューム
  double   price;           // ブローカーによって確認された約定価格
  double   bid;             // 現在の売値
  double   ask;             // 現在の買値
  string   comment;         // 操作に対するブローカーコメント(デフォルトは取引サーバの返したコードの記述)
  uint   request_id;       // ディスパッチの際に、端末によって設定されたリクエストID
  int     retcode_external; // 外部取引システムのリターンコード
 };

フィールドの説明

フィールド

説明

retcode

取引サーバのリターンコード

deal

約定チケット(注文がなされた場合)。TRADE_ACTION_DEAL 型の取引操作で使用可能です。

order

注文チケット(注文された場合)。TRADE_ACTION_PENDING 型の取引操作で使用可能です。

volume

ブローカーによって確認された 約定ボリューム。注文充填タイプによって変化します。

price

ブローカーによって確認された 約定価格取引リクエストまたは取引操作deviation フィールドに依存します。

bid

現在のマーケット売値(リクオート価格)。

ask

現在のマーケット買値 (リクオート価格)。

comment

操作に対するブローカーコメント(デフォルトは取引サーバの返したコードの記述)。

request_id

取引サーバへの送信時に端末によって設定されたリクエストID。

retcode_external

外部取引システムが返したエラーコード。これらのエラーの種類と使用は取引操作が送信される外部取引システムとブローカーに依存します。

取引操作の結果は取引操作を実行するためにOrderSend()に 2 番目のパラメータとして渡される MqlTradeResult type の変数に返されます。

端末は OrdersSend() または OrderSendAsync()関数を使用しての取引サーバへの送信時に request_id フィールドのリクエスト ID を変更します。端末は、取引サーバから実行されるトランザクションに関するメッセージを受信しOnTradeTransaction()関数による処理のためにパラメータとして以下の成分を含んで提出します。  

  • MqlTradeTransaction 構造体内での取引トランザクションの記述。
  • OrderSend() または OrdersSendAsync() 関数から送信された取引リクエストの記述 。リクエスト ID は端末によって取引サーバに送信され、リクエストとその request_id は端末メモリに保存されます。
  • 取引リクエストの実行結果は、リクエストのIDを request_id フィールドに含む MqlTradeResult 構造になります。

OnTradeTransaction() 関数は、3 つの入力パラメータを受信しますが、最後の 2 つは TRADE_TRANSACTION_REQUEST 型のトランザクションのみで分析されるべきです。他の全ての場合では、取引リクエストとその実行結果のデータは満たされません。パラメータ分析の例は取引リクエスト構造体をご参照ください。

サーバ送信時の端末による request_id の設定は主に OrderSendAsync() 非同期関数を操作するために導入されました。この識別子は、アクション(OrderSend または OrderSendAsync 関数の呼び出し)と OnTradeTransaction()に送信されたアクションの結果を関連付けます。

例:

//+------------------------------------------------------------------+
//| 結果処理と取引リクエストを送信する                                        |
//+------------------------------------------------------------------+
bool MyOrderSend(MqlTradeRequest request,MqlTradeResult result)
 {
//--- 最後のエラーコードをゼロにリセットする
  ResetLastError();
//--- リクエストを送信する
  bool success=OrderSend(request,result);
//--- 失敗したら、理由を見つける
  if(!success)
    {
    int answer=result.retcode;
    Print("TradeLog: Trade request failed. Error = ",GetLastError());
    switch(answer)
       {
        //--- リクオート
        case 10004:
          {
          Print("TRADE_RETCODE_REQUOTE");
          Print("request.price = ",request.price,"   result.ask = ",
                 result.ask," result.bid = ",result.bid);
          break;
          }
        //--- 注文がサーバに受け入れられない
        case 10006:
          {
          Print("TRADE_RETCODE_REJECT");
          Print("request.price = ",request.price,"   result.ask = ",
                 result.ask," result.bid = ",result.bid);
          break;
          }
        //--- 無効な価格
        case 10015:
          {
          Print("TRADE_RETCODE_INVALID_PRICE");
          Print("request.price = ",request.price,"   result.ask = ",
                 result.ask," result.bid = ",result.bid);
          break;
          }
        //--- 無効な SL 及び/または TP
        case 10016:
          {
          Print("TRADE_RETCODE_INVALID_STOPS");
          Print("request.sl = ",request.sl," request.tp = ",request.tp);
          Print("result.ask = ",result.ask," result.bid = ",result.bid);
          break;
          }
        //--- 無効なボリューム
        case 10014:
          {
          Print("TRADE_RETCODE_INVALID_VOLUME");
          Print("request.volume = ",request.volume,"   result.volume = ",
                 result.volume);
          break;
          }
        //--- 取引操作に不充分なメモリ
        case 10019:
          {
          Print("TRADE_RETCODE_NO_MONEY");
          Print("request.volume = ",request.volume,"   result.volume = ",
                 result.volume,"   result.comment = ",result.comment);
          break;
          }
        //--- 他の理由。サーバ応答コードを出力する
        default:
          {
          Print("Other answer = ",answer);
          }
       }
    //--- false を返して、取引リクエストの失敗結果を通知する
    return(false);
    }
//--- OrderSend() が true を返す。- 答えを繰り返す。
  return(true);
 }