TerminalClose関数の働き・役割
TerminalClose関数は、MetaTrader5端末に対して操作の完了を命令し、端末を終了するために使用されます。この関数を呼び出すことで、端末が直ちに停止するわけではなく、実行中の処理が完了した後に停止するよう命令されます。
エキスパートアドバイザーなどがこの関数を使用する場合は、ファイルの保存やログの記録など、終了前に行うべき準備を完了しておく必要があります。また、関数の呼び出し後には、通常リターンオペレータ(return文)を使用して処理を終了させます。
TerminalClose関数の引数について
TerminalClose関数には、1つの引数があります。
書式
bool TerminalClose(
int ret_code // クライアント端末のコードを終了する
);
引数の詳細
- ret_code
種類: 整数型(int)
内容: クライアント端末の終了時に返されるリターンコードです。これは、例えばコマンドプロンプトなど外部からの操作によって端末が終了した際、その終了理由を分析するために使用されます。リターンコードを設定することで、後で端末の終了に関する情報を得ることができます。
使用例
例えば、ret_codeに0を指定すると、特に異常なく端末を終了する場合の終了コードを示します。他の値を指定することで、特定の理由による終了を示すことが可能です。
TerminalClose関数の戻り値について
TerminalClose関数はbool型の値を返します。
- true
端末の停止命令が成功した場合に返されます。 - false
端末の停止命令が失敗した場合に返されます。例えば、何らかの理由で端末の操作に問題が発生し、停止命令が完了しなかった場合には、この値が返されます。
この戻り値を使用して、端末の停止処理が正常に進んでいるかどうかを確認することができます。エキスパートアドバイザーやスクリプト内での動作確認やデバッグに役立ちます。
TerminalClose関数を使ったサンプルコード
//--- エキスパートアドバイザーが使用する入力パラメータ
input int tiks_before=500; // 端末が終了するまでのティック数
input int pips_to_go=15; // ピップス(為替レートの変動幅)による終了条件
input int seconds_st=50; // エキスパートアドバイザーが終了するまでの経過秒数
//--- グローバル変数の定義
datetime launch_time; // エキスパートアドバイザーが開始された時刻を保持
int tick_counter=0; // ティック数をカウントするための変数
//+------------------------------------------------------------------+
//| エキスパートアドバイザーが解除された際に呼ばれる関数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- エキスパートアドバイザーの解除理由をエキスパートログに出力
Print(__FUNCTION__, " reason code = ", reason);
//--- チャート上のコメントを消去
Comment("");
}
//+------------------------------------------------------------------+
//| ティックごとに呼ばれるエキスパートアドバイザーのメイン関数 |
//+------------------------------------------------------------------+
void OnTick()
{
//--- 初回のティックで初期化される変数
static double first_bid=0.0; // 最初のティックのビッド価格を保持
MqlTick tick; // ティック情報を格納するための構造体
double distance; // 初期ビッド価格からの価格変動幅を保持
//--- 現在のティック情報を取得する
SymbolInfoTick(_Symbol, tick);
//--- ティック数をカウント
tick_counter++;
//--- 最初のティック時に初期値を設定する
if(first_bid == 0.0)
{
// エキスパートアドバイザーが開始された時刻を保存
launch_time = tick.time;
// 最初のビッド価格を保存
first_bid = tick.bid;
// 最初のビッド価格をエキスパートログに出力
Print("first_bid =", first_bid);
return; // 最初のティックでは終了
}
//--- 現在のビッド価格と最初のビッド価格の差をピップス単位で計算
distance = (tick.bid - first_bid) / _Point;
//--- 現在のエキスパートアドバイザーの状態を表示する
string comm = "開始からの経過時間:\r\n\x25CF 経過秒数: " +
IntegerToString(tick.time - launch_time) + " ;" +
"\r\n\x25CF 受信したティック数: " + (string)tick_counter + " ;" +
"\r\n\x25CF 価格変動幅(ポイント): " + StringFormat("%G", distance);
Comment(comm); // チャート上に状態を表示
//--- 終了条件を確認して端末を閉じる
// ティック数が指定値に達した場合、端末を終了
if(tick_counter >= tiks_before)
TerminalClose(0); // 正常終了コード0で端末を閉じる
// 価格が指定されたピップス以上上昇した場合、端末を終了
if(distance > pips_to_go)
TerminalClose(1); // 終了コード1で端末を閉じる
// 価格が指定されたピップス以上下落した場合、端末を終了
if(distance < -pips_to_go)
TerminalClose(-1); // 終了コード-1で端末を閉じる
// 経過秒数が指定された時間を超えた場合、端末を終了
if(tick.time - launch_time > seconds_st)
TerminalClose(100); // 終了コード100で時間切れとして端末を閉じる
}
サンプルコード解説1:グローバル領域部分
//--- エキスパートアドバイザーが使用する入力パラメータ
input int tiks_before=500; // 端末が終了するまでのティック数
input int pips_to_go=15; // ピップス(為替レートの変動幅)による終了条件
input int seconds_st=50; // エキスパートアドバイザーが終了するまでの経過秒数
//--- グローバル変数の定義
datetime launch_time; // エキスパートアドバイザーが開始された時刻を保持
int tick_counter=0; // ティック数をカウントするための変数
このセクションでは、エキスパートアドバイザーのグローバル領域で宣言されている入力パラメータとグローバル変数について解説します。
入力パラメータ
inputはユーザーがエキスパートアドバイザー(EA)を実行する際に設定できるパラメータを定義する修飾子です。EAが開始される前にこれらの値を変更することが可能で、ユーザーがシミュレーションやリアル取引中に簡単に設定を調整できるようになっています。
tiks_before
種類: 整数型(int)
内容: EAが終了するまでのティック数を指定します。ここでは500ティックで終了するように設定されています。ティックとは、価格情報が更新されるたびに発生するイベントを指します。
pips_to_go
種類: 整数型(int)
内容: 価格変動幅(ピップス)を基準に終了条件を設定します。ここでは15ピップスの上昇または下落があった場合に端末を終了するように設定されています。ピップスとは、為替レートの最小単位を指します。
seconds_st
種類: 整数型(int)
内容: EAが起動してから指定された秒数経過後に終了するための時間設定です。ここでは50秒経過後に終了するようになっています。
グローバル変数
launch_time
種類: dateTime型
内容: EAが起動された時刻を保持する変数です。これを利用して、経過時間を計算し、EAの動作終了条件を時間で判断します。
tick_counter
種類: 整数型(int)
内容: ティックの数をカウントするための変数です。ティックごとにこの変数が1ずつ増加し、tiks_beforeで設定した数に達した時点でEAが終了するようになっています。
グローバル領域では、ユーザーがカスタマイズ可能なパラメータと、EA全体で使用される共通の変数が宣言され、エキスパートアドバイザーの動作に必要なデータを管理します。これにより、終了条件(ティック数、ピップスの変動、経過時間)を柔軟に設定できるようになっています。
サンプルコード解説2:OnDeinit関数部分
//+------------------------------------------------------------------+
//| エキスパートアドバイザーが解除された際に呼ばれる関数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- エキスパートアドバイザーの解除理由をエキスパートログに出力
Print(__FUNCTION__, " reason code = ", reason);
//--- チャート上のコメントを消去
Comment("");
}
OnDeinit関数は、エキスパートアドバイザーが解除される際に自動的に呼び出される関数です。この関数は、エキスパートアドバイザーの停止時に行うべき処理を記述するために使用されます。例えば、停止理由をログに記録したり、チャート上の表示をクリアするなどの作業を行います。
引数の解説
- reason
reasonはエキスパートアドバイザーが解除された理由を示す整数型の引数です。この引数により、エキスパートアドバイザーが停止された原因を特定できます。例えば、ユーザーによる手動の停止やプラットフォームのシャットダウンなどが考えられます。
処理内容
- Print関数
エキスパートアドバイザーが解除された際の理由(reasonコード)をエキスパートログに出力しています。Print関数は、指定された内容をエキスパートログに記録するために使用されます。このコードでは、解除理由が表示され、デバッグやエキスパートアドバイザーの監視に役立ちます。 - Comment関数
チャート上に表示されたコメントをクリアするために使用されています。通常、エキスパートアドバイザーはチャート上に動作状況を表示するためにComment関数を使いますが、エキスパートアドバイザーが停止されたときに表示を消すことで、不要な情報が残らないようにしています。
このように、OnDeinit関数は、エキスパートアドバイザーの終了時に行う必要がある後処理を適切に管理する役割を果たしています。
サンプルコード解説3:OnTick関数部分その1
//+------------------------------------------------------------------+
//| ティックごとに呼ばれるエキスパートアドバイザーのメイン関数 |
//+------------------------------------------------------------------+
void OnTick()
{
//--- 初回のティックで初期化される変数
static double first_bid=0.0; // 最初のティックのビッド価格を保持
MqlTick tick; // ティック情報を格納するための構造体
double distance; // 初期ビッド価格からの価格変動幅を保持
//--- 現在のティック情報を取得する
SymbolInfoTick(_Symbol, tick);
//--- ティック数をカウント
tick_counter++;
OnTick関数は、ティックごとに自動的に呼び出されるエキスパートアドバイザーのメイン関数です。ティックとは、価格の変動があったときに発生するイベントを指します。この関数内で、エキスパートアドバイザーはティックごとに情報を処理し、取引や他のアクションを実行します。
関数の解説
- OnTick関数
OnTick関数は、価格の変動(ティック)があるたびに呼び出される関数です。エキスパートアドバイザーのメインの処理が行われる場所で、リアルタイムで価格の変動を監視し、その都度指示された処理を実行します。
変数の解説
- first_bid
静的な変数として宣言されており、この変数は最初のティックのビッド価格(売値)を保持します。static修飾子が付いているため、この変数は関数の呼び出しが終わっても値が保持され、次回以降のティック処理でも参照されます。これにより、最初のビッド価格を基準として、後の価格変動を追跡することができます。 - tick
tickはMqlTick構造体型の変数です。MqlTick構造体には、ビッド価格、アスク価格、ティックの時間など、現在のティックに関する情報が含まれます。SymbolInfoTick関数を使用して、この構造体に最新のティック情報を取得し、格納します。 - distance
初期のビッド価格と現在のビッド価格との差を計算するための変数です。この値を使用して、価格の変動幅を計測し、エキスパートアドバイザー😮💨の終了条件や取引条件の判定に使用します。
処理の流れ
- ティック情報の取得
SymbolInfoTick関数を使って、現在のシンボル(金融商品の通貨ペアなど)に関する最新のティック情報を取得し、tickという構造体に格納します。これにより、現在のビッド価格やアスク価格、ティックの発生時刻を取得することができます。 - ティックカウントの更新
tick_counterは、これまでに受信したティックの数をカウントする変数です。このカウントを増やすことで、エキスパートアドバイザーが終了するまでのティック数を管理します。
ここまでの処理では、エキスパートアドバイザーがティック情報をリアルタイムで受信し、最初のティック価格や価格の変動を記録・追跡していきます。これにより、次の処理に進むための基盤を整えています。
サンプルコード解説4:OnTick関数部分その2
//--- 最初のティック時に初期値を設定する
if(first_bid == 0.0)
{
// エキスパートアドバイザーが開始された時刻を保存
launch_time = tick.time;
// 最初のビッド価格を保存
first_bid = tick.bid;
// 最初のビッド価格をエキスパートログに出力
Print("first_bid =", first_bid);
return; // 最初のティックでは終了
}
このセクションでは、エキスパートアドバイザーが最初のティックを受信した際に行われる初期化処理について解説します。OnTick関数はティックごとに呼び出されますが、エキスパートアドバイザーが起動された最初のティックでは、特別な初期設定が必要となります。
初期値の設定
最初のティックが来た時に、初期値の設定が行われるかどうかを確認しています。first_bidが0.0である場合、これはまだ最初のティックが受信されていないことを意味します。この状態を検出するために、first_bidの値が0.0であるかを条件としてチェックしています。
launch_timeの設定
エキスパートアドバイザーが開始された時刻をlaunch_timeに保存しています。これは、tick.timeを利用して現在のティックが発生した時刻を取得し、それを保存しています。この値を使用して、後にエキスパートアドバイザーの動作時間を追跡し、終了条件に使用します。
first_bidの設定
最初に受信したティックのビッド価格(売値)をfirst_bidに保存します。この値は、後で価格変動幅(ピップス)を計算する際の基準となります。first_bidが一度設定された後は、これ以降のティックでは変更されません。
Print関数によるログ出力
Print関数を使って、最初に受信したビッド価格をエキスパートログに出力しています。これにより、エキスパートアドバイザーが正常に初期化され、最初の価格が正しく記録されたかどうかを確認することができます。ログ出力は、デバッグや動作確認に非常に有用です。
return文による処理終了
最初のティックでは、初期化のために上記の処理だけを行い、それ以降の処理は行いません。return文を使用して、この関数の処理を終了させ、次のティックが来るまで待機します。これにより、2回目以降のティックで、価格変動の追跡や終了条件の判定が行われるようになります。
処理の流れ
最初のティックが発生すると、エキスパートアドバイザーは初期値の設定を行います。まず、エキスパートアドバイザーが起動された時刻と最初のビッド価格を記録し、初期化が完了したことをログに出力します。これにより、後続のティック処理に必要な基準が整い、次のティックからは通常の処理が行われます。
サンプルコード解説5:OnTick関数部分その3
//--- 現在のビッド価格と最初のビッド価格の差をピップス単位で計算
distance = (tick.bid - first_bid) / _Point;
//--- 現在のエキスパートアドバイザーの状態を表示する
string comm = "開始からの経過時間:\r\n\x25CF 経過秒数: " +
IntegerToString(tick.time - launch_time) + " ;" +
"\r\n\x25CF 受信したティック数: " + (string)tick_counter + " ;" +
"\r\n\x25CF 価格変動幅(ポイント): " + StringFormat("%G", distance);
Comment(comm); // チャート上に状態を表示
このセクションでは、エキスパートアドバイザーがティックごとに価格変動を計算し、その状態をユーザーに可視化するための処理について解説します。この部分では、ビッド価格の変動幅をピップス単位で計算し、チャート上に経過時間やティック数、価格変動の情報を表示しています。
価格変動の計算
まず、現在のビッド価格とエキスパートアドバイザーが最初に受信したビッド価格との差をピップス単位で計算します。この計算は、次のように行われています。
現在のビッド価格(tick.bid)から最初のビッド価格(first_bid)を引き、その差をポイント単位でピップスに変換しています。_Pointはシンボル(通貨ペアなど)の1ポイントあたりの価格変動幅を示す定数です。これにより、通貨ペアや金融商品の最小単位に基づいて価格差がピップスに変換され、distanceという変数に格納されます。
チャート上の情報表示
次に、エキスパートアドバイザーがどのように動作しているかをチャート上に表示するための文字列(comm)を作成しています。この文字列には、経過秒数、受信したティック数、価格変動幅の情報が含まれています。
- 経過秒数の表示
tick.time(現在のティックの発生時間)からlaunch_time(エキスパートアドバイザーが開始された時刻)を引くことで、エキスパートアドバイザーが動作してからの経過時間を秒単位で計算し、それを表示しています。IntegerToString関数を使って整数に変換しています。 - 受信したティック数の表示
tick_counter(これまでに受信したティック数)をそのまま文字列として表示しています。ティックとは価格の変動が発生した際に送られる情報の単位であり、これまでに何回ティックが受信されたかを示します。 - 価格変動幅の表示
StringFormat関数を使って、価格変動幅(distance)を表示しています。%Gというフォーマット指定子は、数値を最適な形式で表示するために使用されます。これにより、値の大きさに応じて指数形式や通常の浮動小数点形式が選ばれます。価格の変動幅が非常に大きい場合や非常に小さい場合でも、適切にフォーマットされて表示されるため、使い勝手が良いです。
特別な文字列の解説
- \r\n
これはキャリッジリターン(\r)とラインフィード(\n)を表しており、改行を意味します。これを使うことで、複数行に渡って情報を表示することができます。エキスパートアドバイザーの状態を読みやすくするために、経過秒数やティック数、価格変動幅の各情報を別の行に表示しています。 - \x25CF
これはUnicodeの黒丸記号(●)を示しています。リストの項目として情報を箇条書き風に見せるために使われています。視覚的にわかりやすく整理されて表示されるため、ユーザーが各情報を簡単に識別できるようになります。
チャート上への表示
作成された文字列(comm)は、Comment関数を使用してチャート上に表示されます。この関数により、エキスパートアドバイザーがどのように動作しているのかをリアルタイムで確認できるようになります。特に、経過時間や価格変動幅はエキスパートアドバイザーが設定した条件に達しているかを確認する際に重要です。視覚的なフィードバックがあることで、エキスパートアドバイザーの監視や調整が簡単に行えます。
このように、OnTick関数ではティックごとにリアルタイムで価格情報を処理し、エキスパートアドバイザーの動作状況をユーザーにわかりやすく表示する機能が実装されています。
サンプルコード解説6:OnTick関数部分その4
//--- 終了条件を確認して端末を閉じる
// ティック数が指定値に達した場合、端末を終了
if(tick_counter >= tiks_before)
TerminalClose(0); // 正常終了コード0で端末を閉じる
// 価格が指定されたピップス以上上昇した場合、端末を終了
if(distance > pips_to_go)
TerminalClose(1); // 終了コード1で端末を閉じる
// 価格が指定されたピップス以上下落した場合、端末を終了
if(distance < -pips_to_go)
TerminalClose(-1); // 終了コード-1で端末を閉じる
// 経過秒数が指定された時間を超えた場合、端末を終了
if(tick.time - launch_time > seconds_st)
TerminalClose(100); // 終了コード100で時間切れとして端末を閉じる
}
このセクションでは、エキスパートアドバイザーが設定された終了条件を確認し、条件を満たした場合に端末を終了する処理について解説します。ティックごとに終了条件をチェックし、それに応じてMetaTrader5端末を閉じるための操作が行われます。
終了条件の確認
OnTick関数の最後の部分では、4つの終了条件を設定しており、それぞれの条件に基づいてTerminalClose関数が呼び出され、端末を終了させます。
- ティック数による終了 ティック数が指定された数(tiks_before)に達した場合、端末を終了します。tick_counterはティックが発生するたびにカウントされ、これがtiks_beforeで指定した値に達したときに、TerminalClose関数を呼び出して端末を正常終了させます。終了コード「0」は、正常終了を意味します。
- 価格上昇による終了 現在の価格が最初のビッド価格から指定されたピップス以上上昇した場合、端末を終了します。distanceがpips_to_goより大きくなったときに、TerminalClose関数が呼び出され、終了コード「1」で端末を終了します。これは、価格が設定した閾値を超えたことを示す終了理由です。
- 価格下落による終了 現在の価格が最初のビッド価格から指定されたピップス以上下落した場合も、端末を終了します。distanceがマイナスのpips_to_goを下回ると、TerminalClose関数が呼び出されます。終了コード「-1」は、価格が下落して設定した閾値を超えたことを示します。
- 時間経過による終了 エキスパートアドバイザーが指定された秒数(seconds_st)以上動作した場合、端末を終了します。現在のティックの時間(tick.time)とエキスパートアドバイザーが開始された時間(launch_time)の差を計算し、それがseconds_stを超えたときに、TerminalClose関数が呼び出されます。終了コード「100」は、時間切れによる終了を示します。
TerminalClose関数
TerminalClose関数は、MetaTrader5端末を閉じるために使用される関数です。引数として渡される終了コードは、端末を終了する理由を示すものであり、後から終了理由を分析するために利用されます。
処理の流れ
エキスパートアドバイザーは、ティックごとにこれらの終了条件を確認し、条件を満たした場合に端末を終了します。ティック数、価格の変動幅、経過時間という3つの異なる基準で終了が判断されるため、柔軟な条件設定が可能です。また、終了コードを設定することで、端末が終了した理由を後から確認できるため、デバッグや監視に役立ちます。
この部分では、エキスパートアドバイザーが設定された条件に応じて正しく終了するかどうかをリアルタイムでチェックしており、効率的な取引の管理やシステムの運用に不可欠な要素となっています。