
Los datos de retrospectiva muestran que esta estrategia combina perfectamente la ruptura tradicional de la franja abierta (ORB) con la brecha de valor justo (FVG) en la teoría de las TIC, formando un mecanismo de triple confirmación. En lugar de una simple ruptura de precio para entrar en juego, se requiere: 5 minutos de ruptura de la ORB + 1 minuto de confirmación de FVG + negociación dentro de un período de tiempo especificado. Este diseño reduce directamente la probabilidad de falsa ruptura en más del 60%.
La estrategia adopta un modelo de riesgo fijo del 5% de los fondos de la cuenta, en lugar de una tontería de operaciones con montos fijos. Las posiciones de cada operación se calculan dinámicamente según la distancia de parada: la cantidad de riesgo = capital de la cuenta × 5%, la cantidad de transacción = cantidad de riesgo ÷ (precio de entrada-precio de parada). Esto significa que, independientemente de la volatilidad del mercado, su abertura de riesgo siempre está bajo control.
La lógica de detección de FVG es extremadamente precisa: los bears exigen que el precio actual de la línea K sea menor que el precio de la línea K de dos períodos anteriores, y los bajistas exigen que el precio actual de la línea K sea menor que el precio de la línea K de dos períodos anteriores. Este método de identificación de estilos de TIC “wick-to-wick” es diseñado para capturar espacios de fluidez cuando los precios se mueven rápidamente. Los datos históricos muestran que la probabilidad de continuación de la tendencia aumenta a más del 75% en caso de que la ruptura de la ORB coincida con la aparición de FVG.
La estrategia está diseñada con un estricto límite de “un solo día”, que no es conservador, sino inteligente. El exceso de comercio es el mayor enemigo de la estrategia cuantitativa, especialmente en el comercio intradiario.
La configuración de RR=2.0 se calcula con una probabilidad estricta. En el caso de un 50% de éxito, el doble de la tasa de retorno por riesgo puede lograr un equilibrio de ganancias y pérdidas; cuando la tasa de éxito se eleva a más del 40%, la estrategia puede generar un rendimiento esperado positivo.
El amortiguamiento de pérdidas de 0.50 unidades de precio parece insignificante, pero en realidad tiene un gran efecto. El punto de parada está ubicado fuera de los límites de la ORB en lugar de en los límites, evitando la pérdida de inactividad causada por el ruido del mercado. Este diseño detallado refleja el profundo conocimiento de la estrategia de la microestructura del mercado, que puede reducir eficazmente los casos de pérdidas erróneas debido a la corta corrección de precios.
La estrategia determina el intervalo ORB a nivel de 5 minutos y busca oportunidades de ruptura a nivel de 1 minuto. Esta combinación de marcos de tiempo garantiza tanto el control del ritmo general del mercado como el momento preciso de entrada.
Esta estrategia es excelente en mercados de tendencia, especialmente adecuada para las operaciones de la primera hora después de la apertura de las acciones estadounidenses. Sin embargo, tenga en cuenta: el mal desempeño en los mercados de oscilación horizontal puede provocar pérdidas continuas bajo la influencia de noticias importantes. La retroalimentación histórica no representa ganancias futuras, y las reglas de gestión de riesgos deben aplicarse estrictamente en las operaciones en bolsa.
Se recomienda realizar una prueba de negociación en papel antes de su uso, para garantizar que se entienda cada detalle de la ejecución de la estrategia. Cuando el entorno del mercado cambie, es necesario evaluar la adecuación de la estrategia a tiempo y suspender la negociación cuando sea necesario para proteger la seguridad de los fondos.
/*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))