개장 범위 돌파 전략과 공정가치 갭 전략의 결합

ORB FVG SMC RRR ATR VWAP RSI TZ
생성 날짜: 2025-06-26 09:24:20 마지막으로 수정됨: 2025-06-26 09:24:20
복사: 1 클릭수: 359
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

개장 범위 돌파 전략과 공정가치 갭 전략의 결합 개장 범위 돌파 전략과 공정가치 갭 전략의 결합

개요

오픈 간격 돌파구와 공정 가치 격차 결합 전략은 오픈 간격 돌파구 (ORB) 와 스마트 펀드 개념 (SMC) 의 공정 가치 격차 (FVG) 를 결합한 양적 거래 전략이다. 이 전략은 우선 거래일 초반의 가격 범위를 정의하고 (일반적으로 오픈 후 5 분), 그리고 거래 신호로 가격이 이 간격 경계와 공정 가치 격차를 교차하는 상황을 찾는다. 이 전략은 특정 시간 동안의 일간 거래, 특히 미국 시장의 일반적인 거래 시점에 적용되며, 위험 관리 메커니즘을 통해 각 거래의 위험 격차를 제어한다.

전략 원칙

이 전략의 핵심 원칙은 두 가지 핵심 기술 분석 개념에 기반합니다.

  1. 오프라인 뚫음 (ORB)- 전략은 우선 거래일 개시 후 특정 시간 동안의 최고 가격과 최저 가격을 결정하여 가격 범위를 형성합니다. 이 범주는 시장 참가자가 당일 가격 움직임에 대한 초기 판단으로 간주되며, 이 범위를 돌파하면 단기 경향의 형성이 발생할 수 있습니다.

  2. 공정 가치 격차 (FVG)- 스마트 펀드 개념 (SMC) 의 분석 방법에서, 현재 하위점은 이전 하위점보다 낮을 때 시선 FVG가 형성되고, 현재 하위점은 이전 하위점보다 높을 때 시선 FVG가 형성된다. 이러한 격차는 미래의 가격으로 보충 될 수있는 지역으로 간주되며, 시장 구조의 불균형을 나타냅니다.

