
ダイナミック価格区間の突破-撤回-反転多策略取引システムは,短線トレーダー向けに特別に設計された日内取引戦略であり,早朝の開場後最初の5分K線で形成される価格区間に基づいて操作する.この戦略は,3つの異なる入場モードを統合している:突破入場,落とし穴入場,反転入場,公正価値のギャップ (FVG) と価格区間の突破パターンを認識して取引する.この戦略は,米国株式市場の開場後最初の1時間 (FVG) の高波動性時間 (FVG) に焦点を当てている. 1分グラフで取引を行い,固定された2:1リスクリターン表を採用し,損失を抑えるよりも管理する.
この戦略の核心となる原理は,早盤の初期区間の形成後の価格の行動パターンに基づいている.具体的には,以下の3つのステップに分かれています.
標識区間 (午前9時30分):
取引開始後1時間以内に入場ポイントを検索する: この戦略は,以下の3つの異なる入学方法を提供しています.
ブレイクエントリー:
トラップ エントリー:
逆転エントリー (Reversal Entry):
取引管理:
戦略コードは,自動で取引区間を検知し,様々な入場条件を識別し,ストップ・ロスト・レベルを設定し,適切なポジションサイズを計算するなど,完全な論理的枠組みを実現している.システムには,特定の時間帯でのみ取引を確実にする時間フィルターも含まれており,異なる入場戦略を選択的に有効または無効にすることができます.
シンプルで明確なルール戦略規則は明確で直感的で,主観的な判断を必要とせず,感情が取引決定に影響を及ぼすのを減らす.コード内の条件論理と状態追跡は,規則の厳格な執行を保証する.
多様な入学方法の柔軟性: 3つの異なる入場戦略を提供する (ブレイク,トラップ,反転) により,トレーダーは異なる市場環境に適応できる.enableBreak、enableTrapそしてenableReversalこのパラメータは,この柔軟性を実現します.
高確率のタイミングを重視する: 戦略は,開設後最初の1時間以内に取引するだけで,この期間中に通常存在するより高い波動性と流動性を利用します.inWindow条件は,取引が9時30分から10時30分間にのみ実行されることを保証します.
リスク管理の厳しさ: 固定の2:1リスク/報酬比率と特定の価格行動に基づくストップ損失設定により,各取引に対する明確なリスク管理が提供されます.riskPctパラメータは,ユーザが自分のリスクの好みに応じて,各取引のリスクの割合を調整できるようにします.
複雑な指標は不要です戦略は複雑な技術指標に依存せず,純粋な価格行動と構造に基づいており,過度に適合するリスクを低減します.
季節的な回避: コードには,市場が不安定で流動性が低い時期を回避するために,休日ブラックリストを組み込みました.
柔軟なポジション管理システムでは,異なる資金管理ニーズに対応するために,リスクの割合または固定契約数に基づく2つのポジション管理方法を提供しています.
偽の突破の危険性: 市場には偽の突破が発生し,取引が引き出された後,価格が急速に反転する可能性があります. このリスクを緩和するために,策略は,トラップと反転入場モデルを統合していますが,慎重に監視する必要があります.
スペースの幅の問題:開盤後最初の5分間のK線区間が幅広くすぎたり,狭すぎたりすると,戦略の有効性に影響する可能性がある.幅が狭すぎると,頻繁にトリガー信号が発生し,幅広くすぎると,ストップポイントが遠すぎるとなるかもしれない.
時間の制限による機会コストしかし,この制限は,過度な取引を防ぐための規律でもある.
固定リスク報酬率の限界: 2:1のRRは一致性を提供しますが,特定の市場環境では最適ではないかもしれません. 強いトレンド市場では,より高いRRはより適しているかもしれません.
休日の市場異常策略は,12月15日から1月15日の間の取引を回避したものの,他の休日の前後の市場行動も異常であり,策略のパフォーマンスに影響を与える可能性があります.
FVGへの依存: 戦略は,突破と逆転のエントリーでFVGモデルに依存するが,特定の市場条件下では,FVGは容易に形成または識別できない.
単一の時間枠の限界1分間のグラフに完全に依存すると,戦略はより大きな時間枠における重要な市場構造を無視する可能性があります.
幅を調整する:市場変動の動向に応じて幅の幅を調整することを考えることができます.例えば,波動性の高い日により広い区間を使用し,波動性の低い日により狭い区間を使用します. これは,最近の平均実際の波動範囲 ((ATR) または同様の指標を計算することによって実現できます.
タイムウィンドウの最適化9:30-10:30に固定するのではなく,異なる市場の最適取引時間ウィンドウを研究することができます. いくつかの市場は,異なる時間帯でより顕著な区間突破パターンを示す可能性があります.
ダイナミックなリスク・リターン設定: 市場状況と波動的動態に応じてリスク・リターン比率を調整できます.例えば,トレンドが強いときの目標を増やし,市場を整頓するときに目標を下げます.
市場情緒指標を統合する: 市場幅度指数または波動性指数をフィルターとして加えることを検討し,市場環境が不利なときに取引を避ける.
複数時間枠確認: 実行取引は1分間のチャートに留まっているが,15分間のチャートや1時間間のチャートでのトレンド方向一致性チェックのような,より高い時間枠の確認条件を追加できます.
FVGの定義を最適化する:現在のFVGの定義は比較的単純で,より複雑な,またはより正確な不均衡領域の定義を考慮することができる.例えば,影線ではなく体を考えること.
トランザクション量確認: 入場条件に取引量確認を追加すると,特に突破入場の場合,信号の質が向上する可能性があります.
損失を食い止めるための適応: 市場変動の動向に合わせて,ストップレベルを調整することで,異なる市場環境における戦略の適応性を向上させることができる.
ダイナミックな価格区間のブレイク・リトール・リバース多策略取引システムは,明瞭で規則明快な1日間の取引戦略であり,早盤が形成された価格区間とそれに続くブレイク,トラップ,またはリバースパターンを識別して取引機会を探している.この戦略の主要な利点は,簡潔さと複数の入場方法の柔軟性であり,厳格な時間制限とリスク管理の原則は,取引規律を維持するのに役立ちます.
しかし,この戦略は,偽の突破,不適切な区間幅,特定の価格パターンへの依存などのリスクにも直面しています.区間設定の最適化方法,時間ウィンドウの調整,リスクと報酬の比率を動的に設定し,複数の時間枠分析を統合することで,戦略の安定性と適応性をさらに向上させることができます.
最終的には,この戦略は,ショートライントレーダーに体系的な枠組みを提供し,特に,毎日開業時に効率的な取引を望む投資家には適しています. すべての取引戦略と同様に,実際の適用の前に十分な反射と適切なリスク管理が行われなければなりません.
/*backtest
start: 2025-07-22 00:00:00
end: 2025-08-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":500000}]
*/
//@version=5
strategy("Three-Step 9:30 Range Scalping (Backtest)", overlay=true, calc_on_every_tick=false, process_orders_on_close=true,
initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0)
// -------------------- Inputs
enableBreak = input.bool(true, "Enable Break Entry")
enableTrap = input.bool(false, "Enable Trap Entry")
enableReversal = input.bool(true, "Enable Reversal Entry")
rr = input.float(2.0, "Take-Profit R Multiple", step=0.25, minval=0.25)
oneTradePerDay = input.bool(false, "One Trade Per Day")
showRange = input.bool(true, "Show 9:30 5m Range")
// Risk management
riskPct = input.float(1.0, "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=100.0)
sizeMode = input.string("Risk %", "Position Sizing Mode", options=["Risk %", "Fixed contracts"])
fixedContracts = input.int(1, "Fixed Contracts", minval=1)
// Optional: warn if not on 1-minute chart (execution timeframe per PRD)
onOneMinute = timeframe.isminutes and timeframe.multiplier == 1
// -------------------- Time helpers (chart is assumed New York time)
newDay = ta.change(time("D")) != 0
// Trade the first hour only: 9:30:00 to 10:29:59
inWindow = (hour == 9 and minute >= 30) or (hour == 10 and minute <= 29)
// Holiday blackout window: Do not trade Dec 15 – Jan 15
inBlackout = (month == 12 and dayofmonth >= 15) or (month == 1 and dayofmonth <= 15)
// -------------------- First 5-min range (use the actual 9:30 5m candle via security())
var float rangeHi = na
var float rangeLo = na
var bool haveRange = false
// -------------------- State for entries
var bool breakUpFound = false
var bool breakDownFound = false
var float initBreakUpLow = na // for Break/Trap long SL
var float initBreakDownHigh = na // for Break/Trap short SL
var bool trapUpRetestedInside = false
var bool trapDownRetestedInside = false
var bool tradedToday = false
// Reset daily state at midnight (chart timezone)
if newDay
rangeHi := na
rangeLo := na
haveRange := false
breakUpFound := false
breakDownFound := false
initBreakUpLow := na
initBreakDownHigh := na
trapUpRetestedInside := false
trapDownRetestedInside := false
tradedToday := false
// Pull the 5-minute bar that STARTS at 9:30 (value available on its close at 9:35)
sess0930Hi = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? high : na, barmerge.gaps_off, barmerge.lookahead_off)
sess0930Lo = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? low : na, barmerge.gaps_off, barmerge.lookahead_off)
// Lock the range when the 9:30 5m candle closes (value appears non-na exactly then)
if not haveRange and not na(sess0930Hi) and not na(sess0930Lo)
rangeHi := sess0930Hi
rangeLo := sess0930Lo
haveRange := true
// reset session-specific flags at start of trading window
breakUpFound := false
breakDownFound := false
initBreakUpLow := na
initBreakDownHigh := na
trapUpRetestedInside := false
trapDownRetestedInside := false
tradedToday := false
// -------------------- Visuals
plot(showRange and haveRange ? rangeHi : na, "Range High", color=color.new(color.teal, 0), style=plot.style_linebr, linewidth=2)
plot(showRange and haveRange ? rangeLo : na, "Range Low", color=color.new(color.orange, 0), style=plot.style_linebr, linewidth=2)
plotchar(not onOneMinute, title="Use 1-minute chart", char="⚠", location=location.top, color=color.new(color.red, 0), size=size.tiny)
plotchar(inBlackout, title="Holiday blackout (Dec 15–Jan 15)", char="⛔", location=location.top, color=color.new(color.red, 0), size=size.tiny)
// -------------------- Convenience conditions
closeAbove = haveRange and close > rangeHi
closeBelow = haveRange and close < rangeLo
closeInside = haveRange and close <= rangeHi and close >= rangeLo
// Track first body-close outside the range in each direction (initial break-close)
if haveRange and inWindow and not tradedToday
if not breakUpFound and closeAbove
breakUpFound := true
initBreakUpLow := low
trapUpRetestedInside := false
if not breakDownFound and closeBelow
breakDownFound := true
initBreakDownHigh := high
trapDownRetestedInside := false
// Trap retest flags (retest back inside after first break)
if haveRange and inWindow and not tradedToday
if breakUpFound and not trapUpRetestedInside and closeInside
trapUpRetestedInside := true
if breakDownFound and not trapDownRetestedInside and closeInside
trapDownRetestedInside := true
// -------------------- FVG detectors (three-candle imbalance)
// Simple wick-gap definition, preserved through the third candle
// Bullish: gap exists if Candle C low > Candle A high AND Candle B low > Candle A high
// Bearish: gap exists if Candle C high < Candle A low AND Candle B high < Candle A low
bullFVG = not na(high[2]) and (low[1] > high[2]) and (low > high[2])
bearFVG = not na(low[2]) and (high[1] < low[2]) and (high < low[2])
// -------------------- Entry gating
allowEntry = haveRange and inWindow and not inBlackout and strategy.position_size == 0 and (not oneTradePerDay or not tradedToday)
// Calculate contracts based on selected sizing mode
calcOrderQty(entryPrice, stopPrice) =>
qty = 0
if sizeMode == "Fixed contracts"
qty := fixedContracts
else
riskCash = strategy.equity * riskPct / 100.0
riskPerContract = math.abs(entryPrice - stopPrice) * syminfo.pointvalue
qty := riskPerContract > 0 ? math.floor(riskCash / riskPerContract) : 0
qty
// -------------------- BREAK Entries (needs FVG and ANY of the 3 bars closes outside)
if enableBreak and allowEntry
// Long BREAK
breakLongOk = bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)
if breakLongOk
// Stop at the FIRST candle that closed outside among the 3 FVG candles
float stopL = na
stopL := close[2] > rangeHi ? low[2] : stopL
stopL := na(stopL) and close[1] > rangeHi ? low[1] : stopL
stopL := na(stopL) and close > rangeHi ? low : stopL
entryL = close
if entryL > stopL
tpL = entryL + rr * (entryL - stopL)
qtyL = calcOrderQty(entryL, stopL)
if qtyL > 0
strategy.entry("LONG_BREAK", strategy.long, qty=qtyL)
strategy.exit("LONG_BREAK_TP/SL", from_entry="LONG_BREAK", stop=stopL, limit=tpL)
tradedToday := oneTradePerDay ? true : tradedToday
// Short BREAK
breakShortOk = bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)
if breakShortOk
// Stop at the FIRST candle that closed outside among the 3 FVG candles
float stopS = na
stopS := close[2] < rangeLo ? high[2] : stopS
stopS := na(stopS) and close[1] < rangeLo ? high[1] : stopS
stopS := na(stopS) and close < rangeLo ? high : stopS
entryS = close
if entryS < stopS
tpS = entryS - rr * (stopS - entryS)
qtyS = calcOrderQty(entryS, stopS)
if qtyS > 0
strategy.entry("SHORT_BREAK", strategy.short, qty=qtyS)
strategy.exit("SHORT_BREAK_TP/SL", from_entry="SHORT_BREAK", stop=stopS, limit=tpS)
tradedToday := oneTradePerDay ? true : tradedToday
// -------------------- TRAP Entries (Break → Retest inside → Reclose outside; FVG not required)
if enableTrap and allowEntry
// Long TRAP
if breakUpFound and trapUpRetestedInside and closeAbove
stopL = na(initBreakUpLow) ? low : initBreakUpLow
entryL = close
if entryL > stopL
tpL = entryL + rr * (entryL - stopL)
qtyL = calcOrderQty(entryL, stopL)
if qtyL > 0
strategy.entry("LONG_TRAP", strategy.long, qty=qtyL)
strategy.exit("LONG_TRAP_TP/SL", from_entry="LONG_TRAP", stop=stopL, limit=tpL)
tradedToday := oneTradePerDay ? true : tradedToday
// Short TRAP
if breakDownFound and trapDownRetestedInside and closeBelow
stopS = na(initBreakDownHigh) ? high : initBreakDownHigh
entryS = close
if entryS < stopS
tpS = entryS - rr * (stopS - entryS)
qtyS = calcOrderQty(entryS, stopS)
if qtyS > 0
strategy.entry("SHORT_TRAP", strategy.short, qty=qtyS)
strategy.exit("SHORT_TRAP_TP/SL", from_entry="SHORT_TRAP", stop=stopS, limit=tpS)
tradedToday := oneTradePerDay ? true : tradedToday
// -------------------- REVERSAL Entries (Failed break + opposite FVG back into range)
if enableReversal and allowEntry
// After bearish break, bullish FVG back into range → LONG
if breakDownFound and bullFVG and closeInside
stopL = low[2] // first candle of the FVG
entryL = close
if entryL > stopL
tpL = entryL + rr * (entryL - stopL)
qtyL = calcOrderQty(entryL, stopL)
if qtyL > 0
strategy.entry("LONG_REV", strategy.long, qty=qtyL)
strategy.exit("LONG_REV_TP/SL", from_entry="LONG_REV", stop=stopL, limit=tpL)
tradedToday := oneTradePerDay ? true : tradedToday
// After bullish break, bearish FVG back into range → SHORT
if breakUpFound and bearFVG and closeInside
stopS = high[2] // first candle of the FVG
entryS = close
if entryS < stopS
tpS = entryS - rr * (stopS - entryS)
qtyS = calcOrderQty(entryS, stopS)
if qtyS > 0
strategy.entry("SHORT_REV", strategy.short, qty=qtyS)
strategy.exit("SHORT_REV_TP/SL", from_entry="SHORT_REV", stop=stopS, limit=tpS)
tradedToday := oneTradePerDay ? true : tradedToday
// -------------------- Markers
plotshape(enableBreak and (bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)) and allowEntry, title="Break Long", style=shape.triangleup, color=color.new(color.teal, 0), size=size.tiny, location=location.belowbar, text="Break")
plotshape(enableBreak and (bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)) and allowEntry, title="Break Short", style=shape.triangledown, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Break")
plotshape(enableTrap and breakUpFound and trapUpRetestedInside and closeAbove and allowEntry, title="Trap Long", style=shape.circle, color=color.new(color.teal, 0), size=size.tiny, location=location.belowbar, text="Trap")
plotshape(enableTrap and breakDownFound and trapDownRetestedInside and closeBelow and allowEntry, title="Trap Short", style=shape.circle, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Trap")
plotshape(enableReversal and breakDownFound and bullFVG and closeInside and allowEntry, title="Reversal Long", style=shape.diamond, color=color.new(color.teal, 0), size=size.tiny, location=location.belowbar, text="Rev")
plotshape(enableReversal and breakUpFound and bearFVG and closeInside and allowEntry, title="Reversal Short", style=shape.diamond, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Rev")