[MQL5]OnInit関数の戻り値がINIT_FAILEDの時にインディケーターをチャートから除去する
MT4では、チャートにインディケーターを挿入しても、OnInit関数の戻り値がINIT_FAILEDの場合は、インディケーターがチャートにセットされずに除去されていた気がします。しかし、MT5ではそういう風にならないようです。
MT5で、わざとおかしな初期値を指定して(OnInit関数の戻り値がINIT_FAILEDになるようにして)インディケーターをチャートに挿入してみました。それからチャート上で右クリックをして「インディケーターリスト」を開くと、インディケーターリストの中に、挿入したインディケーターの名前がありました。
INIT_FAILEDなのだからチャート上に残ってほしくないのですが、MT5がそういう仕様になっているのなら、コード内にインディケーターを除去する仕組みを入れるしかありません。調べてみたら、ChartIndicatorDelete関数というものがありましたので、こちらを使うことにしました。
コードは以下のような感じにしてみました。なお、ChartIndicatorDelete関数の第3引数にはindicator_shortnameを指定することになっているので、そのためだけにif文の冒頭でshortnameをセットしています。
(追記)
なお、EAをチャートから除去する場合、ExpertRemove関数というものがあります。
int OnInit() { // 変数 hoge が負の数の場合、チャートからインディケーターを除去して、INIT_FAILEDを返す if(hoge < 0) { string shortname = "indicator_hoge"; IndicatorSetString(INDICATOR_SHORTNAME, shortname); int window = ChartWindowFind(); // subウィンドウに表示されるインジへの対応 ChartIndicatorDelete(0, window, shortname); return INIT_FAILED; } (中略) return INIT_SUCCEEDED; }
ChartIndicatorDelete関数の書式
bool ChartIndicatorDelete( long chart_id, // chart id int sub_window // number of the subwindow const string indicator_shortname // short name of the indicator );