
Sistem perdagangan pelbagai strategi penembusan-pengunduran-pengunduran-pengunduran dinamik adalah strategi perdagangan dalam hari yang direka khusus untuk pedagang garis pendek, berdasarkan pada kawasan harga yang terbentuk pada garis K 5 minit pertama selepas bukaan pagi. Strategi ini mengintegrasikan tiga mod masuk yang berbeza: penembusan masuk, penembusan masuk dan penembusan masuk, berdagang dengan mengenal pasti jurang nilai wajar (FVG) dan penembusan kawasan harga.
Prinsip utama strategi ini adalah berdasarkan pada corak tingkah laku harga selepas pembentukan julat awal pada perdagangan pagi, dengan tiga langkah:
Jarak penanda (9:30 AM):
Mencari titik masuk (satu jam selepas perdagangan dibuka): Strategi ini menawarkan tiga cara masuk yang berbeza:
Break Entry (dalam bahasa Inggeris):
Trap Entry (Kemasukan Perangkap):
Reversal Entry[petikan diperlukan]:
Pengurusan urus niaga:
Kod strategi mewujudkan kerangka logik yang lengkap, termasuk mengesan secara automatik tempoh perdagangan, mengenal pasti pelbagai syarat masuk, menetapkan paras penangguhan kerugian dan mengira saiz kedudukan yang sesuai. Sistem ini juga merangkumi penapis masa, memastikan perdagangan hanya dalam tempoh masa tertentu, dan boleh secara pilihan mengaktifkan atau menonaktifkan strategi masuk yang berbeza.
Peraturan ringkas dan jelasPeraturan strategi jelas dan intuitif, tidak memerlukan penilaian subjektif, mengurangkan pengaruh emosi terhadap keputusan perdagangan. Logik bersyarat dan pengesanan status dalam kod memastikan pelaksanaan peraturan yang ketat.
Fleksibiliti dalam pelbagai cara kemasukanIa menawarkan tiga strategi kemasukan yang berbeza (penembusan, perangkap, dan pembalikan) yang membolehkan peniaga menyesuaikan diri dengan keadaan pasaran yang berbeza.enableBreak、enableTrapdanenableReversalParameter membolehkan fleksibiliti ini.
Fokus pada masa yang berkemungkinan tinggiStrategi: Berdagang hanya dalam satu jam pertama selepas dibuka, memanfaatkan turun naik dan kecairan yang lebih tinggi yang biasanya wujud dalam tempoh ini.inWindowSyarat memastikan transaksi hanya dijalankan antara 9:30 dan 10:30.
Pengurusan risiko yang ketat: Rasio ganjaran risiko tetap 2: 1 dan penempatan stop loss berdasarkan tindakan harga tertentu, memberikan kawalan risiko yang jelas untuk setiap perdagangan.riskPctParameter ini membolehkan pengguna menyesuaikan peratusan risiko setiap perdagangan mengikut keutamaan risiko mereka sendiri.
Tidak memerlukan petunjuk yang rumitStrategi ini tidak bergantung kepada petunjuk teknikal yang rumit, tetapi berdasarkan pada tingkah laku dan struktur harga semata-mata, mengurangkan risiko over-fitting.
Penghindaran bermusim: Kod ini mempunyai senarai hitam percutian ((15 Disember hingga 15 Januari), untuk mengelakkan tempoh di mana pasaran mungkin tidak stabil atau turun naik.
Pengurusan kedudukan yang fleksibelSistem ini menawarkan dua jenis pengurusan kedudukan berdasarkan peratusan risiko atau jumlah kontrak tetap, yang sesuai dengan keperluan pengurusan wang yang berbeza.
Risiko penembusan palsu: Pasaran mungkin akan mengalami penembusan palsu, menyebabkan harga berbalik dengan cepat selepas perdagangan dicetuskan. Untuk mengurangkan risiko ini, strategi menggabungkan mod perangkap dan masuk ke dalam pasaran, tetapi masih perlu dipantau dengan teliti.
Masalah lebar julat: Jika jarak K-line terlalu lebar atau terlalu sempit dalam 5 minit pertama selepas pembukaan, ia boleh menjejaskan keberkesanan strategi. Jarak yang terlalu sempit boleh menyebabkan isyarat pemicu yang kerap, manakala jarak yang terlalu luas boleh menyebabkan titik henti terlalu jauh.
Kos peluang yang terhad kepada masaNamun, sekatan ini juga merupakan satu disiplin untuk mengelakkan perdagangan berlebihan.
Batasan bagi nisbah ganjaran risiko tetapWalaupun nisbah ganjaran risiko 2: 1 memberikan konsistensi, ia mungkin bukan pilihan terbaik dalam keadaan pasaran tertentu. Dalam pasaran yang cenderung kuat, nisbah ganjaran risiko yang lebih tinggi mungkin lebih sesuai.
Keadaan yang tidak biasa di pasaran semasa cutiWalaupun strategi ini mengelakkan dagangan antara 15 Disember dan 15 Januari, tindakan pasaran lain sebelum dan selepas hari cuti juga boleh menjadi luar biasa dan mempengaruhi prestasi strategi.
Ketergantungan pada FVGStrategi bergantung pada model FVG dalam penembusan dan masuk balik, tetapi dalam keadaan pasaran tertentu, FVG mungkin tidak mudah terbentuk atau dikenali.
Kekurangan satu kerangka masaBergantung sepenuhnya pada carta 1 minit boleh menyebabkan strategi mengabaikan struktur pasaran penting dalam jangka masa yang lebih besar.
Luas julat yang disesuaikanAnda boleh mempertimbangkan untuk menyesuaikan lebar julat mengikut pergerakan turun naik pasaran, contohnya menggunakan julat yang lebih lebar pada hari yang lebih turun naik, menggunakan julat yang lebih sempit pada hari yang kurang turun naik. Ini boleh dicapai dengan mengira julat turun naik rata-rata sebenar terkini (ATR) atau penunjuk yang serupa.
Optimumkan tetingkap masaIa boleh mengkaji waktu perdagangan yang optimum bagi pasaran yang berbeza, dan bukannya ditetapkan pada 9:30-10:30. Beberapa pasaran mungkin menunjukkan pola penembusan yang lebih ketara pada masa yang berbeza.
Tetapan risiko ganjaran dinamikAnda boleh menyesuaikan nisbah pulangan risiko mengikut keadaan pasaran dan dinamik turun naik, contohnya, meningkatkan sasaran apabila trend kuat, mengurangkan sasaran semasa pasaran menyusun.
Menyatakan sentimen pasaranAnda boleh mempertimbangkan untuk memasukkan penunjuk keluasan pasaran atau penunjuk turun naik sebagai penapis untuk mengelakkan perdagangan dalam keadaan pasaran yang tidak baik.
Pengesahan pelbagai kerangka masaWalaupun pelaksanaan perdagangan masih berada pada carta 1 minit, syarat pengesahan untuk jangka masa yang lebih tinggi boleh ditambah, seperti pemeriksaan kesesuaian arah trend pada carta 15 minit atau 1 jam.
Optimumkan definisi FVGDefinisi FVG semasa adalah agak mudah dan boleh mempertimbangkan definisi kawasan tidak seimbang yang lebih rumit atau lebih tepat, seperti mempertimbangkan badan badan badan dan bukan hanya garis bayangan.
Tambah pengesahan jumlah transaksiPenambahan pengesahan jumlah transaksi dalam syarat kemasukan mungkin meningkatkan kualiti isyarat, terutamanya untuk kemasukan yang terganggu.
Penangguhan kerugianMengubah tahap stop loss mengikut pergerakan pasaran yang tidak menentu mungkin meningkatkan kemampuan strategi untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.
Sistem perdagangan pelbagai strategi penembusan-pengunduran-pengunduran pelbagai strategi dinamik adalah strategi perdagangan dalam hari yang jelas dan tersusun dengan peraturan yang jelas, mencari peluang perdagangan dengan mengenal pasti julat harga yang terbentuk pada awal perdagangan dan corak penembusan, perangkap atau pengunduran yang seterusnya. Kelebihan utama strategi ini adalah kesederhanaan dan fleksibiliti pelbagai cara masuk, sementara batasan masa yang ketat dan prinsip pengurusan risiko membantu mengekalkan disiplin perdagangan.
Walau bagaimanapun, strategi ini juga menghadapi risiko seperti pecah palsu, lebar julat yang tidak sesuai dan ketergantungan pada model harga tertentu. Strategi ini dapat meningkatkan lagi kestabilan dan kesesuaian dengan cara mengoptimumkan kaedah penetapan julat, menyesuaikan tetingkap masa, menetapkan perbandingan ganjaran risiko secara dinamik dan mengintegrasikan analisis pelbagai kerangka masa.
Pada akhirnya, strategi ini menyediakan kerangka kerja yang sistematik untuk peniaga garis pendek, terutama bagi pelabur yang mencari perdagangan yang cekap pada waktu buka setiap hari. Seperti semua strategi perdagangan, pengesanan yang mencukupi dan pengurusan risiko yang sesuai harus dilakukan sebelum penggunaan sebenar.
/*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")