SMC(スマートマネー・コンセプト)とは?
SMC(Smart Money Concepts)は、銀行やヘッジファンドなど「相場を動かす巨大な資金(スマートマネー)」の足跡を読み解き、彼らと同じ方向にトレードを行うという海外で大流行しているプライスアクション分析の手法です。
しかし、SMCには「BOS」「CHoCH」「オーダーブロック」「FVG」など専門用語が多く、チャート上でそれらすべてを自力で見つけ出すのは非常に手間がかかります。
そこで今回、SMCの分析に必要なすべての要素を1つのチャートに全自動で描画する**「SMC_Ultimate_All_In_One_v6」**インジケーターを作成しました。
実装されている主要機能
1. BOS / CHoCH の自動検知
相場の構造破壊(BOS = Break of Structure)と、トレンド転換の初期シグナル(CHoCH = Change of Character)を自動で判定し、チャート上にテキストで描画します。これにより、目線の固定が機械的に行えます。
2. オーダーブロック(OB)の可視化
機関投資家が大口の注文を入れた痕跡である「オーダーブロック」をボックスで強調表示します。さらに、上位足(マルチタイムフレーム)のオーダーブロックも同時に重ねて表示できるため、環境認識の精度が劇的に向上します。
3. FVG(フェアバリューギャップ)
価格が急変動した際に生じる「価格の真空地帯(FVG)」を色付きで描画します。価格は磁石のようにFVGを埋めに戻る習性があるため、強力なエントリー/利確のターゲットになります。
4. P&D ゾーン(プレミアム&ディスカウント)
直近50期間の最高値と最安値の中央値(Equilibrium / 半値線)をリアルタイムで描画します。この線より上(プレミアムゾーン)で売り、下(ディスカウントゾーン)で買うのがSMCの鉄則です。
TradingViewへの追加方法
以下のソースコードをコピーし、TradingView下部の「Pineエディタ」に貼り付けて「チャートに追加」をクリックしてください。
//@version=6
indicator("SMC_Ultimate_All_In_One_v6", overlay=true, max_boxes_count=100, max_lines_count=100, max_labels_count=100)
// ==========================================
// 1. 設定画面 (Inputs)
// ==========================================
g_main = "【基本設定】"
length = input.int(5, title="スイング期間 (ピボットの広さ)", minval=2, group=g_main)
g_struct = "【BOS / CHoCH 設定】"
show_struct = input.bool(true, title="BOS / CHoCH (構造破壊・転換) を表示", group=g_struct)
g_ob = "【オーダーブロック (OB) 設定】"
show_ob = input.bool(true, title="通常OB (現在足) を表示", group=g_ob)
show_mtf = input.bool(true, title="上位足OB を表示 (オンオフ)", group=g_ob)
mtf_val = input.timeframe("240", title="表示したい上位足の時間軸", group=g_ob)
g_fvg = "【FVG 設定】"
show_fvg = input.bool(true, title="FVG (価格の真空地帯) を表示", group=g_fvg)
show_pd = input.bool(true, title="P&Dゾーン (半値線) を表示", group=g_fvg)
// カラーカスタマイズ
color_bull = input.color(#deff9a, title="強気カラー (上昇/買いゾーン)")
color_bear = input.color(#ff3b69, title="弱気カラー (下落/売りゾーン)")
// ==========================================
// 2. グローバル計算 (CW10002対策)
// ==========================================
atr_val = ta.atr(14)
ph = ta.pivothigh(high, length, length)
pl = ta.pivotlow(low, length, length)
var float last_ph = na
var float last_pl = na
var string last_direction = ""
if not na(ph)
last_ph := ph
if not na(pl)
last_pl := pl
bool cross_up = ta.crossover(close, last_ph)
bool cross_down = ta.crossunder(close, last_pl)
bool is_new_mtf = timeframe.change(mtf_val)
// ==========================================
// 3. BOS / CHoCH ロジック
// ==========================================
if show_struct
// 上昇ブレイク
if not na(last_ph) and cross_up
string label_text = (last_direction == "bear" or last_direction == "") ? "CHoCH" : "BOS"
label.new(bar_index, high, label_text, style=label.style_label_down, color=color_bull, textcolor=color.black, size=size.small)
last_direction := "bull"
last_ph := na
// 下落ブレイク
if not na(last_pl) and cross_down
string label_text = (last_direction == "bull" or last_direction == "") ? "CHoCH" : "BOS"
label.new(bar_index, low, label_text, style=label.style_label_up, color=color_bear, textcolor=color.black, size=size.small)
last_direction := "bear"
last_pl := na
// ==========================================
// 4. 通常オーダーブロック (OB) ロジック
// ==========================================
is_impulse_bull = close > open and (close - open) > atr_val * 1.5
is_impulse_bear = close < open and (open - close) > atr_val * 1.5
if show_ob
// 上昇OB
if is_impulse_bull and close[1] < open[1]
box.new(bar_index[1], high[1], bar_index + 15, low[1], bgcolor=color.new(color_bull, 85), border_color=color.new(color_bull, 60))
// 下落OB
if is_impulse_bear and close[1] > open[1]
box.new(bar_index[1], high[1], bar_index + 15, low[1], bgcolor=color.new(color_bear, 85), border_color=color.new(color_bear, 60))
// ==========================================
// 5. 上位足オーダーブロック (MTF OB) ロジック
// ==========================================
get_mtf_data() => [high, low, open, close, ta.atr(14)]
[m_high, m_low, m_open, m_close, m_atr] = request.security(syminfo.tickerid, mtf_val, get_mtf_data(), barmerge.gaps_off, barmerge.lookahead_off)
m_is_bull = m_close > m_open and (m_close - m_open) > m_atr * 1.5
m_is_bear = m_close < m_open and (m_open - m_close) > m_atr * 1.5
if show_mtf and is_new_mtf
if m_is_bull
box.new(bar_index, m_high[1], bar_index + 30, m_low[1], bgcolor=color.new(color_bull, 92), border_color=color_bull, border_style=line.style_dashed)
if m_is_bear
box.new(bar_index, m_high[1], bar_index + 30, m_low[1], bgcolor=color.new(color_bear, 92), border_color=color_bear, border_style=line.style_dashed)
// ==========================================
// 6. FVG (フェアバリューギャップ) ロジック
// ==========================================
bull_fvg = low > high[2] and close[1] > high[2]
bear_fvg = high < low[2] and close[1] < low[2]
if show_fvg
// 強気FVG
if bull_fvg
box.new(left=bar_index[2], top=low, right=bar_index + 5, bottom=high[2], bgcolor=color.new(color_bull, 88), border_color=color.new(color_bull, 100))
// 弱気FVG
if bear_fvg
box.new(left=bar_index[2], top=low[2], right=bar_index + 5, bottom=high, bgcolor=color.new(color_bear, 88), border_color=color.new(color_bear, 100))
// ==========================================
// 7. P&D ゾーン (Equilibrium 半値線) ロジック 【修正箇所】
// ==========================================
var line eq_line = na
if show_pd
float highest_high = ta.highest(high, 50)
float lowest_low = ta.lowest(low, 50)
float eq = (highest_high + lowest_low) / 2
// 最新のバーのタイミングでのみ、線を1本だけ描画・更新する
if barstate.islast
if na(eq_line)
eq_line := line.new(bar_index - 50, eq, bar_index, eq, color=color.white, style=line.style_dashed, width=1)
else
line.set_xy1(eq_line, bar_index - 50, eq)
line.set_xy2(eq_line, bar_index, eq)