1. HistoryDealsTotal関数の概要と実務での活用法
MQL5において「履歴」を扱う際、最も基本となる関数の一つが HistoryDealsTotal です。この関数は、現在選択されている取引履歴のリスト内にある「約定(Deal)」の総数を返します。
MT4(MQL4)から移行した開発者が最初につまずくポイントは、MQL5における「注文(Order)」「約定(Deal)」「ポジション(Position)」の厳密な違いです。
– 注文(Order): 取引所に送られたリクエスト。
– 約定(Deal): 注文が執行された結果生じる、売買の事実。
– ポジション(Position): 約定の結果として保有している持ち分。
HistoryDealsTotal は、この中の「約定」をカウントします。実務では、過去のトレード成績(勝率やプロフィットファクター)を自作EA内で計算したり、直前の決済が利確だったのか損切りだったのかを判定して次のエントリーロジックを切り替えたりする際に不可欠な関数です。
2. 構文と戻り値
HistoryDealsTotal 関数の仕様は非常にシンプルです。
int HistoryDealsTotal();
- 引数: なし
- 戻り値: 選択された履歴リスト内の約定数を
int型で返します。
重要な補足:
この関数を呼び出す前に、必ず HistorySelect または HistorySelectByPosition 関数を使用して、どの期間(またはどのポジションID)の履歴をメモリ上に読み込むかを指定する必要があります。これを忘れると、履歴が存在していても戻り値が 0 になってしまいます。
3. 具体的な使い方・実践サンプルコード
以下のコードは、過去24時間に行われた全取引の履歴をスキャンし、総利益と総損失を計算する実用的なスクリプト例です。
void OnStart()
{
// 1. 履歴を取得する範囲を指定(現在時刻から24時間前まで)
datetime end_time = TimeCurrent();
datetime start_time = end_time - (24 * 60 * 60);
// 2. 指定した期間の履歴をメモリにロードする(必須手順)
if(!HistorySelect(start_time, end_time))
{
Print("履歴の取得に失敗しました。");
return;
}
// 3. 読み込まれた履歴内の「約定(Deal)」総数を取得
int total_deals = HistoryDealsTotal();
double total_profit = 0.0;
int trade_count = 0;
// 4. ループで1件ずつの約定データをチェック
for(int i = 0; i < total_deals; i++)
{
// インデックスからチケット番号を取得
ulong ticket = HistoryDealGetTicket(i);
if(ticket > 0)
{
// 約定のタイプ(入出金などは除外)と利益を取得
long type = HistoryDealGetInteger(ticket, DEAL_TYPE);
double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
double commission = HistoryDealGetDouble(ticket, DEAL_COMMISSION);
double swap = HistoryDealGetDouble(ticket, DEAL_SWAP);
// 売買による約定のみをカウント(DEAL_TYPE_BUY または DEAL_TYPE_SELL)
if(type == DEAL_TYPE_BUY || type == DEAL_TYPE_SELL)
{
total_profit += (profit + commission + swap);
trade_count++;
}
}
}
PrintFormat("過去24時間の約定数: %d 件, 合計損益: %.2f", trade_count, total_profit);
}
4. 使用上の注意点とよくあるエラー
開発現場でよく遭遇するトラブルとその回避策をまとめました。
- HistorySelectの呼び出し忘れ:
最も多いミスです。HistoryDealsTotalは「現在メモリにロードされているリスト」の数を返すだけです。事前にHistorySelect(開始日, 終了日)を実行して、検索対象の期間をMT5に教えてあげる必要があります。 - インデックスは「0」から始まる:
HistoryDealsTotalが10を返した場合、約定を特定するためのインデックス番号は0から9までとなります。ループの条件式をi <= total_dealsとすると、範囲外アクセス(Array out of rangeに近いエラー)の原因になります。 - 取引以外の「約定」に注意:
約定履歴には、売買だけでなく「入出金(DEAL_TYPE_BALANCE)」や「ボーナスの付与」なども含まれます。純粋なトレード結果を集計したい場合は、必ずDEAL_TYPEをチェックして、売買(BUY/SELL)のみを抽出するようにしてください。
5. 【重要】自動売買における約定スピードと環境の罠
プロのクオンツエンジニアとして、ロジック以上に重視すべきなのが「実行環境」です。MQL5でどれほど完璧なコードを書き、HistoryDealsTotal を駆使して高度な履歴分析を実装しても、あなたのPCが自宅にあるなら、その優位性はネットワーク遅延(レイテンシ)によって打ち消されてしまいます。
FX市場の価格はミリ秒単位で変動しており、自宅のインターネット回線では注文が証券会社のサーバーに届くまでに数十から数百ミリ秒の遅延が発生します。この遅れは「スリッページ」を招き、バックテストの結果とはかけ離れた損失を生む原因となります。アルゴリズムトレードで安定した収益を上げるには、証券会社のサーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」を利用することが不可欠です。約定スピードを極限まで高めることは、コードを最適化することと同じ、あるいはそれ以上に重要な技術的投資であると断言できます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント