Strategi High Low Breaker Backtest

Penulis:ChaoZhang, Tanggal: 2023-11-27 15:37:13
Tag:

img

Gambaran umum

Strategi High Low Breaker Backtest adalah strategi trend-following yang menggunakan puncak dan terendah historis saham untuk menentukan apakah harga keluar dari kisaran tinggi-rendah ini. Ini menghitung harga tertinggi dan harga terendah selama periode tertentu, dan menghasilkan sinyal beli ketika harga periode saat ini melebihi harga tertinggi selama periode terakhir, dan sinyal jual ketika harga pecah di bawah harga terendah selama periode terakhir. Sebagai jenis strategi trend-following, ini dapat menangkap beberapa karakteristik tren harga saham dan memiliki nilai praktis untuk perdagangan langsung.

Logika Strategi

Logika inti dari strategi ini adalah untuk menghitung harga tertinggi dan harga terendah selama sejumlah bar (default 50 bar). Saat menghitung harga tertinggi / terendah, memungkinkan untuk menggunakan harga dekat atau harga tinggi / rendah aktual (default untuk menggunakan harga tinggi / rendah). Kemudian memeriksa apakah harga penutupan bar saat ini atau harga tinggi melebihi harga tertinggi selama periode terakhir. Jika ya dan telah lebih dari jumlah minimum bar (default 30 bar) sejak bar harga tertinggi terakhir, itu menghasilkan sinyal beli. Demikian pula, jika harga penutupan bar saat ini atau harga rendah melanggar harga terendah selama periode terakhir dan jumlah minimum bar sejak harga terendah terakhir, itu menghasilkan sinyal jual.

Setelah menghasilkan sinyal beli, strategi memasuki posisi panjang pada harga tersebut, dengan harga stop loss dan harga take profit yang ditetapkan.

Analisis Keuntungan

Strategi backtest high low breaker ini memiliki keuntungan berikut:

  1. Logikanya sederhana dan mudah dipahami/diimplementasikan.
  2. Hal ini dapat menangkap beberapa tren karakteristik harga saham.
  3. Parameter dapat dioptimalkan untuk menemukan kombinasi parameter terbaik.
  4. Dibangun dalam stop loss dan mengambil keuntungan mengendalikan risiko.
  5. Visualisasi sangat memfasilitasi penyesuaian parameter dan analisis hasil.

Analisis Risiko

Strategi ini juga memiliki beberapa risiko:

  1. Cenderung untuk beberapa flip-flop perdagangan dan over-dagang.
  2. Peningkatan posisi yang sering terjadi ketika harga berosilasi.
  3. Kehilangan peluang tren utama jika parameter tidak ditetapkan dengan benar.
  4. Tanpa mempertimbangkan frekuensi dan besarnya fluktuasi harga.
  5. Tidak ada validasi sinyal dengan indikator lain.

Aspek berikut dapat membantu mengurangi risiko ini:

  1. Kurangi jarak stop loss untuk memperpanjang waktu ditahan.
  2. Tambahkan lebih banyak kriteria masuk untuk menghindari entri yang sering.
  3. Optimalkan parameter untuk menemukan kombinasi yang optimal.
  4. Tambahkan kondisi filter dengan indikator lain.

Arahan Optimasi

Strategi ini dapat ditingkatkan dengan cara berikut:

  1. Optimasi parameter menggunakan pengujian yang lebih sistematis.
  2. Tambahkan filter sinyal dengan indikator lain misalnya moving average.
  3. Pertimbangkan volatilitas harga menggunakan ATR untuk menyesuaikan ambang batas breakout.
  4. Membedakan tren vs pasar osilasi untuk menyesuaikan parameter.
  5. Meningkatkan aturan ukuran posisi misalnya berhenti membuka posisi baru setelah kerugian yang signifikan.

Ringkasan

Singkatnya, strategi High Low Breaker Backtest adalah strategi trend-following yang sederhana dan praktis. Strategi ini menghasilkan sinyal trading berdasarkan price breaking periodic highest/lowest prices. Strategi ini memiliki keuntungan seperti kesederhanaan, trend-following, dan parameter optimization, tetapi juga risiko seperti over-trading dan ketidakmampuan untuk menangani pasar yang berosilasi. Optimasi lebih lanjut dapat dilakukan di sekitar parameter, filter sinyal, ukuran posisi dll untuk meningkatkan kinerjanya.


/*backtest
start: 2023-11-25 00:00:00
end: 2023-11-26 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("High/Low Breaker Backtest 1.0", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=700)

// Strategy Settings
takeProfitPercentageLong = input(.1, title='Take Profit Percentage Long', type=float)/100
stopLossPercentageLong = input(0.15, title='Stop Loss Percentage Long', type=float)/100
takeProfitPercentageShort = input(.1, title='Take Profit Percentage Short', type=float)/100
stopLossPercentageShort = input(0.15, title='Stop Loss Percentage Short', type=float)/100


candlesBack = input(title="Number of candles back",  defval=50)
useHighAndLows =  input(true, title="Use high and lows (uncheck to use close)", defval=true)
lastBarsBackMinimum =  input(title="Number of candles back to ignore for last high/low",  defval=30)
showHighsAndLows = input(true, title="Show high/low lines", defval=true)

getIndexOfLowestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] <= current
            index := i
            current := series[i]
    index

getIndexOfHighestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] >= current
            index := i
            current := series[i]
    index

indexOfHighestInRange = getIndexOfHighestInSeries(useHighAndLows ? high : close, candlesBack)
indexOfLowestInRange = getIndexOfLowestInSeries(useHighAndLows ? low : close, candlesBack)

max = useHighAndLows ? high[indexOfHighestInRange] : close[indexOfHighestInRange]
min = useHighAndLows ? low[indexOfLowestInRange] : close[indexOfLowestInRange]

barsSinceLastHigh = indexOfHighestInRange
barsSinceLastLow = indexOfLowestInRange

isNewHigh = (useHighAndLows ? high > max[1] : close > max[1]) and (barsSinceLastHigh[1] + 1 > lastBarsBackMinimum)
isNewLow = (useHighAndLows ? low < min[1] : close < min[1]) and (barsSinceLastLow[1] + 1 > lastBarsBackMinimum)

alertcondition(condition=isNewHigh, title="New High", message="Last High Broken")
alertcondition(condition=isNewLow, title="New Low", message="Last Low Broken")

if high > max 
    max := high
    barsSinceLastHigh := 0

if low < min
    min := low
    barsSinceLastLow := 0 

plot( showHighsAndLows ? max : na, color=red, style=line, title="High", linewidth=3)
plot( showHighsAndLows ? min : na, color=green, style=line, title="Low", linewidth=3)

// Strategy Entry/Exit Logic
goLong =isNewHigh
longStopLevel = strategy.position_avg_price * (1 - stopLossPercentageLong)
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercentageLong)

goShort = isNewLow
shortStopLevel = strategy.position_avg_price * (1 + stopLossPercentageShort)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercentageShort)

strategy.entry("Long", strategy.long, when=goLong)
strategy.exit("Long Exit", "Long", stop=longStopLevel, limit=longTakeProfitLevel)

strategy.entry("Short", strategy.short, when=goShort)
strategy.exit("Short Exit", "Short", stop=shortStopLevel, limit=shortTakeProfitLevel)
        
plot(goShort ? shortStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goShort ? shortTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)
plot(goLong ? longStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goLong ? longTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)


Lebih banyak