恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

[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 
   );