
SMC, FVG, BOS, OB, EMA
전통적인 기술 분석은 오래되었습니다. 이 SMC 전략은 기관 거래자의 사고 방식을 직접 복제합니다. 유동성 사냥 지점을 찾고, 주문 블록을 식별하고, 시장 구조의 파괴를 포착합니다.
핵심은 여러 확인 메커니즘입니다: 공정 가치 격차 (FVG) + 시장 구조 파괴 (BOS) + 유동성 포획 (Liquidity Capture) + 피보나치 50% 할인/프레미엄 영역 (Fibonacci 50% Discount/Premium Area). 이것은 기술 지표의 집합이 아니라 시장의 미시 구조에 대한 정확한 해석입니다.
리스크 관리는 직접적으로 무겁게 효과적입니다: 거래당 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개의 주기의 흔들림 길이를 사용하여 높은 낮은 점을 확인합니다. 이것은 하나의 흔들림을 확인하기 위해 4개의 K선까지 기다려야 한다는 것을 의미합니다. 이러한 지연은 필수적인 비용입니다. 너무 짧은 확인 기간은 많은 가짜 흔들림 포인트를 생성하고 너무 긴 확인 기간은 유효성을 잃습니다.
4 사이클은 15분 차트에서 1시간의 확인 시간에 해당하며, 흔들림 지점의 유효성을 보장하면서도 시장 변화에 지나치게 뒤쳐지지 않습니다. 이 파라미터는 많은 재검토를 통해 최적화되어 효율성과 정확성의 최적 균형 지점입니다.
역사적인 회귀는 미래의 수익을 의미하지 않으며, 모든 전략에는 연속적인 손실이 존재합니다. SMC 전략은 강한 트렌드 시장에서 우수한 성능을 발휘하지만, 흔들리는 시장에서 신호 품질은 떨어집니다. 트렌드 필터가 있더라도 가짜 돌파구와 시장 소음을 완전히 피할 수는 없습니다.
전략은 엄격한 심리적 자질을 요구한다: 단독 2유로 손실을 받아들여야 하고, 신호가 있을 때 단호하게 실행해야 하고, 신호가 없을 때 인내심을 가져야 한다. 어떠한 감정적 조작도 전략의 통계적 우위를 파괴한다.
실제 거래 전에 최소 3 개월 동안 시뮬레이션 거래를 수행하여 전략의 논리와 위험 특성을 완전히 이해하도록 권장됩니다. 기억하십시오. 시장 구조는 변화하며, 어떤 전략도 영원히 유효하지 않습니다.
/*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