高頻度ダイナミックオープンレンジブレイクスルー取引戦略

ORB RANGE BREAKOUT HFT EST OHLC SL TP
作成日: 2025-02-21 14:02:59 最終変更日: 2025-02-21 14:02:59
コピー: 2 クリック数: 519
2
フォロー
319
フォロワー

高頻度ダイナミックオープンレンジブレイクスルー取引戦略 高頻度ダイナミックオープンレンジブレイクスルー取引戦略

概要

この戦略は,開盤区間突破に基づく高周波取引システムで,取引日の午前9:30~9:45の間に形成される価格区間に焦点を当てている.この戦略は,価格が15分間の区間を突破するかどうかを観察することによって取引決定を行うが,ダイナミックな止損と利益の設定を組み合わせて,リスクと利益の最適な配合を実現する.システムには,異なる時間帯の市場特性に応じて選択的に取引できる取引日選機能も含まれている.

戦略原則

戦略の核心的な論理は,各取引日の開場後15分以内に ([9:30-9:45 EST]) 価格区間を確立し,この期間中の最高価格と最低価格を記録することです.区間が形成されると,戦略は当日の12時までに価格の突破を監視します.

  • 価格が区間を突破すると,オフラインを設定し,区間の0.5倍でストップを設定し,ストップを3倍に設定します.
  • 価格が区間を突破して下落すると,ポジションを空白,ストップ・ロズ,ストップ・ストップの設定原理は同じです. 戦略には,重複取引を防止する仕組み,一日1回の取引のみを確実に実行し,終了時にすべての保有物をクリアする仕組みが含まれています.

戦略的優位性

  1. 時間効率: 戦略は,開盤後の最も活発な取引時間に焦点を当て,早盤の大幅な波動の機会を捉える
  2. リスク制御:動的なストップ・ストップ設定を使用して,実際の波動幅に基づいてリスク管理パラメータを決定する
  3. 取引の柔軟性:特定の市場環境下での不利な取引日を回避するために,週ごとに取引日を選択する機能が提供されます.
  4. 明確な実行:取引信号が明確で,入場・出場条件が明確で,主観的な判断に影響されない
  5. 高い自動化度:全過程の自動化により,人間の介入による感情的影響が軽減される

戦略リスク

  1. 偽突破のリスク:開盤区間の形成後の最初の突破は偽突破となり,ストップ・ローズ出場を引き起こす
  2. 時間の衰退: 戦略は午前中に取引するだけで,他の時間帯の良い機会を逃す可能性があります
  3. 波動依存性:市場の波動が少ない日,戦略は十分な利潤の余地を得ることが困難である
  4. スライドポイント影響:高周波取引戦略として,実行過程で大きなスライドポイント損失に直面する可能性があります.
  5. 市場環境依存:戦略のパフォーマンスは,全体的な市場環境によって大きく影響される可能性があります.

戦略最適化の方向性

  1. 交差量指標の導入:突破時の交差量を観察することで偽突破信号をフィルターすることができる
  2. ダイナミックな取引時間調整:異なる品種のアクティブ期特性を考慮して取引時間ウィンドウを最適化
  3. トレンドフィルターを増やす: より大きな時間帯のトレンド判断と組み合わせて,取引方向の正確性を向上させる
  4. 停止距離の設定を最適化: 動的なATR指標を使用して停止距離を設定することを考慮する
  5. 波動率のフィルターを追加: 取引開始前に波動率のレベルを評価し,当日の取引を実行するかどうかを決定します.

要約する

これは,合理的で論理的に厳格な開場区間の突破戦略を設計し,市場が最も活発な時間に焦点を当てて取引機会を捕捉する戦略である.この戦略の優点は,明確な取引論理と完善したリスク管理機構にあるが,偽突破や市場環境依存などの潜在的リスクにも注意する必要がある.この戦略は,継続的な最適化と改善により,実際の取引で安定した収益を期待する.

