A estratégia de negociação quantitativa de ruptura do intervalo de manhã é um sistema de negociação diária baseado no princípio da ruptura do intervalo de preço. A idéia central da estratégia é capturar o intervalo de preço formado nos primeiros cinco minutos após a abertura do mercado (09:15-9:19) e gerar um sinal de negociação quando o preço atravessa esse intervalo.
A estratégia baseia-se nos seguintes passos-chave:
A estratégia usa uma lógica de controle de tempo precisa em sua implementação técnica, garantindo que os dados sejam coletados e gerem sinais de negociação somente em determinados períodos de tempo. Ao mesmo tempo, a estratégia é capaz de identificar com precisão o comportamento de ruptura de preços e desencadear a operação de negociação correspondente por meio de julgamento condicional e registro de variáveis.
A estratégia de negociação de volume de ruptura no período de lançamento tem as seguintes vantagens significativas:
Apesar das vantagens de uma estratégia de volume de negociação de breakout no período de início, existem os seguintes riscos potenciais:
Para enfrentar esses riscos, as seguintes soluções podem ser consideradas:
Com base na análise do código da estratégia, a estratégia pode ser otimizada nas seguintes direções:
Essas direções de otimização são importantes porque podem aumentar significativamente a robustez e a adaptabilidade da estratégia. Por exemplo, o stop loss dinâmico e o filtro de tendência podem reduzir o risco de false breakout e melhorar a taxa de retorno do risco; a otimização do cálculo de intervalos pode aumentar a representação de intervalos e reduzir as negociações ineficazes; o filtro de tempo e o ajuste de volatilidade podem ajudar a adaptar a estratégia a diferentes condições de mercado.
A estratégia de negociação quantitativa de breakout da parte da manhã é um sistema de negociação intradiário simples e eficaz, focado em capturar breakouts de breakouts de preços formados após a abertura do mercado. A estratégia estabelece um intervalo de referência ao registrar com precisão as flutuações de preços cinco minutos antes do início da manhã e gerar um sinal de negociação quando o preço ultrapassa esse intervalo.
No entanto, as estratégias também enfrentam riscos potenciais, como falsas brechas, má qualidade de intervalos e dependência de um único fator. Os meios de otimização, como o aumento do mecanismo de parada de perdas, a introdução de filtros de tendência, a otimização da lógica de cálculo de intervalos e a adição de ajustes de parâmetros dinâmicos, podem aumentar significativamente a robustez e a adaptabilidade das estratégias.
Para os comerciantes que pretendem usar a estratégia, é recomendável primeiro fazer um bom retorno em diferentes ambientes de mercado, entender as características de desempenho da estratégia em várias situações e ajustar a configuração de parâmetros e o mecanismo de controle de risco de acordo. Ao mesmo tempo, a estratégia é usada como parte de um sistema de negociação mais abrangente, em combinação com outras ferramentas de análise técnica e princípios de gerenciamento de risco, para que sua eficácia seja aproveitada.
/*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)