既刊のMQL記事群では、損切り幅をiATRで、
バンド幅をiBandsで計算していました。
この記事では、Pine Scriptの組込み関数である、
ta.atr/ta.bbを使うと、同じ計算がどう書けるかを解説します。
・ta.atr/ta.bbのシグネチャと戻り値
・既刊iATR/iBandsとの引数構成の違い
・ta.bbがタプルで3つの値を同時に返す書き方
・Pine Scriptで動くサンプルコード
既刊iATR/iBandsのおさらい
まず、MQL4側の2つの関数を振り返ります。
iATR: 損切り幅を相場の変動に合わせる関数
既刊記事で解説したiATRは、
double iATR( string symbol, int timeframe, int period, int shift );
という4引数で、直近の値幅の平均(True Rangeの平均)を直接返す関数でした。
iBands: ボリンジャーバンドの上下限を取得する関数
既刊記事で解説したiBandsは、
double iBands( string symbol, int timeframe, int period, double deviation, int bands_shift, int mode, int shift );
という7引数で、`mode`引数、
(MODE_UPPER/MODE_LOWER/MODE_MAIN)を切り替えて、
上限・下限・中心線をそれぞれ別の呼び出しで取得する設計でした。
2つの関数の共通点: 1回の呼び出しで1つの値
・iATRは呼ぶたびに1つの数値が返る
・iBandsは上限・下限・中心線を別々に3回呼ぶ必要がある
・MQL4には複数の値をまとめて返す仕組みがない
ta.atr/ta.bbのシグネチャ
Pine Script側の2つの関数を確認します。
ta.atrのシグネチャと内部計算
ta.atr(length) → series float
True Range(高値-安値、|高値-前回終値|、|安値-前回終値|の最大値)を、
Wilderの平滑化(RMA)で平均した値を直接返します。
ta.bbのシグネチャ: タプルで3値を同時に返す
ta.bb(source, length, mult) → [series float, series float, series float]
中心線(単純移動平均)・上限・下限の3つを、
1回の呼び出しでまとめて返します。
ta.bbの戻り値をタプル代入で受け取る
[bbMiddle, bbUpper, bbLower] = ta.bb(close, 20, 2.0)
既刊iBandsのように`mode`引数で呼び分ける必要がありません。
既刊MQLとPine Scriptの書き方の比較
同じ計算を、実際のコードで比較します。
ATRの取得: MQL4版
double atr = iATR(_Symbol, 0, 14, 0); double sl = Bid - atr * 1.5;
`period`(14)を指定して、現在の値(shift=0)を1回取得します。
ATRの取得: Pine Script版
atrValue = ta.atr(14) stopLevel = close - atrValue * 1.5
`symbol`・`timeframe`・`shift`の指定が不要な分、
書くコードが短くなります。
ボリンジャーバンドの取得: MQL4版とPine Script版
// MQL4版(3回呼び出し) double upper = iBands(_Symbol, 0, 20, 2.0, 0, MODE_UPPER, 0); double lower = iBands(_Symbol, 0, 20, 2.0, 0, MODE_LOWER, 0); double middle = iBands(_Symbol, 0, 20, 2.0, 0, MODE_MAIN, 0); // Pine Script版(1回の呼び出し) [middle, upper, lower] = ta.bb(close, 20, 2.0)
iBandsが3回の呼び出しに分けていた処理を、
ta.bbは1回のタプル代入でまとめています。
実際に動くPine Scriptのサンプルコード
ATRベースの損切りラインとボリンジャーバンドを、
同じチャートに表示するサンプルです。
//@version=6
indicator("ATR Stop + Bollinger Bands Sample", overlay = true)
atrLength = input.int(14, title = "ATR期間")
atrMult = input.float(1.5, title = "ATR倍率")
bbLength = input.int(20, title = "BB期間")
bbMult = input.float(2.0, title = "BB標準偏差倍率")
atrValue = ta.atr(atrLength)
stopLevel = close - atrValue * atrMult
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbMult)
plot(stopLevel, title = "ATR Stop", color = color.red, style = plot.style_circles)
plot(bbMiddle, title = "BB Middle", color = color.gray)
plot(bbUpper, title = "BB Upper", color = color.blue)
plot(bbLower, title = "BB Lower", color = color.blue)
ATRから計算した損切りラインと、
ボリンジャーバンドの3本線が同時に表示されます。
TradingViewでの貼り付け・実行手順
実際にTradingViewで動かすまでの手順です。
- TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
- 新規スクリプトを作成し、上のコードを貼り付ける
- 「保存」してから「チャートに追加」をクリックする
- 赤い点線(ATR損切りライン)と青い3本線(ボリンジャーバンド)が表示されることを確認する
- 入力パネルでatrMult・bbMultを変更し、線の位置がどう変わるか確認する
よくあるエラーと注意点
実装でつまずきやすいポイントをまとめます。
タプルの個数を間違える
・ta.bbは必ず3つの値を返す
・[middle, upper] = ta.bb(…)のように、
2つしか受け取らないとエラーになる
・受け取る変数の個数を戻り値の個数と必ず一致させる
standard deviation(mult)の意味を誤解する
既刊iBandsの`deviation`引数と、ta.bbの`mult`引数は、
どちらも標準偏差の倍率という同じ意味です。
名前が違うだけで、計算の考え方は共通しています。
名前空間ta.を忘れる
Pine Scriptのテクニカル関数は、
必ず`ta.`という名前空間付きで呼び出す必要があります。
`atr(14)`のように`ta.`を省略するとエラーになります。
よくある質問
ta.atr/ta.bbについて、よく検索される疑問に回答します。
・既刊iATRトレーリングストップEAの考え方は、ta.atrでもそのまま使える
・bbMultを大きくするほどバンドは広くなる
・ta.bbの中心線はsma(source, length)と同じ値になる
iATRのperiodとta.atrのlengthは同じ意味ですか?
同じ意味です。
どちらも、True Rangeを平均する際に使う本数を指定する引数です。
ta.bbの戻り値を2つだけ受け取ることはできますか?
できません。
ta.bbは常に3つの値(中心線・上限・下限)を返すため、
受け取る側の変数も3つ用意する必要があります。
上限だけ使いたい場合も、残り2つを捨てる変数として受け取ってください。
既刊のATRトレーリングストップEAと同じロジックを組めますか?
組めます。
既刊のMQL4版EAは、iATRの戻り値に倍率を掛けて、
現在値より有利な位置にしかストップを動かさない設計でした。
Pine Scriptでは、strategy.exit()の、
trail_pointsやtrail_offsetに、
ta.atrの値を渡すことで、同じ考え方を再現できます。
【Pine Script入門】ta.atr/ta.bbの使い方をMQLユーザー向けに解説してみた(iATR/iBandsとの比較):まとめ
Pine Scriptのta.atrは、既刊iATRと同じ考え方で、
True Rangeを平均した値を1回の呼び出しで返します。
ta.bbは、既刊iBandsが3回の呼び出しに分けていた、
中心線・上限・下限を、タプル代入で1回にまとめて取得できます。
引数の意味自体はMQL4版と共通しているため、
既刊のATR・ボリンジャーバンド関連記事の設計思想は、
そのままPine Script側にも応用できます。
コメント