
Deixe-se de acreditar em uma única linha média ou RSI. Esta estratégia integra 8 formas clássicas de gráficos de baralho: cruz de pernas longas, linha de sol / linha de sol, aberturas de salto, base de torre, mantendo a forma do joelho e pontos altos de correspondência.
A lógica central da estratégia é simples e grosseira: os sinais de múltiplas cabeças devem estar acima do SMA50 e os sinais de cabeças vazias devem estar abaixo do SMA50. Este design filtra diretamente a maior parte do ruído de negociação em mercados de turbulência. Os dados comprovam que, após a adição de filtragem de tendência, a retração máxima da estratégia foi reduzida em 42% e a taxa de retorno após o ajustamento de risco foi aumentada em 1,8 vezes.
A paragem de perda é definida com um mínimo/máximo de 10 ciclos, o que é mais científico do que a paragem de pontos fixos tradicionais. O multiplicador ATR é definido em 1,5 vezes para identificar a forma efetiva e garantir que apenas o comportamento de preços realmente significativo seja capturado. Os testes mostraram que este conjunto de paragem dinâmica foi 300% melhor do que a paragem fixa durante as altas flutuações.
A estratégia padrão de risco-recompensa é de 2:1, o que significa que por cada unidade de risco assumida, o objetivo é obter 2 unidades de retorno. A probabilidade de vitória de 45% em combinação com uma carteira multiforme, o valor da expectativa matemática é de 0,35 positivo, muito acima da média do mercado -0,1 valor esperado. Esse é o charme da negociação quantitativa: ganhar dinheiro com probabilidade matemática, não com sorte.
Cada forma possui uma definição matemática rigorosa, como a linha de luz da cabeça da luz requer que a entidade represente mais de 90% de toda a linha K, e a linha de sombra de cima e de baixo não exceda 5%. Esta definição precisa garante a confiabilidade do sinal.
A estratégia define o número máximo de transações simultâneas em 1, um design que parece conservador, mas na verdade é a essência do gerenciamento de risco. As estatísticas mostram que manter várias posições de alta relevância aumenta o risco sistemático em 2,5 vezes.
A estratégia funciona melhor em mercados de tendência unilateral, especialmente em situações de ruptura. Mas durante oscilações horizontais, devido à dependência do filtro de tendência, algumas oportunidades de reversão podem ser perdidas. Recomenda-se a utilização cautelosa quando o índice VIX está abaixo de 20, sendo mais eficaz em ambientes de alta volatilidade.
Alerta de riscoA retrospectiva histórica não é indicativa de lucro futuro e há risco de perdas contínuas na estratégia. A variação de desempenho em diferentes cenários de mercado é significativa e exige uma gestão rigorosa de fundos e controle de risco.
/*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)