TradingViewで人気のボラティリティ系インジケーター、CM_Williams_Vix_Fix Finds Market Bottoms(ウィリアムズVIXフィックス)をご存知でしょうか。
海外でも使っている人が多く、「大きな動きが起きた」を素早く可視化するのに便利なインジです。
このページでは、Williams VIX Fixの考え方をベースにしながら、著作権への配慮でコードをゼロから書き直した独自インジ「Volatility Surge Strategy [VSS]」を配布しています。
誰でも無料で使っていただけます。
CM_Williams_Vix_Fix Finds Market Bottomsとは?

Williams VIX Fix(ウィリアムズVIXフィックス)は、個別の銘柄や通貨ペアに対してVIX(恐怖指数)のような動きを計算するインジケーターです。
インジケーターには出来高のようなグラフがあり、過去の一定期間の「高値」からの「下落の深さ」をパーセンテージで表示します。
この値が大きいほど、市場のボラティリティ(値動きの荒さ)が高いことを示す。

黄色い丸の部分で強く反応しているのがわかります。大きな動きのない時はグレー、大きく動いた時はライム色の表示になっています。
一言でいうと「なんかデカい動きがあったぞ」をヒストグラムで見せてくれるインジですね。使い方としては主にこういった場面で活躍します。
- パニック売りや急騰の検出
- トレンド転換の可能性を探る
- ボラティリティの収束(落ち着き)を確認する
ローソク足や出来高でもボラティリティは読めますが、より視覚的に把握しやすくしたインジというイメージです。
なぜ独自インジを作ったのか
ここで少し話をしておきます。
TradingViewで「CM_Williams_Vix_Fix」として公開されているのは、ChrisMoody(cm)さんが実装したPine Scriptのコードです。
Williams VIX Fixの計算の考え方自体はLarry Williamsさんが公開したもので、計算式やアルゴリズムには著作権が発生ません。
なので今回は、Williams VIX Fixの「考え方・計算の概念」だけを使ってPine ScriptのコードをゼロからWイチで書き直したものを作りました。
Volatility Surge Strategy [VSS]

