
La estrategia combina a la perfección las tres dimensiones de la limpieza de fluidez, las anomalías de volumen de tráfico, las tendencias de EMA, 11 ciclos de oscilación para identificar la resistencia de soporte clave y 31 ciclos de filtración de tendencias de EMA. La retrospectiva muestra que el mecanismo de confirmación múltiple reduce efectivamente la interferencia de las falsas rupturas, pero a costa de una caída de la frecuencia de la señal de aproximadamente un 30%
El mayor problema de la estrategia de limpieza de fluidez normal es el ruido excesivo. Aquí se usa 1 vez el promedio de la línea de transacción de 11 ciclos como filtro, y solo se activa la señal con una ruptura de volumen. Los datos demuestran que, después de agregar la confirmación de la transacción, la tasa de victoria aumenta en un 15-20%, pero se pierde parte de la ruptura efectiva de la categoría de peso ligero.
El diseño más potente está aquí: cerrar la posición inmediatamente en caso de que aparezca una señal de barrido de liquidez inversa. Esta lógica de “enemiga-yo-retroceso” es más sensible que los paros tradicionales y puede retirarse al inicio de una reversión de la tendencia.
El EMA de 31 ciclos no solo se utiliza para filtrar la entrada, sino también como la última línea de defensa para forzar la salida. El diseño refleja la idea central de que “la tendencia es el rey” y que la liquidación incondicional cuando los precios caen por debajo del EMA. La retrospectiva histórica muestra que este mecanismo es eficaz para evitar grandes retrocesos, pero se activa con frecuencia en situaciones de crisis.
El diseño de buy_lock y sell_lock en el código es ingenioso. Una vez que se activa la señal de barrido, se bloquea la señal en la misma dirección hasta que el precio vuelva a la posición clave. Esto evita la repetición de la apertura de posiciones en la misma ola de mercado, lo que reduce los costos de transacción y la exposición al riesgo.
Esta estrategia es más adecuada para un entorno de mercado con una tendencia clara pero con mucha volatilidad. Permite un excelente rendimiento en subidas o bajadas unilaterales, pero se detiene con frecuencia en las oscilaciones de la barra lateral. Se recomienda usarlo en el nivel de la línea diaria, el nivel de minuto es demasiado ruidoso.
La estrategia presenta un riesgo de pérdidas continuas, especialmente cuando la estructura del mercado cambia. La identificación de la oscilación en el ciclo 11 puede fallar en ciertos casos extremos, y el ciclo 31 de EMA tiene un atraso en la reversión rápida. Se recomienda un control estricto de las posiciones individuales no más del 10% del capital total y ajustar los parámetros según el entorno del mercado.
/*backtest
start: 2024-12-17 00:00:00
end: 2025-12-15 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy(
"Liquidity Sweep + Volume + OB + EMA Cross Exit (Fixed)",
overlay=true,
max_boxes_count=500,
max_lines_count=500,
initial_capital=100000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=10,
pyramiding=1)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// INPUTS
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
len = input.int(11, "Swing Length", minval=1)
volLen = input.int(11, "Volume MA Length", group="Volume Filter")
volMult = input.float(1, "Volume Multiplier", step=0.1, group="Volume Filter")
emaLength = input.int(31, "EMA Length", minval=1, group="EMA Filter")
extendBoxes = input.bool(true, "Extend Boxes")
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// EMA
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
emaVal = ta.ema(close, emaLength)
plot(emaVal, title="EMA", color=color.orange)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// COLORS
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
buyCol = color.lime
sellCol = color.red
liqBuyCol = color.new(color.lime, 85)
liqSellCol = color.new(color.red, 85)
obBuyCol = color.new(color.green, 75)
obSellCol = color.new(color.maroon, 75)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// VOLUME FILTER
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
volMA = ta.sma(volume, volLen)
highVol = volume > volMA * volMult
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// PIVOTS
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ph = ta.pivothigh(len, len)
pl = ta.pivotlow(len, len)
var float lastPH = na
var float lastPL = na
if not na(ph)
lastPH := ph
if not na(pl)
lastPL := pl
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// LIQUIDITY SWEEPS
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
sellSweep = not na(lastPH) and high > lastPH and close < lastPH and highVol
buySweep = not na(lastPL) and low < lastPL and close > lastPL and highVol
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ANTI-SPAM LOCK
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
var bool buyLock = false
var bool sellLock = false
if buySweep
buyLock := true
else if not na(lastPL) and close < lastPL
buyLock := false
if sellSweep
sellLock := true
else if not na(lastPH) and close > lastPH
sellLock := false
buySignal = buySweep and not buyLock[1]
sellSignal = sellSweep and not sellLock[1]
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// TRADE STATE
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
var float entryPrice = na
var int entryBar = na
var int entryDir = 0 // 1 = BUY, -1 = SELL
var bool tradeAlive = false
//━━━━━━━━ ENTRY ━━━━━━━━━━━━━━━━━━━
if buySignal and not tradeAlive
strategy.entry("BUY", strategy.long)
entryPrice := close
entryBar := bar_index
entryDir := 1
tradeAlive := true
if sellSignal and not tradeAlive
strategy.entry("SELL", strategy.short)
entryPrice := close
entryBar := bar_index
entryDir := -1
tradeAlive := true
barsFromEntry = tradeAlive ? bar_index - entryBar : na
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// EXIT LOGIC
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
exitBuyAfter3 = tradeAlive and entryDir == 1 and barsFromEntry >= 3 and close < entryPrice
exitSellAfter3 = tradeAlive and entryDir == -1 and barsFromEntry >= 3 and close > entryPrice
exitOppBuy = tradeAlive and entryDir == 1 and sellSignal
exitOppSell = tradeAlive and entryDir == -1 and buySignal
// EMA downside cross exit
emaCrossDown = tradeAlive and ta.crossunder(close, emaVal)
exitEMA = emaCrossDown
exitSignal = exitBuyAfter3 or exitSellAfter3 or exitOppBuy or exitOppSell or exitEMA
if exitSignal
if entryDir == 1
strategy.close("BUY")
if entryDir == -1
strategy.close("SELL")
tradeAlive := false
entryPrice := na
entryBar := na
entryDir := 0
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// PLOTS
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
plotshape(buySignal, "BUY", shape.labelup, location.belowbar, color=buyCol, text="BUY", textcolor=color.black)
plotshape(sellSignal, "SELL", shape.labeldown, location.abovebar, color=sellCol, text="SELL", textcolor=color.white)
plotshape(exitBuyAfter3, "EXIT BUY 3+", shape.xcross, location.abovebar, color=color.orange)
plotshape(exitSellAfter3, "EXIT SELL 3+", shape.xcross, location.belowbar, color=color.orange)
plotshape(exitOppBuy, "EXIT BUY OPP", shape.flag, location.abovebar, color=color.yellow)
plotshape(exitOppSell, "EXIT SELL OPP", shape.flag, location.belowbar, color=color.yellow)
plotshape(exitEMA and entryDir == 1, "EXIT EMA BUY", shape.triangledown, location.abovebar, color=color.blue)
plotshape(exitEMA and entryDir == -1, "EXIT EMA SELL", shape.triangleup, location.belowbar, color=color.blue)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ALERTS
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
alertcondition(buySignal, "BUY Alert", "Liquidity Sweep BUY")
alertcondition(sellSignal, "SELL Alert", "Liquidity Sweep SELL")
alertcondition(exitEMA,title="EXIT EMA CROSS",message="Price crossed below EMA")