- ParameterGetRange関数の働き・役割
- ParameterGetRange関数の引数について
- ParameterGetRange関数の戻り値について
- ParameterGetRange関数を使う際の注意点
- ParameterGetRange関数を使ったサンプルコード
- サンプルコード解説1:グローバル領域部分
- サンプルコード解説2:OnInit関数部分
- サンプルコード解説3:OnTesterInit関数部分 その1
- サンプルコード解説4:OnTesterInit関数部分 その2
- サンプルコード解説5:OnTesterInit関数部分 その3
- サンプルコード解説6:OnTesterInit関数部分 その4
- サンプルコード解説7:OnTesterDeinit関数部分
ParameterGetRange関数の働き・役割
ParameterGetRange関数は、ストラテジーテスターにおいてエキスパートアドバイザーの最適化を行う際に、指定した入力パラメータの値範囲を取得するために使用されます。
ParameterGetRange関数を用いることで、最適化の対象となるパラメータの初期値、ステップ、最終値を動的に変更することが可能です。
また、ParameterGetRange関数は整数型と実数型のパラメータに対して2つの書式を持ち、異なるパラメータ型に応じて最適化設定を柔軟に取得できます。
これにより、エキスパートアドバイザーが適切な範囲でパラメータの変動を行い、最適な取引パフォーマンスを得るための最適化が可能になります。
ParameterGetRange関数の引数について
ParameterGetRange関数には、整数型と実数型のパラメータそれぞれに対応する2つの書式があります。
整数型入力パラメータの書式
bool ParameterGetRange(
const string name, // パラメータ(入力変数)名
bool& enable, // パラメータ最適化が有効
long& value, // パラメータ値
long& start, // 初期値
long& step, // ステップ変更
long& stop // 最終値
);
name
パラメータ(input変数)の名前を指定します。この変数はエキスパートアドバイザーの外部パラメータとして設定されます。エキスパートアドバイザーがストラテジーテスターやシングルテストモードで動作する際に指定が可能です。
enable
この引数は、パラメータの最適化が有効かどうかを表すフラグです。ParameterGetRange関数が呼び出された後、この引数に最適化の有効/無効の状態が格納されます。
value
パラメータの現在の値が格納されます。この値は取得されるだけでなく、必要に応じて新しい値に変更することが可能です。
start
最適化中のパラメータの初期値を格納する引数です。最適化の開始時にこの値からスタートします。
step
パラメータの変更ステップを指定します。最適化中にパラメータ値がどの程度ずつ変動するかを制御します。
stop
最適化中に使用されるパラメータの最終値を格納します。最適化がこの値に達するとパラメータの変更が停止します。
実数型入力パラメータの書式
bool ParameterGetRange(
const string name, // パラメータ(入力変数)名
bool& enable, // パラメータ最適化が有効
double& value, // パラメータ値
double& start, // 初期値
double& step, // ステップ変更
double& stop // 最終値
);
name
整数型の書式と同様に、パラメータの名前を指定します。外部パラメータであるため、エキスパートアドバイザーの設定項目として利用されます。
enable
整数型の書式と同様に、パラメータの最適化が有効であるかを示すフラグです。関数の実行後、この引数に有効/無効の情報が格納されます。
value
最適化対象の実数型パラメータの現在値です。関数呼び出し時に値が取得され、変更可能です。
start
パラメータの最適化範囲の初期値を設定します。実数型のパラメータであり、最適化時にこの値から開始されます。
step
パラメータがどの程度の間隔で変動するかを制御します。実数型での変動ステップを指定します。
stop
実数型パラメータの最適化において最終的な目標値を設定します。この値に到達すると、パラメータの変更が終了します。
どちらの書式でも、最適化が成功した場合には「true」を返し、失敗した場合には「false」を返します。
ParameterGetRange関数の戻り値について
ParameterGetRange関数は、最適化パラメータの範囲を正常に取得できたかどうかを示すbool型の値を返します。具体的には、以下の条件で戻り値が決定されます。
- 最適化パラメータの値範囲を正常に取得できた場合、戻り値は「true」となります。
- パラメータの範囲が正しく取得できなかった場合やエラーが発生した場合、戻り値は「false」となります。
取得に失敗した場合のエラー情報は、GetLastError関数を使用して確認することが可能です。これにより、どのような理由で失敗したのかを把握し、適切な対処を行うことができます。
この戻り値を活用することで、エキスパートアドバイザーのパラメータ取得が成功したかどうかを簡単に確認し、エラー発生時にはその情報をもとに処理を続行するか中断するかを判断できます。
ParameterGetRange関数を使う際の注意点
ParameterGetRange関数は、ストラテジーテスターの最適化でのみ使用できるため、呼び出せる場所が限定されています。この関数を利用できるのは、OnTesterInit関数、OnTesterPass関数、OnTesterDeinit関数の各イベントハンドラ内のみです。他の場所から呼び出した場合には正常に動作しません。
また、ParameterGetRange関数はエキスパートアドバイザーの入力パラメータ値の取得を目的としていますが、最適化の際に範囲内でパラメータが変更されるため、取得される値は設定や最適化の進行状況に応じて異なります。特に、エキスパートアドバイザーの重要なパラメータを特定の値で固定したい場合には、取得したパラメータの範囲を利用して、ParameterSetRange関数で値を再設定する必要があります。
OnTesterInit関数でParameterGetRange関数を使用する場合、取得したデータをもとに任意の入力パラメータを最適化から除外することが可能です。ただし、これはエキスパートアドバイザーの構造や目的に大きな影響を与えるため、注意が必要です。
適切に除外することで、効率的な最適化が行える一方で、不適切に設定すると最適化結果が偏る可能性もあります。
ParameterGetRange関数を複数回呼び出す際には、各入力パラメータの範囲設定が混在しないように注意する必要があります。適切にパラメータの取得範囲を管理し、意図した範囲でのみ最適化が行われるように設計することが求められます。
ParameterGetRange関数を使ったサンプルコード
#property description "ParameterGetRange()関数のデモンストレーション用エキスパートアドバイザーです。"
#property description "ストラテジーテスターの最適化モードでのみ起動してください。"
//--- 入力パラメータ
input int Input1=1; // 整数型の入力パラメータ
input double Input2=2.0; // 実数型の入力パラメータ
input bool Input3=false; // ブール型の入力パラメータ
input ENUM_DAY_OF_WEEK Input4=SUNDAY; // 列挙型の入力パラメータ(曜日を指定)
//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- エキスパートアドバイザーがストラテジーテスターの最適化モードで実行されているかを確認
if(!MQL5InfoInteger(MQL5_OPTIMIZATION))
{
MessageBox("このエキスパートアドバイザーはストラテジーテスターの最適化モードでのみ実行可能です。"); // メッセージボックスで警告を表示
//--- 最適化モードでない場合、エキスパートアドバイザーの動作を終了してチャートから削除
return(INIT_FAILED); // 初期化失敗を返し、終了
}
//--- 初期化が正常に完了したことを示す
return(INIT_SUCCEEDED); // 初期化成功を返す
}
//+------------------------------------------------------------------+
//| TesterInit関数: テスター初期化処理 |
//+------------------------------------------------------------------+
void OnTesterInit()
{
//--- long 型入力パラメータの例 (整数型パラメータ "Input1" の範囲を取得)
string name="Input1"; // パラメータ名("Input1")を指定
bool enable; // パラメータ最適化が有効かを受け取る変数
long par1, par1_start, par1_step, par1_stop; // パラメータの値、初期値、ステップ、最終値を格納する変数群
ParameterGetRange(name, enable, par1, par1_start, par1_step, par1_stop); // 整数型の範囲を取得
//--- 取得したパラメータ情報を出力
Print("1つ目のパラメータ");
PrintFormat("%s=%d 最適化有効=%s 範囲: %d から %d まで, ステップ=%d",
name, par1, (string)enable, par1_start, par1_stop, par1_step);
//--- double 型入力パラメータの例 (実数型パラメータ "Input2" の範囲を取得)
name="Input2"; // パラメータ名("Input2")を指定
double par2, par2_start, par2_step, par2_stop; // 実数型パラメータの値、初期値、ステップ、最終値を格納する変数群
ParameterGetRange(name, enable, par2, par2_start, par2_step, par2_stop); // 実数型の範囲を取得
//--- 取得した実数型パラメータ情報を出力
Print("2つ目のパラメータ");
PrintFormat("%s=%G 最適化有効=%s 範囲: %G から %G まで, ステップ=%G",
name, par2, (string)enable, par2_start, par2_stop, par2_step);
//--- bool 型入力パラメータの例 (ブール型パラメータ "Input3" の範囲を取得)
name="Input3"; // パラメータ名("Input3")を指定
long par3, par3_start, par3_step, par3_stop; // ブール型パラメータの値を格納する変数
ParameterGetRange(name, enable, par3, par3_start, par3_step, par3_stop); // ブール型の範囲を取得
//--- 取得したブール型パラメータ情報を出力
Print("3つ目のパラメータ");
PrintFormat("%s=%s 最適化有効=%s 範囲: %s から %s",
name, (string)par3, (string)enable, (string)par3_start, (string)par3_stop);
//--- 列挙型入力パラメータの例 (列挙型パラメータ "Input4" の範囲を取得)
name="Input4"; // パラメータ名("Input4")を指定
long par4, par4_start, par4_step, par4_stop; // 列挙型パラメータの値、初期値、最終値を格納する変数群
ParameterGetRange(name, enable, par4, par4_start, par4_step, par4_stop); // 列挙型の範囲を取得
//--- 取得した列挙型パラメータ情報を出力
Print("4つ目のパラメータ");
PrintFormat("%s=%s 最適化有効=%s 範囲: %s から %s",
name, EnumToString((ENUM_DAY_OF_WEEK)par4), (string)enable,
EnumToString((ENUM_DAY_OF_WEEK)par4_start), EnumToString((ENUM_DAY_OF_WEEK)par4_stop));
}
//+------------------------------------------------------------------+
//| TesterDeinit 関数: 最適化終了後の処理 |
//+------------------------------------------------------------------+
void OnTesterDeinit()
{
//--- 最適化完了後のメッセージを出力
Print(__FUNCTION__, " 最適化が完了しました。");
}
サンプルコード解説1:グローバル領域部分
#property description "ParameterGetRange()関数のデモンストレーション用エキスパートアドバイザーです。"
#property description "ストラテジーテスターの最適化モードでのみ起動してください。"
//--- 入力パラメータ
input int Input1=1; // 整数型の入力パラメータ
input double Input2=2.0; // 実数型の入力パラメータ
input bool Input3=false; // ブール型の入力パラメータ
input ENUM_DAY_OF_WEEK Input4=SUNDAY; // 列挙型の入力パラメータ(曜日を指定)
このコードの冒頭部分では、エキスパートアドバイザーのグローバル領域において、コード全体で使用するパラメータや設定の定義が行われています。以下に詳細な解説を記載します。
プロパティ設定
#property descriptionを使用して、エキスパートアドバイザーの説明を設定しています。これはエキスパートアドバイザーのプロパティウィンドウに表示され、ユーザーがコードの目的や使用環境について確認できるようにするための設定です。
- 1行目では、「ParameterGetRange関数のデモンストレーション用エキスパートアドバイザーです。」と記述され、エキスパートアドバイザーがParameterGetRange関数の動作を示すことを明示しています。
- 2行目では、「ストラテジーテスターの最適化モードでのみ起動してください。」と記述され、エキスパートアドバイザーがストラテジーテスターでの最適化モードでのみ適切に動作することを注意喚起しています。
入力パラメータの定義
エキスパートアドバイザーが操作する入力パラメータを定義しています。これらの入力パラメータは、ストラテジーテスターでの最適化や取引戦略のパフォーマンスを変更する際に利用されます。
- 整数型の入力パラメータであるInput1は、初期値が「1」に設定されています。このパラメータは最適化対象とすることで異なる値を試すことができます。
- 実数型の入力パラメータであるInput2は、初期値「2.0」が設定されています。整数よりも細かい値設定が必要な最適化に対応しています。
- bool型の入力パラメータであるInput3は、true(有効)またはfalse(無効)を設定可能です。このエキスパートアドバイザーの最適化でスイッチのように有効/無効を切り替える用途に適しています。
- 曜日を表す列挙型パラメータであるInput4は、ENUM_DAY_OF_WEEKという曜日を指定できるデータ型を使用しており、エキスパートアドバイザーの動作を特定の曜日に限定したい場合などに役立ちます。
このグローバル領域では、プロパティと入力パラメータを適切に定義し、エキスパートアドバイザーの動作環境と変数の設定を整備しています。これにより、ストラテジーテスター内でエキスパートアドバイザーが目的どおりに動作し、特定のパラメータを最適化の対象として扱うことが可能です。
サンプルコード解説2:OnInit関数部分
//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- エキスパートアドバイザーがストラテジーテスターの最適化モードで実行されているかを確認
if(!MQLInfoInteger(MQL_OPTIMIZATION))
{
MessageBox("このエキスパートアドバイザーはストラテジーテスターの最適化モードでのみ実行可能です。"); // メッセージボックスで警告を表示
//--- 最適化モードでない場合、エキスパートアドバイザーの動作を終了してチャートから削除
return(INIT_FAILED); // 初期化失敗を返し、終了
}
//--- 初期化が正常に完了したことを示す
return(INIT_SUCCEEDED); // 初期化成功を返す
}
この部分では、エキスパートアドバイザーの初期化を行うOnInit関数が定義されています。この関数は、エキスパートアドバイザーがチャートに追加された際に自動的に呼び出され、初期設定や環境の確認を行います。
最適化モードの確認
OnInit関数内では、まずエキスパートアドバイザーがストラテジーテスターの最適化モードで実行されているかどうかを確認しています。これは、エキスパートアドバイザーが特定の動作モードでのみ機能するように設計されているためです。
MQLInfoInteger関数を使用し、MQL_OPTIMIZATION の状態を取得して最適化モードでの実行かどうかを判断します。このチェックにより、最適化モードでない場合には警告を表示し、エキスパートアドバイザーを終了するように設定されています。
警告表示と終了処理
最適化モードでない場合、MessageBox関数を使用して「このエキスパートアドバイザーはストラテジーテスターの最適化モードでのみ実行可能です。」という警告メッセージを表示します。このメッセージにより、ユーザーに最適化モードでの実行が必須であることを通知します。
続いて、最適化モードでない場合にはINIT_FAILEDを返して初期化に失敗させ、エキスパートアドバイザーを終了します。これにより、ストラテジーテスターの最適化モードでなければ、エキスパートアドバイザーがチャート上で動作しないように制御しています。
初期化完了の表示
最適化モードである場合には、INIT_SUCCEEDEDを返して正常に初期化が完了したことを示します。この戻り値により、エキスパートアドバイザーがチャート上での動作を開始する準備が整ったことを示します。
OnInit関数はエキスパートアドバイザーの動作開始時の初期チェックを担当し、特定の条件下でのみエキスパートアドバイザーが動作するよう制御する重要な役割を果たしています。
サンプルコード解説3:OnTesterInit関数部分 その1
//+------------------------------------------------------------------+
//| TesterInit関数: テスター初期化処理 |
//+------------------------------------------------------------------+
void OnTesterInit()
{
//--- long 型入力パラメータの例 (整数型パラメータ "Input1" の範囲を取得)
string name="Input1"; // パラメータ名("Input1")を指定
bool enable; // パラメータ最適化が有効かを受け取る変数
long par1, par1_start, par1_step, par1_stop; // パラメータの値、初期値、ステップ、最終値を格納する変数群
ParameterGetRange(name, enable, par1, par1_start, par1_step, par1_stop); // 整数型の範囲を取得
OnTesterInit関数は、ストラテジーテスターの最適化処理の初期化に使用され、エキスパートアドバイザーの入力パラメータの情報を取得します。ここでは、ParameterGetRange関数を使用して、整数型の入力パラメータであるInput1の範囲を取得する部分について解説します。
整数型入力パラメータの設定
まず、整数型パラメータInput1の範囲を取得するために、以下の変数を定義しています。
- nameは、パラメータの名前「Input1」を指定します。この名前はParameterGetRange関数で取得したいパラメータを識別するために使用されます。
- enableは、パラメータの最適化が有効かどうかのフラグを格納する変数です。ParameterGetRange関数の実行後に、この変数にtrueまたはfalseが設定されます。
- par1は、パラメータの現在の値を格納する変数です。
- par1_startは、最適化処理における初期値を格納する変数です。
- par1_stepは、最適化中にパラメータがどの程度の間隔で変化するかを示すステップ値を格納する変数です。
- par1_stopは、最適化範囲の最終値を格納する変数です。
ParameterGetRange関数の使用
ParameterGetRange関数は、指定した入力パラメータの最適化範囲(初期値、ステップ、最終値)を取得するために使用されます。この関数により、指定されたパラメータが最適化対象であるか、また、どの範囲で変化させるべきかを動的に確認できます。
Print関数とPrintFormat関数の使用
取得したパラメータ情報を表示するために、Print関数とPrintFormat関数を使用しています。
まず、Print関数で「1つ目のパラメータ」という説明を出力し、その後PrintFormat関数で各パラメータの詳細情報をフォーマット付きで出力しています。
PrintFormat関数では、フォーマット指定子を使用して各変数の値を指定の書式で出力します。ここで使用されているフォーマット指定子と対応する変数の意味は以下の通りです。
- %sは文字列として出力されることを意味します。name(パラメータ名)とenable(最適化有効フラグ)に適用されています。
- %dは整数型として出力されることを意味します。par1(現在のパラメータ値)、par1_start(最適化の初期値)、par1_stop(最適化の最終値)、par1_step(ステップ値)に適用されています。
各フォーマット指定子に対応する変数の値が、順番に出力されます。例えば、%s=%d
の部分では、最初の%sがname(「Input1」)に、続く%dがpar1(現在の値)に対応します。これにより、取得したパラメータの情報が分かりやすく整形され、出力されます。
OnTesterInit関数は、ParameterGetRange関数を使い、エキスパートアドバイザーの入力パラメータに対して最適化の範囲情報を取得し、最適化におけるパラメータの調整が適切に行われるようにする重要な役割を担っています。
サンプルコード解説4:OnTesterInit関数部分 その2
//--- double 型入力パラメータの例 (実数型パラメータ "Input2" の範囲を取得)
name="Input2"; // パラメータ名("Input2")を指定
double par2, par2_start, par2_step, par2_stop; // 実数型パラメータの値、初期値、ステップ、最終値を格納する変数群
ParameterGetRange(name, enable, par2, par2_start, par2_step, par2_stop); // 実数型の範囲を取得
//--- 取得した実数型パラメータ情報を出力
Print("2つ目のパラメータ");
PrintFormat("%s=%G 最適化有効=%s 範囲: %G から %G まで, ステップ=%G",
name, par2, (string)enable, par2_start, par2_stop, par2_step);
OnTesterInit関数の続きでは、実数型の入力パラメータInput2の範囲を取得し、その情報を出力しています。この部分について詳細に解説します。
実数型入力パラメータの設定
まず、以下の変数が定義されています。
- nameは、パラメータ名「Input2」を指定するための変数です。ParameterGetRange関数で取得したいパラメータを特定するために使用されます。
- par2は、パラメータInput2の現在の値を格納する変数です。
- par2_startは、最適化処理での開始時に使用する初期値を格納する変数です。
- par2_stepは、最適化の際にパラメータの値がどの間隔で増減するかを示すステップ幅を格納する変数です。
- par2_stopは、最適化の範囲内での最終値を格納する変数です。
ParameterGetRange関数を使用することで、指定した実数型の入力パラメータInput2の最適化範囲(初期値、ステップ幅、最終値)を取得できます。この関数は、取得対象パラメータの最適化の範囲を確認し、最適化が有効であるかどうかをenableフラグで取得します。
実数型パラメータの情報出力
取得したパラメータ情報を出力するために、Print関数とPrintFormat関数を使用しています。
まず、Print関数で「2つ目のパラメータ」という説明が出力され、その後、PrintFormat関数でパラメータの詳細情報を整形して出力します。
PrintFormat関数では、フォーマット指定子を用いて各変数の値を指定された書式で出力します。ここで使用されているフォーマット指定子と対応する変数の意味は以下の通りです。
%s
は文字列として出力することを意味し、name(パラメータ名)とenable(最適化の有効フラグ)に適用されています。%G
は実数型として出力することを意味し、par2(現在のパラメータ値)、par2_start(初期値)、par2_stop(最終値)、par2_step(ステップ幅)に適用されています。
各フォーマット指定子に対応する変数が、指定された順序で出力されます。例えば、最初の%s
はname(「Input2」)に、次の%G
はpar2(現在の値)に対応します。これにより、取得したパラメータ情報が視覚的にわかりやすく整形されて出力され、最適化の確認に役立ちます。
サンプルコード解説5:OnTesterInit関数部分 その3
//--- bool 型入力パラメータの例 (ブール型パラメータ "Input3" の範囲を取得)
name="Input3"; // パラメータ名("Input3")を指定
long par3, par3_start, par3_step, par3_stop; // ブール型パラメータの値を格納する変数
ParameterGetRange(name, enable, par3, par3_start, par3_step, par3_stop); // ブール型の範囲を取得
//--- 取得したブール型パラメータ情報を出力
Print("3つ目のパラメータ");
PrintFormat("%s=%s 最適化有効=%s 範囲: %s から %s",
name, (string)par3, (string)enable, (string)par3_start, (string)par3_stop);
OnTesterInit関数のこの部分では、bool型の入力パラメータInput3の範囲を取得し、その情報を出力しています。この部分について詳細に解説します。
ブール型入力パラメータの設定
まず、以下の変数が定義されています。
- nameは、パラメータ名「Input3」を指定するための変数です。ParameterGetRange関数で取得したいパラメータを特定するために使用されます。
- par3は、bool型パラメータInput3の現在の値を格納する変数です。bool型はtrueまたはfalseを示すため、最適化が有効な場合には1、無効な場合には0として格納されます。
- par3_startは、最適化処理で使用するbool型パラメータの初期値を格納する変数です。
- par3_stepは、bool型パラメータには適用されませんが、他の型と同じ形式で宣言されています(通常は1または0)。
- par3_stopは、最適化範囲の最終値を示す変数で、bool型パラメータの最終的な状態(1または0)を格納します。
ParameterGetRange関数を使用することで、bool型のパラメータInput3に対する最適化の有効状態や値の範囲(初期値と最終値)を取得できます。この関数は、bool型の最適化設定が有効かをenableフラグで確認し、範囲を取得することで適切なパラメータ操作を可能にします。
ブール型パラメータの情報出力
取得したパラメータ情報を出力するために、Print関数とPrintFormat関数を使用しています。
まず、Print関数で「3つ目のパラメータ」という説明を出力し、続けてPrintFormat関数でパラメータの詳細情報を整形して出力します。
PrintFormat関数では、フォーマット指定子を用いて各変数の値を指定された書式で出力しています。ここで使用されているフォーマット指定子と対応する変数の意味は以下の通りです。
%s
は文字列として出力することを意味し、name(パラメータ名)、par3(bool型パラメータの現在の値)、enable(最適化の有効フラグ)、par3_start(初期値)、par3_stop(最終値)に適用されています。
各フォーマット指定子に対応する変数が順番に出力されます。例えば、最初の%s
はname(「Input3」)に対応し、次の%s
はpar3(現在の状態、trueまたはfalse)に対応します。これにより、取得したbool型パラメータの情報が整理されて出力され、最適化の確認に役立ちます。
サンプルコード解説6:OnTesterInit関数部分 その4
//--- 列挙型入力パラメータの例 (列挙型パラメータ "Input4" の範囲を取得)
name="Input4"; // パラメータ名("Input4")を指定
long par4, par4_start, par4_step, par4_stop; // 列挙型パラメータの値、初期値、最終値を格納する変数群
ParameterGetRange(name, enable, par4, par4_start, par4_step, par4_stop); // 列挙型の範囲を取得
//--- 取得した列挙型パラメータ情報を出力
Print("4つ目のパラメータ");
PrintFormat("%s=%s 最適化有効=%s 範囲: %s から %s",
name, EnumToString((ENUM_DAY_OF_WEEK)par4), (string)enable,
EnumToString((ENUM_DAY_OF_WEEK)par4_start), EnumToString((ENUM_DAY_OF_WEEK)par4_stop));
}
OnTesterInit関数のこの部分では、列挙型の入力パラメータInput4の範囲を取得し、その情報を出力しています。列挙型は特定の決まった値(定義された選択肢の中から選ぶ)を扱う型で、ここでは曜日を示すENUM_DAY_OF_WEEKを使用しています。
列挙型入力パラメータの設定
まず、以下の変数が定義されています。
- nameは、パラメータ名「Input4」を指定するための変数です。ParameterGetRange関数で取得したいパラメータを特定するために使用されます。
- par4は、列挙型パラメータInput4の現在の値を格納する変数です。曜日を指定するENUM_DAY_OF_WEEK型の列挙値を整数として格納しています。
- par4_startは、最適化処理での初期の曜日設定を示す変数です。
- par4_stepは、列挙型のパラメータには適用されませんが、他の型と同様の形式で宣言されています。
- par4_stopは、最適化範囲内の最終的な曜日設定を示す変数です。
ParameterGetRange関数は、列挙型パラメータInput4に対しても適用でき、最適化の範囲(初期値と最終値)を取得します。これにより、列挙型のパラメータがどのような値で設定されているか確認することができます。
列挙型パラメータの情報出力とEnumToString関数
取得したパラメータ情報を出力するために、Print関数とPrintFormat関数を使用しています。
まず、Print関数で「4つ目のパラメータ」という説明を出力し、続いてPrintFormat関数でパラメータの詳細情報を整形して出力します。
ここでは、列挙型の値をわかりやすい文字列に変換するためにEnumToString関数が使用されています。EnumToString関数は、列挙型の数値(たとえば、曜日を示すインデックス(通し番号))をその値に対応する文字列に変換します。たとえば、ENUM_DAY_OF_WEEK型で「SUNDAY」が数値「0」で表されている場合、EnumToString関数を使うと「SUNDAY」という文字列に変換されます。
PrintFormat関数では以下のフォーマット指定子を使用しています。
%s
は文字列として出力することを意味し、name(パラメータ名)、par4の文字列変換結果、enable(最適化の有効フラグ)、par4_startおよびpar4_stopの文字列変換結果に適用されています。
このようにして、列挙型パラメータの値がそのまま整数として出力されるのではなく、曜日を表すわかりやすい文字列として出力されます。EnumToString関数の利用により、列挙型パラメータの内容がユーザーにとってわかりやすく整形され、最適化内容の確認がしやすくなっています。
サンプルコード解説7:OnTesterDeinit関数部分
//+------------------------------------------------------------------+
//| TesterDeinit 関数: 最適化終了後の処理 |
//+------------------------------------------------------------------+
void OnTesterDeinit()
{
//--- 最適化完了後のメッセージを出力
Print(__FUNCTION__, " 最適化が完了しました。");
}
OnTesterDeinit関数は、ストラテジーテスターにおける最適化プロセスが終了した際に呼び出される関数です。この関数は、最適化が正常に完了したことを通知するために使用されます。
最適化終了後のメッセージ出力
関数内では、Print関数を用いて、最適化の完了を示すメッセージを出力しています。
- __FUNCTION__は、関数名を自動的に取得する特殊な識別子で、この場合は「OnTesterDeinit」として出力されます。これにより、出力メッセージに関数名が含まれるため、メッセージがどこから出力されたのかが明確になります。
- 続く文字列「最適化が完了しました。」は、最適化プロセスが正常に完了したことをユーザーに通知します。
このメッセージにより、最適化が終了した際にユーザーはテストプロセスの完了を確認することができ、必要に応じて次の手順を取るための準備が可能です。OnTesterDeinit関数は、最適化終了の確認メッセージを出力するためのシンプルかつ有用な役割を担っています。