
A estratégia de combinação de breakout do intervalo de abertura com o intervalo de valor justo é uma estratégia de negociação quantitativa que combina o breakout do intervalo de abertura (ORB) e o intervalo de valor justo (FVG) no conceito de fundos inteligentes (SMC). A estratégia define primeiro o intervalo de preço no início do dia de negociação (geralmente 5 minutos após a abertura) e, em seguida, procura o interseção do intervalo de abertura com o intervalo de valor justo quando o preço quebra esse intervalo como um sinal de negociação. A estratégia é projetada para ser usada em negociações diárias dentro de um determinado período de tempo, especialmente no período de negociação regular do mercado americano, e controla o risco de breakout de cada transação por meio de mecanismos de gerenciamento de risco.
A estratégia baseia-se em dois conceitos fundamentais de análise técnica:
Abertura de espaço de jogo (ORB)- A estratégia primeiro determina o preço mais alto e o preço mais baixo em um determinado período de tempo (default 5 minutos) após a abertura do dia de negociação, formando uma faixa de preços. Esta faixa é considerada um julgamento preliminar dos participantes do mercado sobre a movimentação dos preços do dia, e a ruptura da faixa pode indicar a formação de uma tendência de curto prazo.
Falha de Valor Justo (FVG)- A partir da análise do conceito de capital inteligente (SMC), os altos atuais formam um FVG de alta quando estão abaixo dos baixos dos antecessores, e os baixos atuais formam um FVG de baixa quando estão acima dos altos dos antecessores. Essas lacunas são consideradas áreas onde o preço pode ser compensado no futuro, representando um desequilíbrio na estrutura do mercado.
Os sinais de negociação da estratégia são gerados pelas seguintes condições:
A estratégia utiliza um método de gerenciamento de posição baseado em risco, calculado de acordo com o tamanho da posição específica de cada transação, de acordo com a distância de parada, para garantir que a abertura de risco de cada transação seja consistente. A parada de perda é definida no ponto mais baixo anterior de uma transação múltipla ou no ponto mais alto anterior de uma transação em branco, e a meta de lucro é baseada na taxa de retorno do risco predefinida.
Combinação de vários métodos de análise técnica- Combinando os métodos de análise técnica ORB e FVG, a estratégia é capaz de filtrar os falsos sinais que um único indicador pode gerar, melhorando a qualidade dos sinais de negociação.
Uma estrutura de tempo de negociação clara- A estratégia define claramente o intervalo de tempo de negociação (signal e período de negociação), o que ajuda os comerciantes a se concentrarem nos momentos em que o mercado é mais ativo e de maior qualidade de sinal, evitando negociações inválidas em momentos de baixa atividade.
Gestão de posições com base no risco- A estratégia utiliza um método de cálculo de posições baseado em risco, garantindo que cada transação represente uma proporção consistente de risco para o capital total da conta (default 1%), o que favorece a gestão de fundos a longo prazo e o controle de risco.
Configuração de parâmetros flexível- A estratégia oferece vários parâmetros ajustáveis, incluindo a configuração do tempo de negociação, a duração do ORB, a duração do período de sinal, a proporção de risco e a taxa de retorno do risco, etc., permitindo que os comerciantes otimizem de acordo com diferentes mercados e preferências de risco pessoais.
Ajuda visual- A estratégia oferece uma abundância de elementos de visualização, incluindo a linha horizontal ORB, marcação de sinais de negociação, alta luminosidade de fundo em diferentes períodos de negociação e tabelas de dados estatísticos em tempo real, para facilitar o monitoramento e análise da execução da estratégia por parte do comerciante.
Suporte à gestão multidimensional- A estratégia de design de suporte para manter várias posições de negociação ao mesmo tempo (controle de parâmetros através de pyramiding), permitindo a captura de várias oportunidades de negociação no mesmo dia de negociação, aumentando a eficiência de utilização de fundos.
Dependência de mercado específico- A estratégia é projetada principalmente para o mercado de ações dos EUA em horários de negociação regulares, que pode não ser eficaz em outros mercados ou horários de negociação. As características de abertura e os padrões de flutuação em diferentes mercados são muito diferentes, e os parâmetros precisam ser ajustados de forma adequada.
Sensibilidade do parâmetro- A performance da estratégia é sensível a vários parâmetros-chave, como a duração do ORB, a duração do período de sinalização e a taxa de retorno do risco. A configuração inadequada dos parâmetros pode levar a excesso de negociação ou a perda de oportunidades importantes.
Dependência do estado do mercado- O desempenho da estratégia pode ser inconsistente em ambientes de mercado de alta ou baixa volatilidade. Especialmente em mercados de baixa volatilidade, os intervalos ORB podem ser muito estreitos, resultando em frequentes disparos de falsos sinais de ruptura.
Risco de perda de posição- A estratégia utiliza o ponto alto/baixo da barra anterior como uma posição de parada, o que pode levar a uma posição de parada muito ampla em mercados rápidos, reduzindo a taxa de retorno do risco ou resultando em um tamanho de posição muito pequeno.
Dependência de modelos de preços históricos- A estratégia assume que as rupturas nas zonas FVG e ORB são previsíveis, mas que a eficiência do mercado ou a mudança no ambiente de negociação podem enfraquecer a eficácia desses modelos.
Risco de execução técnica- Em operações reais, podem ocorrer problemas como deslizamentos, atrasos na execução de pedidos, etc., que afetam a consistência entre os resultados reais das operações e os resultados da retrospectiva.
Tempo de duração do ORB dinâmico- Pode-se considerar a duração do ORB para ajustar automaticamente a volatilidade do mercado, por exemplo, usando um tempo de ORB mais longo em um ambiente de mercado de alta volatilidade para evitar falsas rupturas, reduzindo o tempo de ORB em um ambiente de baixa volatilidade para capturar mais oportunidades de negociação.
Adicionar condições de filtragem- A introdução de condições de filtragem adicionais para melhorar a qualidade do sinal, como a combinação com a direção da tendência do mercado em geral ((fazer mais apenas em tendências ascendentes, fazer menos em tendências descendentes) ou adicionar confirmação de volume de transação ((transação apenas quando a ruptura é acompanhada por um aumento de volume de transação))
Optimizar a posição de parada- Considere o uso de um sistema de stop loss dinâmico baseado no ATR ou na volatilidade, em vez do método de stop loss fixo baseado no ponto mais alto ou mais baixo do que o anterior, o que pode fornecer um controle de risco mais racional.
Adição de mecanismos de lucro- Implementar estratégias de lucro intermitente, como liquidar uma parte da posição quando a relação de risco-retorno é de 1:1, e definir o restante para traçar um stop loss ou um objetivo de lucro mais distante, para equilibrar a necessidade de bloquear lucros e acompanhar tendências.
Filtro de tempo- Adicione um filtro de tempo para evitar períodos de negociação de baixa qualidade conhecidos, como períodos de baixa volatilidade no horário do almoço ou períodos de alta volatilidade antes e depois do lançamento de dados econômicos importantes.
Parâmetros de adaptabilidade adicionados- Introdução de parâmetros de adaptação, permitindo que a estratégia ajuste automaticamente os parâmetros de acordo com o desempenho mais recente do mercado, como ajustar dinamicamente a taxa de retorno do risco ou o percentual de risco de acordo com a taxa de vitória mais recente.
A estratégia de combinação de breakout em intervalos abertos e breakout de valor justo é um sistema de negociação intradiária bem projetado para encontrar oportunidades de negociação de alta probabilidade através da combinação de métodos de análise técnica ORB e FVG. A estratégia funciona dentro de períodos de negociação bem definidos, usa uma abordagem de gerenciamento de posições baseada em risco e oferece uma abundância de visualizações e ferramentas estatísticas para auxiliar a decisão de negociação.
As principais vantagens de uma estratégia reside na sua lógica de negociação clara, configuração de parâmetros flexíveis e mecanismo de gerenciamento de risco abrangente. No entanto, a estratégia também enfrenta riscos como dependência de mercado, sensibilidade de parâmetros e dependência de estado de mercado. Para aumentar a solidez da estratégia, recomenda-se considerar a direção de otimização, como ajuste de parâmetros dinâmicos, aumento de condições de filtragem, otimização de métodos de parada de perdas e implementação de mecanismos de lucro por etapas.
Note-se que a estratégia não se aplica a todos os cenários de mercado e a todas as variedades de negociação, e os comerciantes devem fazer um bom teste de retrospectiva e de prospectiva antes de aplicá-la, para garantir que a estratégia esteja de acordo com as suas preferências de risco e objetivos de negociação. A estratégia tem o potencial de ser uma ferramenta eficaz na caixa de ferramentas do comerciante diário, por meio de otimização contínua e adaptação às mudanças do mercado.
/*backtest
start: 2025-06-18 00:00:00
end: 2025-06-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// Based on https://www.youtube.com/watch?v=mzFXoK2pbNE
//@version=5
strategy("[Myth Busting] [ORB] Casper SMC - 16 Jun", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, pyramiding = 10)
// Input settings
show_orb = input.bool(true, "Show 5m Opening Range")
show_signals = input.bool(true, "Show FVG Intersection Signals")
show_stats = input.bool(true, "Show Statistics Table")
risk_per_trade = input.float(1.0, "Risk Per Trade (%)", minval=0.1, maxval=10.0, step=0.1)
use_stop_loss = input.bool(true, "Use Stop Loss")
use_take_profit = input.bool(true, "Use Take Profit")
risk_reward_ratio = input.float(2.0, "Risk:Reward Ratio", minval=1.0, step=0.1)
// Session time inputs
session_start_hour = input.int(9, "Session Start Hour", minval=0, maxval=23, group="Session Settings")
session_start_minute = input.int(30, "Session Start Minute", minval=0, maxval=59, group="Session Settings")
session_end_hour = input.int(16, "Session End Hour", minval=0, maxval=23, group="Session Settings")
session_end_minute = input.int(0, "Session End Minute", minval=0, maxval=59, group="Session Settings")
session_timezone = input.string("America/New_York", "Session Timezone", group="Session Settings")
orb_duration_minutes = input.int(5, "ORB Duration (Minutes)", minval=1, maxval=60, group="Session Settings")
signal_end_offset = input.int(90, "Signal Period Duration (Minutes)", minval=30, maxval=300, group="Session Settings")
// Style settings
orb_high_color = input.color(color.new(color.green, 50), "ORB High Color")
orb_low_color = input.color(color.new(color.red, 50), "ORB Low Color")
bullish_signal_color = input.color(color.green, "Bullish Signal Color")
bearish_signal_color = input.color(color.red, "Bearish Signal Color")
// Variables to store ORB levels
var float orb_high = na
var float orb_low = na
var int orb_start_time = na
var int orb_end_time = na
var bool orb_set = false
// Position tracking
var int position_counter = 0
var int active_positions = 0
// Function to get current time in specified timezone
get_session_time() =>
current_hour = hour(time, session_timezone)
current_minute = minute(time, session_timezone)
current_hour * 60 + current_minute
// Calculate session times in minutes
session_start_minutes = session_start_hour * 60 + session_start_minute
session_end_minutes = session_end_hour * 60 + session_end_minute
orb_end_minutes = session_start_minutes + orb_duration_minutes
signal_end_minutes = session_start_minutes + signal_end_offset
// Check if we're in the ORB period
is_orb_period() =>
current_time = get_session_time()
current_time >= session_start_minutes and current_time < orb_end_minutes
// Check if we're in the signal period
is_signal_period() =>
current_time = get_session_time()
current_time >= orb_end_minutes and current_time < signal_end_minutes
// Check if we're in the overall trading session
is_trading_session() =>
current_time = get_session_time()
current_time >= session_start_minutes and current_time < session_end_minutes
// Reset ORB at the start of each trading session
new_session = is_trading_session() and not is_trading_session()[1]
if new_session or ta.change(dayofweek)
orb_high := na
orb_low := na
orb_start_time := na
orb_end_time := na
orb_set := false
position_counter := 0
// Capture ORB levels during the ORB period
if is_orb_period()
if na(orb_high) or na(orb_low)
orb_high := high
orb_low := low
orb_start_time := time
else
orb_high := math.max(orb_high, high)
orb_low := math.min(orb_low, low)
orb_end_time := time
// Mark ORB as set after the period ends
if not is_orb_period() and not na(orb_high) and not orb_set
orb_set := true
// Fair Value Gap detection
bullish_fvg = high[2] < low and not na(orb_high)
bearish_fvg = low[2] > high and not na(orb_low)
// Check for FVG intersection with ORB boundaries during signal period
bullish_intersection = false
bearish_intersection = false
// Count active positions
active_positions := strategy.opentrades
if is_signal_period() and orb_set
// Bullish FVG intersecting upper boundary
if bullish_fvg
if open[1] <= orb_high and close[1] >= orb_high
bullish_intersection := true
// Bearish FVG intersecting lower boundary
if bearish_fvg
if open[1] >= orb_low and close[1] <= orb_low
bearish_intersection := true
// Calculate position size based on risk per trade
calculate_position_size(entry, stop, is_long) =>
risk_amount = strategy.equity * (risk_per_trade / 100)
price_diff = is_long ? entry - stop : stop - entry
position_size = risk_amount / price_diff
position_size
// Strategy execution - Modified for multiple positions
if bullish_intersection
position_counter += 1
entry_price = close
stop_loss_price = low[1]
risk = entry_price - stop_loss_price
take_profit_price = entry_price + (risk * risk_reward_ratio)
// Calculate position size
qty = calculate_position_size(entry_price, stop_loss_price, true)
// Create unique entry ID
entry_id = "Long_" + str.tostring(position_counter)
exit_id = "LongExit_" + str.tostring(position_counter)
// Enter long position
strategy.entry(entry_id, strategy.long, qty=qty)
// Set stop loss and take profit
if use_stop_loss
strategy.exit(exit_id, entry_id, stop=stop_loss_price, limit=use_take_profit ? take_profit_price : na)
if bearish_intersection
position_counter += 1
entry_price = close
stop_loss_price = high[1]
risk = stop_loss_price - entry_price
take_profit_price = entry_price - (risk * risk_reward_ratio)
// Calculate position size
qty = calculate_position_size(entry_price, stop_loss_price, false)
// Create unique entry ID
entry_id = "Short_" + str.tostring(position_counter)
exit_id = "ShortExit_" + str.tostring(position_counter)
// Enter short position
strategy.entry(entry_id, strategy.short, qty=qty)
// Set stop loss and take profit
if use_stop_loss
strategy.exit(exit_id, entry_id, stop=stop_loss_price, limit=use_take_profit ? take_profit_price : na)
// Close all positions at end of trading session
if not is_trading_session() and strategy.position_size != 0
strategy.close_all("End of Trading Session")
// Plot ORB levels
plot(show_orb and orb_set ? orb_high : na, "ORB High", color=orb_high_color, linewidth=2, style=plot.style_line)
plot(show_orb and orb_set ? orb_low : na, "ORB Low", color=orb_low_color, linewidth=2, style=plot.style_line)
// Plot intersection signals
plotshape(series=show_signals and bullish_intersection, title="Bullish FVG Intersection", style=shape.triangleup, location=location.belowbar, color=bullish_signal_color, size=size.normal)
plotshape(series=show_signals and bearish_intersection, title="Bearish FVG Intersection", style=shape.triangledown, location=location.abovebar, color=bearish_signal_color, size=size.normal)
// Background highlights for different session periods
bgcolor(is_orb_period() ? color.new(color.yellow, 90) : na, title="ORB Period")
bgcolor(is_signal_period() and orb_set ? color.new(color.blue, 95) : na, title="Signal Period")
bgcolor(is_trading_session() and not is_signal_period() and not is_orb_period() ? color.new(color.gray, 98) : na, title="Trading Session")
// Plot session boundaries
plot(is_trading_session() ? high : na, "Session High", color=color.new(color.orange, 80), linewidth=1)
plot(is_trading_session() ? low : na, "Session Low", color=color.new(color.orange, 80), linewidth=1)