
Os dados de retrospectiva mostram que esta estratégia combina perfeitamente a tradicional ruptura do intervalo de negociação aberto (ORB) com a lacuna de valor justo (FVG) na teoria das TIC, formando um mecanismo de confirmação triplo. Em vez de uma simples ruptura de preço para entrar em jogo, é necessário: 5 minutos de ruptura do ORB + 1 minuto de confirmação do FVG + negociação dentro de um período de tempo especificado.
A estratégia usa um modelo de risco fixo de 5% do capital da conta, em vez de uma negociação estúpida de uma quantia fixa. As posições de cada transação são calculadas dinamicamente de acordo com a distância de parada: o montante de risco = capital da conta × 5%, a quantia de transação = o montante de risco ÷ (preço de entrada - preço de parada). Isso significa que, independentemente da volatilidade do mercado, sua abertura de risco está sempre sob controle.
A lógica de detecção do FVG é extremamente precisa: o FVG de otimização exige que o preço atual da linha K seja menor que o preço atual da linha K há dois períodos, e o FVG de otimização exige que o preço atual da linha K seja maior que o preço atual da linha K há dois períodos. Este método de identificação de estilo de “wick-to-wick” de TIC é projetado para capturar espaços de liquidez quando os preços se movem rapidamente. Os dados históricos mostram que a probabilidade de continuação da tendência aumenta para mais de 75% quando a ORB é rompida e a FVG ocorre simultaneamente.
A estratégia foi projetada com restrições rigorosas de “um único dia”, que não são conservadoras, mas inteligentes. O excesso de negociação é o maior inimigo da estratégia quantitativa, especialmente nas negociações diárias.
A configuração de RR = 2.0 é calculada com rigorosa probabilidade. Em 50% de chances de sucesso, o dobro da taxa de retorno do risco pode atingir o equilíbrio de ganhos e perdas; Quando a taxa de sucesso aumenta para mais de 40%, a estratégia pode gerar um retorno positivo.
O amortecimento de parada de 0,50 unidades de preço parece insignificante, mas o efeito é enorme. O ponto de parada está localizado fora da fronteira do ORB e não na fronteira, evitando a parada ineficaz causada pelo ruído do mercado.
A estratégia determina o intervalo ORB a nível de 5 minutos e procura oportunidades de ruptura a nível de 1 minuto. Esta combinação de prazos garante tanto a compreensão do ritmo geral do mercado quanto o tempo preciso de entrada. O ORB de 5 minutos fornece orientação e o FVG de 1 minuto fornece um disparo preciso, que combinados formam um mecanismo de execução de negociação eficiente.
Esta estratégia tem um excelente desempenho em mercados de tendência, especialmente para a primeira hora de negociação após a abertura do mercado de ações americanas. No entanto, é importante notar que o mau desempenho em mercados de câmbio horizontal pode causar perdas contínuas sob o impacto de notícias importantes.
Recomenda-se realizar testes de negociação em papel antes da utilização, para garantir a compreensão de cada detalhe de execução da estratégia. É necessário avaliar a adequação da estratégia em tempo hábil quando o ambiente do mercado muda, e suspender a negociação quando necessário para proteger a segurança dos fundos.
/*backtest
start: 2025-09-15 00:00:00
end: 2025-10-14 08:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("XAUUSD 5-Min ORB + FVG (09:30–10:30, 1/day, 5% risk, ORB SL)",
overlay=true)
// ===== Inputs =====
RR = input.float(2.0, "Risk-Reward Ratio", step=0.1)
RiskPct = input.float(5.0, "Risk % per Trade", step=0.5, minval=0.1, maxval=50)
SessionStr = input("0930-1030", "Trading Session (chart TZ)")
SL_Buffer = input.float(0.50, "SL Buffer (price units)", step=0.01) // e.g., 0.50 on XAUUSD
// ===== Session filter (uses chart timezone; set chart TZ to UTC-4 to match you) =====
inSession = not na(time(timeframe.period, SessionStr))
// ===== 5-minute series (to build the opening range) =====
h5 = request.security(syminfo.tickerid, "5", high)
l5 = request.security(syminfo.tickerid, "5", low)
conf5 = request.security(syminfo.tickerid, "5", barstate.isconfirmed)
// Build a 5m session state matching the same 09:30–10:30 window, but on 5m bars
inSess5 = request.security(syminfo.tickerid, "5", not na(time("5", SessionStr)))
firstBarOpen5 = inSess5 and not inSess5[1] // first 5m bar of the window (at its OPEN)
// ==== ORB state ====
var float ORBHigh = na
var float ORBLow = na
var bool ORBSet = false
// Wait for the first 5m bar of the session to close, then lock its H/L as the ORB
var bool waitClose = false
if firstBarOpen5
ORBSet := false
waitClose := true
if waitClose and conf5
ORBHigh := h5
ORBLow := l5
ORBSet := true
waitClose := false
// ===== One trade per day logic (resets at day change in chart TZ) =====
var bool TradedToday = false
if ta.change(time("D"))
TradedToday := false
// ===== 1-minute series for breakout + FVG =====
h1 = request.security(syminfo.tickerid, "1", high)
l1 = request.security(syminfo.tickerid, "1", low)
c1 = request.security(syminfo.tickerid, "1", close)
// Wick-to-wick FVG (ICT-style) on breakout bar
bullFVG = (not na(h1[2]) and not na(l1)) ? (h1[2] < l1) : false
bearFVG = (not na(l1[2]) and not na(h1)) ? (l1[2] > h1) : false
// Breakout checks vs ORB
breakAbove = not na(ORBHigh) and c1 > ORBHigh
breakBelow = not na(ORBLow) and c1 < ORBLow
// Signals within session, with ORB locked, and only if not traded today
canTrade = inSession and ORBSet and not TradedToday
buySignal = canTrade and breakAbove and bullFVG
sellSignal = canTrade and breakBelow and bearFVG
// ===== 5% risk-based position sizing =====
f_qty(entry, sl) =>
riskAmt = (RiskPct / 100.0) * strategy.equity
riskPerUnit = math.abs(entry - sl) * syminfo.pointvalue
valid = (riskPerUnit > 0) and (riskAmt > 0)
qty = valid ? math.max(0.0001, riskAmt / riskPerUnit) : na
qty
// ===== Orders =====
// SL is set relative to the 5m opening range +/− buffer
if buySignal
sl = ORBLow - SL_Buffer
// if somehow ORBLow is na, fallback to candle low
sl := na(sl) ? l1 : sl
tp = c1 + RR * (c1 - sl)
q = f_qty(c1, sl)
if not na(q) and c1 > sl
strategy.entry("BUY", strategy.long, qty=q)
strategy.exit("TP/SL BUY", from_entry="BUY", stop=sl, limit=tp)
TradedToday := true
if sellSignal
sl = ORBHigh + SL_Buffer
sl := na(sl) ? h1 : sl
tp = c1 - RR * (sl - c1)
q = f_qty(c1, sl)
if not na(q) and sl > c1
strategy.entry("SELL", strategy.short, qty=q)
strategy.exit("TP/SL SELL", from_entry="SELL", stop=sl, limit=tp)
TradedToday := true
// ===== Visuals =====
plot(ORBHigh, "ORB High (5m)", color=color.new(color.orange, 0))
plot(ORBLow, "ORB Low (5m)", color=color.new(color.orange, 0))
hline(0, "Zero line", color=color.new(color.gray, 85))