OnInit関数は、自動売買の初期化に使われるイベント関数です。OnInit関数は、自動売買を起動すると、自動的に一度だけ実行される関数です。そのため、変数の初期化などの処理に使うと良いでしょう。
OnInit関数とは
「自動売買の変数を初期化したい!」
という方は、OnInit関数を使ってみましょう!
OnInit関数は、イベント関数の一つで、自動売買が起動したときに、自動的に一度だけ実行される関数です。
そのため、自動売買開発者の多くの方が、変数の初期化などの処理に使っています。
また、OnInit関数は、自動売買(エキスパートアドバイザ)を新規作成すると、自動的にプログラミングされています。
自動的にプログラミングされているのは、主に以下の3つなので、確認しておくと良いでしょう。
今回は、OnInit関数に注目して解説していきます。
自動売買を新規作成したときのプログラム
自動売買を新規作成すると、以下のようなプログラムが自動作成されます。
//+------------------------------------------------------------------+
//| newExpertAdviser.mq4 |
//| Copyright 2022, Asahina Risa |
//| https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Asahina Risa"
#property link "https://mql-programing.com/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
このように、すでにOnInit関数・OnDeinit関数・OnTick関数が記述されています。
OnInit関数は、13行目にあります。
OnInit関数の特徴
OnInit関数はイベント関数なので、イベントが起こったときに実行されます。
そのイベントとは、「自動売買が起動したとき」です。
つまり、自動売買をチャートにドラッグアンドドロップしたときに、一度だけ実行されます。
そのため、OnInit関数は、変数などのパラメータの初期化をするために使用されることが多いです。
別名「初期化関数」(initialization function)とも呼ばれる関数です。
OnInit関数の書き方
OnInit関数の使い方は、基本的な関数と同じです。
関数をマスターしていない方はこちらの記事が参考になります。
基本的な書き方
OnInit関数はとてもシンプルな関数です。
引数なしで実行できます。
戻り値はint型ですが、以下のプログラムの4行目にあるように、「INIT_SUCCEEDED」という定数を戻すことが多いです。
INIT_SUCCEEDED定数は、「OnInit関数が正常に終了しました。」ということを表している定数なので、このまま使用して問題ありません。
逆に異常終了した場合は、INIT_FAILED定数を使用しましょう。
OnInit関数の基本的な書き方は以下の通りです。
int OnInit()
{
//初期化したい変数などを記述
return(INIT_SUCCEEDED);
}
戻り値は int型なので、returnで値を戻すようにしましょう。
戻す値は、定数が用意されています。
OnInit関数の戻り値はこちらの記事が詳しいので、よろしければどうぞ。
戻り値
int型(ENUM_INIT_RETCODE)
引数
なし
Oninit関数のサンプルプログラム
サンプルプログラムは、こちらになります。
このプログラムには4つの機能を実装しております。
- パラメータの異常検知
- メモリの異常検知
- 関数の異常検知
- 正常終了
//異常値を検出するためのパラメータ
input int ma_period=10;
int OnInit()
{
//パラメータが異常かどうかをチェック
if(ma_period <= 0)
{
//パラメータが異常なので、INIT_PARAMETERS_INCORRECT定数を戻す
return (INIT_PARAMETERS_INCORRECT);
}
//メモリに異常がないかチェック
int memory = TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
if(memory < 2000)
{
//メモリが異常なので、INIT_AGENT_NOT_SUITABLE定数を戻す
return (INIT_AGENT_NOT_SUITABLE);
}
//その他異常がないかチェック
double ma = iMA(Symbol(), PERIOD_CURRENT, 14, 0, MODE_SMA, PRICE_CLOSE, 0);
if(ma <= 0)
{
//値が異常なので、INIT_FAILED定数を戻す
return(INIT_FAILED);
}
//正常なので、INIT_SUCCEEDED定数を戻す
return(INIT_SUCCEEDED);
}
まとめ
OnInit関数は、自動売買を起動すると一度だけ実行されるイベント関数です。
自動売買を、チャートにドラッグアンドドロップすると実行されます。
そのため、パラメータの初期化などに使用されることが多いので、サンプルプログラムを参考にして、プログラミングしてみてください。
ちなみに、OnInit関数は、自動的に実行されますが、手動で実行することも可能です。
他の関数と同じように、OnInit関数を呼び出すことで、実行できますので、プログラムの途中で初期化したいときに実行すると良いでしょう。