
В основе стратегии лежит идея захвата ценового диапазона, формируемого в течение первых пяти минут после открытия рынка (9:15-9:19), и создания торгового сигнала при его прорыве. Стратегия разработана с использованием краткосрочного диапазона колебаний цен, который обычно образуется во время ранних часов рынка, и использует его в качестве ориентира для последующего движения цен.
Эта стратегия основана на нескольких ключевых шагах:
В технической реализации стратегии используется точная логика временного контроля, которая гарантирует, что данные собираются и генерируются только в определенный период времени. При этом, с помощью условного суждения и записи переменных, стратегия может точно идентифицировать ценовые прорывы и инициировать соответствующие торговые операции.
Стратегия прорыва в количественном трейдинге в ранних торговых промежутках имеет следующие значительные преимущества:
Несмотря на многочисленные преимущества стратегии прорыва в количественном трейдинге на ранних торговых площадках, существуют следующие потенциальные риски:
В ответ на эти риски можно рассмотреть следующие решения:
На основе анализа кода стратегии можно оптимизировать стратегию в следующих направлениях:
Эти направления оптимизации важны, потому что они могут значительно повысить устойчивость и адаптивность стратегии. Например, динамические стоп-лоры и фильтрации трендов могут снизить риск ложного прорыва и улучшить рискованный коэффициент прибыли; оптимизация расчета интервала может повысить представительство интервала и уменьшить неэффективные сделки; фильтрация времени и корректировка волатильности помогают стратегии адаптироваться к различным рыночным условиям.
Стратегия количественного трейдинга с прорывом в ранний период - это простая и эффективная система внутридневного трейдинга, ориентированная на захват прорыва в ценовом диапазоне, который формируется после открытия рынка. Стратегия создает референсный диапазон, точно фиксируя колебания цен в течение пяти минут до раннего периода, и генерирует торговый сигнал, когда цена проходит этот диапазон. Ее основные преимущества заключаются в четких торговых правилах, объективном процессе принятия решений и автоматизированном механизме исполнения.
Тем не менее, стратегии также сталкиваются с потенциальными рисками, такими как ложные прорывы, плохое качество интервала и зависимость от одного фактора. Устойчивость и адаптивность стратегии могут быть значительно улучшены путем добавления механизмов остановки, введения фильтрации тенденций, оптимизации логики расчета интервала и добавления таких инструментов оптимизации, как корректировка динамических параметров.
Для трейдеров, которые намерены использовать эту стратегию, рекомендуется сначала провести полное обследование в различных рыночных условиях, чтобы понять, как стратегия будет работать в различных ситуациях, и соответственно адаптировать параметры и механизм контроля риска. В то же время, чтобы использовать стратегию в полной мере как часть более полной торговой системы в сочетании с другими инструментами технического анализа и принципами управления рисками.
/*backtest
start: 2025-03-20 00:00:00
end: 2025-03-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Morning Range Breakout Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Input parameters
var useStrategy = input.bool(true, title="Enable Strategy Execution")
var debugMode = input.bool(true, title="Debug Mode")
// Variables to store specific candle data
var float high915 = na
var float low915 = na
var float high916 = na
var float low916 = na
var float high917 = na
var float low917 = na
var float high918 = na
var float low918 = na
var float high919 = na
var float low919 = na
// Final range variables
var float highestHigh = na
var float lowestLow = na
var bool rangeEstablished = false
// Get current bar time components
t = time("1", "0930-1600:1234567")
timeHour = hour(t)
timeMinute = minute(t)
// Debug variables
var string timeString = na
var int barNum = 0
barNum := barNum + 1
// Record exact timestamp for debugging
timeString := str.tostring(timeHour) + ":" + str.tostring(timeMinute)
// Capture each specific minute's high and low
if timeHour == 9 and timeMinute == 15
high915 := high
low915 := low
if debugMode
label.new(bar_index, high, "9:15 H:" + str.tostring(high, "#.##") + " L:" + str.tostring(low, "#.##"),
color=color.new(color.blue, 50), style=label.style_label_down, textcolor=color.white)
if timeHour == 9 and timeMinute == 16
high916 := high
low916 := low
if timeHour == 9 and timeMinute == 17
high917 := high
low917 := low
if timeHour == 9 and timeMinute == 18
high918 := high
low918 := low
if timeHour == 9 and timeMinute == 19
high919 := high
low919 := low
// At 9:20, calculate the highest high and lowest low from all values
if timeHour == 9 and timeMinute == 20 and not rangeEstablished
// Initialize with first non-NA value
if not na(high915)
highestHigh := high915
else if not na(high916)
highestHigh := high916
else if not na(high917)
highestHigh := high917
else if not na(high918)
highestHigh := high918
else if not na(high919)
highestHigh := high919
if not na(low915)
lowestLow := low915
else if not na(low916)
lowestLow := low916
else if not na(low917)
lowestLow := low917
else if not na(low918)
lowestLow := low918
else if not na(low919)
lowestLow := low919
// Now find the highest high and lowest low across all minutes
if not na(high915) and high915 > highestHigh
highestHigh := high915
if not na(high916) and high916 > highestHigh
highestHigh := high916
if not na(high917) and high917 > highestHigh
highestHigh := high917
if not na(high918) and high918 > highestHigh
highestHigh := high918
if not na(high919) and high919 > highestHigh
highestHigh := high919
if not na(low915) and low915 < lowestLow
lowestLow := low915
if not na(low916) and low916 < lowestLow
lowestLow := low916
if not na(low917) and low917 < lowestLow
lowestLow := low917
if not na(low918) and low918 < lowestLow
lowestLow := low918
if not na(low919) and low919 < lowestLow
lowestLow := low919
rangeEstablished := true
if debugMode
label.new(bar_index, high, "Range Set\nHigh:" + str.tostring(highestHigh, "#.##") +
"\nLow:" + str.tostring(lowestLow, "#.##") +
"\n9:15 values included: " + str.tostring(not na(high915)),
color=color.new(color.purple, 0), style=label.style_label_down, textcolor=color.white)
// Reset values for the next day
if dayofweek != dayofweek[1]
high915 := na
low915 := na
high916 := na
low916 := na
high917 := na
low917 := na
high918 := na
low918 := na
high919 := na
low919 := na
highestHigh := na
lowestLow := na
rangeEstablished := false
// Generate buy/sell signals
longCondition = rangeEstablished and ta.crossover(close, highestHigh)
shortCondition = rangeEstablished and ta.crossunder(close, lowestLow)
// Execute strategy if enabled
if useStrategy and rangeEstablished
if longCondition
strategy.entry("Long", strategy.long)
if shortCondition
strategy.entry("Short", strategy.short)
// Plotting
plot(rangeEstablished ? highestHigh : na, color=color.green, linewidth=2, title="Highest High")
plot(rangeEstablished ? lowestLow : na, color=color.red, linewidth=2, title="Lowest Low")
// Plot buy/sell signals
plotshape(longCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
// Display range information
if barstate.islast and rangeEstablished
label.new(bar_index, highestHigh, text="High: " + str.tostring(highestHigh, "#.##") + " (9:15-9:19)", color=color.green, textcolor=color.white, style=label.style_label_down)
label.new(bar_index, lowestLow, text="Low: " + str.tostring(lowestLow, "#.##") + " (9:15-9:19)", color=color.red, textcolor=color.white, style=label.style_label_up)
// Debug information
if debugMode and barstate.islast
label.new(bar_index, high + (high * 0.05),
"9:15 recorded: " + str.tostring(not na(high915)) +
"\n9:15 High: " + str.tostring(high915, "#.##") +
"\n9:15 Low: " + str.tostring(low915, "#.##") +
"\nTime seen: " + timeString,
color=color.blue, textcolor=color.white, style=label.style_label_down)