전략의 거래 신호는 다음과 같은 조건에서 생성됩니다.

  • 보 FVG와 ORB 상부 경계가 교차할 때 ((전쪽 보의 개시값이 ORB 최고점보다 낮고, 닫기값은 ORB 최고점보다 높다), 다중 신호를 트리거
  • 하향 FVG가 ORB의 하위 경계와 교차할 때 (전쪽 의 오프닝 가격이 ORB의 하락점보다 높고, 오프닝 가격이 ORB의 하락점보다 낮습니다) 하락 신호가 발생

거래가 실행될 때, 전략은 위험 기반의 위치 관리 방법을 사용하며, 중지 거리에 따라 각 거래의 특정 위치 크기를 계산하여 각 거래의 위험 을 일관되게 보장합니다. 중지 손실은 여러 거래를하는 전날의 가장 낮은 지점이나 공백 거래를하는 전날의 가장 높은 지점으로 설정되며, 수익 목표는 미리 설정된 리스크 수익률을 기반으로합니다.

전략적 이점

  1. 다양한 기술 분석 방법- ORB와 FVG의 기술 분석 방법을 통합하여, 전략은 단일 지표에서 발생할 수있는 가짜 신호를 필터링하여 거래 신호의 품질을 향상시킬 수 있습니다.

  2. 명확한 거래 시간 프레임- 전략은 거래의 시간 범위를 명확하게 정의합니다. (신호 기간과 거래 기간) 이는 거래자가 시장에서 가장 활발하고 신호 품질이 가장 높은 시간에 집중하고, 활동성이 낮은 시간에 유효하지 않은 거래를 피하는 데 도움이됩니다.

  3. 리스크 기반 포지션 관리- 전략은 리스크 기반의 포지션 계산 방법을 사용하여 각 거래의 리스크가 계좌 총 자본의 일정한 비율을 차지하도록 보장합니다.

  4. 유연한 변수 구성- 전략은 거래 시간 설정, ORB 지속, 신호 기간 지속, 위험 비율 및 위험 수익률 등과 같은 여러 가지 조정 가능한 매개 변수를 제공하여 거래자가 다른 시장 및 개인 위험 선호도에 따라 최적화 할 수 있습니다.

  5. 시각적 도움말- 전략은 ORB 수평선, 거래 신호 표시, 다양한 거래 시기의 배경 고조, 실시간 통계 데이터 테이블을 포함한 풍부한 시각적 요소를 제공하여 거래자가 전략 수행을 모니터링하고 분석 할 수 있습니다.

  6. 다단계 관리를 지원- 전략적 설계는 동시에 여러 거래 포지션을 보유하는 것을 지원합니다 (피라미딩 파라미터를 통해 제어), 동일한 거래 날에 여러 거래 기회를 잡을 수 있도록 함으로써 자금 활용 효율성을 높입니다.

전략적 위험

  1. 특정 시장 의존성- 이 전략은 주로 미국 주식 시장의 정규 거래 시간을 위해 설계되었으며, 다른 시장이나 거래 시간에 효과가 좋지 않을 수 있습니다. 시장의 개장 특성과 변동 패턴이 크게 다르기 때문에 타겟 조정 매개 변수가 필요합니다.

  2. 매개변수 민감도- 전략 성능은 ORB 지속 시간, 신호 기간 길고 리스크 수익률과 같은 여러 핵심 매개 변수에 민감합니다. 잘못된 매개 변수 설정은 과도한 거래 또는 중요한 거래 기회를 놓칠 수 있습니다.

  3. 시장 상태 의존- 높은 변동성 또는 낮은 변동성 시장 환경에서 전략의 성능이 일관되지 않을 수 있습니다. 특히 낮은 변동성 시장에서 ORB 간격이 너무 좁아질 수 있으며, 이는 종종 거짓된 브레이크 신호를 유발합니다.

  4. 지점 손실 위험- 전략은 앞 줄의 높은/저한 지점을 중지 위치로 사용합니다. 빠른 시장에서 이것은 중지 위치가 너무 넓어 위험과 수익률을 낮추거나 너무 작은 포지션 크기를 초래할 수 있습니다.

  5. 역사적인 가격 패턴에 의존한다- 전략적 가정은 FVG 영역과 ORB 돌파구가 예측에 의미가 있지만, 시장의 효율성 향상이나 거래 환경의 변화는 이러한 모델의 효과를 약화시킬 수 있습니다.

  6. 기술 실행 위험- 실제 거래에서, 실제 거래 결과와 재검토 결과의 일관성에 영향을 미치는 슬라이드 포인트, 주문 실행 지연 등의 문제가 발생할 수 있습니다.

전략 최적화 방향

  1. 동적 ORB 지속 시간- 시장의 변동성에 따라 ORB의 지속 시간을 자동으로 조정하는 것이 고려 될 수 있습니다. 예를 들어, 가짜 돌파구를 피하기 위해 높은 변동성 시장 환경에서 더 긴 ORB 시간을 사용하거나, 낮은 변동성 환경에서 더 많은 거래 기회를 잡기 위해 ORB 시간을 단축합니다.

  2. 필터링 조건을 추가- 추가 필터링 조건을 도입하여 신호 품질을 향상시킵니다. 예를 들어, 전체 시장 추세 방향과 결합하여 ((상향 추세에서만 더 많이하고, 하향 추세에서 빈) 또는 거래량 확인을 추가하여 ((파괴가 거래량 증가와 함께 거래 할 때만 거래하십시오))

  3. 절감 위치 최적화- ATR 또는 변동률에 기반한 동적 중지 손실 설정을 사용하여 이전 높고 낮은 지점에 기반한 고정 중지 방법을 대체하는 것을 고려하여 더 합리적인 위험 관리를 제공 할 수 있습니다.

  4. 일부 수익 메커니즘을 추가- 분기 수익 전략을 실행하십시오. 예를 들어, 1:1 리스크-비용 비율이 달성되면 일부 포지션을 청산하고 나머지 부분은 수익을 추적하는 스톱 손실 또는 더 먼 수익 목표를 설정하여 수익을 고정하고 트렌드를 추적하는 요구를 균형을 잡습니다.

  5. 시간 필터- 시간 필터를 추가하여 점심시간의 낮은 변동이나 중요한 경제 데이터가 발표되기 전과 후의 높은 변동과 같은 알려진 낮은 품질의 거래 시간을 피하십시오.

  6. 적응성 변수를 추가합니다.- 적응 변수를 도입하여 전략이 최근 시장 성과에 따라 자동으로 조정할 수 있도록합니다. 예를 들어, 위험 수익률을 동적으로 조정하거나 최근 승률에 따라 위험 비율을 조정합니다.

요약하다

오픈 간격 돌파구와 공정 가치 격차 결합 전략은 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)