Sistem Dagangan Pelbagai Strategi Julat Harga Dinamik Breakout-Pullback-Reversal

FVG 5M 1M R:R RANGE TRADING SCALPING
Tarikh penciptaan: 2025-08-22 09:55:06 Akhirnya diubah suai: 2025-08-22 09:55:06
Salin: 0 Bilangan klik: 333
2
fokus pada
319
Pengikut

Sistem Dagangan Pelbagai Strategi Julat Harga Dinamik Breakout-Pullback-Reversal Sistem Dagangan Pelbagai Strategi Julat Harga Dinamik Breakout-Pullback-Reversal

Gambaran keseluruhan

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 Strategi

Prinsip utama strategi ini adalah berdasarkan pada corak tingkah laku harga selepas pembentukan julat awal pada perdagangan pagi, dengan tiga langkah:

  1. Jarak penanda (9:30 AM):

    • Tunggu 5 minit pertama selepas pembukaan K baris ((9:30-9:35) penutupan
    • Tandakan titik tertinggi dan terendah pada garisan K sebagai kawasan dagangan
    • Bertukar kepada carta 1 minit untuk perdagangan sebenar
  2. Mencari titik masuk (satu jam selepas perdagangan dibuka): Strategi ini menawarkan tiga cara masuk yang berbeza:

    • Break Entry (dalam bahasa Inggeris):

      • Keperluan untuk memenuhi syarat jurang nilai wajar (FVG)
      • Jarak penutupan harga untuk mana-mana garisan K dalam FVG
      • FVG ditakrifkan sebagai tiga garis K yang membentuk corak lompat ((wick-gap)
    • Trap Entry (Kemasukan Perangkap):

      • Harga pertama yang melintasi sempadan zon
      • Kemudian diukur semula ke dalam jarak
      • Akhir sekali, ia ditutup di luar zon.
    • Reversal Entry[petikan diperlukan]:

      • Harga selepas satu arah kejayaan gagal
      • FVG yang muncul ke arah yang bertentangan kembali ke dalam ruang
  3. Pengurusan urus niaga:

    • Tetapan Stop Loss:
      • Strategi penembusan / perangkap: menggunakan penutupan pertama pada garis K yang paling rendah / tertinggi di luar julat
      • Strategi pembalikan: titik terendah / tertinggi garis K pertama dalam mod FVG
    • Tetapan penangguhan:
      • Sentiasa menggunakan nisbah risiko dan ganjaran 2:1
      • Risiko \(100 keuntungan \)200

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.

Kelebihan Strategik

  1. 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.

  2. 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.enableBreakenableTrapdanenableReversalParameter membolehkan fleksibiliti ini.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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 Strategik

  1. 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.

  2. 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.

  3. Kos peluang yang terhad kepada masaNamun, sekatan ini juga merupakan satu disiplin untuk mengelakkan perdagangan berlebihan.

  4. 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.

  5. 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.

  6. Ketergantungan pada FVGStrategi bergantung pada model FVG dalam penembusan dan masuk balik, tetapi dalam keadaan pasaran tertentu, FVG mungkin tidak mudah terbentuk atau dikenali.

  7. Kekurangan satu kerangka masaBergantung sepenuhnya pada carta 1 minit boleh menyebabkan strategi mengabaikan struktur pasaran penting dalam jangka masa yang lebih besar.

Arah pengoptimuman strategi

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. Tambah pengesahan jumlah transaksiPenambahan pengesahan jumlah transaksi dalam syarat kemasukan mungkin meningkatkan kualiti isyarat, terutamanya untuk kemasukan yang terganggu.

  8. Penangguhan kerugianMengubah tahap stop loss mengikut pergerakan pasaran yang tidak menentu mungkin meningkatkan kemampuan strategi untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

ringkaskan

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.

Kod sumber strategi
/*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")