この記事でわかること
- SMCの3大概念(FVG・Order Block・BOS/CHoCH)をPine Script v5で実装する手順
- Claudeに複雑なトレード概念を正確に伝えるプロンプト設計パターン
- 各コンポーネントの完成コードと、3つを組み合わせたSMCダッシュボードの構成
SMC(スマートマネーコンセプト)の概念をTradingViewで手動確認しているトレーダーは多い。ただ、Fair Value GapやOrder Blockをリアルタイムで全銘柄に適用するには自動検出ツールが必要で、それを自作しようとするとPine Scriptの知識が要ります。
この記事では、SMCの主要3概念をPine Script v5で実装する方法をコンポーネント別に説明します。各コンポーネントにClaudeへの具体的なプロンプト例を添えます。
Pine Scriptとのやり取りの基本を確認したい場合はClaude Code × TradingViewでオリジナルインジケーターを作る完全ガイドを先に読んでください。
SMCの主要3概念と実装の考え方
SMC(スマートマネーコンセプト)はプライスアクション分析の一形態で、機関投資家(スマートマネー)の注文フローを追う手法です。実装するコンポーネントは3つです。
| 概念 | 意味 | Pine Scriptでの実装難易度 |
|---|---|---|
| Fair Value Gap (FVG) | 急激な価格移動で生じた未充填ゾーン(ギャップ) | 低〜中 |
| Order Block (OB) | 機関が大量注文を入れたと推定されるゾーン | 中 |
| Break of Structure / CHoCH | スイング構造のブレイクとトレンド転換の判定 | 中〜高 |
3つを独立したインジケーターとして実装し、最後に組み合わせる順序で進めます。一気に全部作らせようとすると、Claudeがコンポーネント間の干渉を誤って処理することがある。
PART 1:Fair Value Gap(FVG)の実装
FVGの定義をPine Scriptに落とし込む
FVGは3本ローソク足パターンで検出します。
- 強気FVG:C1(2本前)の高値 < C3(現在)の安値 → 両者の間にギャップが存在
- 弱気FVG:C1(2本前)の安値 > C3(現在)の高値 → 同様にギャップが存在
中央のC2は価格を急激に動かした「インパルスキャンドル」です。このギャップゾーンは価格が戻ってきたときの反発ポイントとして機能します。
Claudeへのプロンプト例
Pine Script v5で書いてください。インジケーター名は「FVG Detector」。overlay=true。
Fair Value Gapを以下の定義で検出してください:
- 強気FVG:high[2] < low[0]
- 弱気FVG:low[2] > high[0]
検出したら box.new で描画(強気=青緑/弱気=赤、透明度80)
extend.right で右に延長。max_boxes_count=500、max_labels_count=500
完成コード
//@version=5
indicator("FVG Detector", overlay=true, max_boxes_count=500, max_labels_count=500)
showBull = input.bool(true, "強気FVGを表示", group="表示設定")
showBear = input.bool(true, "弱気FVGを表示", group="表示設定")
minAtrPct = input.float(0.0, "最小サイズ(ATR比率%)", minval=0.0, group="フィルター")
bullCol = input.color(color.new(color.teal, 80), "強気カラー", group="カラー")
bearCol = input.color(color.new(color.red, 80), "弱気カラー", group="カラー")
atrVal = ta.atr(14)
minSize = atrVal * (minAtrPct / 100.0)
bTop = low[0]
bBot = high[2]
bSize = bTop - bBot
isBull = bSize > 0 and bSize >= minSize
rTop = low[2]
rBot = high[0]
rSize = rTop - rBot
isBear = rSize > 0 and rSize >= minSize
if isBull and showBull
box.new(bar_index - 2, bTop, bar_index, bBot, border_color=color.teal, border_width=1, bgcolor=bullCol, extend=extend.right)
label.new(bar_index - 1, bTop, "FVG+", color=color.teal, textcolor=color.white, style=label.style_label_down, size=size.tiny)
if isBear and showBear
box.new(bar_index - 2, rTop, bar_index, rBot, border_color=color.red, border_width=1, bgcolor=bearCol, extend=extend.right)
label.new(bar_index - 1, rBot, "FVG-", color=color.red, textcolor=color.white, style=label.style_label_up, size=size.tiny)
ATRフィルターがあると、ボラティリティが低い時間帯の小さなFVGを無視できます。
PART 2:Order Block(OB)の実装
Order Blockの定義とコードへの変換
- 強気OB:陰線の直後に陽線が出て、その陽線の終値が陰線の高値を超えた → 陰線がOBゾーン
- 弱気OB:陽線の直後に陰線が出て、その陰線の終値が陽線の安値を割った → 陽線がOBゾーン
完成コード
//@version=5
indicator("Order Block Detector", overlay=true, max_boxes_count=200, max_labels_count=200)
showBullOB = input.bool(true, "強気OBを表示", group="表示設定")
showBearOB = input.bool(true, "弱気OBを表示", group="表示設定")
bullOBCol = input.color(color.new(color.blue, 85), "強気OBカラー", group="カラー")
bearOBCol = input.color(color.new(color.orange, 85), "弱気OBカラー", group="カラー")
isBullOB = close[1] < open[1] and close > open and close > high[1]
isBearOB = close[1] > open[1] and close < open and close < low[1]
if isBullOB and showBullOB
box.new(bar_index - 2, high[1], bar_index, low[1], border_color=color.blue, border_width=1, bgcolor=bullOBCol, extend=extend.right)
label.new(bar_index - 1, high[1], "Bull OB", color=color.blue, textcolor=color.white, style=label.style_label_down, size=size.tiny)
if isBearOB and showBearOB
box.new(bar_index - 2, high[1], bar_index, low[1], border_color=color.orange, border_width=1, bgcolor=bearOBCol, extend=extend.right)
label.new(bar_index - 1, low[1], "Bear OB", color=color.orange, textcolor=color.white, style=label.style_label_up, size=size.tiny)
PART 3:BOS/CHoCH の実装
BOS(Break of Structure)はトレンド継続のスイングブレイク、CHoCH(Change of Character)はトレンド転換のシグナルです。実装には「現在のトレンドをvar bool変数で管理する」ことが必要です。
//@version=5
indicator("BOS CHoCH Detector", overlay=true, max_lines_count=200, max_labels_count=200)
swingLen = input.int(5, "スイング期間", minval=2, group="スイング設定")
ph = ta.pivothigh(high, swingLen, swingLen)
pl = ta.pivotlow(low, swingLen, swingLen)
var float lastSH = na
var float lastSL = na
var int lastSHBar = na
var int lastSLBar = na
if not na(ph)
lastSH := ph
lastSHBar := bar_index - swingLen
if not na(pl)
lastSL := pl
lastSLBar := bar_index - swingLen
var bool isUptrend = true
bullBreak = not na(lastSH) and ta.crossover(close, lastSH)
bearBreak = not na(lastSL) and ta.crossunder(close, lastSL)
bullBOS = bullBreak and isUptrend
bearBOS = bearBreak and not isUptrend
bullCHoCH = bullBreak and not isUptrend
bearCHoCH = bearBreak and isUptrend
if bullBreak
isUptrend := true
if bearBreak
isUptrend := false
if bullBOS
label.new(bar_index, lastSH, "BOS ↑", color=color.green, textcolor=color.white, style=label.style_label_down, size=size.small)
if bearBOS
label.new(bar_index, lastSL, "BOS ↓", color=color.red, textcolor=color.white, style=label.style_label_up, size=size.small)
if bullCHoCH
label.new(bar_index, lastSH, "CHoCH ↑", color=color.lime, textcolor=color.black, style=label.style_label_down, size=size.small)
if bearCHoCH
label.new(bar_index, lastSL, "CHoCH ↓", color=color.orange, textcolor=color.white, style=label.style_label_up, size=size.small)
⚠️ isUptrendの更新順序が重要
BOS/CHoCHの判定はisUptrendを更新する前に行うこと。更新後の値で判定するとすべてのブレイクがBOSになり、CHoCHが検出されなくなります。
3コンポーネントの統合
3つを1つにまとめる場合のClaudeへの指示:
先ほど作ったFVG Detector・Order Block Detector・BOS CHoCH Detectorの3つを1つのインジケーターに統合してください。
インジケーター名:「SMC Dashboard」。overlay=true。
各コンポーネントにgroup設定でセクション分けする。max_boxes_count=500、max_lines_count=300、max_labels_count=500に設定。
Claudeへの複雑なトレード概念の伝え方
SMCのような専門用語はClaudeが知っている場合と知らない場合があります。確実に機能させるプロンプトの原則:
原則1:概念をコード条件式で定義する「Order Blockを検出して」ではなく「陰線の直後に陽線が来て、その陽線の終値が陰線の高値を超えた場合」と条件式レベルで書く。
原則2:「定義」「描画仕様」「制約」の3ブロック構造で書く。ClaudeにPine Scriptを書かせるときの基本はClaudeにPine Scriptを書かせるときの3つのコツにまとめています。
まとめ
FVG・Order Block・BOS/CHoCHの3コンポーネントはそれぞれ独立した検出ロジックを持ちます。コンポーネント単位で進め、各段階でTradingViewの動作を確認してから次に進むのが確実です。完成したインジケーターの検証にはTradingViewのバックテスト機能を活用してください。

