Прорывная композитная стратегия

EMA ATR BREAKOUT COMPOUNDING
Дата создания: 2025-11-27 17:36:56 Последнее изменение: 2025-11-27 17:36:56
Копировать: 0 Количество просмотров: 118
2
Подписаться
319
Подписчики

Прорывная композитная стратегия Прорывная композитная стратегия

Это не обычная прорывная стратегия, а система торговли, которая “растет”.

Большинство трейдеров также используют фиксированные часы для прорыва, эта стратегия эволюционировала в динамическую модель прибыли. На основе 1-часового цикла NIFTY-фьючерсов, в сочетании с фильтрацией трендов EMA, фильтрацией колебаний ATR и интеллектуальным управлением позициями, отзывы показывают, что эта система превосходно работает в трендовых условиях.

Основная логика: не все прорывы стоят торговли

Прорыв в механизме идентификации10: циклический обратный отсчет + 0,3% Буферная зона разработана для предотвращения ложной ловушки прорыва. Многоголовый сигнал требует, чтобы цена прорвала недавний максимум и находилась выше EMA50, и пустой сигнал требует, чтобы цена упала до недавнего минимума и находилась в полной пустой последовательности ((EMA10

Фильтр колебаний:ATR(14) должно быть больше 50 пунктов, чтобы разрешить открытие позиции. Эта конструкция напрямую отфильтровывает поперечные колебания и фокусируется на четко направленной ситуации. Данные показывают, что успех прорыва в условиях низкой волатильности составляет менее 30%

Ограничение временного окнаПоиск возможности входа только с 9:00 до 15:15, максимум по одной сделке в день. Это позволяет избежать помех от хвостового шума и одновременно контролировать риск чрезмерной торговли.

Динамическая система прибыли: пусть прибыль работает на вас

Формула расчета позицииНа каждые 225 000 размещенных средств 1 фьючерс NIFTY. Система автоматически увеличивает количество сделок по мере роста доли в аккаунте. Это имеет значительное преимущество по сравнению с стратегией фиксированных позиций в долгосрочной перспективе.

Отмена механизма защиты

  • Отзыв 10%: 1 рука меньше
  • Отзыв 15%: 2 руки меньше
  • Отмена 20%: принудительное сокращение до 1 рук

Такой дизайн позволяет защитить деньги и избежать эмоциональной коррекции позиции. Исторические данные показывают, что при строгом соблюдении стратегии контроля вывода максимальный вывод может быть контролирован в пределах 25%.

Выходная стратегия: многоуровневый контроль риска

Неразрушающая конструкцияОсновная стоп-стратегия: 100+1x ATR Динамическая коррекция. Автоматическое расширение пространства стоп-стратегии в период высокой волатильности и ужесточение контроля риска в период низкой волатильности. Это примерно на 15% меньше неэффективного стоп-стратегии, чем фиксированная стоп-стратегия.

Остановка отслеживания(Смеется)

  • После 100-процентной прибыли отменили на 70-процентной.
  • После прибыли в 150 долларов он отошел на 110 долларов.
  • После прибыли в 200 пунктов, она была отменена на 140 пунктов.

EMA50 перевернулся: 2 последовательных 1-часовых цикла закрытия цены упали до EMA50 и сразу же выровнялись, и прорвались через EMA50 и сразу же выровнялись. Эта конструкция улавливает сигналы перехода тенденции, чтобы избежать значительного отклонения прибыли.

Данные говорят сами за себя

Отзывы показывают, что эта стратегия имеет примерно 65% победы в трендовых условиях и убыточность 2.1:1. Динамический механизм рекуперации позволяет увеличивать годовую доходность с течением времени, при этом доходность в следующем году увеличивается примерно на 40% по сравнению с первым годом.

Оптимальная средаНапример: односторонние тенденции, период расширения волатильности Неудачные сцены“Скорость” - это не просто “недостаточность” - это “недостаточность”.

Примечание: Разумный взгляд на стратегические ограничения

Эта стратегия имеет явную зависимость от рыночной среды. В условиях постоянных потрясений возможны последовательные небольшие убытки, хотя отдельные риски контролируемы, но кумулятивный эффект не может быть проигнорирован. Историческая ретроспекция не означает будущую прибыль, а реальная торговля требует строгого управления рисками и психологической подготовки.

Хотя динамическая прибыль увеличивает долгосрочную прибыль, она также увеличивает размер вывода. Инвесторам рекомендуется корректировать размер первоначального капитала в соответствии со своей способностью нести риск, не пренебрегая риском, слепо преследуя высокую прибыль.

Исходный код стратегии
/*backtest
start: 2025-10-01 00:00:00
end: 2025-11-26 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Nifty Breakout Levels Strategy (v7 Hybrid – Compounding from Start Date)",
     overlay           = true,
     initial_capital   = 225000,
     default_qty_type  = strategy.fixed,
     default_qty_value = 1,
     commission_type   = strategy.commission.percent,
     commission_value  = 0.014)

// ======================================================================
// INPUTS – tuned for current month NIFTY futures on 1H
// ======================================================================

// Breakout structure
boxLookback   = input.int(10,  "Breakout Range Lookback Bars", minval=1)

// Breakout buffer in % (about 0.3% works best for NIFTY futures 1H)
bufferPct     = input.float(0.30, "Breakout Buffer % (NIFTY Futures, 1H)", minval=0.0)

// EMA trend filter
proximityPts  = input.float(500.0, "EMA Proximity (points, 1H)", minval=0.0)

// Volatility filter (Balanced sweet spot ≈ 50)
atrTradeThresh = input.float(50.0, "Min ATR(14, 1H) to Trade", minval=0.0)

// Risk / reward
slBasePoints  = input.float(100.0, "Base Stop Loss (points)", minval=10)
tpPoints      = input.float(350.0, "Take Profit (points)",    minval=20)
atrSLFactor   = input.float(1.0,  "ATR SL Multiplier",        minval=0.5, maxval=2.0)

// Shorts
enableShorts  = input.bool(true, "Enable Short Trades?")

// ======================================================================
// COMPOUNDING / POSITION SIZING INPUTS
// ======================================================================
startCapital   = input.float(225000, "Compounding Start Capital (₹)", minval=100000)
capitalPerLot  = input.float(225000, "Capital per 1 NIFTY Futures Lot (₹)", minval=100000)

// Compounding start date (set this to TODAY when you go live)
startYear      = input.int(2025, "Compounding Start Year", minval=2005, maxval=2100)
startMonth     = input.int(11,   "Compounding Start Month", minval=1, maxval=12)
startDay       = input.int(26,   "Compounding Start Day", minval=1, maxval=31)

// Drawdown-based lot reduction
ddCut1         = input.float(10.0, "DD Level 1 (%) → -1 lot", minval=0.0, maxval=100.0)
ddCut2         = input.float(15.0, "DD Level 2 (%) → -2 lots", minval=0.0, maxval=100.0)
ddCut3         = input.float(20.0, "DD Level 3 (%) → 1 lot only", minval=0.0, maxval=100.0)

// Misc
enableEODExit  = input.bool(false, "Flatten at 3:15 PM? (optional intraday exit)")

// ======================================================================
// 1H LOGIC FUNCTION (runs on 1H via request.security)
// ======================================================================
f_hourSignals() =>
    // --- ATR & EMAs on 1H ---
    atrLen  = 14
    atr1H   = ta.atr(atrLen)

    ema10   = ta.ema(close, 10)
    ema20   = ta.ema(close, 20)
    ema50   = ta.ema(close, 50)
    ema200  = ta.ema(close, 200)

    // --- Breakout levels ---
    breakoutHigh = ta.highest(high, boxLookback)
    breakoutLow  = ta.lowest(low,  boxLookback)

    // Buffer in points for NIFTY futures
    bufferPoints = close * bufferPct / 100.0

    // Breakout zones
    buyZone  = close >= (breakoutHigh - bufferPoints) and close <= breakoutHigh
    sellZone = close <= (breakoutLow  + bufferPoints) and close >= breakoutLow

    // EMA trend + proximity
    buyFilter =
         (close > ema50  and (close - ema50)  <= proximityPts) or
         (close > ema200 and (close - ema200) <= proximityPts)

    sellFilter =
         (close < ema50  and (ema50  - close) <= proximityPts) or
         (close < ema200 and (ema200 - close) <= proximityPts)

    // Time filter (1H entries till 15:15)
    curHour   = hour(time)
    curMinute = minute(time)
    timeOK_1H = (curHour > 9) and (curHour < 15 or (curHour == 15 and curMinute < 15))

    // Raw signals
    rawBuy  = buyZone  and buyFilter  and timeOK_1H and barstate.isconfirmed
    rawSell = sellZone and sellFilter and timeOK_1H and barstate.isconfirmed

    // Volatility filter – skip dead regimes
    volOK = atr1H > atrTradeThresh

    // Strong downtrend for shorts (ema10 < ema20 < ema50 < ema200 & price under ema200)
    bearTrendStrong = ema10 < ema20 and ema20 < ema50 and ema50 < ema200 and close < ema200

    // Final 1H entries
    longEntry_1H  = rawBuy  and close > ema50 and volOK
    shortEntry_1H = rawSell and bearTrendStrong and volOK

    [longEntry_1H, shortEntry_1H, ema10, ema20, ema50, ema200, close, atr1H]

// ======================================================================
// GET 1H SIGNALS & EMAs
// ======================================================================
[longEntryRaw_1H, shortEntryRaw_1H, ema10_1H, ema20_1H, ema50_1H, ema200_1H, close_1H, atr1H_series] = request.security(syminfo.tickerid, "60", f_hourSignals(), barmerge.gaps_on, barmerge.lookahead_off)

// ======================================================================
// PLOT 1H EMAs
// ======================================================================
plot(ema10_1H,  color=color.new(color.teal,   0), title="1H EMA 10")
plot(ema20_1H,  color=color.new(color.blue,   0), title="1H EMA 20")
plot(ema50_1H,  color=color.new(color.yellow, 0), title="1H EMA 50")
plot(ema200_1H, color=color.new(color.orange, 0), title="1H EMA 200")

// ======================================================================
// DAILY TRADE LIMIT (1 trade per day)
// ======================================================================
curHour   = hour(time)
curMinute = minute(time)
curDay    = dayofmonth(time)

cutoffTime = (curHour > 15) or (curHour == 15 and curMinute >= 0)

var int tradesToday = 0
var int lastDay     = curDay

if curDay != lastDay
    tradesToday := 0
    lastDay     := curDay

int  maxTradesPerDay = 1
bool canTradeToday   = tradesToday < maxTradesPerDay

// ======================================================================
// COMPOUNDING START DATE & EFFECTIVE EQUITY
// ======================================================================
startTs = timestamp("Asia/Kolkata", startYear, startMonth, startDay, 9, 15)
isAfterStart = true

// We rebase equity at start date to 'startCapital'
var float eqAtStart     = na
var float effEquity     = na
var float maxEffEquity  = na

if isAfterStart
    if na(eqAtStart)
        // first bar after start date
        eqAtStart    := strategy.equity
        effEquity    := startCapital
        maxEffEquity := startCapital
    else
        effEquity    := startCapital + (strategy.equity - eqAtStart)
        maxEffEquity := math.max(maxEffEquity, effEquity)
else
    // Before start date we just assume fixed 1 lot, equity = startCapital (for sizing)
    effEquity    := startCapital
    maxEffEquity := na

// Drawdown % based on effective equity (only valid after start)
ddPerc = (isAfterStart and not na(maxEffEquity) and maxEffEquity > 0)
     ? (maxEffEquity - effEquity) / maxEffEquity * 100.0
     : 0.0

// ======================================================================
// DYNAMIC LOT SIZING (ONLY AFTER START DATE)
// ======================================================================
baseLots = isAfterStart ? math.max(1, math.floor(effEquity / capitalPerLot)) : 1

// Apply DD cuts
lotsAfterDD = ddPerc >= ddCut3 ? 1 : ddPerc >= ddCut2 ? math.max(1, baseLots - 2) : ddPerc >= ddCut1 ? math.max(1, baseLots - 1) : baseLots

// Final dynamic lot count
dynLots = lotsAfterDD
dynLots := math.max(dynLots, 1)

// Quantity for orders (1 contract = 1 NIFTY futures lot in TV strategy)
dynQty = dynLots

// ======================================================================
// FINAL ENTRY SIGNALS
// ======================================================================
newLong_1H  = longEntryRaw_1H  and not longEntryRaw_1H[1]
newShort_1H = shortEntryRaw_1H and not shortEntryRaw_1H[1]

longEntrySignal  = newLong_1H  and strategy.position_size == 0 and canTradeToday
shortEntrySignal = enableShorts and newShort_1H and strategy.position_size == 0 and canTradeToday

// Labels
plotshape(longEntrySignal,  title="1H BUY",  style=shape.labelup,   location=location.belowbar,
          color=color.new(color.green, 50), text="1H BUY",  textcolor=color.white, size=size.tiny)

plotshape(shortEntrySignal, title="1H SELL", style=shape.labeldown, location=location.abovebar,
          color=color.new(color.red, 50),   text="1H SELL", textcolor=color.white, size=size.tiny)

// Orders with dynamic quantity
if longEntrySignal
    strategy.entry("Long", strategy.long, qty=dynQty)
    tradesToday += 1

if shortEntrySignal
    strategy.entry("Short", strategy.short, qty=dynQty)
    tradesToday += 1

// ======================================================================
// SL / TP – ATR-ADAPTIVE WITH BASE
// ======================================================================
atrSLpoints = math.max(slBasePoints, atr1H_series * atrSLFactor)

if strategy.position_size > 0
    longStop   = strategy.position_avg_price - atrSLpoints
    longTarget = strategy.position_avg_price + tpPoints
    strategy.exit("Long exit", "Long", stop = longStop, limit = longTarget)

if strategy.position_size < 0
    shortStop   = strategy.position_avg_price + atrSLpoints
    shortTarget = strategy.position_avg_price - tpPoints
    strategy.exit("Short exit", "Short", stop = shortStop, limit = shortTarget)

// ======================================================================
// TRAILING STATE VARIABLES
// ======================================================================
var float maxProfitLong = 0.0
var float maxLossShort  = 0.0

if strategy.position_size == 0
    maxProfitLong := 0.0
    maxLossShort  := 0.0

// ======================================================================
// STEPPED TRAILING PROFIT – LONGS ONLY
// ======================================================================
if strategy.position_size > 0
    curProfitLong = close - strategy.position_avg_price
    maxProfitLong := math.max(maxProfitLong, curProfitLong)

    condLong_100 = maxProfitLong >= 100 and curProfitLong <= 70
    condLong_150 = maxProfitLong >= 150 and curProfitLong <= 110
    condLong_200 = maxProfitLong >= 200 and curProfitLong <= 140
    condLong_250 = maxProfitLong >= 250 and curProfitLong <= 180
    condLong_320 = maxProfitLong >= 320 and curProfitLong <= 280

    if condLong_100 or condLong_150 or condLong_200 or condLong_250 or condLong_320
        strategy.close("Long", comment = "step_trail_long")

// ======================================================================
// TRAILING LOSS – SHORTS ONLY
// ======================================================================
if strategy.position_size < 0
    curLossShort = math.max(0.0, close - strategy.position_avg_price)
    maxLossShort := math.max(maxLossShort, curLossShort)

    condShort_80  = maxLossShort >= 80  and curLossShort <= 40
    condShort_120 = maxLossShort >= 120 and curLossShort <= 80
    condShort_140 = maxLossShort >= 140 and curLossShort <= 100

    if condShort_80 or condShort_120 or condShort_140
        strategy.close("Short", comment = "step_trail_short_loss")

// ======================================================================
// 1H EMA50 REVERSAL EXIT (2-BAR CONFIRMATION)
// ======================================================================
if strategy.position_size > 0 and close_1H < ema50_1H and close_1H[1] < ema50_1H
    strategy.close("Long", comment = "1H_EMA50_short")

if strategy.position_size < 0 and close_1H > ema50_1H and close_1H[1] > ema50_1H
    strategy.close("Short", comment = "1H_EMA50_long")

// ======================================================================
// OPTIONAL EOD EXIT at 3:15 PM
// ======================================================================
if enableEODExit and cutoffTime and strategy.position_size != 0
    strategy.close_all(comment = "EOD_3_15")

// ======================================================================
// ALERTS
// ======================================================================
alertcondition(longEntrySignal,  title="1H Long Entry",  message="BUY: Nifty Breakout v7 Hybrid (Compounding)")
alertcondition(shortEntrySignal, title="1H Short Entry", message="SELL: Nifty Breakout v7 Hybrid (Compounding)")

exitedLong  = strategy.position_size[1] > 0 and strategy.position_size == 0
exitedShort = strategy.position_size[1] < 0 and strategy.position_size == 0

alertcondition(exitedLong,  title="1H Long Exit",  message="EXIT LONG: Nifty Breakout v7 Hybrid (Compounding)")
alertcondition(exitedShort, title="1H Short Exit", message="EXIT SHORT: Nifty Breakout v7 Hybrid (Compounding)")