Динамическая многостратегическая торговая система с прорывом-откатом-разворотом ценового диапазона

FVG 5M 1M R:R RANGE TRADING SCALPING
Дата создания: 2025-08-22 09:55:06 Последнее изменение: 2025-08-22 09:55:06
Копировать: 0 Количество просмотров: 332
2
Подписаться
319
Подписчики

Динамическая многостратегическая торговая система с прорывом-откатом-разворотом ценового диапазона Динамическая многостратегическая торговая система с прорывом-откатом-разворотом ценового диапазона

Обзор

Динамическая система трейдинга с множественной стратегией прорыв-вывод-обратный диапазон цен - это стратегия дневного трейдинга, разработанная специально для краткосрочных трейдеров, основанная на ценовом диапазоне, образованном в первые 5 минут после открытия ранней торговли. Стратегия объединяет три различных режима входа: прорыв входа, ловушной вход и обратный вход, для торговли с помощью идентификации пробелов в справедливой стоимости (FVG) и модели прорыва между ценовыми диапазонами. Стратегия специализируется на высокой волатильности в течение первого часа после открытия рынка акций США (09:30-10:30 EST), выполняет сделки на 1-минутном графике и использует фиксированный рисковый возврат в размере 2:1, а не на сдерживание убытков.

Стратегический принцип

