既刊の記事群では、SendMail()でメールを送る方法や、
WebRequest()を使ってLINE NotifyへHTTPリクエストを、
直接送る通知EAの作り方を解説しました。
この記事では、Pine Scriptのalert()/alertcondition()が、
同じ「通知」をどう実現するのか、MQL4版との違いを対比します。
・既刊SendMail/LINE通知のおさらい
・alert()/alertcondition()のシグネチャ
・コードは「トリガー」だけ、配信先はUIダイアログで決める設計
・Pine Scriptで動くサンプルコード
既刊SendMail/LINE通知のおさらい
まず、MQL4側の2つの通知方法を振り返ります。
SendMail()での通知
SendMail()は、MT4端末側に設定したSMTPサーバーを使い、
件名と本文を指定してメールを送る関数でした。
WebRequest()でLINE Notifyへ送る設計
既刊line-ea.mdでは、WebRequest()を使い、
LINE NotifyのAPIへ直接HTTPのPOSTリクエストを、
EAのコードの中から組み立てて送信していました。
どちらも配信先の実装がコードの中にある
・SendMail()もWebRequest()も、送信先の設定や組み立てをコードが担う
・MT4側でSMTP設定やURLの許可リスト登録が必要
・通知の「内容」と「届け方」が1つのコードに混ざっている
alert()とalertcondition()のシグネチャ
次に、Pine Script側の2つの関数を確認します。
alertcondition(condition, title, message)
alertcondition(condition, title, message)
conditionがtrueになった瞬間、
titleとmessageを使ったアラートを発生させます。
alert(message, freq)
alert(message, freq)
messageは固定文字列ではなく、
series string(計算中の値を含む文字列)を渡せます。
freq引数の3つの値
・alert.freq_all: 条件を満たすたびに毎回発生
・alert.freq_once_per_bar: 1本のバーで最初の1回だけ
・alert.freq_once_per_bar_close: バーが確定した時だけ
最大の違い: コードは「トリガー」だけ
・コードが作るのは「いつ・何を通知するか」のトリガーだけ
・配信先(メール・Webhook等)は、TradingViewのUI側で設定する
・MQLのWebRequestのような送信コードは一切書かなくてよい
配信先はUIダイアログで決める
TradingViewの「アラートを作成」ダイアログで、
ポップアップ・メール・Webhook URL等の配信先を選びます。
Webhook URLでLINE Notify等にも飛ばせる
ダイアログのWebhook URL欄に、LINE Notify等の、
中継先のURLを設定すれば、コード側は何も変えずに届け先を増やせます。
コードと配信先が分離している利点
既刊line-ea.mdのように、配信先を変えるたびにコードを直す必要がなく、
ダイアログの設定を変えるだけで配信先を切り替えられます。
alertcondition()とalert()の使い分け
2つの関数は、使える場面と柔軟さが違います。
alertconditionはインジケーター専用
alertcondition()は、strategyスクリプトでは使えず、
indicatorスクリプトでのみ使える関数です。
alertはstrategyでも使える
alert()は、indicator・strategyの両方で使え、
messageに計算中の値を埋め込める分、柔軟性が高くなります。
迷ったらalert()を使う
alertcondition()は列の先頭(条件分岐の外)に書く必要があるなど、
書き方の制約もあるため、迷った場合はalert()を使う方が扱いやすいです。
MQLとPine Scriptのコード比較
「価格が一定値を超えたら通知する」という同じ目的のコードを比較します。
MQL4版: WebRequestで直接送る
if(Bid > 150.0 && !alreadySent)
{
string url = "https://notify-api.line.me/api/notify";
string headers = "Authorization: Bearer " + LineToken;
// WebRequest()でPOSTを組み立てて送信する処理が続く
alreadySent = true;
}
Pine Script版: トリガーだけ作る
alertcondition(close > 150.0, title = "価格アラート",
message = "価格が150.0を超えました")
送信先のURLやヘッダーをコードに書く必要はありません。
実際に動くPine Scriptのサンプルコード
終値が移動平均を上抜けたら、動的メッセージで通知するサンプルです。
//@version=6
indicator("Alert Sample", overlay = true)
maLength = input.int(20, title = "移動平均期間")
ma = ta.sma(close, maLength)
crossUp = ta.crossover(close, ma)
plot(ma, title = "MA", color = color.blue)
if crossUp
alert("終値がMA(" + str.tostring(maLength) + ")を上抜け。価格: "
+ str.tostring(close), alert.freq_once_per_bar_close)
alert()のmessageにmaLengthやcloseの値を埋め込んでいる点が、
静的メッセージしか使えないalertcondition()との違いです。
TradingViewでアラートを作成する手順
- チャートに追加したスクリプトを選び、右クリックで「アラートを追加」を開く
- 条件にスクリプト名を選び、通知方法(ポップアップ・メール・Webhook URL等)を選ぶ
- Webhook URLにLINE Notify等の中継先を設定する場合はここに入力する
- 「作成」をクリックし、条件を満たした時に通知が届くことを確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
alertcondition()をif文の中に書く
・alertcondition()は、列の先頭で無条件に1回だけ呼ぶ必要がある
・if文の中に入れるとコンパイルエラーになる
・条件分岐はconditionの引数の中に書く
alert()のfreqを指定し忘れる
freqを省略すると、デフォルトのalert.freq_once_per_barになり、
想定より通知が多く届くことがあります。
アラートを作成しないと何も届かない
alert()/alertcondition()はトリガーを作るだけで、
TradingView側で「アラートを作成」しないと、通知自体は発生しません。
よくある質問
alert()/alertcondition()について、よく検索される疑問に回答します。
・動的な数値を通知文に入れたい場合は、必ずalert()を使う
・LINEへ飛ばす場合も、コード側の変更は不要でダイアログ側だけで済む
・既刊SendMail/line-eaのコードはPine Script移行時は不要になる
既刊SendMail()相当のメール通知はできますか?
できます。
アラート作成ダイアログの通知方法で「メール」を選ぶだけで、
既刊SendMail()のようなSMTP設定をコードに書く必要はありません。
既刊LINE Notify相当の通知はできますか?
できます。
Webhook URLの欄に、
LINE Notify(または中継サービス)のURLを設定すれば、
既刊WebRequest()のようなコードなしで同じ通知を実現できます。
strategyスクリプトでもalertconditionは使えますか?
使えません。
alertcondition()はindicatorスクリプト専用の関数のため、
strategyスクリプトでは代わりにalert()を使います。
【Pine Script入門】alert()/alertcondition()の使い方をMQLユーザー向けに解説してみた(SendMail/LINE通知との比較):まとめ
Pine Scriptのalert()/alertcondition()は、
既刊SendMail()・WebRequest()とは違い、
コードが作るのは通知の「トリガー」だけです。
配信先(メール・Webhook等)は、
TradingViewのUIダイアログ側で設定するため、
MQL4のようにメール送信やHTTPリクエストの組み立てを、
コードの中に書く必要がありません。
コメント