オープニングレンジの突破と公正価値ギャップ戦略の組み合わせ

ORB FVG SMC RRR ATR VWAP RSI TZ
作成日: 2025-06-26 09:24:20 最終変更日: 2025-06-26 09:24:20
コピー: 1 クリック数: 359
2
フォロー
319
フォロワー

オープニングレンジの突破と公正価値ギャップ戦略の組み合わせ オープニングレンジの突破と公正価値ギャップ戦略の組み合わせ

概要

オープニング区間突破と公平価値ギャップを組み合わせる戦略は,オープニング区間突破 (ORB) とスマートファンドコンセプト (SMC) の公平価値ギャップ (FVG) を組み合わせた量化取引戦略である.この戦略は,取引日の初期に価格区間 (通常は開封後5分) を定義し,その区間境界を突破する際に価格が公平価値ギャップと交差する状況を取引信号として探す.この戦略は,特定の時間帯の間の日内取引,特に米国市場の通常の取引時間に適用され,リスク管理メカニズムによって各取引のリスクギャップを制御するように設計されている.

戦略原則

この戦略の核心となる原則は,技術分析の2つの重要な概念に基づいています.

  1. オープン区間突破 (ORB)- 戦略は,取引日の開場後,特定の時間帯 (デフォルト5分) 内の最高価格と最低価格を最初に決定し,価格区画を形成します. この区画は,市場の参加者が当日の価格動きに関する初等判断として見られ,この区画を破ることは,短期トレンドの形成を予兆にすることができます.

  2. 公平価値のギャップ (FVG)SMCの分析方法から,現在の高さが前回の低さより低いとき,看板FVGが形成され,現在の低さが前回の高さより高いとき,下落FVGが形成される.これらのギャップは,価格が将来補償される可能性のある領域と考えられ,市場構造の不均衡を代表する.

戦略の取引シグナルは次の条件によって発生します.

  • FVGとORB上の境界が交差するとき ((前の開盘はORB高点より低い,閉盘はORB高点より高い),多信号を触発する
  • 下落FVGがORBの下限と交差するとき (前の開値がORB低点より高く,閉値がORB低点より低い),空白信号を触発する

取引を実行する際には,戦略はリスクベースのポジション管理方法を採用し,ストップダスト距離に基づいて各取引の特定のポジションサイズを計算し,各取引のリスク口が一致することを保証する.ストップダストは,複数の取引を行う前の値の低点または空白取引を行う前の値の高点に設定され,利益の目標は,既定のリスクリターン比率に基づいて設定されます.

戦略的優位性

  1. 複数の技術分析方法の組み合わせ- ORBとFVGの2つの技術分析方法の統合により,戦略は,単一の指標によって発生する偽の信号をフィルターすることができ,取引信号の質を向上させます.

  2. 明確な取引時間枠- 戦略は取引の時間帯を明確に定義している (シグナル期と取引期) であり,市場が最も活発で信号の質が最も高い時間帯に集中し,低アクティビティの時間に無効取引を避けるのに役立ちます.

  3. リスクベースのポジション管理- 戦略はリスクに基づくポジション計算方法を採用し,各取引のリスクが口座の総資金に占める割合が一致することを保証します (デフォルトは1%),長期の資金管理とリスク管理に役立ちます.

  4. フレキシブルなパラメータ配置- 戦略は,取引時間設定,ORBの持続時間,シグナル期間の持続時間,リスク比率およびリスクリターン比率などの複数の可調パラメータを提供します.これは,トレーダーが異なる市場と個人リスクの好みに合わせて最適化できるようにします.

  5. ビジュアルアシスタント- 戦略は,ORB水平線,取引シグナル標識,異なる取引時間の背景の高輝度,リアルタイム統計データ表を含む豊富なビジュアル要素を提供し,トレーダーが戦略の実行を監視し分析することを容易にします.

  6. 複数の管理をサポートする- 戦略的設計は,複数の取引ポジションを同時に保持することをサポートします (pyramiding パラメータ制御により),同じ取引日中に複数の取引機会をキャプチャし,資金の利用効率を向上させます.

戦略リスク

  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の2つの技術分析方法を組み合わせて,高確率の取引機会を探すために,精密に設計された日内取引システムである.この戦略は,明確に定義された取引時間内に動作し,リスクベースのポジション管理方法を使用し,取引意思決定を支援する豊富な可視化と統計ツールを提供する.

戦略の主な優点は,明確な取引論理,柔軟なパラメータ設定,包括的なリスク管理メカニズムである.しかし,戦略は,市場依存性,パラメータ感受性,市場状態依存性などのリスクにも直面している.戦略の安定性を高めるために,ダイナミックパラメータの調整,フィルター条件の追加,ストップ・ロスの最適化,分割収益メカニズムの実施などの最適化方向を考慮することが推奨されている.

留意すべきは,この戦略はすべての市場環境およびすべての取引品種に適用されないことであり,トレーダーは,実際の適用の前に十分な反省と前向きなテストを行い,戦略が自身のリスク好みと取引目標に適合していることを確認する必要があります. 継続的な最適化と市場の変化に適応することによって,この戦略は,日内トレーダーのツールキットに有効なツールになる可能性があります.

ストラテジーソースコード
/*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)