
오픈 간격 돌파구와 공정 가치 격차 결합 전략은 오픈 간격 돌파구 (ORB) 와 스마트 펀드 개념 (SMC) 의 공정 가치 격차 (FVG) 를 결합한 양적 거래 전략이다. 이 전략은 우선 거래일 초반의 가격 범위를 정의하고 (일반적으로 오픈 후 5 분), 그리고 거래 신호로 가격이 이 간격 경계와 공정 가치 격차를 교차하는 상황을 찾는다. 이 전략은 특정 시간 동안의 일간 거래, 특히 미국 시장의 일반적인 거래 시점에 적용되며, 위험 관리 메커니즘을 통해 각 거래의 위험 격차를 제어한다.
이 전략의 핵심 원칙은 두 가지 핵심 기술 분석 개념에 기반합니다.
오프라인 뚫음 (ORB)- 전략은 우선 거래일 개시 후 특정 시간 동안의 최고 가격과 최저 가격을 결정하여 가격 범위를 형성합니다. 이 범주는 시장 참가자가 당일 가격 움직임에 대한 초기 판단으로 간주되며, 이 범위를 돌파하면 단기 경향의 형성이 발생할 수 있습니다.
공정 가치 격차 (FVG)- 스마트 펀드 개념 (SMC) 의 분석 방법에서, 현재 하위점은 이전 하위점보다 낮을 때 시선 FVG가 형성되고, 현재 하위점은 이전 하위점보다 높을 때 시선 FVG가 형성된다. 이러한 격차는 미래의 가격으로 보충 될 수있는 지역으로 간주되며, 시장 구조의 불균형을 나타냅니다.
전략의 거래 신호는 다음과 같은 조건에서 생성됩니다.
거래가 실행될 때, 전략은 위험 기반의 위치 관리 방법을 사용하며, 중지 거리에 따라 각 거래의 특정 위치 크기를 계산하여 각 거래의 위험 을 일관되게 보장합니다. 중지 손실은 여러 거래를하는 전날의 가장 낮은 지점이나 공백 거래를하는 전날의 가장 높은 지점으로 설정되며, 수익 목표는 미리 설정된 리스크 수익률을 기반으로합니다.
다양한 기술 분석 방법- ORB와 FVG의 기술 분석 방법을 통합하여, 전략은 단일 지표에서 발생할 수있는 가짜 신호를 필터링하여 거래 신호의 품질을 향상시킬 수 있습니다.
명확한 거래 시간 프레임- 전략은 거래의 시간 범위를 명확하게 정의합니다. (신호 기간과 거래 기간) 이는 거래자가 시장에서 가장 활발하고 신호 품질이 가장 높은 시간에 집중하고, 활동성이 낮은 시간에 유효하지 않은 거래를 피하는 데 도움이됩니다.
리스크 기반 포지션 관리- 전략은 리스크 기반의 포지션 계산 방법을 사용하여 각 거래의 리스크가 계좌 총 자본의 일정한 비율을 차지하도록 보장합니다.
유연한 변수 구성- 전략은 거래 시간 설정, ORB 지속, 신호 기간 지속, 위험 비율 및 위험 수익률 등과 같은 여러 가지 조정 가능한 매개 변수를 제공하여 거래자가 다른 시장 및 개인 위험 선호도에 따라 최적화 할 수 있습니다.
시각적 도움말- 전략은 ORB 수평선, 거래 신호 표시, 다양한 거래 시기의 배경 고조, 실시간 통계 데이터 테이블을 포함한 풍부한 시각적 요소를 제공하여 거래자가 전략 수행을 모니터링하고 분석 할 수 있습니다.
다단계 관리를 지원- 전략적 설계는 동시에 여러 거래 포지션을 보유하는 것을 지원합니다 (피라미딩 파라미터를 통해 제어), 동일한 거래 날에 여러 거래 기회를 잡을 수 있도록 함으로써 자금 활용 효율성을 높입니다.
특정 시장 의존성- 이 전략은 주로 미국 주식 시장의 정규 거래 시간을 위해 설계되었으며, 다른 시장이나 거래 시간에 효과가 좋지 않을 수 있습니다. 시장의 개장 특성과 변동 패턴이 크게 다르기 때문에 타겟 조정 매개 변수가 필요합니다.
매개변수 민감도- 전략 성능은 ORB 지속 시간, 신호 기간 길고 리스크 수익률과 같은 여러 핵심 매개 변수에 민감합니다. 잘못된 매개 변수 설정은 과도한 거래 또는 중요한 거래 기회를 놓칠 수 있습니다.
시장 상태 의존- 높은 변동성 또는 낮은 변동성 시장 환경에서 전략의 성능이 일관되지 않을 수 있습니다. 특히 낮은 변동성 시장에서 ORB 간격이 너무 좁아질 수 있으며, 이는 종종 거짓된 브레이크 신호를 유발합니다.
지점 손실 위험- 전략은 앞 줄의 높은/저한 지점을 중지 위치로 사용합니다. 빠른 시장에서 이것은 중지 위치가 너무 넓어 위험과 수익률을 낮추거나 너무 작은 포지션 크기를 초래할 수 있습니다.
역사적인 가격 패턴에 의존한다- 전략적 가정은 FVG 영역과 ORB 돌파구가 예측에 의미가 있지만, 시장의 효율성 향상이나 거래 환경의 변화는 이러한 모델의 효과를 약화시킬 수 있습니다.
기술 실행 위험- 실제 거래에서, 실제 거래 결과와 재검토 결과의 일관성에 영향을 미치는 슬라이드 포인트, 주문 실행 지연 등의 문제가 발생할 수 있습니다.
동적 ORB 지속 시간- 시장의 변동성에 따라 ORB의 지속 시간을 자동으로 조정하는 것이 고려 될 수 있습니다. 예를 들어, 가짜 돌파구를 피하기 위해 높은 변동성 시장 환경에서 더 긴 ORB 시간을 사용하거나, 낮은 변동성 환경에서 더 많은 거래 기회를 잡기 위해 ORB 시간을 단축합니다.
필터링 조건을 추가- 추가 필터링 조건을 도입하여 신호 품질을 향상시킵니다. 예를 들어, 전체 시장 추세 방향과 결합하여 ((상향 추세에서만 더 많이하고, 하향 추세에서 빈) 또는 거래량 확인을 추가하여 ((파괴가 거래량 증가와 함께 거래 할 때만 거래하십시오))
절감 위치 최적화- ATR 또는 변동률에 기반한 동적 중지 손실 설정을 사용하여 이전 높고 낮은 지점에 기반한 고정 중지 방법을 대체하는 것을 고려하여 더 합리적인 위험 관리를 제공 할 수 있습니다.
일부 수익 메커니즘을 추가- 분기 수익 전략을 실행하십시오. 예를 들어, 1:1 리스크-비용 비율이 달성되면 일부 포지션을 청산하고 나머지 부분은 수익을 추적하는 스톱 손실 또는 더 먼 수익 목표를 설정하여 수익을 고정하고 트렌드를 추적하는 요구를 균형을 잡습니다.
시간 필터- 시간 필터를 추가하여 점심시간의 낮은 변동이나 중요한 경제 데이터가 발표되기 전과 후의 높은 변동과 같은 알려진 낮은 품질의 거래 시간을 피하십시오.
적응성 변수를 추가합니다.- 적응 변수를 도입하여 전략이 최근 시장 성과에 따라 자동으로 조정할 수 있도록합니다. 예를 들어, 위험 수익률을 동적으로 조정하거나 최근 승률에 따라 위험 비율을 조정합니다.
오픈 간격 돌파구와 공정 가치 격차 결합 전략은 ORB와 FVG의 두 가지 기술 분석 방법을 결합하여 높은 확률의 거래 기회를 찾기 위해 정교하게 설계된 일일 거래 시스템입니다. 이 전략은 명확하게 정의된 거래 시간 내에 작동하며, 위험 기반의 위치 관리 방법을 적용하며, 풍부한 시각화 및 통계 도구를 제공하여 거래 결정을 지원합니다.
전략의 주요 장점은 명확한 거래 논리, 유연한 매개 변수 설정 및 포괄적 인 위험 관리 장치에 있습니다. 그러나 전략은 시장 의존성, 매개 변수 민감성 및 시장 상태 의존성 등의 위험에 직면합니다. 전략의 안정성을 높이기 위해, 동적 매개 변수 조정, 필터 조건의 추가, 스탠드 로스 방법의 최적화 및 분기 수익 메커니즘의 구현과 같은 최적화 방향을 고려하는 것이 좋습니다.
주의해야 할 점은 이 전략이 모든 시장 환경과 모든 거래 유형에 적용되는 것은 아니라는 점입니다. 거래자는 전략이 자신의 위험 선호도와 거래 목표에 부합하는지 확인하기 위해 실제 적용하기 전에 충분한 역검사 및 전향 테스트를 수행해야합니다. 지속적인 최적화와 시장 변화에 대한 적응을 통해 이 전략은 일일 거래자의 도구 상에서 효과적인 도구가 될 잠재력을 가지고 있습니다.
/*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)