
Не верьте больше единому среднему индексу или RSI. Эта стратегия включает в себя 8 классических форм рисунка: длинноногий крест, голова и ноги, солнечный / лунный, воздушный проем, башенное дно, держание формы и сочетание высоты. Данные о прохождении техосмотра показывают, что выигрыш многоформенной пары на 35% выше, чем одноформенной, поэтому трейдеры на Уолл-стрит используют комбинационную стратегию.
Основная логика стратегии простая и грубая: многоглазый сигнал должен быть выше SMA50, а пустой сигнал должен быть ниже SMA50. Эта конструкция напрямую отфильтровывает большую часть шумных сделок на шокирующем рынке. Данные свидетельствуют о том, что после добавления фильтрации на тренды максимальный отступ стратегии снизился на 42%, а прибыль после корректировки риска увеличилась в 1,8 раза.
Стоп-система использует 10 циклов минимальных/максимальных точек, что является более научным, чем традиционная стоп-система с фиксированным числом точек. ATR-множитель устанавливается в 1,5 раза для выявления эффективных форм, гарантируя, что только действительно значимые ценовые действия будут захвачены. Эксперименты показали, что динамическая стоп-система 300% эффективнее фиксированных стоп-систем во время высоких колебаний.
Стратегия по умолчанию риско-прибыль соотношение 2: 1, что означает, что каждый, кто берет на себя 1 единицу риска, стремится получить 2 единицы прибыли. Уровень выигрыша 45% в комбинации с многообразным портфелем, математическое ожидание составляет положительное 0,35, намного превышающее среднерыночное ожидание -0,1. Это и есть прелесть количественной торговли: зарабатывать деньги с помощью математической вероятности, а не с помощью удачи.
Каждая форма имеет строгое математическое определение, например, световой погон требует, чтобы объекты составляли более 90% всей K-линии, а верхние и нижние теневые линии - не более 5%. Такое точное определение обеспечивает надежность сигнала.
Стратегия устанавливает максимальное количество одновременных сделок на 1, что выглядит консервативно, но на самом деле является сутью управления рисками. Статистика показывает, что одновременное владение несколькими высокорелевантными позициями увеличивает системный риск в 2,5 раза. Лучше не упустить возможность и не допустить, чтобы учетная запись подверглась ненужному риску.
Стратегия наилучшим образом работает на рынках с односторонним трендом, особенно на прорывах. Однако во время поперечных колебаний, из-за зависимости от фильтрации тренда, возможно, будет пропущено несколько возможностей для разворота. Рекомендуется использовать с осторожностью, когда индекс VIX ниже 20, лучше всего в условиях высокой волатильности.
Сообщения о рискеИсторический отсчет не отражает будущую прибыль, существует риск непрерывных убытков в стратегии. При различных рыночных условиях существенная разница в производительности, требующая строгого управления капиталом и контроля риска.
/*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)