既刊の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で動かすまでの手順です。

  1. TradingViewのチャート画面下部にある「Pineエディタ」タブを開く
  2. 新規スクリプトを作成し、上のコードを貼り付ける
  3. 「保存」してから「チャートに追加」をクリックする
  4. 赤い点線(ATR損切りライン)と青い3本線(ボリンジャーバンド)が表示されることを確認する
  5. 入力パネルで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側にも応用できます。

関連記事