1. HistoryOrderGetTicket関数の概要と実務での活用法
MQL5において、HistoryOrderGetTicketは「取引履歴の中から、指定したインデックス番号に対応するオーダー(注文)のチケット番号を取得する」ための非常に重要な関数です。
MQL5の設計思想において、現在保有中の「ポジション」と、すでに処理が完了した「オーダー(注文履歴)」や「ディール(約定履歴)」は明確に区別されています。本関数は、過去に出した注文がどのような結果になったか(約定したのか、キャンセルされたのかなど)を追跡する際に不可欠です。
実務でのつまずきポイント:
初心者が最も陥りやすい罠は、「この関数を呼ぶ前に履歴をメモリにロードしていない」ことです。MQL5では、まずHistorySelectなどの関数を使って「どの期間の履歴を読み込むか」をターミナルに指示しなければ、HistoryOrderGetTicketで値を取得することができません。
実務では、直近のトレードが損切りになったのか利確になったのかを判定したり、特定のEAが過去に何回注文を出し、どれが不成立だったかを集計する際によく活用されます。
2. 構文と戻り値
HistoryOrderGetTicket関数の基本的な仕様は以下の通りです。
ulong HistoryOrderGetTicket(
int index // 履歴リスト内でのインデックス番号
);
パラメーター
- index: 取得したいオーダーのインデックス。0から「履歴にあるオーダー総数 – 1」までの整数を指定します。オーダー総数は
HistoryOrdersTotal()で取得できます。
戻り値
- ulong型: 成功した場合は、そのオーダーの一意な識別番号である「チケット番号」を返します。
- 失敗した(インデックスが範囲外など)場合は、
0を返します。
この関数で「チケット番号」を取得した後は、HistoryOrderGetDouble や HistoryOrderGetInteger といった関数を使い、そのチケット番号を引数に渡すことで、注文時の価格やロット数、注文種別などの詳細データを抽出できるようになります。
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. 使用上の注意点とよくあるエラー
-
HistorySelectの実行忘れ
前述の通り、HistorySelectまたはHistorySelectByPositionを実行してリストを作成しない限り、HistoryOrdersTotal()は 0 を返し、HistoryOrderGetTicketも動作しません。 -
「オーダー」と「ディール」の混同
MQL5では「注文(Order)」と「約定(Deal)」は別物です。HistoryOrderGetTicketはあくまで「注文の記録」を扱います。利益額(損益)や実際にいくらで約定したかを知りたい場合は、HistoryDealGetTicketを使用する必要があります。 -
インデックスの順序
HistoryOrdersTotal()で得られるリストの並び順は、必ずしも時間順であるとは限りません。特定の注文を探す場合は、ループ内でチケット番号やマジックナンバー、注文時刻(ORDER_TIME_SETUP)をチェックして特定するようにしましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードの世界では、ロジックの優位性と同じくらい「物理的な通信環境」が勝敗を分けます。自宅のPCや一般的な光回線でEAを稼働させる場合、ブローカーのサーバーとの間で数十から数百ミリ秒のネットワーク遅延(レイテンシ)が発生します。この遅延は、相場急変時のスリッページを増大させ、バックテストの結果とはかけ離れた「隠れた損失」を生む原因となります。
プロのクオンツや専業トレーダーにとって、ブローカーのデータセンターに近い場所に位置する専用のVPS(仮想専用サーバー)を利用することは、もはやオプションではなく必須条件です。24時間安定した稼働を維持し、極限までネットワーク遅延を削ぎ落とすことで、初めてEA本来のポテンシャルを引き出すことが可能になります。わずかな約定速度の差が、年間の収益率に決定的な差をもたらすことを忘れないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント