Strategi Dagangan Pecah Berbilang Penunjuk dan Pembalikan: Sistem Dwi Kemasukan Digabungkan dengan Pengoptimuman Julat Harga Pembukaan

EMA SMA RSI ATR VWAP ORB
Tarikh penciptaan: 2025-04-01 16:00:37 Akhirnya diubah suai: 2025-04-01 16:00:37
Salin: 0 Bilangan klik: 382
2
fokus pada
319
Pengikut

Strategi Dagangan Pecah Berbilang Penunjuk dan Pembalikan: Sistem Dwi Kemasukan Digabungkan dengan Pengoptimuman Julat Harga Pembukaan Strategi Dagangan Pecah Berbilang Penunjuk dan Pembalikan: Sistem Dwi Kemasukan Digabungkan dengan Pengoptimuman Julat Harga Pembukaan

Gambaran keseluruhan

Strategi perdagangan berlainan indikator adalah kaedah perdagangan kuantitatif yang menggabungkan analisis teknikal indikator dan tingkah laku harga untuk menangkap dua jenis peluang perdagangan utama di pasaran: perubahan harga dan trend. Strategi ini mengintegrasikan pelbagai indikator teknikal seperti purata bergerak, indeks RSI yang agak lemah, rentang sebenar rata-rata, ATR, dan harga purata yang dipertanggungjawabkan dengan jumlah perdagangan, VWAP, sambil memperkenalkan mekanisme penembusan jarak terbuka (ORB) untuk meningkatkan kebolehpercayaan isyarat masuk.

Prinsip Strategi

Prinsip utama strategi ini adalah untuk mengenal pasti tiga kategori peluang perdagangan yang berpotensi menguntungkan melalui penapisan dan pengesahan pelbagai indikator:

  1. Isyarat perdagangan terbalik

    • Reversal Multi-Head: Ia berlaku apabila harga melangkaui purata bergerak sederhana 50 tempoh ((SMA50), RSI berada di bawah paras oversold ((default 30), dan harga berada di bawah VWAP, sementara trend keseluruhan ke atas ((harga di atas SMA200)).
    • Pembalikan kosong: Ia berlaku apabila harga melintasi SMA 50 ke bawah, RSI lebih tinggi daripada paras overbought (default 70), dan harga lebih tinggi daripada VWAP, sementara trend keseluruhan ke bawah (harga lebih rendah daripada SMA 200).
  2. Isyarat trend pecah

    • Penembusan berbilang kepala: apabila 9 indeks bergerak rata-rata ((EMA9) melalui 20 indeks bergerak rata-rata ((EMA20), harga lebih tinggi daripada VWAP, dan trend keseluruhan ke atas apabila ia dicetuskan.
    • Penembusan udara: apabila EMA9 di bawah EMA20 di bawah harga VWAP dan trend keseluruhan ke bawah.
  3. Isyarat ORB

    • ORB berbilang kepala: ia dicetuskan apabila harga menembusi jumlah tiang tertentu sebelum pembukaan perdagangan (default 15 tiang) dan jumlah dagangan melebihi perkalian yang ditetapkan untuk jumlah perdagangan rata-rata dalam tempoh pembukaan perdagangan (default 1.5 kali).
    • Blank ORB: Digunakan apabila harga jatuh daripada harga terendah yang terbentuk sebelum bukaan dan apabila jumlah dagangan memenuhi syarat penurunan nilai.

Strategi menggunakan indikator ATR untuk mengira kedudukan stop loss dinamik, yang ditetapkan dengan membalikkan harga minimum / harga tertinggi untuk tempoh tertentu (default 7) dan menambah kelipatan nilai ATR yang dikurangkan (default 0.5). Setelah masuk, strategi menetapkan dua sasaran stop loss:

  • Sasaran pertama: 0.5 kali risiko (default), kedudukan 25%
  • Sasaran kedua: 1.1 kali ganda risiko (default), 75% baki kedudukan kosong

Apabila sasaran berhenti pertama dicapai, strategi secara automatik akan menyesuaikan stop loss ke harga masuk (titik keseimbangan kerugian), dengan berkesan melindungi keuntungan yang telah diperoleh.

Kelebihan Strategik

  1. Isyarat kemasukan yang pelbagaiDengan mengintegrasikan tiga jenis isyarat masuk yang berbeza iaitu reversal, breakout, dan breakout pada masa bukaan, strategi ini dapat menyesuaikan diri dengan pelbagai keadaan pasaran, meningkatkan peluang perdagangan dengan berkesan, dan mengekalkan kualiti isyarat yang tinggi.

  2. Pengurusan risiko yang baikStrategi ini menggunakan mekanisme hentian bertingkat, yang membolehkan sebahagian keuntungan diperoleh sambil mengekalkan potensi keuntungan yang lebih besar. Apabila sasaran hentian pertama dicapai, hentian kerugian akan disesuaikan secara automatik ke titik keseimbangan keuntungan dan kerugian, mewujudkan “biarkan keuntungan berjalan” sambil melindungi modal.

  3. Pengiraan Hentian DinamikMenggunakan ATR untuk mengira kedudukan stop loss, membolehkan tahap stop loss disesuaikan dengan dinamik turun naik pasaran, mencerminkan keadaan pasaran semasa dengan lebih tepat, dan mengelakkan tetapan stop loss yang terlalu ketat atau terlalu longgar.

  4. Pengesahan jumlah transaksi: Memperkenalkan mekanisme pengesahan jumlah transaksi khusus dalam isyarat ORB, yang memerlukan jumlah transaksi pada waktu penembusan mesti melebihi kelipatan tertentu jumlah transaksi rata-rata dalam ruang terbuka, untuk menyaring penembusan berkualiti rendah.

  5. Penapis trendUntuk menentukan arah trend jangka panjang melalui purata bergerak mudah 200 tempoh ((SMA200), pastikan arah perdagangan selaras dengan trend utama, meningkatkan kadar kejayaan perdagangan.

  6. Pengurusan kewangan bersepaduStrategi: Mekanisme pengurusan dana terbina dalam, hadkan peratusan dana yang digunakan untuk setiap urus niaga (default 50% modal), memastikan pembahagian dana yang pelbagai, mengurangkan risiko untuk satu urus niaga.

Risiko Strategik

  1. Penurunan dalam IndeksStrategi ini bergantung kepada penunjuk keterlambatan seperti purata bergerak, yang boleh menyebabkan kelewatan masa masuk, kehilangan titik masuk yang baik atau menyebabkan kerugian yang tidak perlu dalam pasaran yang berubah dengan cepat.

Penyelesaian: Pertimbangkan untuk menambah indikator prospektif seperti mengenal pasti corak tingkah laku harga, atau mengurangkan parameter untuk purata bergerak jangka panjang, meningkatkan kepekaan terhadap perubahan pasaran.

  1. Kepekaan ParameterBanyaknya parameter yang boleh disesuaikan (seperti panjang EMA, nilai RSI, faktor ATR, dan lain-lain) membuat pengoptimuman strategi menjadi rumit, dan mungkin menyebabkan terlalu banyak penyesuaian data sejarah yang tidak berfungsi dengan baik di pasaran masa depan.

Penyelesaian: Menggunakan kaedah pengoptimuman parameter yang sesuai, seperti pengesahan ke hadapan, simulasi Monte Carlo, untuk mengelakkan pengoptimuman berlebihan; atau menggunakan parameter tetap, memberi tumpuan kepada reka bentuk peraturan yang lebih mantap.

  1. Pertembungan pelbagai isyaratDalam keadaan pasaran tertentu, isyarat masuk yang berbeza boleh menghasilkan cadangan perdagangan yang bertentangan, yang menyebabkan prestasi strategi tidak stabil.

Penyelesaian: Menubuhkan sistem keutamaan isyarat yang lebih ketat, atau memperkenalkan mekanisme pengesahan tambahan untuk memastikan transaksi hanya dijalankan dalam keadaan kebarangkalian yang tinggi.

  1. Menghalang risiko terjun ke udaraDalam pasaran yang bergolak atau kurang likuid, harga mungkin melangkaui kedudukan henti, menyebabkan kerugian sebenar melebihi jangkaan.

Penyelesaian: Pertimbangkan untuk menggunakan strategi perlindungan opsyen, atau meningkatkan jarak hentian dalam keadaan pasaran yang tidak menentu, atau bahkan mengurangkan saiz kedudukan sementara.

  1. Celah Risiko SistemikStrategi: menjalankan beberapa dagangan yang berkaitan pada masa yang sama, mungkin menghadapi risiko sistemik ketika pasaran bergolak-golak, yang menyebabkan beberapa dagangan mengalami kerugian pada masa yang sama.

Penyelesaian: melaksanakan kawalan risiko global, mengehadkan saiz kedudukan keseluruhan, atau menyebarkan perdagangan di antara kelas aset yang berbeza, mengurangkan risiko hubungan.

Arah pengoptimuman strategi

  1. Memperkenalkan model pembelajaran mesinMenggunakan algoritma pembelajaran mesin untuk penentuan berat indikator atau pengelompokan keadaan pasaran, penyesuaian penting masing-masing indikator secara automatik dalam keadaan pasaran yang berbeza, meningkatkan kebolehpasaran strategi.

Alasan pengoptimuman: Kombinasi penunjuk berat tetap tradisional sukar untuk disesuaikan dengan tahap pasaran yang berbeza, dan pembelajaran mesin dapat secara automatik mempelajari model kombinasi penunjuk yang optimum dari data sejarah.

  1. Menyatakan sentimen pasaranMenambah Indeks Volatiliti (VIX) atau Indeks Sentimen Pasaran Frekuensi Tinggi untuk membantu strategi mengenali keadaan pasaran dengan lebih baik, menyesuaikan syarat kemasukan dan parameter risiko.

Alasan pengoptimuman: Sentimen pasaran mempunyai pengaruh yang ketara terhadap pergerakan harga jangka pendek, integrasi indikator seperti ini dapat menangkap titik-titik perubahan pasaran lebih awal, mengoptimumkan masa masuk dan keluar.

  1. Dinamika penyesuaian nisbah hentianPenarikan sasaran secara automatik berdasarkan turun naik bersejarah atau tahap rintangan sokongan, membolehkan strategi memperoleh keuntungan yang munasabah dalam pelbagai persekitaran turun naik.

Alasan pengoptimuman: Pendapatan risiko tetap mungkin tidak fleksibel dalam keadaan pasaran yang berbeza, dan penyesuaian dinamik membolehkan sasaran yang lebih jauh ditetapkan dalam pasaran yang bergelombang tinggi dan sasaran yang lebih konservatif ditetapkan dalam pasaran yang bergelombang rendah.

  1. Masukkan penapis masaMenyenaraikan mekanisme penapisan berdasarkan masa pasaran, mengelakkan dagangan pada masa turun naik yang rendah atau tidak menguntungkan, seperti beberapa minit pertama selepas pasaran dibuka atau pada waktu tengah hari yang kurang cair.

Alasan pengoptimuman: Aktiviti pasaran menunjukkan perbezaan yang ketara pada waktu yang berbeza dalam sehari, penapis masa dapat membantu strategi untuk memberi tumpuan kepada masa perdagangan yang paling menguntungkan.

  1. Mengoptimumkan pengiraan saiz kedudukan: daripada peratusan modal tetap kepada perhitungan skala kedudukan berdasarkan turun naik, secara automatik mengurangkan kedudukan semasa turun naik tinggi, dan meningkatkan kedudukan dengan sewajarnya semasa turun naik rendah.

Alasan pengoptimuman: Risiko berkaitan langsung dengan turun naik pasaran, dan pengurusan kedudukan dinamik dapat mengekalkan tahap risiko yang lebih konsisten dan meningkatkan pulangan yang disesuaikan dengan risiko jangka panjang.

ringkaskan

Strategi dagangan penembusan dan pembalikan pelbagai indikator adalah sistem dagangan kuantitatif yang komprehensif yang menggabungkan pelbagai kaedah analisis teknikal, dengan mengintegrasikan pembalikan, penembusan trend dan isyarat penembusan dalam tempoh terbuka, digabungkan dengan mekanisme pengurusan risiko dan pengurusan wang yang baik, bertujuan untuk menangkap peluang perdagangan dalam pelbagai persekitaran pasaran. Kelebihan utama strategi ini adalah kepelbagaian isyarat, kawalan risiko yang baik dan parameter penyesuaian yang kuat, terutama untuk perdagangan jangka pendek.

Kod sumber strategi
/*backtest
start: 2025-01-01 00:00:00
end: 2025-03-31 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Reversal & Breakout Strategy with ORB", overlay=true, pyramiding=2, initial_capital=50000)

// --- Inputs ---
ema9Length = input.int(9, "9 EMA Length", minval=1)
ema20Length = input.int(20, "20 EMA Length", minval=1)
sma50Length = input.int(50, "50 SMA Length", minval=1)
sma200Length = input.int(200, "200 SMA Length", minval=1)
rsiLength = input.int(14, "RSI Length", minval=1)
rsiOverbought = input.int(70, "RSI Overbought", minval=0, maxval=100)
rsiOversold = input.int(30, "RSI Oversold", minval=0, maxval=100)
atrLength = input.int(14, "ATR Length", minval=1)
stopMulti = input.float(0.5, "Stop Loss ATR Multiplier", minval=0.1, step=0.1)
stopLookback = input.int(7, "Stop Loss Lookback", minval=1)
rr1 = input.float(0.5, "Risk:Reward Target 1", minval=0.1, step=0.1)
rr2 = input.float(1.1, "Risk:Reward Target 2", minval=0.1, step=0.1)
target1Percent = input.float(25, "Profit % Target 1", minval=0, maxval=100)
orbBars = input.int(15, "Opening Range Bars", minval=1, tooltip="Number of bars to define the opening range (e.g., 15 bars = 30 min on 2-min chart)")
volThreshold = input.float(1.5, "Volume Threshold Multiplier", minval=1.0, step=0.1, tooltip="Volume must be this multiple of the opening range average")

// --- Indicators ---
// Moving Averages
ema9 = ta.ema(close, ema9Length)
ema20 = ta.ema(close, ema20Length)
sma50 = ta.sma(close, sma50Length)
sma200 = ta.sma(close, sma200Length)

// VWAP
vwapValue = ta.vwap(close)

// RSI
rsi = ta.rsi(close, rsiLength)

// ATR
atr = ta.atr(atrLength)

// --- Opening Range Breakout ---
var float openingRangeHigh = na
var float openingRangeLow = na
var float openingRangeAvgVol = na
if bar_index < orbBars
    openingRangeHigh := na
    openingRangeLow := na
    openingRangeAvgVol := na
else if bar_index == orbBars
    openingRangeHigh := ta.highest(high, orbBars)
    openingRangeLow := ta.lowest(low, orbBars)
    openingRangeAvgVol := ta.sma(volume, orbBars)

orbLong = not na(openingRangeHigh) and ta.crossover(close, openingRangeHigh) and volume > openingRangeAvgVol * volThreshold
orbShort = not na(openingRangeLow) and ta.crossunder(close, openingRangeLow) and volume > openingRangeAvgVol * volThreshold

// --- Trend Detection ---
trendUp = close > sma200
trendDown = close < sma200

// --- Reversal Conditions ---
reversalLong = ta.crossover(close, sma50) and rsi < rsiOversold and close < vwapValue and trendUp
reversalShort = ta.crossunder(close, sma50) and rsi > rsiOverbought and close > vwapValue and trendDown

// --- Range Breakout Conditions ---
breakoutLong = ta.crossover(ema9, ema20) and close > vwapValue and trendUp
breakoutShort = ta.crossunder(ema9, ema20) and close < vwapValue and trendDown

// Combine conditions
longCondition = (reversalLong or breakoutLong or orbLong)
shortCondition = (reversalShort or breakoutShort or orbShort)

// --- Calculate Position Size ---
equityPerPosition = 25000.0  // $50,000 / 2 positions
positionSizeLong = math.floor(equityPerPosition / close)
positionSizeShort = math.floor(equityPerPosition / close)

// --- Stop Loss Calculation ---
longStop = ta.lowest(low, stopLookback) - (atr * stopMulti)
shortStop = ta.highest(high, stopLookback) + (atr * stopMulti)

// --- Variables to Store Trade Levels ---
var float tradeStop = na
var float tradeTarget1 = na
var float tradeTarget2 = na
var float initialPositionSize = na
var bool breakEvenSet = false  // Track if stop has been moved to break-even
var float stopLevel = na       // Dedicated variable for stop loss in exits
var float target1Level = na    // Dedicated variable for first take profit
var float target2Level = na    // Dedicated variable for second take profit
var float qtyTotal = na        // Track total quantity

// --- Reset Levels Before New Trade ---
var bool newTrade = false
if longCondition or shortCondition
    newTrade := true
else
    newTrade := false

if strategy.position_size == 0 and newTrade
    tradeStop := na
    tradeTarget1 := na
    tradeTarget2 := na
    stopLevel := na
    target1Level := na
    target2Level := na
    initialPositionSize := na
    qtyTotal := na
    breakEvenSet := false

// --- Strategy Entries ---
if longCondition and strategy.position_size == 0
    strategy.entry("Long", strategy.long, qty=positionSizeLong * 2)
    tradeStop := longStop
    stopLevel := longStop
    stopDistance = close - tradeStop
    tradeTarget1 := close + (stopDistance * rr1)
    tradeTarget2 := close + (stopDistance * rr2)
    target1Level := tradeTarget1
    target2Level := tradeTarget2
    initialPositionSize := positionSizeLong * 2
    qtyTotal := positionSizeLong * 2
    breakEvenSet := false  // Reset break-even flag

if shortCondition and strategy.position_size == 0
    strategy.entry("Short", strategy.short, qty=positionSizeShort * 2)
    tradeStop := shortStop
    stopLevel := shortStop
    stopDistance = tradeStop - close
    tradeTarget1 := close - (stopDistance * rr1)
    tradeTarget2 := close - (stopDistance * rr2)
    target1Level := tradeTarget1
    target2Level := tradeTarget2
    initialPositionSize := positionSizeShort * 2
    qtyTotal := positionSizeShort * 2
    breakEvenSet := false  // Reset break-even flag

// --- Trade Exits ---
if strategy.position_size > 0
    qty_tp1 = qtyTotal * (target1Percent / 100)
    qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
    strategy.exit("Long Exit 1", "Long", qty=qty_tp1, stop=stopLevel, limit=target1Level)
    strategy.exit("Long Exit 2", "Long", qty=qty_tp2, stop=stopLevel, limit=target2Level)

if strategy.position_size < 0
    qty_tp1 = qtyTotal * (target1Percent / 100)
    qty_tp2 = qtyTotal * ((100 - target1Percent) / 100)
    strategy.exit("Short Exit 1", "Short", qty=qty_tp1, stop=stopLevel, limit=target1Level)
    strategy.exit("Short Exit 2", "Short", qty=qty_tp2, stop=stopLevel, limit=target2Level)

// --- Move Stop to Break-even ---
if strategy.position_size != 0 and not na(initialPositionSize) and not breakEvenSet
    if math.abs(strategy.position_size) < math.abs(initialPositionSize)
        tradeStop := strategy.position_avg_price
        stopLevel := strategy.position_avg_price
        tradeTarget1 := na  // Clear first target for plotting
        breakEvenSet := true  // Mark break-even as set

// --- Manual Close Fallback ---
if strategy.position_size > 0
    if close >= target2Level or close <= stopLevel
        strategy.close("Long", qty=qtyTotal, comment="Manual Close")

if strategy.position_size < 0
    if close <= target2Level or close >= stopLevel
        strategy.close("Short", qty=qtyTotal, comment="Manual Close")

// --- Reset Levels When No Position ---
if strategy.position_size == 0 and not newTrade
    tradeStop := na
    tradeTarget1 := na
    tradeTarget2 := na
    stopLevel := na
    target1Level := na
    target2Level := na
    initialPositionSize := na
    qtyTotal := na
    breakEvenSet := false

// --- Plotting ---
plot(tradeStop, title="Stop Loss", color=color.red, linewidth=1, style=plot.style_linebr)
plot(tradeTarget1, title="Take Profit 1", color=color.green, linewidth=1, style=plot.style_linebr)
plot(tradeTarget2, title="Take Profit 2", color=color.blue, linewidth=1, style=plot.style_linebr)