Основные принципы стратегии основываются на модели поведения цены после формирования первоначального диапазона на ранних торгах. Конкретные действия подразделяются на три шага:

  1. Отметки в интервале 9:30 утра:

    • Первые 5 минут после открытия K-линии ((9:30-9:35) закрытие
    • Отметьте наивысшие и наименьшие точки на линии K в качестве диапазонов торгов
    • Переключиться на 1-минутный график для фактической торговли
  2. Поиск точки входа (в течение часа после начала торгов): Эта стратегия предлагает три различных способа получения доступа:

    • Брейк-энтри:

      • Требуется удовлетворение условий пробела справедливой стоимости (FVG)
      • Прорыв цены закрытия любой линии K в FVG
      • FVG определяется как взлетная модель, в которой образуются три K-линии (wick-gap)
    • Вход в ловушку:

      • Цены первыми пересекли границы между зонами
      • Затем отсчитывается в пределах
      • Наконец, снова закрытие за пределами зоны
    • Reversal Entry (перевернутый вход):

      • После неудачного прорыва в одном направлении
      • FVG, появляющиеся в противоположном направлении, возвращаются в зону
  3. Управление сделками:

    • Параметры остановки:
      • Стратегия прорыва/ловушки: использование первого закрытия на нижней/высшей точке K-линии вне диапазона
      • Обратная стратегия: минимальная/максимальная точка первой линии K в режиме FVG
    • Параметры торможения:
      • Всегда используйте соотношение риска и прибыли 2:1
      • Риск \(100, прибыль \)200

Код стратегии реализует полную логическую структуру, включающую автоматическое обнаружение торговых промежутков, идентификацию различных условий входа, установку уровня стоп-стоп и расчет надлежащего размера позиции. Система также включает в себя временные фильтры, которые гарантируют торговлю только в определенные периоды времени, а также могут избирательно включать или отключать различные стратегии входа.

Стратегические преимущества

  1. Краткие и четкие правила: правила стратегии четкие и интуитивные, без необходимости субъективного суждения, уменьшает влияние эмоций на торговые решения. Условная логика и отслеживание состояния в коде гарантируют строгое выполнение правил.

  2. Гибкость с различными способами поступления: Предоставляет три различных стратегии входа (прорыв, ловушку и обратный ход), позволяя трейдерам адаптироваться к различным рыночным условиям.enableBreakenableTrapиenableReversalПараметры обеспечивают такую гибкость.

  3. Сосредоточьтесь на периоде высокой вероятности.Стратегия: торговать только в течение первого часа после открытия, используя высокую волатильность и ликвидность, которые обычно существуют в этот период времени.inWindowУсловия, гарантирующие, что сделки будут выполняться только с 9:30 до 10:30

  4. Строгое управление рисками: фиксированное соотношение риска и прибыли в размере 2: 1 и установка стоп-лосса на основе конкретных ценовых действий, обеспечивающая четкий контроль риска для каждой сделки.riskPctПараметры позволяют пользователям корректировать процент риска для каждой сделки в соответствии с их собственными предпочтениями в отношении риска.

  5. Не нужно сложных показателейСтратегия не зависит от сложных технических показателей, а основана на чисто ценовом поведении и структуре, снижая риск перенастройки.

  6. Сезонное уклонение: В коде встроен праздничный черный список ((15 декабря - 15 января), чтобы избежать периодов, когда рынок может быть нестабильным или менее ликвидным.

  7. Гибкое управление позициямиСистема предлагает два способа управления позициями, основанные на процентах риска или фиксированном количестве контрактов, для удовлетворения различных потребностей в управлении капиталом.

Стратегический риск

  1. Риск ложного проникновения: рынок может иметь ложные прорывы, в результате чего цена быстро переворачивается после запуска сделки. Для смягчения этого риска стратегия включает в себя ловушку и обратную модель входа, но все же требует тщательного мониторинга.

  2. Проблема с шириной диапазона: Если в первые 5 минут после открытия диска интервал K-линии становится слишком широким или слишком узким, это может повлиять на эффективность стратегии. Слишком узкий интервал может привести к частому сигналу, а слишком широкий интервал может привести к тому, что точка остановки будет слишком далеко.

  3. Временные издержкиОднако это ограничение служит дисциплиной, которая предотвращает чрезмерную торговлю.

  4. Ограничения фиксированного коэффициента возврата рискаХотя соотношение риска и прибыли в размере 2:1 обеспечивает согласованность, оно может быть не оптимальным в некоторых рыночных условиях. В рынках с сильными тенденциями более высокое соотношение риска и прибыли может быть более подходящим.

  5. Рыночные аномалии в период праздниковНесмотря на то, что стратегия избегает торговли в период с 15 декабря по 15 января, другие рыночные действия до и после праздников также могут быть необычными и влиять на эффективность стратегии.

  6. Зависимость от FVGСтратегия зависит от модели FVG в прорывах и обратном входе, но в некоторых рыночных условиях FVG могут быть не так легко сформированы или идентифицированы.

  7. Ограничения единой временной рамкиВ то же время, если мы будем рассматривать графики в течение одной минуты, мы можем увидеть, что мы не можем рассматривать их в течение более длительных периодов времени.

Направление оптимизации стратегии

  1. Приспособность к ширине полосы: можно рассмотреть возможность корректировки диапазона в зависимости от динамики волатильности рынка, например, использование более широкого диапазона в дни с высокой волатильностью, использование более узкого диапазона в дни с низкой волатильностью. Это может быть достигнуто путем расчета среднего реального диапазона колебаний в последнее время (ATR) или аналогичного показателя.

  2. Оптимизация временного окнаВместо того, чтобы фиксироваться в 9:30-10:30, можно изучить оптимальные торговые окна для различных рынков. Некоторые рынки могут демонстрировать более заметную модель прорыва в разное время.

  3. Динамическая настройка риска и дохода: можно корректировать рисково-рентабельный коэффициент в зависимости от состояния рынка и волатильной динамики, например, увеличить цель при сильной тенденции и уменьшить цель в консолидированном рынке.

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

  5. Подтверждение многократных временных рамокХотя выполнение сделки остается на 1-минутном графике, можно добавить условия подтверждения на более высокие временные рамки, такие как проверка согласованности направления тренда на 15-минутном или 1-часовом графике.

  6. Оптимизация определения FVGВ настоящее время определение FVG относительно простое и позволяет рассматривать более сложные или более точные определения неуравновешенных областей, например, рассматривать тело тела, а не только теневую линию.

  7. Добавить подтверждение объема сделкиВключение подтверждения объема сделки в условия входа может улучшить качество сигнала, особенно для прорыва входа.

  8. Приспособность к потереВ зависимости от динамики рыночной волатильности, может быть повышена адаптивность стратегии в различных рыночных условиях.

Подвести итог

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

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

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

Исходный код стратегии
/*backtest
start: 2025-07-22 00:00:00
end: 2025-08-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Three-Step 9:30 Range Scalping (Backtest)", overlay=true, calc_on_every_tick=false, process_orders_on_close=true,
     initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0)

// -------------------- Inputs
enableBreak    = input.bool(true,  "Enable Break Entry")
enableTrap     = input.bool(false, "Enable Trap Entry")
enableReversal = input.bool(true, "Enable Reversal Entry")
rr             = input.float(2.0,  "Take-Profit R Multiple", step=0.25, minval=0.25)
oneTradePerDay = input.bool(false,  "One Trade Per Day")
showRange      = input.bool(true,  "Show 9:30 5m Range")

// Risk management
riskPct        = input.float(1.0,  "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=100.0)
sizeMode       = input.string("Risk %", "Position Sizing Mode", options=["Risk %", "Fixed contracts"])
fixedContracts = input.int(1, "Fixed Contracts", minval=1)

// Optional: warn if not on 1-minute chart (execution timeframe per PRD)
onOneMinute = timeframe.isminutes and timeframe.multiplier == 1

// -------------------- Time helpers (chart is assumed New York time)
newDay   = ta.change(time("D")) != 0
// Trade the first hour only: 9:30:00 to 10:29:59
inWindow = (hour == 9 and minute >= 30) or (hour == 10 and minute <= 29)
// Holiday blackout window: Do not trade Dec 15 – Jan 15
inBlackout = (month == 12 and dayofmonth >= 15) or (month == 1 and dayofmonth <= 15)

// -------------------- First 5-min range (use the actual 9:30 5m candle via security())
var float rangeHi = na
var float rangeLo = na
var bool  haveRange = false

// -------------------- State for entries
var bool  breakUpFound           = false
var bool  breakDownFound         = false
var float initBreakUpLow         = na    // for Break/Trap long SL
var float initBreakDownHigh      = na    // for Break/Trap short SL
var bool  trapUpRetestedInside   = false
var bool  trapDownRetestedInside = false
var bool  tradedToday            = false

// Reset daily state at midnight (chart timezone)
if newDay
    rangeHi := na
    rangeLo := na
    haveRange := false
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// Pull the 5-minute bar that STARTS at 9:30 (value available on its close at 9:35)
sess0930Hi = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? high : na, barmerge.gaps_off, barmerge.lookahead_off)
sess0930Lo = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? low  : na, barmerge.gaps_off, barmerge.lookahead_off)

// Lock the range when the 9:30 5m candle closes (value appears non-na exactly then)
if not haveRange and not na(sess0930Hi) and not na(sess0930Lo)
    rangeHi := sess0930Hi
    rangeLo := sess0930Lo
    haveRange := true
    // reset session-specific flags at start of trading window
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// -------------------- Visuals
plot(showRange and haveRange ? rangeHi : na, "Range High", color=color.new(color.teal, 0), style=plot.style_linebr, linewidth=2)
plot(showRange and haveRange ? rangeLo : na, "Range Low",  color=color.new(color.orange, 0), style=plot.style_linebr, linewidth=2)

plotchar(not onOneMinute, title="Use 1-minute chart", char="⚠", location=location.top, color=color.new(color.red, 0), size=size.tiny)
plotchar(inBlackout, title="Holiday blackout (Dec 15–Jan 15)", char="⛔", location=location.top, color=color.new(color.red, 0), size=size.tiny)

// -------------------- Convenience conditions
closeAbove  = haveRange and close > rangeHi
closeBelow  = haveRange and close < rangeLo
closeInside = haveRange and close <= rangeHi and close >= rangeLo

// Track first body-close outside the range in each direction (initial break-close)
if haveRange and inWindow and not tradedToday
    if not breakUpFound and closeAbove
        breakUpFound := true
        initBreakUpLow := low
        trapUpRetestedInside := false
    if not breakDownFound and closeBelow
        breakDownFound := true
        initBreakDownHigh := high
        trapDownRetestedInside := false

// Trap retest flags (retest back inside after first break)
if haveRange and inWindow and not tradedToday
    if breakUpFound and not trapUpRetestedInside and closeInside
        trapUpRetestedInside := true
    if breakDownFound and not trapDownRetestedInside and closeInside
        trapDownRetestedInside := true

// -------------------- FVG detectors (three-candle imbalance)
// Simple wick-gap definition, preserved through the third candle
// Bullish: gap exists if Candle C low > Candle A high AND Candle B low > Candle A high
// Bearish: gap exists if Candle C high < Candle A low  AND Candle B high < Candle A low
bullFVG = not na(high[2]) and (low[1] > high[2]) and (low > high[2])
bearFVG = not na(low[2])  and (high[1] < low[2])  and (high < low[2])

// -------------------- Entry gating
allowEntry = haveRange and inWindow and not inBlackout and strategy.position_size == 0 and (not oneTradePerDay or not tradedToday)

// Calculate contracts based on selected sizing mode
calcOrderQty(entryPrice, stopPrice) =>
    qty = 0
    if sizeMode == "Fixed contracts"
        qty := fixedContracts
    else
        riskCash = strategy.equity * riskPct / 100.0
        riskPerContract = math.abs(entryPrice - stopPrice) * syminfo.pointvalue
        qty := riskPerContract > 0 ? math.floor(riskCash / riskPerContract) : 0
    qty

// -------------------- BREAK Entries (needs FVG and ANY of the 3 bars closes outside)
if enableBreak and allowEntry
    // Long BREAK
    breakLongOk  = bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)
    if breakLongOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopL = na
        stopL := close[2] > rangeHi ? low[2] : stopL
        stopL := na(stopL) and close[1] > rangeHi ? low[1] : stopL
        stopL := na(stopL) and close > rangeHi ? low : stopL
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_BREAK", strategy.long, qty=qtyL)
                strategy.exit("LONG_BREAK_TP/SL", from_entry="LONG_BREAK", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short BREAK
    breakShortOk = bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)
    if breakShortOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopS = na
        stopS := close[2] < rangeLo ? high[2] : stopS
        stopS := na(stopS) and close[1] < rangeLo ? high[1] : stopS
        stopS := na(stopS) and close < rangeLo ? high : stopS
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_BREAK", strategy.short, qty=qtyS)
                strategy.exit("SHORT_BREAK_TP/SL", from_entry="SHORT_BREAK", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- TRAP Entries (Break → Retest inside → Reclose outside; FVG not required)
if enableTrap and allowEntry
    // Long TRAP
    if breakUpFound and trapUpRetestedInside and closeAbove
        stopL  = na(initBreakUpLow) ? low : initBreakUpLow
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_TRAP", strategy.long, qty=qtyL)
                strategy.exit("LONG_TRAP_TP/SL", from_entry="LONG_TRAP", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short TRAP
    if breakDownFound and trapDownRetestedInside and closeBelow
        stopS  = na(initBreakDownHigh) ? high : initBreakDownHigh
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_TRAP", strategy.short, qty=qtyS)
                strategy.exit("SHORT_TRAP_TP/SL", from_entry="SHORT_TRAP", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- REVERSAL Entries (Failed break + opposite FVG back into range)
if enableReversal and allowEntry
    // After bearish break, bullish FVG back into range → LONG
    if breakDownFound and bullFVG and closeInside
        stopL  = low[2]  // first candle of the FVG
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_REV", strategy.long, qty=qtyL)
                strategy.exit("LONG_REV_TP/SL", from_entry="LONG_REV", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // After bullish break, bearish FVG back into range → SHORT
    if breakUpFound and bearFVG and closeInside
        stopS  = high[2] // first candle of the FVG
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_REV", strategy.short, qty=qtyS)
                strategy.exit("SHORT_REV_TP/SL", from_entry="SHORT_REV", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- Markers
plotshape(enableBreak and (bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)) and allowEntry,  title="Break Long",  style=shape.triangleup,   color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Break")
plotshape(enableBreak and (bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)) and allowEntry,  title="Break Short", style=shape.triangledown, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Break")
plotshape(enableTrap  and breakUpFound   and trapUpRetestedInside   and closeAbove and allowEntry,  title="Trap Long",  style=shape.circle, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Trap")
plotshape(enableTrap  and breakDownFound and trapDownRetestedInside and closeBelow and allowEntry,  title="Trap Short", style=shape.circle, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Trap")
plotshape(enableReversal and breakDownFound and bullFVG and closeInside and allowEntry, title="Reversal Long",  style=shape.diamond, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Rev")
plotshape(enableReversal and breakUpFound   and bearFVG and closeInside and allowEntry, title="Reversal Short", style=shape.diamond, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Rev")