Strategi Tinggi / Rendah yang Rusak

Penulis:ChaoZhang, Tarikh: 2023-12-22 12:59:43
Tag:

img

Ringkasan

Strategi Broken High/Low adalah strategi trend-mengikuti yang mengesan harga breakouts di luar tinggi atau rendah candlestick sebelumnya. Ia menggunakan purata bergerak untuk menentukan arah trend dan memasuki titik breakout, dengan stop loss atau trailing stop loss untuk mengunci keuntungan.

Logika Strategi

Syarat utama untuk masuk dan keluar yang ditentukan oleh strategi ini adalah:

  1. Mengenal pasti jika lilin adalah hijau atau merah untuk menentukan sama ada ia adalah lilin ke atas atau ke bawah lilin
  2. Periksa sama ada lilin semasa memecahkan tinggi atau rendah lilin sebelumnya
  3. Gunakan purata bergerak pantas dan perlahan untuk menentukan arah trend
  4. Pergi panjang apabila lilin naik pecah di atas tinggi lilin bawah sebelumnya, pergi pendek apabila lilin bawah pecah di bawah rendah lilin atas sebelumnya
  5. Keadaan keluar dipicu oleh stop loss atau trailing stop; juga boleh keluar dengan segera jika lilin pembalikan muncul

Strategi ini juga menggunakan penapis berdasarkan lilin pembalikan kedua untuk mengelakkan pecah palsu dan memastikan kebolehpercayaan isyarat.

Analisis Kelebihan

  • Arahan strategi yang jelas, mudah untuk memahami operasi breakout
  • Memastikan penilaian trend yang betul dengan menggabungkan purata bergerak berganda
  • Hentikan pengangkutan membantu mengunci lebih banyak keuntungan
  • Penapis lilin pembalikan membantu mengelakkan mengejar tinggi dan membunuh rendah

Analisis Risiko

  • Kegagalan keluar boleh menyebabkan kerugian dari operasi jangka pendek
  • Risiko pecah palsu yang lebih besar di pasaran terhad julat
  • Purata bergerak berganda mungkin terlambat, yang membawa kepada kesilapan penilaian

Langkah-langkah Kawalan Risiko:

  1. Pilih indeks atau penanda aras utama untuk mengelakkan risiko tinggi stok individu
  2. Mengoptimumkan parameter purata bergerak untuk meningkatkan ketepatan penghakiman
  3. Memperluas julat stop loss untuk mengawal kerugian perdagangan tunggal

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji kombinasi parameter purata bergerak yang berbeza
  2. Ujian yang merangkumi penunjuk teknikal lain untuk penilaian gabungan
  3. Mengoptimumkan parameter tahap masuk dan stop loss
  4. Tambah peraturan penapisan kuantitatif untuk memilih asas berkualiti tinggi
  5. Menggabungkan algoritma pembelajaran mesin untuk pengoptimuman parameter adaptif

Ringkasan

Strategi Broken High/Low secara keseluruhan merupakan strategi trend-mengikuti matang. Dengan bantuan purata bergerak untuk penilaian tambahan, ia boleh menangkap tahap tertentu trend. Stop loss dan mekanisme berhenti menyusul juga membantu mengunci keuntungan. Melalui ujian dan pengoptimuman berterusan, parameter dan prestasi strategi ini boleh menjadi lebih cemerlang.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Broken High/Low Strategy", overlay=true, initial_capital = 5000, default_qty_value = 25, pyramiding = 10, default_qty_type= strategy.percent_of_equity)

useEMAForStop = input.bool(false, 'Use trail stop EMA', group = 'Exit strategy')
trailStopMALength = input(8, 'Trail stop EMA length', group = 'Exit strategy')

fastMALength = input(5 , 'Fast MA length', group = 'Trend strength')
fastEMAEnabled = input.bool(false, 'Fast EMA enabled (default is SMA)', group = 'Trend strength')

slowMALength = input(10, 'Slow MA length', group = 'Trend strength')
slowEMAEnabled = input.bool(false, 'Slow EMA enabled (default is SMA)', group = 'Trend strength')

