
この戦略は,開盤区間突破に基づく高周波取引システムで,取引日の午前9:30~9:45の間に形成される価格区間に焦点を当てている.この戦略は,価格が15分間の区間を突破するかどうかを観察することによって取引決定を行うが,ダイナミックな止損と利益の設定を組み合わせて,リスクと利益の最適な配合を実現する.システムには,異なる時間帯の市場特性に応じて選択的に取引できる取引日選機能も含まれている.
戦略の核心的な論理は,各取引日の開場後15分以内に ([9:30-9:45 EST]) 価格区間を確立し,この期間中の最高価格と最低価格を記録することです.区間が形成されると,戦略は当日の12時までに価格の突破を監視します.
これは,合理的で論理的に厳格な開場区間の突破戦略を設計し,市場が最も活発な時間に焦点を当てて取引機会を捕捉する戦略である.この戦略の優点は,明確な取引論理と完善したリスク管理機構にあるが,偽突破や市場環境依存などの潜在的リスクにも注意する必要がある.この戦略は,継続的な最適化と改善により,実際の取引で安定した収益を期待する.
/*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()