
SMC, FVG, BOS, OB, EMA
伝統的な技術分析は時代遅れである. このSMC戦略は,機関トレーダーの思考パターンを直接複製する:流動性の獲取ポイントを探し,注文ブロックを識別し,市場構造の破壊を捕捉する. 追溯データは,BTC/EUR対の15分周期を使用し,1時間のEMA200のトレンドフィルターと連携し,リスク調整後のリターンは,伝統的な指標戦略よりも明らかに優れていることを示している.
鍵となるのは,複数の確認メカニズムである: 公平価値のギャップ ((FVG) + 市場構造の破壊 ((BOS) + 流動性の捕獲 + フィボナッチ50%の割引/プレミアム領域である. これは技術指標の堆積ではなく,市場の微細構造の正確な解釈である.
リスク管理は直接的に粗略に効果的です:市場変動の大きさにかかわらず,取引ごとに2ユーロのリスクを固定します. 止損距離は自動的に計算され,リスクが一定であることを保証します. 勝負比率は1:3にロックされ,これは33.4%の勝負比率で勝負均衡を達成することができ,この数字を超える勝負は純利益です.
最小ポジションは0.00001 BTC,最大ポジションは0.01 BTCで,小売資金の規模に完全に適合する.ポジションが大きすぎるため,不必要なリスクを負うことはなく,ポジションが小さすぎるため,機会を逃すこともありません.この資金管理方法は,従来のパーセントリスクモデルよりも安定しています.
単一のSMC信号は,波動的な市場では頻繁に誤りやすい. この戦略は,1時間のEMA200をトレンドフィルターとして加える: 15分の価格が1時間のEMA200上にある場合にのみ多頭信号を実行し,逆に空頭信号を実行する.
この設計は,戦略の適用性を”全市場”から”トレンド市場”に直接絞り込み,取引頻度を減らす一方で,信号の質を大幅に向上させる.横軸整理の間,戦略は自動的に取引を停止し,無効な波動で資金を消費するのを避ける.
注文ブロックは,抵抗を支えるものではなく,機関大資金がかつて活動していた価格領域である. 戦略は,以下の条件によって有効な注文ブロックを識別する.
多頭注文ブロック:前K線が陰線 + 上方FVGが存在する + 価格が前期振動の低点を破る + 下方流動性が存在する + 現在の価格はフィボナッチ50%以下の割引区域にある。
空頭注文塊:前K線が陽線 + 下方FVGが存在する + 価格が下落する前期変動高点 + 上方流動性が存在する + 現在の価格はフィボナッチ50%以上のプレミアム領域にある.
それぞれの条件には論理が付いている:陰線/陽線は方向性圧力を表し,FVGは流動性の不均衡を示し,BOSは構造の変化を確認し,流動性の狩猟証明機関の関与,割引/プレミアムエリアは最適な入場タイミングを提供する.
市場の90%の小売ストップは,明白なサポート・レジスタンス・レベルに設定されている.機関資金は,意図的に価格をこれらの領域に触らせ,大量にストップ・シートの後,反動を誘発する.戦略は,0.1%の価格容量差によって,このような流動性狩猟行為を識別する.
7周期間の最低価格が現在の低点より0.1%以下であるとき,下流動性が存在することを確認する.この設計は過度に敏感な誤判を回避し,同時に真の流動性捕獲が逃れられないことを保証する.
戦略は高低点を確認するために4周期の振動の長さを用いる.これは,1つの振動点を確認するために4つのK線を待つことを意味する.この遅延は必要な代償である:短すぎる確認期間は,大量の偽振動点を生み出し,長すぎる確認期間は,有効性を失ってしまう.
4周期は15分図で1時間相当の確認時間であり,波動点の有効性を保証するだけでなく,市場の変化に過度に遅れることはありません.このパラメータは,大量に反測された後に最適化され,効率性と正確性の最適なバランスポイントです.
歴史的反転は将来の利益を意味しません.どんな戦略にも連続的な損失の可能性があります.SMC戦略は強いトレンド市場では優れているが,揺れ動いている市場では信号の質が低下します.トレンドフィルターがあっても,偽の突破や市場のノイズを完全に回避することはできません.
戦略には厳格な心理的な資質が必要である:単一の2ユーロの損失を受け入れ,シグナルが出たときに決定的に実行し,シグナルが出なかったときに忍耐しなければならない.どんな感情的な操作も,戦略の統計的優位性を破壊する.
市場構造が変化し,いかなる戦略も永遠に有効であるとは考えないこと.
/*backtest
start: 2024-12-04 00:00:00
end: 2025-12-02 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=6
strategy(title="Stratégie SMC V18.2 (BTC/EUR FINAL R3 - Tendance)", shorttitle="SMC-BTC-FINAL-Tendance", overlay=true,
currency=currency.EUR, // <--- CHANGÉ EN EUR
initial_capital=1000, // Capital initial de 1000 euros pour coller à votre compte démo
pyramiding=0,
default_qty_type=strategy.cash,
default_qty_value=1)
// --- PARAMÈTRES ADAPTÉS POUR BTC (M15) ---
i_max_lot_size = input.float(0.01, title="Lot Max (Quantité Max BTC)", minval=0.00001, step=0.001)
i_min_lot_size = input.float(0.00001, title="Lot Min Réel (Exigence Broker)", minval=0.00001, step=0.00001)
i_swing_length = input.int(4, title="Long. Swing (BOS) pour BTC", minval=2) // ADAPTÉ M15
i_ob_opacity = input.int(80, title="Opacité OB", minval=0, maxval=100)
i_liq_tolerance = input.float(0.1, title="Tolérance Liq. (%) pour BTC", minval=0.01, step=0.01)
i_liq_search = input.int(7, title="Long. Recherche Liq.", minval=5) // ADAPTÉ M15
// --- PARAMÈTRES DE FILTRE DE TENDANCE (H1/EMA 200 PAR DÉFAUT) ---
i_tf_tendance = input.string("60", title="Timeframe Tendance (ex: 60 pour H1)", options=["30", "60", "120", "240"]) // ADAPTÉ H1
i_ema_length = input.int(200, title="Longueur EMA Tendance", minval=1)
// --- GESTION DU RISQUE DÉDIÉE ---
float risk_amount = 2.0 // Risque de 2.00 EUROS par transaction
float min_sl_distance = 0.0001
// --- VARIABLES SMC ---
var float obHigh = na
var float obLow = na
var bool obIsBullish = false
var box currentBox = na
var float last_swing_low = na
var float last_swing_high = na
var label active_label = na
var bool signal_entry_long = false
var bool signal_entry_short = false
var float entry_sl_level = na
var float entry_tp_level = na
var float entry_qty_to_risk = na
var bool signal_persistant_long = false
var bool signal_persistant_short = false
// --- FONCTION DE FILTRE DE TENDANCE (EMA sur TF supérieur) ---
f_get_ema_hl() =>
request.security(syminfo.tickerid, i_tf_tendance, ta.ema(close, i_ema_length))
ema_tendance = f_get_ema_hl()
// PLOT de l'EMA pour la visualisation (Titre corrigé)
plot(ema_tendance, color=color.new(color.white, 20), title="EMA Tendance (Filtre)", linewidth=2)
// --- RÉINITIALISATION ---
if not na(active_label)
label.delete(active_label)
active_label := na
signal_entry_long := false
signal_entry_short := false
entry_qty_to_risk := na
// Mise à jour des Swings Highs/Lows
sh_confirmed = ta.barssince(high == ta.highest(i_swing_length * 2 + 1)) == i_swing_length
sl_confirmed = ta.barssince(low == ta.lowest(i_swing_length * 2 + 1)) == i_swing_length
// Initialisation des swings
if na(last_swing_high)
last_swing_high := ta.highest(200)
if na(last_swing_low)
last_swing_low := ta.lowest(200)
if sh_confirmed
last_swing_high := high[i_swing_length]
if sl_confirmed
last_swing_low := low[i_swing_length]
float fib_0_5_level = not na(last_swing_high) and not na(last_swing_low) ? (last_swing_high + last_swing_low) / 2 : na
// PLOT DE DÉBOGAGE: Visualisation des derniers swings
plot(last_swing_high, color=color.new(color.fuchsia, 50), style=plot.style_line, linewidth=2, title="Last Swing High")
plot(last_swing_low, color=color.new(color.lime, 50), style=plot.style_line, linewidth=2, title="Last Swing Low")
// --- FONCTIONS DE DÉTECTION (unchanged) ---
fvg_bullish() => high[1] < low[3]
fvg_bearish() => low[1] > high[3]
f_has_liquidity(direction) =>
result = false
price_to_search = direction ? low : high
search_price = direction ? ta.lowest(i_liq_search) : ta.highest(i_liq_search)
tolerance = close * i_liq_tolerance / 100
if direction
result := search_price < price_to_search - tolerance
else
result := search_price > price_to_search + tolerance
result
// --- LOGIQUE DE DÉCLENCHEMENT DE L'ORDRE BLOCK (unchanged) ---
is_bullish_ob() =>
isBearCandle = close[1] < open[1]
hasFVG = fvg_bullish()
isBOS = not na(last_swing_low) and close > last_swing_low
hasLiquiditySupport = f_has_liquidity(true)
isDiscount = not na(fib_0_5_level) and close < fib_0_5_level
isBearCandle and hasFVG and isBOS and hasLiquiditySupport and isDiscount
is_bearish_ob() =>
isBullCandle = close[1] > open[1]
hasFVG = fvg_bearish()
isBOS = not na(last_swing_high) and close < last_swing_high
hasLiquiditySupport = f_has_liquidity(false)
isPremium = not na(fib_0_5_level) and close > fib_0_5_level
isBullCandle and hasFVG and isBOS and hasLiquiditySupport and isPremium
// --- CRÉATION / MISE À JOUR DE L'OB ACTIF (unchanged) ---
if na(obHigh) or strategy.position_size == 0
if is_bullish_ob() or is_bearish_ob()
obIsBullish := is_bullish_ob()
obHigh := high[1]
obLow := low[1]
// --- GESTION DE LA MITIGATION ET VALIDATION ---
if not na(obHigh)
float mitigation_buffer = 0.00005 * close
isTouched = obIsBullish ? low <= obHigh + mitigation_buffer : high >= obLow - mitigation_buffer
isInvalidatedBull = obIsBullish and close < obLow
isInvalidatedBear = not obIsBullish and close > obHigh
// L'OB est touché ET nous ne sommes pas déjà en position
if isTouched and strategy.position_size == 0
// --- CALCULS ET SIGNAL ---
var float sl_level = obIsBullish ? obLow : obHigh
var float rr_distance_usd = math.abs(close - sl_level)
float safe_rr_distance = math.max(rr_distance_usd, min_sl_distance)
float desired_risk_amount = risk_amount
float calculated_qty = desired_risk_amount / safe_rr_distance
// LOGIQUE POUR GÉRER LOT MAX/MIN
float minimum_lot_for_market = i_min_lot_size
entry_qty_to_risk := math.max(calculated_qty, minimum_lot_for_market)
entry_qty_to_risk := math.min(entry_qty_to_risk, i_max_lot_size)
entry_sl_level := sl_level
// TP FIXE : R:R 1:3
entry_tp_level := obIsBullish ? close + safe_rr_distance * 3 : close - safe_rr_distance * 3
// VÉRIFICATION DU LOT MINIMUM
if entry_qty_to_risk >= minimum_lot_for_market
if obIsBullish
signal_entry_long := true
else
signal_entry_short := true
// --- EXÉCUTION DE LA STRATÉGIE ---
// Persistance du signal
if signal_entry_long and strategy.position_size == 0
signal_persistant_long := true
if signal_entry_short and strategy.position_size == 0
signal_persistant_short := true
// EXÉCUTION AVEC FILTRE DE TENDANCE
if strategy.position_size == 0
// EXÉCUTION LONG
if signal_persistant_long and not na(entry_qty_to_risk)
// FILTRE LONG : Prix M15 au-dessus de l'EMA de tendance H1
if close > ema_tendance
strategy.entry("LongEntry", strategy.long, qty=entry_qty_to_risk, comment="OB Long Actif")
strategy.exit("ExitLong", from_entry="LongEntry", stop=entry_sl_level, limit=entry_tp_level)
signal_persistant_long := false
// EXÉCUTION SHORT
if signal_persistant_short and not na(entry_qty_to_risk)
// FILTRE SHORT : Prix M15 en dessous de l'EMA de tendance H1
if close < ema_tendance
strategy.entry("ShortEntry", strategy.short, qty=entry_qty_to_risk, comment="OB Short Actif")
strategy.exit("ExitShort", from_entry="ShortEntry", stop=entry_sl_level, limit=entry_tp_level)
signal_persistant_short := false
// S'assurer que le signal actif est effacé après l'entrée/sortie
if strategy.position_size != 0
signal_persistant_long := false
signal_persistant_short := false