ストラテジーソースコード
/*backtest
start: 2025-01-21 00:00:00
end: 2025-01-24 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"DOGE_USDT"}]
args: [["MaxCacheLen",580,358374]]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © UKFLIPS69

//@version=6
strategy("ORB", overlay=true, fill_orders_on_standard_ohlc = true)

trade_on_monday = input(false, "Trade on Monday") 
trade_on_tuesday = input(true, "Trade on Tuesday") 
trade_on_wednesday = input(true, "Trade on Wednesday")
trade_on_thursday = input(false, "Trade on Thursday")
trade_on_friday = input(true, "Trade on Friday")
// Get the current day of the week (1=Monday, ..., 6=Saturday, 0=Sunday)
current_day = dayofweek(time) 
current_price = request.security(syminfo.tickerid, "1", close)
// Define trading condition based on the day of the week
is_trading_day = (trade_on_monday and current_day == dayofweek.monday) or
                 (trade_on_tuesday and current_day == dayofweek.tuesday) or
                 (trade_on_wednesday and current_day == dayofweek.wednesday) or
                 (trade_on_thursday and current_day == dayofweek.thursday) or
                 (trade_on_friday and current_day == dayofweek.friday)
// ─── Persistent variables ─────────────────────────
var line  orHighLine       = na   // reference to the drawn line for the OR high
var line  orLowLine        = na   // reference to the drawn line for the OR low
var float orHigh           = na   // stores the open-range high
var float orLow            = na   // stores the open-range low
var int   barIndex930      = na   // remember the bar_index at 9:30
var bool  rangeEstablished = false
var bool  tradeTakenToday  = false  // track if we've opened a trade for the day

// ─── Detect times ────────────────────────────────
is930  = (hour(time, "America/New_York") == 9 and minute(time, "America/New_York") == 30)
is945  = (hour(time, "America/New_York") == 9 and minute(time, "America/New_York") == 45)

// Between 9:30 and 9:44 (inclusive of 9:30 bar, exclusive of 9:45)?
inSession = (hour(time, "America/New_York") == 9 and minute(time, "America/New_York") >= 30 and minute(time, "America/New_York") < 45)

// ─── Reset each day at 9:30 ─────────────────────
if is930
    // Reset orHigh / orLow
    orHigh := na
    orLow  := na
    rangeEstablished := false
    tradeTakenToday  := false
    // Record the bar_index for 9:30
    barIndex930 := bar_index
// ─── ONLY FORM OR / TRADE IF TODAY IS ALLOWED ─────────────────────
if is_trading_day
// ─── Accumulate the OR high/low from 9:30 to 9:44 ─
    if inSession
        orHigh := na(orHigh) ? high : math.max(orHigh, high)
        orLow  := na(orLow)  ? low  : math.min(orLow, low)

// ─── Exactly at 9:45, draw the lines & lock range ─
    if is945 and not na(orHigh) and not na(orLow)

    // Mark that the OR is established
        rangeEstablished := true

// ─── TRADING LOGIC AFTER 9:45, but BEFORE NOON, and if NO trade taken ─
    if rangeEstablished and not na(orHigh) and not na(orLow) 
    // Only trade if it's still BEFORE 12:00 (noon) EST and we haven't taken a trade today
        if hour(time, "America/New_York") < 12 and (not tradeTakenToday)
        // 1) Compute distances for stops & targets
            float stopSize   = 0.5 * (orHigh - orLow)      // half the OR size
            float targetSize = 3 * stopSize      // 3x the stop => 1.5x the entire OR
    
        // 2) Check if price breaks above OR => go long
            if close > orHigh 
            // Only enter a new long if not already in a long position (optional)
                if strategy.position_size <= 0
                    strategy.entry("ORB Long", strategy.long)
                    strategy.exit("Long Exit", from_entry = "ORB Long", stop = orHigh - stopSize, limit  = strategy.position_avg_price + targetSize)
                // Flag that we've taken a trade today
                    tradeTakenToday := true
    
        // 3) Check if price breaks below OR => go short
            if close < orLow 
            // Only enter a new short if not already in a short position (optional)
                if strategy.position_size >= 0
                    strategy.entry("ORB Short", strategy.short)
                    strategy.exit("Short Exit", from_entry = "ORB Short", stop = orLow + stopSize, limit  = strategy.position_avg_price - targetSize)
                // Flag that we've taken a trade today
                    tradeTakenToday := true
if hour(time, "America/New_York") == 16 and minute(time, "America/New_York") == 0
    strategy.close_all()