
SMC, FVG, BOS, OB, EMA
El análisis técnico tradicional ya está obsoleto. Esta estrategia de SMC replica directamente el modo de pensar de los operadores institucionales: busca puntos de captura de liquidez, identifica bloques de órdenes y captura la destrucción de la estructura del mercado. Los datos de retrospectiva muestran que el uso de un ciclo de 15 minutos en el par BTC / EUR, junto con un filtro de tendencia de 1 hora en EMA200, ofrece una rentabilidad ajustada al riesgo claramente superior a la estrategia de indicadores tradicionales.
La clave está en el mecanismo de confirmación múltiple: brecha de valor justo (FVG) + destrucción de la estructura del mercado (BOS) + captura de liquidez + zona de descuento/prima del 50% de Fibonacci. No se trata de una pila de indicadores técnicos, sino de una interpretación precisa de la microestructura del mercado.
La gestión de riesgos es directamente eficiente: cada operación se fija en un riesgo de 2 euros, independientemente de la volatilidad del mercado. La distancia de parada se calcula automáticamente, lo que garantiza una constante de riesgo. La relación de ganancias y pérdidas se bloquea en 1:3, lo que significa que una ganancia del 33.4% puede alcanzar un equilibrio de ganancias y pérdidas, y cualquier ganancia superior a este número es una ganancia neta.
La posición mínima es de 0.00001 BTC, la posición máxima es de 0.01 BTC, se adapta perfectamente al tamaño de los fondos minoristas. No se asume un riesgo innecesario por tener una posición demasiado grande, ni se pierde una oportunidad por tener una posición demasiado pequeña. Este método de gestión de fondos es más estable que el modelo tradicional de riesgo porcentual.
Las señales de SMC en solitario son propensas a fallar con frecuencia en mercados convulsivos. Esta estrategia incluye el EMA200 de 1 hora como un filtro de tendencia: la señal de multitud solo se ejecuta cuando el precio de 15 minutos está por encima del EMA200 de 1 hora, en cambio, se ejecuta la señal de vacío.
Este diseño reduce directamente la aplicabilidad de la estrategia de “todo el mercado” a “mercado de tendencia”, aunque reduce la frecuencia de las operaciones, pero mejora considerablemente la calidad de la señal. Durante la revisión horizontal, la estrategia detiene automáticamente las operaciones para evitar el consumo de fondos en fluctuaciones ineficaces.
Los bloques de orden no son soportes de resistencia, sino zonas de precios en las que los grandes fondos de la institución han estado activos. La estrategia identifica los bloques de orden efectivos mediante las siguientes condiciones:
Bloque de pedidos múltiple: la línea K anterior es negativa + Existe un FVG hacia arriba + El precio ha roto los mínimos de la oscilación previa + Existe una liquidez hacia abajo + El precio actual está en la zona de descuento de Fibonacci por debajo del 50%.
Bloque de pedidos en blanco: la línea K anterior es la línea de sol + Existe un FVG a la baja + Precios bajan los picos de oscilación previos + Existe una liquidez ascendente + Precios actuales en la zona de prima superior al 50% de Fibonacci.
Cada condición tiene su lógica: el signo del sol/sol indica la presión direccional, el signo del sol muestra el desequilibrio de la liquidez, el BOS confirma el cambio de estructura, la liquidez busca la participación de la agencia de certificación, y la zona de descuento/premio ofrece el mejor momento de entrada.
El 90% de los paros minoristas en el mercado se sitúan en áreas de resistencia de soporte obvio. Los fondos de las instituciones impulsan deliberadamente los precios a tocar estas áreas, lo que desencadena una operación de reversión después de una gran cantidad de paros. La estrategia identifica este tipo de caza de liquidez a través de una tolerancia de precio del 0,1%.
Cuando el precio mínimo en 7 períodos es inferior al mínimo actual en más del 0.1%, se confirma la existencia de liquidez por debajo. Este diseño evita errores de juicio demasiado sensibles, mientras que se asegura que la verdadera captura de liquidez no se pierda.
La estrategia utiliza una longitud de oscilación de 4 ciclos para confirmar los puntos altos y bajos, lo que significa que se necesita esperar 4 líneas K para confirmar un punto de oscilación. Esta demora es un costo necesario: un período de confirmación demasiado corto produce una gran cantidad de puntos de oscilación falsos, y un período de confirmación demasiado largo pierde su validez.
4 ciclos en un gráfico de 15 minutos equivale a una hora de confirmación, lo que garantiza la efectividad de los puntos de oscilación y no se retrasa demasiado con los cambios en el mercado. Este parámetro, optimizado con una gran cantidad de retroalimentación, es el punto de equilibrio óptimo entre eficiencia y precisión.
El retroceso histórico no representa ganancias futuras, y cualquier estrategia tiene la posibilidad de pérdidas continuas. Las estrategias de SMC tienen un rendimiento excelente en mercados de tendencia fuerte, pero la calidad de la señal disminuye en mercados de turbulencia. Incluso con filtros de tendencia, no se pueden evitar completamente los falsos reveses y el ruido del mercado.
Las estrategias requieren una estricta cualidad psicológica: hay que aceptar pérdidas de 2 euros por partida, hay que ejecutar con decisión cuando aparecen señales, hay que tener paciencia cuando no hay señales. Cualquier operación emocional puede destruir la ventaja estadística de la estrategia.
Se recomienda realizar simulaciones de trading por lo menos 3 meses antes de las operaciones reales, para asegurar una comprensión completa de la lógica de la estrategia y las características de riesgo. Recuerde: la estructura del mercado cambia, y ninguna estrategia es válida para siempre.
/*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