1. HistoryOrderGetInteger関数の概要と実務での活用法
MQL5において、HistoryOrderGetIntegerは「過去の注文履歴」から整数型のデータ(マジックナンバー、注文タイプ、注文状態など)を取得するための非常に重要な関数です。
実務開発において、初心者が最もつまずきやすいポイントは「現在の保有ポジション」と「過去の履歴」の区別です。MQL5では、現在動いている注文(待機注文)と、すでに約定・キャンセルされた注文は完全に別物として扱われます。HistoryOrderGetIntegerは後者、つまり「決済された後のデータ」や「約定した瞬間の注文詳細」を振り返る際に使用します。
具体的には、以下のようなシーンで活用します。
– 自作EAが過去にどのような理由(指値か逆指値かなど)でエントリーしたかを特定する。
– 特定のマジックナンバーを持つ注文が、最終的に「約定(FILLED)」したのか「キャンセル(CANCELED)」されたのかを判定する。
– 損益グラフや取引履歴を独自に集計するロジックを組み込む。
この関数を使いこなすことで、単に売買するだけでなく、「なぜそのトレードが起きたのか」という高度なバックテスト分析や証拠金管理が可能になります。
2. 構文と戻り値
HistoryOrderGetInteger関数の構文は以下の通りです。
long HistoryOrderGetInteger(
ulong ticket_number, // 注文チケット番号
ENUM_ORDER_PROPERTY_INTEGER property_id // プロパティ識別子
);
パラメーター
- ticket_number: 取得したい注文の「チケット番号」を指定します。この番号はあらかじめ
HistoryOrderGetTicketなどで取得しておく必要があります。 - 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点に注意してください。
-
HistorySelectの呼び出し忘れ:
HistoryOrderGetIntegerを呼ぶ前に、必ずHistorySelectまたはHistorySelectByPositionを実行して履歴をキャッシュに読み込む必要があります。これを忘れると、関数は常に失敗します。 -
「注文(Order)」と「約定(Deal)」の混同:
MQL5では、注文(Order)は「〜を買いたいという依頼」であり、約定(Deal)は「実際に取引が成立した結果」です。利益や手数料などの「お金」に関する情報を取得したい場合は、HistoryOrder...ではなくHistoryDeal...系の関数を使用する必要があります。 -
チケット番号の有効性:
HistoryOrderGetIntegerに渡すチケット番号は、必ず履歴内に存在するものでなければなりません。待機中の注文チケットをこの関数に渡してもデータは取得できません(その場合はOrderGetIntegerを使用します)。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確さと同じくらい、あるいはそれ以上に重要なのが「通信環境」です。多くの個人開発者は自宅のPCや一般的な光回線でEAを運用しようとしますが、これはプロの視点から見ると極めてリスクが高い行為です。家庭用回線では、FX業者のサーバーとの間に数十ミリ秒(ms)から数百ミリ秒の遅延(レイテンシ)が発生します。このわずかな遅延の間に価格が動き、本来意図した価格で約定しない「スリッページ」が発生し、期待期待値を大幅に削り取ってしまうのです。
特に、1日に何度も取引を行うスキャルピングやデイトレードの戦略において、ネットワーク遅延は致命的な損失に直結します。極限まで約定スピードを高め、不慮のPCシャットダウンやアップデートによる停止を防ぐためには、FX業者と同じデータセンター内、あるいは物理的に極めて近い距離に設置された自動売買専用のVPS(仮想専用サーバー)の利用が不可欠です。安定した24時間稼働と低レイテンシ環境を整えることは、システムトレーダーとして勝つための「最低限のインフラ投資」と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント