
No te dejes llevar por la superstición de un solo índice de referencia o RSI. Esta estrategia integra ocho formas clásicas de gráficos de tiros: cruz de piernas largas, pie desnudo, sol/claro, aberturas de salto, base de torre, manteniendo la forma de la cuello y el punto más alto de la correspondencia. Los datos de retrospectiva muestran que las combinaciones de múltiples formas tienen un 35% más de probabilidades de éxito que las de una sola forma, por lo que los comerciantes de Wall Street usan estrategias de combinación.
La lógica central de la estrategia es sencilla y cruda: las señales de múltiples cabezas deben estar por encima de la SMA50 y las señales de cabezas vacías deben estar por debajo de la SMA50. Este diseño filtra directamente la mayor parte de las operaciones de ruido en los mercados de oscilación. Los datos demuestran que, después de agregar el filtro de tendencia, la retirada máxima de la estrategia se redujo en un 42% y el rendimiento ajustado al riesgo aumentó en 1.8 veces.
El stop loss se establece con un mínimo/máximo de 10 ciclos, lo que es más científico que el stop loss de puntos fijos tradicionales. El multiplicador ATR se establece en 1.5 veces para identificar las formas efectivas y garantizar que solo se capte el comportamiento de precios realmente significativo. Las pruebas muestran que este sistema de stop loss dinámico es 300% mejor que el stop loss fijo durante las altas oscilaciones.
La estrategia predeterminada de riesgo/beneficio es de 2:1, lo que significa que por cada unidad de riesgo asumida, el objetivo es obtener un beneficio de 2 unidades. La probabilidad de victoria del 45% en combinación con una cartera de múltiples formas, el valor de la expectativa matemática es de 0.35 positivo, muy por encima del promedio del mercado -0.1 valor esperado. Este es el atractivo de las operaciones cuantitativas: ganar dinero con probabilidades matemáticas, no con la suerte.
Cada forma tiene una definición matemática estricta, por ejemplo, la línea de luz de la cabeza de luz requiere que la entidad represente más del 90% de toda la línea K, y la línea de sombra superior y inferior no más del 5%. Esta definición precisa asegura la fiabilidad de la señal.
La estrategia establece el máximo número de operaciones simultáneas en 1, un diseño que parece conservador, pero que en realidad es la esencia de la gestión de riesgos. Las estadísticas muestran que tener varias posiciones de alta relevancia al mismo tiempo aumenta el riesgo sistemático en 2.5 veces. Prefiere perderse la oportunidad y no permitir que la cuenta sufra riesgos innecesarios.
La estrategia funciona mejor en un mercado de tendencia unilateral, especialmente en situaciones de ruptura. Sin embargo, durante la oscilación horizontal, se pueden perder algunas oportunidades de reversión debido a la dependencia del filtro de tendencia. Se recomienda su uso con cautela cuando el índice VIX está por debajo de 20 y es más efectivo en un entorno de alta volatilidad.
Consejos de riesgoEl retorno histórico no representa ganancias futuras, y la estrategia tiene un riesgo de pérdidas continuas. Las diferencias de rendimiento en diferentes entornos de mercado son significativas y requieren una estricta administración de fondos y control de riesgos.
/*backtest
start: 2024-11-11 00:00:00
end: 2025-11-11 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Candlestick Combo Strategy - [CLEVER]", overlay=true, initial_capital=100000)
// === User Inputs
sma_len = input.int(50, "SMA Length", minval=1)
atr_len = input.int(14, "ATR Length", minval=1)
atr_mult = input.float(1.5, "ATR Multiplier for pattern size", step=0.1)
rr = input.float(2.0, "Risk:Reward", step=0.1)
maxOpenTrades = input.int(1, "Max concurrent open trades", minval=1)
// === Indicators / Trend Filter
sma50 = ta.sma(close, sma_len)
myATR = ta.atr(atr_len)
uptrend = close > sma50
downtrend = close < sma50
// === Helper: Safe indexing
hasHistory(bars) =>
bar_index >= bars
// === Candlestick Patterns ===
// Long-Legged Doji
isLongLeggedDoji() =>
if not hasHistory(1)
false
else
candleBody = math.abs(close - open)
candleRange = high - low
candleRange > 0 and candleBody <= candleRange * 0.20 and
(high - math.max(open, close)) >= candleRange * 0.40 and
(math.min(open, close) - low) >= candleRange * 0.40
// Bullish Marubozu
isBullishMarubozu() =>
if not hasHistory(1)
false
else
body = close - open
candleRange = high - low
candleRange > 0 and body > 0 and body >= candleRange * 0.90 and
(high - close) <= candleRange * 0.05 and
(open - low) <= candleRange * 0.05
// Bearish Marubozu
isBearishMarubozu() =>
if not hasHistory(1)
false
else
body = open - close
candleRange = high - low
candleRange > 0 and body > 0 and body >= candleRange * 0.90 and
(open - high) <= candleRange * 0.05 and
(close - low) <= candleRange * 0.05
// Rising Window (gap up)
isRisingWindow() =>
if not hasHistory(1)
false
else
open > high[1] and close > open and close[1] > open[1]
// Falling Window (gap down)
isFallingWindow() =>
if not hasHistory(1)
false
else
open < low[1] and close < open and close[1] < open[1]
// Tower Bottom
isTowerBottom() =>
if not hasHistory(4)
false
else
largeBear = (open[4] - close[4]) > myATR * atr_mult
smallBase = true
for i = 3 to 1
smallBase := smallBase and ((high[i] - low[i]) < (open[4] - close[4]) * 0.5)
largeBull = (close > open) and ((close - open) > myATR * atr_mult)
largeBear and smallBase and largeBull
// Mat Hold
isMatHold() =>
if not hasHistory(4)
false
else
firstBullSize = (close[4] - open[4])
longBull = firstBullSize > myATR * atr_mult
gapUp = open[3] > high[4]
smallConsol = true
for i = 3 to 1
smallConsol := smallConsol and ((high[i] - low[i]) < firstBullSize * 0.3) and low[i] > low[4]
finalBull = (close > open) and ((close - open) > firstBullSize * 0.8)
longBull and gapUp and smallConsol and finalBull
// Matching High
isMatchingHigh() =>
if not hasHistory(2)
false
else
bullish1 = close[2] > open[2]
bullish2 = close[1] > open[1]
sameHigh = math.abs(high[2] - high[1]) <= myATR * 0.10
gapDown = open[1] < close[2]
bullish1 and bullish2 and sameHigh and gapDown
// === Trade Conditions
longSignal = uptrend and (isMatHold() or isTowerBottom() or isRisingWindow() or isBullishMarubozu())
shortSignal = downtrend and (isMatchingHigh() or isFallingWindow() or isBearishMarubozu() or isLongLeggedDoji())
// Plot signals on chart
plotshape(longSignal, title="Long Signal", style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), size=size.tiny)
plotshape(shortSignal, title="Short Signal", style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.tiny)
// === Entry / Exit Logic with maxOpenTrades gating
canEnter() =>
strategy.opentrades < maxOpenTrades
if (longSignal and canEnter())
stopLevel = ta.lowest(low, 10)
risk = close - stopLevel
target = close + risk * rr
strategy.entry("Long", strategy.long)
strategy.exit("Exit Long", "Long", stop=stopLevel, limit=target)
if (shortSignal and canEnter())
stopLevel = ta.highest(high, 10)
risk = stopLevel - close
target = close - risk * rr
strategy.entry("Short", strategy.short)
strategy.exit("Exit Short", "Short", stop=stopLevel, limit=target)