OnInit

この関数は、Initイベントが発生するときに指標やEAで呼び出され、実行中のMQL5プログラムを初期化するのに使用されます。この関数の型は 2 つあります。

結果を返すバージョン

int  OnInit(void);

戻り値

int型の値、ゼロは正常な初期化

INIT_FAILEDを返すと、EAはチャートから強制的にアンロードされます。

INIT_FAILEDを返すと、指標はチャートからアンロードされません。チャート上に残っている指標は動作しません。イベントハンドラは指標内で呼び出されません。

実行結果を返すOnInit()を呼び出すと、プログラムを初期化できるだけでなく、プログラムが異常に終了した場合にはエラーコードが返されるため、これを使用することをお勧めします。

結果を返さないバージョンは古いコードとの相互性の為のみに残されています。使用は推奨されません。

void OnInit(void);

注意事項

Initイベントは、EAまたは指標を読み込んだ直後に生成されます。このイベントはスクリプトでは生成されません。OnInit()関数は、MQL5プログラムを初期化するために使用されます。OnInit()の戻り値がint型の場合、ゼロ以外の戻り値は初期化が失敗したことを示し、DeinitイベントをREASON_INITFAILED初期化解除の理由コードで作成します。

void型のOnInit()関数は常に初期化が成功したことを示すので、使用は推奨されません。

EAの入力最適化するために、リターンコードとしてENUM_INIT_RETCODE列挙体からの値を使用することがおすすめです。これらの値は、最も適切なテストエージェントの選択などの最適化プロセス管理を確立するためのものです。テストを始める前に、EAの初期化中にTerminalInfoInteger()関数を使用して、エージェントの設定とリソース(コア数、空きメモリ量など)のデータをリクエストすることができます。 取得したデータに基づいて、テストエージェントの使用を許可するか、EAの最適化を禁止することができます。

ID

説明

INIT_SUCCEEDED

初期化が成功し、EAのテストを続けることが出来ます。

このコードはゼロ値と同じ意味を持ちます。EAはテスター内で正常に初期化されています。

INIT_FAILED

初期化が失敗しました。致命的なエラーが起こったのでテストを続ける理由がありません。たとえば、EAの操作に必要な指標を作成することは不可能です。

この戻り値はゼロ以外の値と同じ意味です。 テスター内でのEAの初期化は失敗しました。

INIT_PARAMETERS_INCORRECT

プログラマーの間違った入力パラメータを示すように設計されています。一般最適化テーブルでは、この戻りコードを含む結果文字列が赤で強調表示されます。

このようなEA入力セットのテストは実行されません。エージェントは新しいタスクを受け取る用意ができています。

この値を受け取ると、ストラテジーテスターはこのタスクを他のエージェントに再試行のために渡しません。

INIT_AGENT_NOT_SUITABLE

初期化時にプログラム実行エラーはありませんでしたが、エージェントが何らかの理由でテストに適していません。例えば、RAM不足、OpenCLサポートがないなどです。

このコードが返された後は、エージェントは この最適化が終了するまでタスクを受信しません。

OnInit()を使用してテスターでINIT_FAILED/INIT_PARAMETERS_INCORRECTを返すと、EAの最適化の際に考慮されるべきことがあります。

  • OnInit()がINIT_PARAMETERS_INCORRECTを返すのに使用したパラメータはテストには不向きとみなされ、遺伝的最適化では次世代の取得には使用されません。最適なEAパラメータを検索する際に、「廃棄された」パラメータセットが多すぎると誤った結果につながる可能性があります。検索アルゴリズムでは、最適化基準関数は滑らかで、多数の入力パラメータにギャップがないと仮定しています。
  • OnInit()がINIT_FAILEDを返した場合、これはテストを起動できないことを意味するため、EAはエージェントのメモリからアンロードされます。EAは新しいパラメータのセットで次のパスを実行するために再び読み込まれます。次の最適化パスを起動すると、TesterStop()を呼び出すよりもはるかに時間がかかります。

EAのOnInit()関数の例

//--- 入力パラメータ
input int     ma_period=20; // 移動平均期間
 
//--- EAで使用される指標のハンドル
int indicator_handle;  
//+------------------------------------------------------------------+
//| エキスパート初期化関数                                                 |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- check ma_period validity
  if(ma_period<=0)
    {
    PrintFormat("Invalid ma_period input value: %d",ma_period);
    return (INIT_PARAMETERS_INCORRECT);
    }
//--- 最適化中
  if(MQLInfoInteger(MQL_OPTIMIZATION))
    {
    //--- エージェントが利用できるRAMを確認する
    int available_memory_mb=TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
    if(available_memory_mb<2000)
       {
        PrintFormat("Insufficient memory for the test agent: %d MB",
                    available_memory_mb);
        return (INIT_AGENT_NOT_SUITABLE);
       }
    }
//--- 指標を確認する
  indicator_handle=iCustom(_Symbol,_Period,"My_Indicator",ma_period);
  if(indicator_handle==INVALID_HANDLE)
    {
    PrintFormat("Failed to generate My_Indicator handle. Error code %d",
                GetLastError());
    return (INIT_FAILED);
    }
//--- EA初期化完了
  return(INIT_SUCCEEDED);
 }

参照

OnDeinit, Event handling functionsProgram runningClient terminal eventsInitialization of variablesCreating and deleting objects