「移動平均エンベロープ」とは、移動平均の上下数%に平行したラインを引くインジケーターで、移動平均からの乖離率が視覚化しやすくなります。
TradingViewにも「Envelope」という名前の内蔵インジケーターがありますが、もう少し色々設定できるものが欲しかったので自作してみました。
・最大3本までのエンベロープを同時に引けます
・不要なエンベロープは設定で非表示にできます
・エンベロープの%値や色も自由に変更できます
・SMAとEMAの両方に対応しています(切り替え可能)
Pine言語のサンプルコード付きで公開しますので、ぜひご利用ください。
Pineスクリプトのバージョン5(v5)に対応したサンプルコードも追加しました。
本インジケーターの概要
1つのインジケーターで最大3本のエンベロープを表示できます。不要なエンベロープは非表示にできるので、1本や2本だけ使いたいという方でもOKです。
各エンベロープは%値や色を設定できますし、SMAだけでなくEMAでの計算にも対応しています。

初期設定
MA | 終値の25日単純移動平均線(SMA) | 白色(透過率50%) |
---|---|---|
エンベロープ1 | MA ± 1% | 表示する / ライム色(不透明度30%) |
エンベロープ2 | MA ± 2% | 表示する / ライム色(不透明度50%) |
エンベロープ3 | MA ± 3% | 表示する / ライム色(不透明度80%) |
設定変更可能なパラメータ
インジケーターの設定画面は、以下のような構成となっております。

(1) 移動平均線の計算対象価格を変更したい時
「計算価格」を変更すると、高値や出来高などでも計算可能です。
(2) 移動平均線を計算する長さ(足数)を変更したい
たとえば日足で75日MAに変更したければ、「MA長さ」を「75」に変更してください。
(3) SMA/EMA切り替え
「EMAとして計算する」にチェックを入れると、単純移動平均線(SMA)ではなく指数平滑移動平均線(EMA)で計算します。
(4) エンベロープの%値とライン色
下の方にある「Env1 %」~「Env3 %」が各エンベロープの設定です。移動平均からの乖離率を%値で指定できます。
また一番右の色をクリックするとカラーパレットから色を選択できます。不透明度も変更可能。

(5) エンベロープの表示/非表示切り替え
各エンベロープ設定の左端にあるチェックを外すと、そのエンベロープは表示されなくなります。
サンプルコード
以下のコードをコピペしてお使いください。
サンプルコードを元にTradingViewインジケーターを作成する手順が分からない方は、以下の記事を参考にしてください。(記事内の手順3を今回のサンプルコードに置き換えて進めてみてください)

Pine(v5)バージョン
//@version=5
indicator(title="$TTOSample_MAEnv", shorttitle="MAEnv", overlay=true)
//-------------------------
// input設定
//-------------------------
src = input.source(close, title="計算価格", group="移動平均線の設定")
ma_length = input.int(25, title="MA 長さ", minval=1, inline="MA Settings", group="移動平均線の設定")
is_ema = input.bool(false, title="EMAとして計算する", inline="MA Settings", group="移動平均線の設定")
env1_enable = input.bool(true, "", inline="Env Pct 1", group="エンベロープ設定")
env1_pct = input.float(1, "Env1 %", inline="Env Pct 1", group="エンベロープ設定")
env1_color = input.color(color.new(color.lime, 70), "", inline="Env Pct 1", group="エンベロープ設定")
env2_enable = input.bool(true, "", inline="Env Pct 2", group="エンベロープ設定")
env2_pct = input.float(2, "Env2 %", inline="Env Pct 2", group="エンベロープ設定")
env2_color = input.color(color.new(color.lime, 50), "", inline="Env Pct 2", group="エンベロープ設定")
env3_enable = input.bool(true, "", inline="Env Pct 3", group="エンベロープ設定")
env3_pct = input.float(3, "Env3 %", inline="Env Pct 3", group="エンベロープ設定")
env3_color = input.color(color.new(color.lime, 20), "", inline="Env Pct 3", group="エンベロープ設定")
//-------------------------
// メイン処理
//-------------------------
ma_value = is_ema ? ta.ema(src, ma_length) : ta.sma(src, ma_length)
plot(ma_value, title="MA", color=color.new(#ffffff, 50))
plot(env1_enable ? ma_value * (1 + env1_pct/100) : na, color=env1_color)
plot(env1_enable ? ma_value * (1 - env1_pct/100) : na, color=env1_color)
plot(env2_enable ? ma_value * (1 + env2_pct/100) : na, color=env2_color)
plot(env2_enable ? ma_value * (1 - env2_pct/100) : na, color=env2_color)
plot(env3_enable ? ma_value * (1 + env3_pct/100) : na, color=env3_color)
plot(env3_enable ? ma_value * (1 - env3_pct/100) : na, color=env3_color)
Pine(v4)バージョン
//@version=4
study(title="$TTOSample_MAEnv", shorttitle="MAEnv", overlay=true)
//-------------------------
// input設定
//-------------------------
src = input(close, type=input.source, title="計算価格", group="移動平均線の設定")
ma_length = input(25, title="MA 長さ", minval=1, inline="MA Settings", group="移動平均線の設定")
is_ema = input(false, title="EMAとして計算する", inline="MA Settings", group="移動平均線の設定")
env1_enable = input(true, "", inline="Env Pct 1", group="エンベロープ設定")
env1_pct = input(1, "Env1 %", inline="Env Pct 1", group="エンベロープ設定")
env1_color = input(color.new(color.lime, 70), "", type=input.color, inline="Env Pct 1", group="エンベロープ設定")
env2_enable = input(true, "", inline="Env Pct 2", group="エンベロープ設定")
env2_pct = input(2, "Env2 %", inline="Env Pct 2", group="エンベロープ設定")
env2_color = input(color.new(color.lime, 50), "", type=input.color, inline="Env Pct 2", group="エンベロープ設定")
env3_enable = input(true, "", inline="Env Pct 3", group="エンベロープ設定")
env3_pct = input(3, "Env3 %", inline="Env Pct 3", group="エンベロープ設定")
env3_color = input(color.new(color.lime, 20), "", type=input.color, inline="Env Pct 3", group="エンベロープ設定")
//-------------------------
// メイン処理
//-------------------------
ma_value = is_ema ? ema(src, ma_length) : sma(src, ma_length)
plot(ma_value, title="MA", color=color.new(#ffffff, 50))
plot(env1_enable ? ma_value * (1 + env1_pct/100) : na, color=env1_color)
plot(env1_enable ? ma_value * (1 - env1_pct/100) : na, color=env1_color)
plot(env2_enable ? ma_value * (1 + env2_pct/100) : na, color=env2_color)
plot(env2_enable ? ma_value * (1 - env2_pct/100) : na, color=env2_color)
plot(env3_enable ? ma_value * (1 + env3_pct/100) : na, color=env3_color)
plot(env3_enable ? ma_value * (1 - env3_pct/100) : na, color=env3_color)
おわりに
今後も「かゆいところに手が届く」「日本語表記で分かりやすい」インジケーターのサンプルコードを色々と作ってみようと思っています。
ブログの記事更新はTwitter(@eltraders)または本ページ右から登録できる「メルマガTTO通信」でお知らせしているので、ぜひフォローorご購読よろしくお願いします。