Alert関数の書式だけ知っても、実際にサインインジケーターへ組み込むと「条件が成立している間ポップアップが鳴りっぱなしになる」という壁にぶつかります。この記事では、Alert関数の基本の書き方に加えて、同じ足で何度も鳴らさないようにする実装まで解説します。

Alert関数

Alert関数は、ポップアップアラート(メッセージ)を表示させるために使用します。

Alert関数でありがちなのが、シグナルなどのサインインジケーターに使用させるケースですね。

パソコンの近くにはいても、画面を見ているのは面倒だという時に役立つ関数です。

Alert関数の記述

Alert関数の記述は非常に簡単で、Alert()の中に表示したい文字を入力するだけです。カンマ区切りで複数の値を並べると、それらをつなげて1つのメッセージとして表示できます。

int OnInit()
  {
   Alert("〇〇◯", "✕✕✕");

   return(INIT_SUCCEEDED);
  }

このコードはインジケーター(またはEA)をチャートに追加した瞬間、OnInit()が呼ばれるタイミングで一度だけポップアップが表示される、という動作確認用のサンプルです。

条件が成立したときだけアラートを鳴らす

実際にサインインジケーターとして使う場合は、価格やインジケーターの値を条件にしてAlert()を呼び出します。ここで気をつけたいのが、条件が成立している間、毎ティックAlert()が呼ばれ続けてしまうことです。

例えば「RSIが70を超えたらアラート」という条件をそのまま書くと、RSIが70を超えている間ずっとポップアップが表示され続け、実用に耐えません。

これを防ぐには、「直前に確定した足で既に通知したかどうか」を記録しておき、同じ足では2回目以降のAlert()を呼ばないようにします。

datetime lastAlertTime = 0;//最後にアラートを出したバーの時刻

void OnTick()
  {
   double rsi = iRSI(_Symbol, 0, 14, PRICE_CLOSE, 0);//現在のRSI

   if(rsi > 70 && Time[0] != lastAlertTime)
     {
      Alert(_Symbol, ":RSIが70を超えました(", DoubleToString(rsi, 1), ")");
      lastAlertTime = Time[0];//このバーで通知済みにする
     }
  }
Copy

ポイントはTime[0] != lastAlertTimeです。現在の足の開始時刻(Time[0])と、最後に通知したときの時刻を比較し、まだ同じ足で通知していない場合だけAlert()を呼びます。新しい足に切り替わるとTime[0]が変わるため、次の足でまた条件が成立していれば改めて通知されます。

コンパイルする

メタエディタで「コンパイル」(Ctrl+F7)を実行し、「0 error(s), 0 warning(s)」と表示されることを確認してください。

まとめ

Alert関数の基本の使い方と、実際にサインインジケーターへ組み込む際に必須となる「同じ足で二重に鳴らさない」実装を解説しました。

関連記事