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

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

MQL5において、HistoryOrderGetIntegerは「過去の注文履歴」から整数型のデータ(マジックナンバー、注文タイプ、注文状態など)を取得するための非常に重要な関数です。

実務開発において、初心者が最もつまずきやすいポイントは「現在の保有ポジション」と「過去の履歴」の区別です。MQL5では、現在動いている注文(待機注文)と、すでに約定・キャンセルされた注文は完全に別物として扱われます。HistoryOrderGetIntegerは後者、つまり「決済された後のデータ」や「約定した瞬間の注文詳細」を振り返る際に使用します。

具体的には、以下のようなシーンで活用します。
– 自作EAが過去にどのような理由(指値か逆指値かなど)でエントリーしたかを特定する。
– 特定のマジックナンバーを持つ注文が、最終的に「約定(FILLED)」したのか「キャンセル(CANCELED)」されたのかを判定する。
– 損益グラフや取引履歴を独自に集計するロジックを組み込む。

この関数を使いこなすことで、単に売買するだけでなく、「なぜそのトレードが起きたのか」という高度なバックテスト分析や証拠金管理が可能になります。

2. 構文と戻り値

HistoryOrderGetInteger関数の構文は以下の通りです。

long  HistoryOrderGetInteger(
   ulong                        ticket_number,     // 注文チケット番号
   ENUM_ORDER_PROPERTY_INTEGER  property_id        // プロパティ識別子
   );

パラメーター

  1. ticket_number: 取得したい注文の「チケット番号」を指定します。この番号はあらかじめ HistoryOrderGetTicket などで取得しておく必要があります。
  2. property_id: 取得したい情報の種類を ENUM_ORDER_PROPERTY_INTEGER 型の中から指定します。

よく使われる識別子(property_id)

  • ORDER_MAGIC: EAを識別するマジックナンバー。
  • ORDER_TYPE: 注文の種類(買い、売り、指値など)。
  • ORDER_STATE: 注文の状態(約定済み、キャンセル済みなど)。
  • ORDER_REASON: 注文が出された理由(EAによるものか、手動か、など)。

戻り値

指定したプロパティの値を long 型で返します。データの取得に失敗した場合は 0 を返しますが、0 自体が有効な値(例:ORDER_TYPE_BUY)であることもあるため、厳密なエラーチェックには GetLastError() を併用します。

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

この関数を使用する際は、必ず事前に HistorySelect 関数を呼び出して、ターミナルの履歴メモリをロードしておく必要があります。以下のコードは、直近1週間の履歴から、特定のマジックナンバーを持つ注文の結果を表示する例です。

void OnStart()
{
   // 1. 履歴の範囲を指定(現在から1週間前まで)
   datetime end_time = TimeCurrent();
   datetime start_time = end_time - (7 * 24 * 60 * 60);

   // 2. 履歴を選択(これを行わないとHistoryOrderGet...は動作しません)
   if(!HistorySelect(start_time, end_time))
   {
      Print("履歴の取得に失敗しました。");
      return;
   }

   // 3. 履歴内の注文総数を取得
   int total_orders = HistoryOrdersTotal();

   for(int i = 0; i < total_orders; i++)
   {
      // インデックスからチケット番号を取得
      ulong ticket = HistoryOrderGetTicket(i);

      if(ticket > 0)
      {
         // 4. HistoryOrderGetIntegerで各種情報を取得
         long magic  = HistoryOrderGetInteger(ticket, ORDER_MAGIC);
         long type   = HistoryOrderGetInteger(ticket, ORDER_TYPE);
         long state  = HistoryOrderGetInteger(ticket, ORDER_STATE);

         // ログに出力
         PrintFormat("注文チケット: %I64u, マジックナンバー: %d, タイプ: %s, 状態: %s",
                     ticket, 
                     magic, 
                     EnumToString((ENUM_ORDER_TYPE)type), 
                     EnumToString((ENUM_ORDER_STATE)state));
      }
   }
}

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

開発者が陥りやすいミスとして、以下の3点に注意してください。

  1. HistorySelectの呼び出し忘れ:
    HistoryOrderGetInteger を呼ぶ前に、必ず HistorySelect または HistorySelectByPosition を実行して履歴をキャッシュに読み込む必要があります。これを忘れると、関数は常に失敗します。

  2. 「注文(Order)」と「約定(Deal)」の混同:
    MQL5では、注文(Order)は「〜を買いたいという依頼」であり、約定(Deal)は「実際に取引が成立した結果」です。利益や手数料などの「お金」に関する情報を取得したい場合は、HistoryOrder... ではなく HistoryDeal... 系の関数を使用する必要があります。

  3. チケット番号の有効性:
    HistoryOrderGetInteger に渡すチケット番号は、必ず履歴内に存在するものでなければなりません。待機中の注文チケットをこの関数に渡してもデータは取得できません(その場合は OrderGetInteger を使用します)。

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

アルゴリズムトレードにおいて、ロジックの正確さと同じくらい、あるいはそれ以上に重要なのが「通信環境」です。多くの個人開発者は自宅のPCや一般的な光回線でEAを運用しようとしますが、これはプロの視点から見ると極めてリスクが高い行為です。家庭用回線では、FX業者のサーバーとの間に数十ミリ秒(ms)から数百ミリ秒の遅延(レイテンシ)が発生します。このわずかな遅延の間に価格が動き、本来意図した価格で約定しない「スリッページ」が発生し、期待期待値を大幅に削り取ってしまうのです。

特に、1日に何度も取引を行うスキャルピングやデイトレードの戦略において、ネットワーク遅延は致命的な損失に直結します。極限まで約定スピードを高め、不慮のPCシャットダウンやアップデートによる停止を防ぐためには、FX業者と同じデータセンター内、あるいは物理的に極めて近い距離に設置された自動売買専用のVPS(仮想専用サーバー)の利用が不可欠です。安定した24時間稼働と低レイテンシ環境を整えることは、システムトレーダーとして勝つための「最低限のインフラ投資」と言えます。

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

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

コメント

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