ignoreSlowMA = input.bool(false, 'Use fast MA for trend ignoring slow MA', group = 'Trend strength')

useOpposingBarAsExit = input.bool(false, 'Using opposing bar as exit', group = 'Exit strategy')
secondEntryEnabled = input.bool(false, 'Second bar that eliminates opposing bar for entry', group = 'Trend strength')

longsEnabled = input.bool(true, 'Enable longs', group = 'Trade settings')
shortsEnabled = input.bool(true, 'Enable shorts', group = 'Trade settings')

fastMA = fastEMAEnabled ? ta.ema(close, fastMALength) : ta.sma(close, fastMALength)
slowMA = slowEMAEnabled ? ta.ema(close, slowMALength) : ta.sma(close, slowMALength)

FromMonth=input.int(defval=1,title="FromMonth",minval=1,maxval=12, group = 'Time filters')
FromDay=input.int(defval=1,title="FromDay",minval=1,maxval=31, group = 'Time filters')
FromYear=input.int(defval=1990,title="FromYear",minval=1900, group = 'Time filters')
ToMonth=input.int(defval=1,title="ToMonth",minval=1,maxval=12, group = 'Time filters')
ToDay=input.int(defval=1,title="ToDay",minval=1,maxval=31, group = 'Time filters')
ToYear=input.int(defval=9999,title="ToYear",minval=2017, group = 'Time filters')
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>time>=start and time<=finish?true:false
afterStartDate = time >= start and time<=finish?true:false
closeTradesEOD = input.bool(false, 'Close trades end of day', group = 'Time filters')

trailStopMA = ta.ema(close, trailStopMALength)

isGreenCandle = close > open
isRedCandle = close < open
isBrokenHigh = close > open[1]
isPriorCandleRed = close[1] < open[1]
isPriorPriorCandleRed = close[2] < open[2]
isPriorPriorCandleGreen = close[2] > open[2]
isPriorCandleGreen = close[1] > open[1]
isBrokenLow = close < open[1]

isPriorRedCandleBroken = isGreenCandle and isPriorCandleRed and isBrokenHigh
isPriorGreenCandleBroken = isRedCandle and isPriorCandleGreen and isBrokenLow

isPriorPriorRedCandleBroken = secondEntryEnabled and not isPriorRedCandleBroken and isGreenCandle and isPriorPriorCandleRed ? close > open[2] : false
isPriorPriorGreenCandleBroken = secondEntryEnabled and not isPriorGreenCandleBroken and isRedCandle and isPriorPriorCandleGreen ? close < open[2] : false

longOpenCondition = (isPriorRedCandleBroken or isPriorPriorRedCandleBroken) and afterStartDate and (ignoreSlowMA ? close > fastMA : fastMA > slowMA) and longsEnabled
longCloseCondition = useOpposingBarAsExit ? isRedCandle : ta.crossunder(close, fastMA)
longCloseCondition := useEMAForStop ? ta.crossunder(close, trailStopMA) : longCloseCondition

shortOpenCondition = (isPriorGreenCandleBroken or isPriorPriorGreenCandleBroken) and afterStartDate and (ignoreSlowMA ? close < fastMA : fastMA < slowMA) and shortsEnabled
shortCloseCondition = useOpposingBarAsExit ? isGreenCandle : ta.crossover(close, fastMA)
shortCloseCondition := useEMAForStop ? ta.crossover(close, trailStopMA) : shortCloseCondition

if (longOpenCondition)
    strategy.entry("Long Entry", strategy.long)

if (longCloseCondition)
    strategy.close('Long Entry', 'Long Exit')

if (shortOpenCondition)
    strategy.entry("Short Entry", strategy.long)

if (shortCloseCondition)
    strategy.close('Short Entry', 'Short Exit')

if (closeTradesEOD and hour >= 14 and minute >= 30)
    strategy.close_all("EOD")

plot(useEMAForStop ? trailStopMA : na, linewidth = 2, color = color.red)
plot(fastMA)
plot(ignoreSlowMA ? na : slowMA, linewidth = 4)

Lebih lanjut