OnTesterPass関数の働き・役割
OnTesterPass関数は、エキスパートアドバイザー(EA)の最適化中にテストエージェント(最適化処理を実行するエンジン)から送信された新しいデータフレーム(特定のデータを含む構造体データ)を受け取るために使用されます。
この関数は、TesterPassイベント(新しいデータフレームが受信された際に発生するイベント)が発生した際にEA内で自動的に呼び出され、最適化結果を含むデータフレームを処理します。
TesterPassイベントは、ストラテジーテスターでEAの最適化を行っている際に新しいデータフレームが到着したタイミングで生成されます。これにより、EAはテスト結果の受信を検知し、効率的に最適化プロセスを進めることができます。
OnTesterPass関数は、FrameAdd関数を用いてOnTester関数から送信されるフレームデータを受け取り、処理を行います。FrameAdd関数は、最適化の各パスで得られたデータを送信する役割を担い、ファイルや任意の型の配列を使ってフレームにデータを追加することが可能です。
OnTesterPass関数の引数について
void OnTesterPass(void);
OnTesterPass関数には引数がありません。
この関数は、EAの最適化中にTesterPassイベント(新しいデータフレームが受信された際に発生するイベント)が発生した際に自動的に呼び出されます。
OnTesterPass関数の戻り値について
OnTesterPass関数には戻り値がありません。void型であり、TesterPassイベント(新しいデータフレームが受信された際に発生するイベント)に対応する処理を行うだけです。
OnTesterPass関数を使う際の注意点
OnTesterPass関数を使用する際には、データフレームが必ずしもリアルタイムで処理されるわけではないことに注意が必要です。データフレームはテストエージェントからまとめて送信されることがあり、その際には配信に遅延が生じる可能性があります。
このため、最適化が完了するまでに一部のフレームがOnTesterPass関数で処理されない場合があります。
最適化が終了した後にすべてのフレームを処理するには、OnTesterDeinit関数を使用し、FrameNext関数を活用することで未処理のフレームを順次取得できます。また、受信したフレームを整理するには、FrameFirst関数とFrameFilter関数を組み合わせて並び替えを行うことが可能です。
OnTesterPass関数を使ったサンプルコード
以下は、OnTesterPass関数を使用して最適化中に受信したデータフレームを処理するサンプルコードです。このコードでは、最適化の各パスでテストエージェントから送信されたフレームデータを受信し、エキスパートログにその内容を出力します。また、テストが終了してすべてのデータを処理する場合は、OnTesterDeinit関数を使用して、未処理のフレームを再確認することができます。
// 最適化の各パスで新しいフレームが到着した際に自動的に呼び出される関数
void OnTesterPass()
{
// フレームのパスIDを格納するための変数。最適化の各パス(試行)ごとに一意のIDが付与される
ulong pass_id;
// フレームの名前を格納するための変数。FrameAdd関数を使って送信される際に設定された名前が入る
string frame_name;
// フレームの識別IDを格納する変数。FrameAdd関数で設定した識別番号が保持される
long frame_id;
// フレームの値(数値データ)を格納するための変数。FrameAddで指定された数値情報が入る
double frame_value;
// FrameNext関数は、次のフレームが存在する限りtrueを返し、フレームデータを変数に格納する
// フレームがなくなるまでループを継続
while(FrameNext(pass_id, frame_name, frame_id, frame_value))
{
// 取得したフレームデータをエキスパートログに出力
// Print関数を使用し、Pass ID、フレーム名、識別ID、値の情報を表示
Print("Pass ID: ", pass_id, // 最適化のパスIDを表示
" Name: ", frame_name, // フレームの名前を表示
" ID: ", frame_id, // フレームの識別IDを表示
" Value: ", DoubleToString(frame_value, 2)); // 数値データを小数点2桁で表示
}
}
// 最適化が終了した後に未処理のフレームを処理するための関数
void OnTesterDeinit()
{
// 最適化パスID、フレーム名、識別ID、値を保持する変数を定義
ulong pass_id;
string frame_name;
long frame_id;
double frame_value;
// FrameFirst関数を呼び出してフレームの最初の位置に移動
// 最適化完了後、すべてのフレームを再確認する準備を行う
FrameFirst();
// 未処理のフレームがある限り、次のフレームを取得して処理を繰り返す
while(FrameNext(pass_id, frame_name, frame_id, frame_value))
{
// 未処理のフレームデータをエキスパートログに出力して確認
Print("Deinit - Pass ID: ", pass_id, // 最適化パスIDを表示
" Name: ", frame_name, // フレームの名前を表示
" ID: ", frame_id, // フレームの識別IDを表示
" Value: ", DoubleToString(frame_value, 2)); // 数値データを小数点2桁で表示
}
}
サンプルコードに使われた関数や変数の詳細な解説
- OnTesterPass関数
最適化中にテストエージェントから新しいデータフレームが送信された際に自動的に呼び出され、フレーム内容の受け取りと処理を行う関数です。 - OnTesterDeinit関数
最適化が完了した後に呼び出され、未処理のフレームを確認・処理するために使用されます。 - pass_id
各最適化パス(試行)ごとに一意のIDを格納するための変数で、FrameNext関数で取得されます。 - frame_name
フレームの名前を格納する変数で、FrameAdd関数で設定した名前が入ります。識別名として利用することができます。 - frame_id
フレームの識別IDを保持する変数で、各フレームの特定情報として設定されます。 - frame_value
フレームに含まれる数値データを格納する変数です。最適化の結果や評価指標などを受け取ります。 - while文
while文は、条件が満たされている限り繰り返し処理を実行する構文です。このコードでは、FrameNext関数がtrueを返す間、つまり未処理のフレームがある限りループが続きます。while文の内部でFrameNext関数が新たなフレームデータを取得し、変数に格納して処理を繰り返します。 - FrameNext関数
次のフレームが存在するかを確認し、存在する場合にはそのデータを取得して指定の変数に格納します。未処理のフレームを順次処理する際に使用します。 - FrameFirst関数
最初のフレームに移動するために使用します。OnTesterDeinit関数で、フレームの再処理を行う際に利用されます。 - Print関数
取得したデータをエキスパートログに表示するための関数です。このサンプルでは各フレームのID、名前、識別ID、数値データを表示しています。 - DoubleToString関数
DoubleToString関数は、数値を文字列に変換する関数です。このコードではframe_valueを小数点以下2桁に指定して文字列化し、エキスパートログに出力しています。
この関数を使ってEAを作る際のアイディア
リアルタイムの最適化パフォーマンスモニタリング
EAの最適化中に各パスの結果を逐次取得し、エキスパートログに出力することで、パフォーマンスの動向をその場で監視する仕組みを作ることが可能です。例えば、一定の収益やドローダウンに達したパスのみを記録するようなフィルタリングを追加し、最も効率的なパラメータセットを即時に確認できます。
最適化結果のフィルタリングと自動記録
OnTesterPass関数を利用し、最適化パスごとにカスタム指標を生成し、その指標が一定基準を満たした場合に結果をCSVファイルなどに記録する機能を実装できます。たとえば、特定のリスク・リターン比率を満たす場合のみ結果を保存し、最適化後に効率的な結果のみを一元的に管理することができます。
視覚的なフィードバックの追加
OnTesterPass関数内で受信した結果を基に、チャート上に動的にテキストやオブジェクトを表示し、パラメータがリアルタイムでどのように影響を与えるかを視覚化することもできます。これにより、グラフやインジケータと連携して、結果をその場で視覚的に把握できるダッシュボード風のインターフェースが作成可能です。
最適化結果に基づいた自動パラメータ調整
OnTesterPass関数で受信したデータを分析し、特定の条件が満たされた場合に、次の最適化パスで使用するパラメータを動的に調整するロジックも考えられます。これは、OnTesterInit関数やParameterSetRange関数と組み合わせることで、逐次改善する遺伝的アルゴリズムのような最適化手法に近い動作を再現します。
パス結果のデータベース蓄積と詳細分析
OnTesterPass関数で取得した各パスの結果をデータベースに保存し、蓄積したデータを後でデータ分析ツールで解析するというアプローチも有効です。これにより、過去の最適化結果のトレンド分析や、特定の相場条件下でのパフォーマンス傾向を詳細に検証することが可能です。
これらのアイディアにより、OnTesterPass関数を活用したEAは、柔軟で高精度な最適化分析や自動化プロセスを取り入れることができます。