今回作ったのが「Volatility Surge Strategy [VSS]」です。
TradingViewでも「Volatility Surge Strategy」という名前で無料公開しています。
Williams VIX Fixの核心にある「過去N期間の終値最高値から現在の安値までの下落深度(%)」という計算式をベースに、そこにBollinger Bandフィルターを重ねてボラティリティの急上昇(スパイク)を検出する作りにしています。
ストラテジー形式なのでTradingViewのバックテスト機能も使えます。
設定項目
設定はグループごとにまとまっています。
Volatility Index
- Lookback Period:22(高値の参照期間。長くすると感度が下がります)
BB Filter
- BB Period:20(ボラティリティの平均を取る期間)
- BB Multiplier:2.0(スパイク判定の感度。上げると反応が減ります)
Risk Management
- ATR Period:14(SL/TP計算の基準)
- SL ATR Multiplier:1.5(SLの広さ。ATR×1.5)
- Risk/Reward Ratio:1.5(TPはSL幅の1.5倍)
コード
//@version=6
// ================================================================
// Volatility Surge Strategy [VSS]
// 完全オリジナル実装
// ① VolatilityIndex(VI):過去N期間の終値高値からの下落深度
// ② Bollinger Bandフィルター:VIの急上昇(スパイク)を検出
// ③ Switchシグナル:高ボラ継続中の陽線/陰線転換でエントリー
// ================================================================
strategy(
title = "Volatility Surge Strategy",
shorttitle = "VSS",
overlay = false,
default_qty_type = strategy.fixed,
default_qty_value = 1,
commission_type = strategy.commission.percent,
commission_value = 0.05,
slippage = 2
)
// ── パラメータ ───────────────────────────────────────────────────
var g_vi = "Volatility Index"
var g_bb = "BB Filter"
var g_rm = "Risk Management"
lookback = input.int (22, title="Lookback Period", minval=5, maxval=200, group=g_vi)
bbPeriod = input.int (20, title="BB Period", minval=5, group=g_bb)
bbMult = input.float(2.0, title="BB Multiplier", minval=0.5, maxval=5, group=g_bb, step=0.1)
atrPeriod = input.int (14, title="ATR Period", minval=1, group=g_rm)
atrMult = input.float(1.5, title="SL ATR Multiplier", minval=0.5, maxval=5, group=g_rm, step=0.1)
rrRatio = input.float(1.5, title="Risk/Reward Ratio", minval=0.5, maxval=5, group=g_rm, step=0.1)
// ── Volatility Index計算 ────────────────────────────────────────
// 過去lookback期間の終値最高値からの安値の下落深度(%)
highest_c = ta.highest(close, lookback)
vi = (highest_c - low) / highest_c * 100
// ── Bollinger Bandフィルター ─────────────────────────────────────
vi_sma = ta.sma(vi, bbPeriod)
vi_stdev = ta.stdev(vi, bbPeriod)
vi_upper = vi_sma + bbMult * vi_stdev
// ── 条件判定 ────────────────────────────────────────────────────
isHigh = vi >= vi_upper // ボラティリティスパイク中
isBull = close > open // 現在バーが陽線
wasBull = close[1] > open[1] // 前バーが陽線
// Switchシグナル:高ボラ継続中に陽線⇔陰線が入れ替わった瞬間
bullSwitch = isHigh[1] and isHigh and isBull and not wasBull
bearSwitch = isHigh[1] and isHigh and not isBull and wasBull
// ── ATRベースSL/TP ───────────────────────────────────────────────
atr = ta.atr(atrPeriod)
// ── ストラテジー エントリー ──────────────────────────────────────
if bullSwitch and barstate.isconfirmed
strategy.entry("BUY", strategy.long)
strategy.exit("BUY_X", "BUY",
stop = close - atr * atrMult,
limit = close + atr * atrMult * rrRatio)
if bearSwitch and barstate.isconfirmed
strategy.entry("SELL", strategy.short)
strategy.exit("SELL_X", "SELL",
stop = close + atr * atrMult,
limit = close - atr * atrMult * rrRatio)
// ── 表示 ─────────────────────────────────────────────────────────
// ヒストグラム:スパイク中は陽線=黄色 / 陰線=赤、通常はグレー
barCol = isHigh
? (isBull ? color.rgb(255, 220, 0) : color.rgb(255, 60, 60))
: color.rgb(110, 110, 110)
plot(vi, title="VI (Histogram)", style=plot.style_histogram, linewidth=4, color=barCol)
plot(vi_upper, title="Upper Band", color=color.new(color.aqua, 50), linewidth=1)
plot(vi_sma, title="Mid (SMA)", color=color.new(color.gray, 60), linewidth=1)
// Switchシグナルマーカー
plotshape(bullSwitch, title="Bull Switch",
style=shape.triangleup, location=location.bottom,
color=color.yellow, size=size.small)
plotshape(bearSwitch, title="Bear Switch",
style=shape.triangledown, location=location.top,
color=color.red, size=size.small)
// ── アラート ─────────────────────────────────────────────────────
alertcondition(isHigh and barstate.isconfirmed, title="High Volatility", message="{{ticker}}, {{interval}}: Volatility Surge Detected")
alertcondition(bullSwitch and barstate.isconfirmed, title="Bullish Switch", message="{{ticker}}, {{interval}}: Bullish Switch")
alertcondition(bearSwitch and barstate.isconfirmed, title="Bearish Switch", message="{{ticker}}, {{interval}}: Bearish Switch")
アラートについて
アラート条件は3つあります。
- 「High Volatility」:ボラティリティがスパイク(急上昇)した時
- 「Bullish Switch」:スパイク中に陰線→陽線に転換した時
- 「Bearish Switch」:スパイク中に陽線→陰線に転換した時
High VolatilityはVIがBBの上限を超えたタイミングで鳴ります。陽線・陰線どちらでも反応します。
Bullish/Bearish Switchは「大きな動きの後に逆方向の力が入ってきた瞬間」を捉えるアラートです。急変動後の転換を早めにキャッチしたい時に使えます。
3種類あるので、必要なものだけオンにしてください。
他のインジとの組み合わせ
このインジ単体で素直にエントリーするとうまくいかないことが多いです。
「大きな動きがあった」の検出は得意ですが、そのままの流れで続くのか、反転するのかはVSSだけでは判断できないので。他のインジや価格アクションと組み合わせるのがおすすめです。
例えばRSIと組み合わせる場合。ボラティリティが急上昇した後にRSIのダイバージェンスが重なると、転換の可能性が高まります。「大きな動きがあった」+「RSIが逆方向を向いている」という2段構えで根拠が増えますね。
オーダーブロックのポイントでBullish/Bearish Switchが出た場合も面白い組み合わせです。価格的に意味のある場所でボラティリティが反転したタイミングのサインとして使えます。
200EMAなどのMAラインの上下で反応が出た時に順張りというのもシンプルで使いやすいです。
単体では補助的なポジションのインジですが、他のインジや価格アクションと組み合わせると応用パターンはかなり多いです。ご自身のスタイルに合わせて試してみてください。
あと、MT4やMT5などでチャートを見ている方はぜひ一度TradingViewを見てみてください。



コメント