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

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

MQL5において、HistoryOrderGetTicket「取引履歴の中から、指定したインデックス番号に対応するオーダー(注文)のチケット番号を取得する」ための非常に重要な関数です。

MQL5の設計思想において、現在保有中の「ポジション」と、すでに処理が完了した「オーダー(注文履歴)」や「ディール(約定履歴)」は明確に区別されています。本関数は、過去に出した注文がどのような結果になったか(約定したのか、キャンセルされたのかなど)を追跡する際に不可欠です。

実務でのつまずきポイント:
初心者が最も陥りやすい罠は、「この関数を呼ぶ前に履歴をメモリにロードしていない」ことです。MQL5では、まずHistorySelectなどの関数を使って「どの期間の履歴を読み込むか」をターミナルに指示しなければ、HistoryOrderGetTicketで値を取得することができません。

実務では、直近のトレードが損切りになったのか利確になったのかを判定したり、特定のEAが過去に何回注文を出し、どれが不成立だったかを集計する際によく活用されます。


2. 構文と戻り値

HistoryOrderGetTicket関数の基本的な仕様は以下の通りです。

ulong HistoryOrderGetTicket(
   int  index      // 履歴リスト内でのインデックス番号
);

パラメーター

  • index: 取得したいオーダーのインデックス。0から「履歴にあるオーダー総数 – 1」までの整数を指定します。オーダー総数は HistoryOrdersTotal() で取得できます。

戻り値

  • ulong型: 成功した場合は、そのオーダーの一意な識別番号である「チケット番号」を返します。
  • 失敗した(インデックスが範囲外など)場合は、0 を返します。

この関数で「チケット番号」を取得した後は、HistoryOrderGetDoubleHistoryOrderGetInteger といった関数を使い、そのチケット番号を引数に渡すことで、注文時の価格やロット数、注文種別などの詳細データを抽出できるようになります。


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

以下は、過去24時間以内に行われた注文履歴をスキャンし、それぞれのオーダーチケットと注文種別(買い・売りなど)をエキスパートログに出力するサンプルコードです。

void OnStart()
{
   // 1. まずは履歴を取得する範囲を指定(現在の時刻から24時間前まで)
   datetime end = TimeCurrent();
   datetime start = end - PeriodSeconds(PERIOD_D1);

   // 2. 指定した期間の履歴をメモリにロード(この処理が必須!)
   if(!HistorySelect(start, end))
   {
      Print("履歴の取得に失敗しました。");
      return;
   }

   // 3. ロードされた履歴に含まれるオーダーの総数を取得
   int totalOrders = HistoryOrdersTotal();
   PrintFormat("過去24時間のオーダー総数: %d件", totalOrders);

   // 4. ループで1つずつのオーダーチケットを取得
   for(int i = 0; i < totalOrders; i++)
   {
      // インデックスを指定してチケット番号を取得
      ulong ticket = HistoryOrderGetTicket(i);

      if(ticket > 0)
      {
         // チケット番号を元に、注文のプロパティ(ここでは注文種別)を取得
         ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticket, ORDER_TYPE);
         double volume = HistoryOrderGetDouble(ticket, ORDER_VOLUME_INITIAL);
         string symbol = HistoryOrderGetString(ticket, ORDER_SYMBOL);

         PrintFormat("Index: %d, チケット番号: %d, 通貨ペア: %s, 数量: %.2f, 注文タイプ: %s", 
                     i, ticket, symbol, volume, EnumToString(type));
      }
   }
}

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

  1. HistorySelectの実行忘れ
    前述の通り、HistorySelect または HistorySelectByPosition を実行してリストを作成しない限り、HistoryOrdersTotal() は 0 を返し、HistoryOrderGetTicket も動作しません。

  2. 「オーダー」と「ディール」の混同
    MQL5では「注文(Order)」と「約定(Deal)」は別物です。HistoryOrderGetTicket はあくまで「注文の記録」を扱います。利益額(損益)や実際にいくらで約定したかを知りたい場合は、HistoryDealGetTicket を使用する必要があります。

  3. インデックスの順序
    HistoryOrdersTotal() で得られるリストの並び順は、必ずしも時間順であるとは限りません。特定の注文を探す場合は、ループ内でチケット番号やマジックナンバー、注文時刻(ORDER_TIME_SETUP)をチェックして特定するようにしましょう。


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

アルゴリズムトレードの世界では、ロジックの優位性と同じくらい「物理的な通信環境」が勝敗を分けます。自宅のPCや一般的な光回線でEAを稼働させる場合、ブローカーのサーバーとの間で数十から数百ミリ秒のネットワーク遅延(レイテンシ)が発生します。この遅延は、相場急変時のスリッページを増大させ、バックテストの結果とはかけ離れた「隠れた損失」を生む原因となります。

プロのクオンツや専業トレーダーにとって、ブローカーのデータセンターに近い場所に位置する専用のVPS(仮想専用サーバー)を利用することは、もはやオプションではなく必須条件です。24時間安定した稼働を維持し、極限までネットワーク遅延を削ぎ落とすことで、初めてEA本来のポテンシャルを引き出すことが可能になります。わずかな約定速度の差が、年間の収益率に決定的な差をもたらすことを忘れないでください。

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

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

コメント

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