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];//このバーで通知済みにする
}
}
ポイントはTime[0] != lastAlertTimeです。現在の足の開始時刻(Time[0])と、最後に通知したときの時刻を比較し、まだ同じ足で通知していない場合だけAlert()を呼びます。新しい足に切り替わるとTime[0]が変わるため、次の足でまた条件が成立していれば改めて通知されます。
コンパイルする
メタエディタで「コンパイル」(Ctrl+F7)を実行し、「0 error(s), 0 warning(s)」と表示されることを確認してください。
まとめ
Alert関数の基本の使い方と、実際にサインインジケーターへ組み込む際に必須となる「同じ足で二重に鳴らさない」実装を解説しました。
コメント