【MQL5】HistoryDealGetTicket関数の使い方と自動売買実装コード

1. HistoryDealGetTicket関数の概要と実務での活用法

MQL5において、過去の取引結果(約定履歴)にアクセスするための入り口となるのがHistoryDealGetTicket関数です。MT5はMT4とは異なり、「注文(Order)」「約定(Deal)」「ポジション(Position)」が明確に分離されています。この関数は、その中でも実際に売買が成立した結果である「約定(Deal)」のチケット番号を取得するために使用します。

実務開発において最もつまずきやすいのは、「履歴リストのインデックス」と「チケット番号」の混同です。HistoryDealGetTicketは、選択された履歴リスト内の「○番目(0から始まるインデックス)」を指定して、固有の「チケット番号」を呼び出す役割を持ちます。このチケット番号を取得して初めて、利益や手数料、約定価格といった詳細データにアクセスできるようになります。

主な活用シーンとしては、決済直後にそのトレードの損益(プロフィット)を確認したり、EAのパフォーマンスを動的に計算してロットサイズを調整したりする際に不可欠な関数です。

2. 構文と戻り値

HistoryDealGetTicket関数の構文は非常にシンプルです。

ulong  HistoryDealGetTicket(
   int  index      // 履歴リスト内でのインデックス
   );
  • パラメーター
    • index: 取得したい約定のインデックス番号です。0から「履歴の総数 – 1」の範囲で指定します。
  • 戻り値
    • 成功した場合:約定のチケット番号ulong型)を返します。
    • 失敗した場合:0を返します。

※この関数を呼び出す前に、必ずHistorySelectまたはHistorySelectByPositionを呼び出して、メモリ上に履歴をロードしておく必要があります。

3. 具体的な使い方・実践サンプルコード

以下のコードは、直近に発生した約定(決済など)の損益と手数料を取得する実戦的な例です。

void OnTick()
{
   // 1. 履歴全体をメモリにロード(現在の時刻まで)
   if(!HistorySelect(0, TimeCurrent()))
   {
      Print("履歴の取得に失敗しました");
      return;
   }

   // 2. 履歴内の全約定数を取得
   int totalDeals = HistoryDealsTotal();

   if(totalDeals > 0)
   {
      // 3. 一番最後(最新)の約定インデックスを指定してチケット番号を取得
      // インデックスは0から始まるため、総数から1を引く
      ulong dealTicket = HistoryDealGetTicket(totalDeals - 1);

      if(dealTicket > 0)
      {
         // 4. チケット番号を元に、詳細なデータを取り出す
         double profit = HistoryDealGetDouble(dealTicket, DEAL_PROFIT);      // 損益
         double commission = HistoryDealGetDouble(dealTicket, DEAL_COMMISSION); // 手数料
         double swap = HistoryDealGetDouble(dealTicket, DEAL_SWAP);          // スワップ
         long type = HistoryDealGetInteger(dealTicket, DEAL_TYPE);          // 約定種別

         // 5. 結果を出力(例:決済による約定の場合のみ表示)
         if(type == DEAL_TYPE_BUY || type == DEAL_TYPE_SELL)
         {
            PrintFormat("最新約定チケット: #%I64u, 損益: %.2f, 手数料: %.2f", 
                        dealTicket, profit, commission + swap);
         }
      }
   }
}

4. 使用上の注意点とよくあるエラー

開発初心者が最も陥りやすいエラーは、HistorySelectを呼ばずにこの関数を実行すること」です。MT5の仕様上、履歴データは常にメモリ展開されているわけではありません。HistorySelectを実行しない限り、履歴リストは空のままであり、HistoryDealGetTicketは常に0を返してしまいます。

また、以下の点にも注意が必要です。

  • インデックスの範囲外指定: HistoryDealsTotal()で取得した数以上のインデックスを指定するとエラーになります。必ず「総数 – 1」までの範囲で指定してください。
  • 約定種別の判別: 履歴には売買だけでなく、入出金(DEAL_TYPE_BALANCE)なども含まれます。トレード結果のみを抽出したい場合は、必ずDEAL_TYPEを確認するロジックを入れてください。
  • チケット番号の型: チケット番号は非常に大きな数値になる可能性があるため、int型ではなく必ずulong型(符号なし64ビット整数)を使用してください。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、ロジックの正確さと同等、あるいはそれ以上に重要なのが「実行環境のレイテンシ(通信遅延)」です。FX市場はミリ秒単位で価格が変動しており、特にMQL5を用いた高速なスキャルピングや指標トレードを行う場合、自宅のPC環境からの注文は致命的なリスクを伴います。一般的な家庭用回線では、パケットの揺らぎやプロバイダー経由の遅延(ジッター)が発生し、EAが検知した価格とサーバーで受理される価格の間に乖離(スリッページ)が生じ、本来得られるはずの利益を大きく削ってしまうからです。

プロのクオンツエンジニアが共通して認識しているのは、取引サーバーの至近距離に位置する「専用VPS(仮想専用サーバー)」の利用が不可欠であるという点です。物理的な距離を縮めることでネットワーク遅延を極限まで排除し、安定した約定スピードを確保することは、自動売買における「最低限のインフラ投資」と言えます。どれほど洗練されたアルゴリズムを記述しても、実行環境が貧弱であれば、それは「穴の開いたバケツ」で水を汲むようなものです。安定した収益を目指すのであれば、24時間稼働の安定性と超低遅延を兼ね備えたFX専用VPSの導入を強く推奨します。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました