
Динамическая система трейдинга с множественной стратегией прорыв-вывод-обратный диапазон цен - это стратегия дневного трейдинга, разработанная специально для краткосрочных трейдеров, основанная на ценовом диапазоне, образованном в первые 5 минут после открытия ранней торговли. Стратегия объединяет три различных режима входа: прорыв входа, ловушной вход и обратный вход, для торговли с помощью идентификации пробелов в справедливой стоимости (FVG) и модели прорыва между ценовыми диапазонами. Стратегия специализируется на высокой волатильности в течение первого часа после открытия рынка акций США (09:30-10:30 EST), выполняет сделки на 1-минутном графике и использует фиксированный рисковый возврат в размере 2:1, а не на сдерживание убытков.
Основные принципы стратегии основываются на модели поведения цены после формирования первоначального диапазона на ранних торгах. Конкретные действия подразделяются на три шага:
Отметки в интервале 9:30 утра:
Поиск точки входа (в течение часа после начала торгов): Эта стратегия предлагает три различных способа получения доступа:
Брейк-энтри:
Вход в ловушку:
Reversal Entry (перевернутый вход):
Управление сделками:
Код стратегии реализует полную логическую структуру, включающую автоматическое обнаружение торговых промежутков, идентификацию различных условий входа, установку уровня стоп-стоп и расчет надлежащего размера позиции. Система также включает в себя временные фильтры, которые гарантируют торговлю только в определенные периоды времени, а также могут избирательно включать или отключать различные стратегии входа.
Краткие и четкие правила: правила стратегии четкие и интуитивные, без необходимости субъективного суждения, уменьшает влияние эмоций на торговые решения. Условная логика и отслеживание состояния в коде гарантируют строгое выполнение правил.
Гибкость с различными способами поступления: Предоставляет три различных стратегии входа (прорыв, ловушку и обратный ход), позволяя трейдерам адаптироваться к различным рыночным условиям.enableBreak、enableTrapиenableReversalПараметры обеспечивают такую гибкость.
Сосредоточьтесь на периоде высокой вероятности.Стратегия: торговать только в течение первого часа после открытия, используя высокую волатильность и ликвидность, которые обычно существуют в этот период времени.inWindowУсловия, гарантирующие, что сделки будут выполняться только с 9:30 до 10:30
Строгое управление рисками: фиксированное соотношение риска и прибыли в размере 2: 1 и установка стоп-лосса на основе конкретных ценовых действий, обеспечивающая четкий контроль риска для каждой сделки.riskPctПараметры позволяют пользователям корректировать процент риска для каждой сделки в соответствии с их собственными предпочтениями в отношении риска.
Не нужно сложных показателейСтратегия не зависит от сложных технических показателей, а основана на чисто ценовом поведении и структуре, снижая риск перенастройки.
Сезонное уклонение: В коде встроен праздничный черный список ((15 декабря - 15 января), чтобы избежать периодов, когда рынок может быть нестабильным или менее ликвидным.
Гибкое управление позициямиСистема предлагает два способа управления позициями, основанные на процентах риска или фиксированном количестве контрактов, для удовлетворения различных потребностей в управлении капиталом.
Риск ложного проникновения: рынок может иметь ложные прорывы, в результате чего цена быстро переворачивается после запуска сделки. Для смягчения этого риска стратегия включает в себя ловушку и обратную модель входа, но все же требует тщательного мониторинга.
Проблема с шириной диапазона: Если в первые 5 минут после открытия диска интервал K-линии становится слишком широким или слишком узким, это может повлиять на эффективность стратегии. Слишком узкий интервал может привести к частому сигналу, а слишком широкий интервал может привести к тому, что точка остановки будет слишком далеко.
Временные издержкиОднако это ограничение служит дисциплиной, которая предотвращает чрезмерную торговлю.
Ограничения фиксированного коэффициента возврата рискаХотя соотношение риска и прибыли в размере 2:1 обеспечивает согласованность, оно может быть не оптимальным в некоторых рыночных условиях. В рынках с сильными тенденциями более высокое соотношение риска и прибыли может быть более подходящим.
Рыночные аномалии в период праздниковНесмотря на то, что стратегия избегает торговли в период с 15 декабря по 15 января, другие рыночные действия до и после праздников также могут быть необычными и влиять на эффективность стратегии.
Зависимость от FVGСтратегия зависит от модели FVG в прорывах и обратном входе, но в некоторых рыночных условиях FVG могут быть не так легко сформированы или идентифицированы.
Ограничения единой временной рамкиВ то же время, если мы будем рассматривать графики в течение одной минуты, мы можем увидеть, что мы не можем рассматривать их в течение более длительных периодов времени.
Приспособность к ширине полосы: можно рассмотреть возможность корректировки диапазона в зависимости от динамики волатильности рынка, например, использование более широкого диапазона в дни с высокой волатильностью, использование более узкого диапазона в дни с низкой волатильностью. Это может быть достигнуто путем расчета среднего реального диапазона колебаний в последнее время (ATR) или аналогичного показателя.
Оптимизация временного окнаВместо того, чтобы фиксироваться в 9:30-10:30, можно изучить оптимальные торговые окна для различных рынков. Некоторые рынки могут демонстрировать более заметную модель прорыва в разное время.
Динамическая настройка риска и дохода: можно корректировать рисково-рентабельный коэффициент в зависимости от состояния рынка и волатильной динамики, например, увеличить цель при сильной тенденции и уменьшить цель в консолидированном рынке.
Интеграция показателей рыночных настроенийВ качестве фильтра можно использовать индикаторы широты рынка или индикаторы волатильности, чтобы избежать торговли в неблагоприятных условиях.
Подтверждение многократных временных рамокХотя выполнение сделки остается на 1-минутном графике, можно добавить условия подтверждения на более высокие временные рамки, такие как проверка согласованности направления тренда на 15-минутном или 1-часовом графике.
Оптимизация определения FVGВ настоящее время определение FVG относительно простое и позволяет рассматривать более сложные или более точные определения неуравновешенных областей, например, рассматривать тело тела, а не только теневую линию.
Добавить подтверждение объема сделкиВключение подтверждения объема сделки в условия входа может улучшить качество сигнала, особенно для прорыва входа.
Приспособность к потереВ зависимости от динамики рыночной волатильности, может быть повышена адаптивность стратегии в различных рыночных условиях.
Динамическая система трейдинга с многостратегией прорыв-вывод-обратный ценовой диапазон - это четко структурированная, четко регламентированная внутридневная торговая стратегия, которая ищет возможности для торговли, идентифицируя ценовые диапазоны, в которых формируется ранний рывок, и последующие модели прорыва, ловушки или обратных поворотов. Основные преимущества этой стратегии заключаются в ее простоте и гибкости в различных способах входа, в то время как строгие временные ограничения и принципы управления рисками помогают поддерживать торговую дисциплину.
Тем не менее, стратегия также подвержена рискам, таким как ложные прорывы, неуместная ширина диапазона и зависимость от конкретной ценовой модели. С помощью оптимизации методов установки диапазонов, корректировки временных окон, динамического настройки соотношения возврата риска и интеграции анализа в несколько временных рамок можно еще больше повысить устойчивость и адаптивность стратегии.
В конечном счете, эта стратегия предоставляет систематизированную структуру для коротколинейных трейдеров, особенно для инвесторов, которые ищут эффективную торговлю во время ежедневных открытий. Как и все торговые стратегии, перед практическим применением следует провести полное отслеживание и надлежащее управление рисками.
/*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")