OnTrade関数の働き・役割
OnTrade関数は、Tradeイベントが発生するときにエキスパートアドバイザー(EA)で呼び出され、注文、ポジション、取引リストの変更を処理するためのものです。この関数は、指値注文の実行、ポジションの開閉、ストップの設定、指値注文の発動など、様々な取引操作が行われた際に呼び出されます。取引サーバは、取引イベントに関するメッセージを端末に送信し、これによりEAは必要な処理を実行します。
OnTrade関数は次のような状況で呼び出されます:
- アクティブ注文の変更
- ポジションの変更
- 約定の変更
- 取引履歴の変更
それぞれのTradeイベントは、1つまたは複数の取引要求の結果として発生することがあります。
これにより、各操作によって注文、ポジション、取引履歴の状態が変更されることがあります。
EAでは、OnTrade関数を使用して、これらのイベントに対する処理を行います。例えば、新しい注文が追加された場合や既存のポジションが変更された場合に、その変化を検知して適切な処理を行います。
OnTrade関数は、OnTradeTransaction関数が呼び出された後で呼び出されます。一般に、OnTrade関数とOnTradeTransaction関数の呼び出し回数には正確な相関関係はなく、1つのOnTrade関数呼び出しが複数のOnTradeTransaction関数呼び出しに対応することがあります。
OnTrade関数の引数について
void OnTrade(void);
OnTrade関数の戻り値について
OnTrade関数は戻り値を持ちません。関数の宣言からも分かるように、関数の戻り値はvoidです。
OnTrade関数を使う際の注意点
OnTrade関数はエキスパートアドバイザー(EA)でのみ呼び出されます。インジケータやスクリプトには使用されません。同じ名前と型の関数を追加しても、これらのプログラムでは動作しないため注意が必要です。
指値注文の実行、ポジションの開閉、ストップの設定、指値注文の発動などの取引操作によって、注文や取引の履歴、またはポジションと現在の注文リストが変更されます。
履歴から注文と取引に関する関連データを検索する際には、まずHistorySelect関数を使用して取引履歴リクエストを実行する必要があります。
取引リクエストはOrderSend関数またはOrderSendAsync関数を使用してサーバに送信されますが、各リクエストは複数の取引イベントを引き起こす可能性があり、「1つのリクエスト – 1つの取引イベント」という単純な構造ではないことを理解しておく必要があります。
OnTrade関数は、OnTradeTransaction関数が呼び出された後に呼び出されますが、これらの関数の呼び出し回数には正確な相関関係がないため、1回のOnTrade関数呼び出しが複数のOnTradeTransaction関数呼び出しに対応することがあります。この点も考慮してコードを設計する必要があります。
OnTrade関数を使った公式リファレンスのサンプルコード
OnTrade関数を使った公式リファレンスのサンプルコードは以下の通りです。
※わかりやすくする為、日本語コメントアウトを独自に付与してあります。下記サンプルコードを使い、OnTrade関数の使い方を解説していきます。
//+------------------------------------------------------------------+
//| OnTrade_Sample.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
// 取引履歴の日数を設定するための入力パラメータ
input int days = 7;
// グローバルスコープで取引履歴の上限を設定する
datetime start; // 取引履歴の開始日
datetime end; // 取引履歴の終了日
// グローバルカウンタ
int orders; // アクティブ注文数
int positions; // ポジション数
int deals; // 取引履歴内の約定数
int history_orders; // 取引履歴内の注文数
bool started = false; // カウンタ有効性のフラグ
//+------------------------------------------------------------------+
//| エキスパート初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 取引履歴の終了日を現在時刻に設定
end = TimeCurrent();
// 取引履歴の開始日を設定
start = end - days * PeriodSeconds(PERIOD_D1);
// 取引履歴の開始日と終了日をコンソールに出力
PrintFormat("取引履歴の期間: 開始 - %s, 終了 - %s", TimeToString(start), TimeToString(end));
// カウンタを初期化
InitCounters();
return(0);
}
//+------------------------------------------------------------------+
//| ポジション、注文、取引カウンタの初期化関数 |
//+------------------------------------------------------------------+
void InitCounters()
{
// エラーフラグをリセット
ResetLastError();
// 取引履歴を読み込む
bool selected = HistorySelect(start, end);
// 取引履歴の読み込みに失敗した場合
if (!selected)
{
PrintFormat("取引履歴の読み込みに失敗しました。期間: %s から %s まで。エラーコード: %d",
TimeToString(start), TimeToString(end), GetLastError());
return;
}
// 現在のアクティブ注文数を取得
orders = OrdersTotal();
// 現在のポジション数を取得
positions = PositionsTotal();
// 現在の取引履歴内の約定数を取得
deals = HistoryDealsTotal();
// 現在の取引履歴内の注文数を取得
history_orders = HistoryOrdersTotal();
// カウンタの有効性を示すフラグを立てる
started = true;
// カウンタの初期化が成功したことをコンソールに出力
Print("注文、ポジション、取引のカウンタが正常に初期化されました");
}
//+------------------------------------------------------------------+
//| エキスパートティック関数 |
//+------------------------------------------------------------------+
void OnTick()
{
// カウンタが有効な場合は取引処理関数を呼び出す
if (started) SimpleTradeProcessor();
// カウンタが無効な場合はカウンタを初期化する
else InitCounters();
}
//+------------------------------------------------------------------+
//| Tradeイベントが到着すると呼び出される関数 |
//+------------------------------------------------------------------+
void OnTrade()
{
// カウンタが有効な場合は取引処理関数を呼び出す
if (started) SimpleTradeProcessor();
// カウンタが無効な場合はカウンタを初期化する
else InitCounters();
}
//+------------------------------------------------------------------+
//| 取引と履歴の変更を処理する関数 |
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
{
// 現在時刻を取得
end = TimeCurrent();
// エラーフラグをリセット
ResetLastError();
// 指定された期間の取引履歴を読み込む
bool selected = HistorySelect(start, end);
// 取引履歴の読み込みに失敗した場合
if (!selected)
{
PrintFormat("取引履歴の読み込みに失敗しました。期間: %s から %s まで。エラーコード: %d",
TimeToString(start), TimeToString(end), GetLastError());
return;
}
// 現在のアクティブ注文数を取得
int curr_orders = OrdersTotal();
// 現在のポジション数を取得
int curr_positions = PositionsTotal();
// 現在の取引履歴内の約定数を取得
int curr_deals = HistoryDealsTotal();
// 現在の取引履歴内の注文数を取得
int curr_history_orders = HistoryOrdersTotal();
// アクティブ注文の数が変更されているかを確認
if (curr_orders != orders)
{
PrintFormat("アクティブ注文数が変更されました。前の値: %d, 現在の値: %d", orders, curr_orders);
orders = curr_orders; // 値を更新
}
// ポジション数の変更を確認
if (curr_positions != positions)
{
PrintFormat("ポジション数が変更されました。前の値: %d, 現在の値: %d", positions, curr_positions);
positions = curr_positions; // 値を更新
}
// 取引履歴内の約定数の変更を確認
if (curr_deals != deals)
{
PrintFormat("取引履歴内の約定数が変更されました。前の値: %d, 現在の値: %d", deals, curr_deals);
deals = curr_deals; // 値を更新
}
// 取引履歴内の注文数の変更を確認
if (curr_history_orders != history_orders)
{
PrintFormat("取引履歴内の注文数が変更されました。前の値: %d, 現在の値: %d", history_orders, curr_history_orders);
history_orders = curr_history_orders; // 値を更新
}
// 取引履歴の開始日を更新する必要があるか確認
CheckStartDateInTradeHistory();
}
//+------------------------------------------------------------------+
//| 取引履歴リクエストの開始日の変更関数 |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
{
// 現在時刻から履歴の開始日を計算
datetime curr_start = TimeCurrent() - days * PeriodSeconds(PERIOD_D1);
// 取引履歴の開始日が意図した日付から1日以上経過していないか確認
if (curr_start - start > PeriodSeconds(PERIOD_D1))
{
// 履歴の開始日を修正
start = curr_start;
PrintFormat("取引履歴の新しい開始日: %s", TimeToString(start));
// 更新された期間の取引履歴を再度読み込む
HistorySelect(start, end);
// 約定および注文カウンタを修正
history_orders = HistoryOrdersTotal();
deals = HistoryDealsTotal();
}
}
解説1: OnInit関数グローバル領域での定義
// 取引履歴の日数を設定するための入力パラメータ
input int days = 7;
// グローバルスコープで取引履歴の上限を設定する
datetime start; // 取引履歴の開始日
datetime end; // 取引履歴の終了日
// グローバルカウンタ
int orders; // アクティブ注文数
int positions; // ポジション数
int deals; // 取引履歴内の約定数
int history_orders; // 取引履歴内の注文数
bool started = false; // カウンタ有効性のフラグ
取引履歴の日数を設定するための入力パラメータ
input int days は、取引履歴の日数を設定するための入力パラメータです。ユーザーは、このパラメータを変更することで、取引履歴の期間を調整することができます。初期値は7日間に設定されています。
グローバルスコープで取引履歴の上限を設定する
dateTime start と dateTime end は、取引履歴の開始日と終了日を示すために使用されます。start は取引履歴の開始日を、end は取引履歴の終了日を表します。
グローバルカウンタ
- int orders は、現在のアクティブ注文数を保持するための変数です。
- int positions は、現在のポジション数を保持するための変数です。
- int deals は、取引履歴内の約定数を保持するための変数です。
- int history_orders は、取引履歴内の注文数を保持するための変数です。
- bool started は、カウンタの有効性を示すためのフラグです。カウンタが初期化された後、このフラグは true に設定されます。
これらの変数は、エキスパートアドバイザー全体で共有される情報を保持し、取引イベントが発生した際に適切に処理するために使用されます。
※注文(オーダー)は、取引プラットフォームに対して特定の金融商品の売買を指示することで、具体的な価格や数量を指定して出される取引の依頼を指します。これは、OrderSend関数などを使ってサーバに送信されます。
約定(ディール)は、その注文が市場で受け入れられ、実際に取引が成立したことを意味します。これは、注文が完全に処理され、売買が完了したことを示します。約定はHistoryDealsTotal関数などを使って取引履歴として確認することができます。
解説2: OnInit関数
//+------------------------------------------------------------------+
//| エキスパート初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 取引履歴の終了日を現在時刻に設定
end = TimeCurrent();
// 取引履歴の開始日を設定
start = end - days * PeriodSeconds(PERIOD_D1);
// 取引履歴の開始日と終了日をエキスパートログに出力
PrintFormat("取引履歴の期間: 開始 - %s, 終了 - %s", TimeToString(start), TimeToString(end));
// カウンタを初期化
InitCounters();
return(0);
}
エキスパート初期化関数
OnInit関数は、エキスパートアドバイザー(EA)が初期化される際に最初に呼び出される関数です。この関数では、EAの実行に必要な初期設定を行います。
取引履歴の終了日を現在時刻に設定
end変数は、取引履歴の終了日を保持するためのもので、TimeCurrent関数を使用して現在時刻を取得し、これをendに設定します。これにより、取引履歴の終了日が現在時刻に設定されます。
取引履歴の開始日を設定
start変数は、取引履歴の開始日を保持するためのもので、endから指定された日数(days)を引いた日付に設定されます。PeriodSeconds関数は、指定された期間(ここではPERIOD_D1、つまり1日)の秒数を返します。これにより、取引履歴の開始日が設定されます。
取引履歴の開始日と終了日をエキスパートログに出力
PrintFormat関数を使用して、取引履歴の開始日と終了日をエキスパートログに出力します。TimeToString関数を使用して、dateTime型のstartとendを文字列に変換します。これにより、取引履歴の期間がエキスパートログに表示され、確認することができます。
カウンタを初期化
InitCounters関数を呼び出して、グローバルカウンタ(注文数、ポジション数、約定数など)を初期化します。これにより、EAが動作を開始する前に必要なデータが準備されます。
戻り値
OnInit関数は、初期化が正常に完了した場合に0を返します。この戻り値は、EAの初期化ステータスを示します。
解説3: InitCounters関数(オリジナル関数)
//+------------------------------------------------------------------+
//| ポジション、注文、取引カウンタの初期化関数 |
//+------------------------------------------------------------------+
void InitCounters()
{
// エラーフラグをリセット
ResetLastError();
// 取引履歴を読み込む
bool selected = HistorySelect(start, end);
// 取引履歴の読み込みに失敗した場合
if (!selected)
{
PrintFormat("取引履歴の読み込みに失敗しました。期間: %s から %s まで。エラーコード: %d",
TimeToString(start), TimeToString(end), GetLastError());
return;
}
// 現在のアクティブ注文数を取得
orders = OrdersTotal();
// 現在のポジション数を取得
positions = PositionsTotal();
// 現在の取引履歴内の約定数を取得
deals = HistoryDealsTotal();
// 現在の取引履歴内の注文数を取得
history_orders = HistoryOrdersTotal();
// カウンタの有効性を示すフラグを立てる
started = true;
// カウンタの初期化が成功したことをエキスパートログに出力
Print("注文、ポジション、取引のカウンタが正常に初期化されました");
}
ポジション、注文、取引カウンタの初期化関数
InitCounters関数は、エキスパートアドバイザー(EA)の動作に必要なカウンタを初期化するための関数です。この関数は、取引履歴や現在の取引状況を取得し、それを基にカウンタを設定します。
エラーフラグをリセット
ResetLastError関数を使用して、前回のエラーフラグをリセットします。これにより、後続の処理でエラーチェックが正しく行われるようにします。
取引履歴を読み込む
HistorySelect関数を使用して、指定された期間(startからendまで)の取引履歴を読み込みます。この関数が成功すると、selected変数はtrueになります。
取引履歴の読み込みに失敗した場合
取引履歴の読み込みに失敗した場合、PrintFormat関数を使用してエラー情報をエキスパートログに出力します。エラーコードはGetLastError関数を使用して取得されます。
現在のアクティブ注文数を取得
OrdersTotal関数を使用して、現在のアクティブな注文の数を取得し、orders変数に設定します。
現在のポジション数を取得
PositionsTotal関数を使用して、現在のポジションの数を取得し、positions変数に設定します。
現在の取引履歴内の約定数を取得
HistoryDealsTotal関数を使用して、取引履歴内の約定数を取得し、deals変数に設定します。
現在の取引履歴内の注文数を取得
HistoryOrdersTotal関数を使用して、取引履歴内の注文数を取得し、history_orders変数に設定します。
カウンタの有効性を示すフラグを立てる
カウンタが正常に初期化されたことを示すために、started変数をtrueに設定します。
カウンタの初期化が成功したことをエキスパートログに出力
Print関数を使用して、カウンタの初期化が成功したことをエキスパートログに出力します。これにより、初期化が正常に完了したことを確認できます。
解説4: OnTick関数
//+------------------------------------------------------------------+
//| OnTick関数
//+------------------------------------------------------------------+
void OnTick()
{
// カウンタが有効な場合は取引処理関数を呼び出す
if (started) SimpleTradeProcessor();
// カウンタが無効な場合はカウンタを初期化する
else InitCounters();
}
OnTick関数
OnTick関数は、エキスパートアドバイザー(EA)が市場のティックデータを受け取った際に呼び出される関数です。ティックデータとは、価格の変動を示すデータであり、EAが取引の判断を行うために使用されます。この関数では、取引処理を実行するか、カウンタを初期化するかを判断します。
カウンタが有効な場合は取引処理関数を呼び出す
if (started) という条件文では、カウンタの有効性を示すフラグであるstarted変数がtrueかどうかを確認します。startedがtrueの場合、SimpleTradeProcessor関数を呼び出して取引処理を実行します。
カウンタが無効な場合はカウンタを初期化する
else条件文では、started変数がfalseの場合にInitCounters関数を呼び出してカウンタを初期化します。これにより、カウンタが無効な場合でも正しい初期化を行い、次回のティックデータ受信時に取引処理が正常に行えるようにします。
OnTick関数は、エキスパートアドバイザーの動作中に継続的に呼び出されるため、効率的に取引処理やカウンタの初期化を行うことが重要です。この関数の構造により、EAは常に最新の取引情報に基づいて動作することができます。
解説5: OnTrade関数
//+------------------------------------------------------------------+
//| Tradeイベントが到着すると呼び出される関数 |
//+------------------------------------------------------------------+
void OnTrade()
{
// カウンタが有効な場合は取引処理関数を呼び出す
if (started) SimpleTradeProcessor();
// カウンタが無効な場合はカウンタを初期化する
else InitCounters();
}
Tradeイベントが到着すると呼び出される関数
OnTrade関数は、Tradeイベントが発生した際に呼び出される関数です。Tradeイベントは、新しい注文の追加、既存のポジションの変更、取引履歴の更新など、取引に関連する何らかの変更が発生したときにサーバから送信されます。この関数では、取引の状態を確認し、必要な処理を実行します。
カウンタが有効な場合は取引処理関数を呼び出す
if (started) という条件文では、カウンタの有効性を示すフラグであるstarted変数がtrueかどうかを確認します。startedがtrueの場合、SimpleTradeProcessor関数を呼び出して取引処理を実行します。これは、カウンタが正しく初期化されている場合に取引の変更を適切に処理するためです。
カウンタが無効な場合はカウンタを初期化する
else条件文では、started変数がfalseの場合にInitCounters関数を呼び出してカウンタを初期化します。これにより、カウンタが無効な場合でも正しい初期化を行い、次回のTradeイベント受信時に取引処理が正常に行えるようにします。
OnTrade関数は、エキスパートアドバイザーが取引の変更に迅速に対応できるようにするために重要な役割を果たします。この関数により、EAは市場の変動に適応し、取引状況の変化に応じて適切なアクションを取ることができます。
解説6: SimpleTradeProcessor関数(オリジナル関数)
//+------------------------------------------------------------------+
//| 取引と履歴の変更を処理する関数 |
//+------------------------------------------------------------------+
void SimpleTradeProcessor()
{
// 現在時刻を取得
end = TimeCurrent();
// エラーフラグをリセット
ResetLastError();
// 指定された期間の取引履歴を読み込む
bool selected = HistorySelect(start, end);
// 取引履歴の読み込みに失敗した場合
if (!selected)
{
PrintFormat("取引履歴の読み込みに失敗しました。期間: %s から %s まで。エラーコード: %d",
TimeToString(start), TimeToString(end), GetLastError());
return;
}
// 現在のアクティブ注文数を取得
int curr_orders = OrdersTotal();
// 現在のポジション数を取得
int curr_positions = PositionsTotal();
// 現在の取引履歴内の約定数を取得
int curr_deals = HistoryDealsTotal();
// 現在の取引履歴内の注文数を取得
int curr_history_orders = HistoryOrdersTotal();
// アクティブ注文の数が変更されているかを確認
if (curr_orders != orders)
{
PrintFormat("アクティブ注文数が変更されました。前の値: %d, 現在の値: %d", orders, curr_orders);
orders = curr_orders; // 値を更新
}
// ポジション数の変更を確認
if (curr_positions != positions)
{
PrintFormat("ポジション数が変更されました。前の値: %d, 現在の値: %d", positions, curr_positions);
positions = curr_positions; // 値を更新
}
// 取引履歴内の約定数の変更を確認
if (curr_deals != deals)
{
PrintFormat("取引履歴内の約定数が変更されました。前の値: %d, 現在の値: %d", deals, curr_deals);
deals = curr_deals; // 値を更新
}
// 取引履歴内の注文数の変更を確認
if (curr_history_orders != history_orders)
{
PrintFormat("取引履歴内の注文数が変更されました。前の値: %d, 現在の値: %d", history_orders, curr_history_orders);
history_orders = curr_history_orders; // 値を更新
}
// 取引履歴の開始日を更新する必要があるか確認
CheckStartDateInTradeHistory();
}
取引と履歴の変更を処理する関数
SimpleTradeProcessor関数は、取引履歴と現在の取引状態を処理し、必要に応じてカウンタを更新するための関数です。この関数は、取引の変更が発生した際に呼び出され、最新の取引情報を反映させます。
現在時刻を取得
TimeCurrent関数を使用して、現在時刻を取得し、それをend変数に設定します。これにより、最新の取引履歴を取得するための終了日時が設定されます。
エラーフラグをリセット
ResetLastError関数を使用して、前回のエラーフラグをリセットします。これにより、後続の処理でエラーチェックが正しく行われるようにします。
指定された期間の取引履歴を読み込む
HistorySelect関数を使用して、指定された期間(startからendまで)の取引履歴を読み込みます。この関数が成功すると、selected変数はtrueになります。
取引履歴の読み込みに失敗した場合
取引履歴の読み込みに失敗した場合、PrintFormat関数を使用してエラー情報をエキスパートログに出力します。エラーコードはGetLastError関数を使用して取得されます。
現在のアクティブ注文数を取得
OrdersTotal関数を使用して、現在のアクティブな注文の数を取得し、curr_orders変数に設定します。
現在のポジション数を取得
PositionsTotal関数を使用して、現在のポジションの数を取得し、curr_positions変数に設定します。
現在の取引履歴内の約定数を取得
HistoryDealsTotal関数を使用して、取引履歴内の約定数を取得し、curr_deals変数に設定します。
現在の取引履歴内の注文数を取得
HistoryOrdersTotal関数を使用して、取引履歴内の注文数を取得し、curr_history_orders変数に設定します。
アクティブ注文の数が変更されているかを確認
curr_ordersとorders変数を比較し、アクティブ注文数が変更されているかどうかを確認します。変更されている場合、PrintFormat関数を使用して変更内容をエキスパートログに出力し、orders変数を更新します。
ポジション数の変更を確認
curr_positionsとpositions変数を比較し、ポジション数が変更されているかどうかを確認します。変更されている場合、PrintFormat関数を使用して変更内容をエキスパートログに出力し、positions変数を更新します。
取引履歴内の約定数の変更を確認
curr_dealsとdeals変数を比較し、取引履歴内の約定数が変更されているかどうかを確認します。変更されている場合、PrintFormat関数を使用して変更内容をエキスパートログに出力し、deals変数を更新します。
取引履歴内の注文数の変更を確認
curr_history_ordersとhistory_orders変数を比較し、取引履歴内の注文数が変更されているかどうかを確認します。変更されている場合、PrintFormat関数を使用して変更内容をエキスパートログに出力し、history_orders変数を更新します。
取引履歴の開始日を更新する必要があるか確認
CheckStartDateInTradeHistory関数を呼び出して、取引履歴の開始日を更新する必要があるかどうかを確認します。この関数により、履歴の開始日が適切に設定され、最新の取引履歴が取得されます。
解説7: CheckStartDateInTradeHistory関数(オリジナル関数)
//+------------------------------------------------------------------+
//| 取引履歴リクエストの開始日の変更関数 |
//+------------------------------------------------------------------+
void CheckStartDateInTradeHistory()
{
// 現在時刻から履歴の開始日を計算
datetime curr_start = TimeCurrent() - days * PeriodSeconds(PERIOD_D1);
// 取引履歴の開始日が意図した日付から1日以上経過していないか確認
if (curr_start - start > PeriodSeconds(PERIOD_D1))
{
// 履歴の開始日を修正
start = curr_start;
PrintFormat("取引履歴の新しい開始日: %s", TimeToString(start));
// 更新された期間の取引履歴を再度読み込む
HistorySelect(start, end);
// 約定および注文カウンタを修正
history_orders = HistoryOrdersTotal();
deals = HistoryDealsTotal();
}
}
取引履歴リクエストの開始日の変更関数
CheckStartDateInTradeHistory関数は、取引履歴のリクエスト期間を適切に設定し直すための関数です。特に、取引履歴の開始日を定期的に更新し、最新の取引履歴を正確に取得するために使用されます。
現在時刻から履歴の開始日を計算
TimeCurrent関数を使用して現在時刻を取得し、days変数に指定された日数分の秒数を引いて、履歴の開始日を計算します。
PeriodSeconds関数を使用して1日の秒数を取得し、それをdaysに掛け合わせることで、指定された日数分の秒数を計算します。これにより、curr_start変数に計算された開始日が設定されます。
取引履歴の開始日が意図した日付から1日以上経過していないか確認
curr_startとstart変数を比較し、履歴の開始日が意図した日付から1日以上経過しているかどうかを確認します。もし、curr_start – startがPeriodSeconds(PERIOD_D1)より大きい場合、履歴の開始日を更新する必要があります。
履歴の開始日を修正
start変数をcurr_startに更新します。これにより、取引履歴の開始日が最新の状態に修正されます。修正後の開始日はPrintFormat関数を使用してエキスパートログに出力され、確認することができます。
更新された期間の取引履歴を再度読み込む
HistorySelect関数を使用して、更新された期間(startからendまで)の取引履歴を再度読み込みます。これにより、最新の取引履歴が取得されます。
約定および注文カウンタを修正
HistoryOrdersTotal関数とHistoryDealsTotal関数を使用して、取引履歴内の注文数と約定数を再計算し、それぞれhistory_orders変数とdeals変数に設定します。これにより、最新の取引履歴に基づいてカウンタが更新されます。
CheckStartDateInTradeHistory関数は、取引履歴の正確性を維持し、最新のデータに基づいた取引処理を行うために重要な役割を果たします。この関数により、エキスパートアドバイザーは常に最新の取引履歴を参照することができます。