Strategi perdagangan kuantitatif berdasarkan indikator supertrend dan perdagangan kurva ekuitas

Penulis:ChaoZhang, Tanggal: 2024-01-15 11:41:53
Tag:

img

Gambaran umum

Ide inti dari strategi ini adalah untuk menggabungkan indikator Supertrend dengan perdagangan kurva ekuitas. Ketika indikator Supertrend menghasilkan sinyal beli atau jual, kita tidak langsung mengeksekusi perdagangan. Sebaliknya, kita memeriksa apakah kurva ekuitas saat ini berada di bawah rata-rata bergerak. Kita akan membuka posisi hanya ketika kurva ekuitas berada di atas rata-rata bergerak. Ketika kurva ekuitas berada di bawah rata-rata bergerak, kita akan menghentikan perdagangan untuk strategi saat ini. Ini dapat secara efektif mencegah ekspansi kerugian.

Logika Strategi

Strategi ini terutama terdiri dari dua bagian:

  1. Indikator Supertrend
  2. Perdagangan kurva ekuitas

Rumus perhitungan untuk indikator Supertrend adalah:

Band atas = Harga sumber - ATR Multiplier * ATR Band bawah = Harga sumber + ATR Multiplier * ATR

Di mana ATR adalah singkatan dari Average True Range. Indikator Supertrend menggunakan ATR untuk mengatur band atas dan bawah. Breakout di atas band atas adalah sinyal jual, sementara breakout di bawah band bawah adalah sinyal beli.

Ide di balik perdagangan kurva ekuitas adalah bahwa kita mengambil rata-rata bergerak dari kurva ekuitas strategi. Ketika kurva ekuitas jatuh di bawah rata-rata bergeraknya, kita menghentikan perdagangan untuk strategi saat ini dan menunggu kurva ekuitas bangkit kembali di atas rata-rata bergerak sebelum mengaktifkan kembali perdagangan.

Strategi ini menggabungkan kedua teknik, sehingga setelah indikator Supertrend menghasilkan sinyal perdagangan, kita tidak langsung masuk ke perdagangan. Sebaliknya, kita memeriksa apakah kurva ekuitas saat ini berada di atas rata-rata bergeraknya. Hanya ketika kedua kondisi terpenuhi, kita akan membuka posisi. Ini dapat secara efektif mengurangi risiko yang melekat pada indikator Supertrend itu sendiri dan mencegah kerugian yang berlebihan.

Keuntungan

Keuntungan utama dari strategi ini adalah:

  1. Ini dapat secara efektif mencegah risiko dari indikator Supertrend. Indikator Supertrend itu sendiri tidak dapat secara efektif mengekang kerugian. Perdagangan kurva ekuitas menebus kekurangan ini.

  2. Ketika perdagangan menjadi tidak menguntungkan, kita menghentikan perdagangan untuk menghindari kerugian yang berlebihan.

  3. Ini dapat secara otomatis mengelola posisi tanpa intervensi manual. Perdagangan dihentikan secara otomatis ketika kurva ekuitas jatuh di bawah rata-rata bergerak, dan dilanjutkan ketika kurva ekuitas bangkit kembali di atasnya.

Risiko

Ada juga beberapa risiko dengan strategi ini:

  1. Pengaturan parameter yang salah dapat membuat perdagangan kurva ekuitas tidak efektif.

  2. Ia mungkin gagal menyesuaikan posisi dengan segera ketika tren pasar berubah.

  3. Hal ini mungkin kehilangan peluang perdagangan yang baik sementara menunggu kurva ekuitas untuk rebound.

Tindakan balas:

  1. Optimalkan parameter dan pilih periode rata-rata bergerak terbaik.

  2. Menggabungkan indikator lain untuk menilai tren dan menyesuaikan posisi sesuai.

  3. Memperpendek durasi perdagangan yang ditangguhkan untuk mengurangi kemungkinan kesempatan yang hilang.

Arahan Optimasi

Kita dapat mengoptimalkan strategi dari aspek berikut:

  1. Uji kombinasi parameter yang berbeda untuk menemukan periode ATR dan pengganda optimal.

  2. Coba jenis lain dari rata-rata bergerak, seperti rata-rata bergerak eksponensial, Hull rata-rata bergerak dll

  3. Tambahkan indikator lain untuk menentukan tren pasar, dan sesuaikan posisi ketika tren berubah.

  4. Optimalkan periode rata-rata bergerak untuk menemukan keseimbangan terbaik. Periode yang terlalu panjang dapat kehilangan kesempatan, sementara yang terlalu pendek dapat berhenti terlalu sering.

  5. Mengoptimalkan kondisi untuk menghentikan perdagangan, seperti menetapkan ambang stop loss sebelum penangguhan.

Kesimpulan

Strategi ini dengan cerdas menggabungkan indikator Supertrend dengan perdagangan kurva ekuitas, memanfaatkan kekuatan kedua teknik. Hasil pengujian menunjukkan bahwa dalam kebanyakan kasus, menerapkan perdagangan kurva ekuitas sebenarnya mengurangi profitabilitas. Dengan demikian, strategi ini lebih cocok untuk pedagang defensif. Dengan optimasi parameter dan logika, ini dapat menjadi strategi perdagangan kuantitatif yang sangat praktis.


/*backtest
start: 2023-01-14 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Supertrend & Equity curve with EMA', overlay=false, format=format.price, precision=2, initial_capital=100000)

eqlen = input.int(25, "EQ EMA len", group = "New Equity Curve Settings")
shEQandMA = input.bool(true, "Show Original Equity Curve and MA")
shEQfilt = input.bool(true, "Show Filtered Equity Curve by MA")

Periods = input(title='ATR Period', defval=10, group = "SuperTrend Settings")
src = input(hl2, title='Source', group = "SuperTrend Settings")
Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group = "SuperTrend Settings")
changeATR = input(title='Change ATR Calculation Method ?', defval=true, group = "SuperTrend Settings")

//SuperTrend Code
atr2 = ta.sma(ta.tr, Periods)
atr = changeATR ? ta.atr(Periods) : atr2
up = src - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = src + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

// Strategy main code
buySignal = trend == 1 and trend[1] == -1
sellSignal = trend == -1 and trend[1] == 1
if buySignal
    strategy.entry('Long', strategy.long)
if sellSignal
    strategy.entry('Short', strategy.short)



//Equity Curve calcs
eq = strategy.netprofit
ch = ta.change(eq)
neq = ch != 0 ? eq : na
mova = ta.ema(neq,eqlen)

// New Equity Curve
var float neweq = 0
var int ttrades = 0
var int wintrades = 0
var int losetrades = 0

switch
    strategy.netprofit == strategy.netprofit[1]  => na
    strategy.netprofit < mova and strategy.netprofit[1] > mova  => neweq := neweq + ch
    strategy.netprofit < mova and strategy.netprofit[1] < mova => na
    strategy.netprofit > mova and strategy.netprofit[1] > mova => neweq := neweq + ch

newch = ta.change(neweq)
switch
    newch == 0 => na
    newch > 0 => 
        wintrades := wintrades +1
        ttrades := ttrades +1
    newch < 0 =>
        losetrades := losetrades +1
        ttrades := ttrades +1

//plot(eq, linewidth = 2)
//plot(mova, color=color.red)
//plot(neweq, color= color.green, linewidth = 3)


//Table 
var testTable = table.new(position = position.top_right, columns = 5, rows = 10, bgcolor = color.green, border_width = 1)
table.cell(table_id = testTable, column = 0, row = 0, text = "Strategy: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 1, row = 0, text = "Original: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 2, row = 0, text = "Equity Curve EMA: ", bgcolor=color.white)     

table.cell(table_id = testTable, column = 0, row = 1, text = "Total Trades: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 2, text = "Win Trades: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 3, text = "Lose Trades: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 4, text = "Win Rate: ", bgcolor=color.white)     
table.cell(table_id = testTable, column = 0, row = 5, text = "Net Profit: ", bgcolor=color.white)     

//Equity Curve EMA stat
table.cell(table_id = testTable, column = 2, row = 1, text = str.tostring(ttrades), bgcolor=color.white)     
table.cell(table_id = testTable, column = 2, row = 2, text = str.tostring(wintrades), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 3, text = str.tostring(losetrades), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 4, text = str.tostring(math.round(100*wintrades/ttrades,2)), bgcolor=color.white)
table.cell(table_id = testTable, column = 2, row = 5, text = str.tostring(math.round(neweq)), bgcolor=color.white)

//Original Strategy stat
// table.cell(table_id = testTable, column = 1, row = 1, text = str.tostring(strategy.closedtrades), bgcolor=color.white)     
// table.cell(table_id = testTable, column = 1, row = 2, text = str.tostring(strategy.wintrades), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 3, text = str.tostring(strategy.losstrades), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 4, text = str.tostring(math.round(100*strategy.wintrades/strategy.closedtrades,2)), bgcolor=color.white)
// table.cell(table_id = testTable, column = 1, row = 5, text = str.tostring(math.round(strategy.netprofit)), bgcolor=color.white)




//New Equity curve
var newcurve = array.new_float(0)
var int ida = 0
var bool printEQ = false
if newch !=0 
    array.push(newcurve, neweq)
if bar_index > last_bar_index - array.size(newcurve) - 1 - 20  and array.size(newcurve) > 20 
    printEQ := true
else
    printEQ := false

plot(printEQ and ida < strategy.closedtrades and shEQfilt ? array.get(newcurve, ida) : na, color=color.green, linewidth = 2)

if printEQ
    ida := ida + 1
if ida >= array.size(newcurve) and printEQ
    ida := array.size(newcurve) -1



//Original Equity curve
var newcurve2 = array.new_float(0)
var int ida2 = 0
var bool printEQ2 = false
if ch !=0 
    array.push(newcurve2, eq)
if bar_index > last_bar_index - array.size(newcurve2) - 1 - 20  and array.size(newcurve2) > 20 
    printEQ2 := true
else
    printEQ2 := false

plot(printEQ2 and ida2 < strategy.closedtrades and shEQandMA  ? array.get(newcurve2, ida2) : na, color=color.blue, linewidth = 2)

if printEQ2
    ida2 := ida2 + 1
if ida2 >= array.size(newcurve2) and printEQ2
    ida2 := array.size(newcurve2) -1



//Moving Average Array
var marray = array.new_float(0)
if ch
    array.push(marray, mova)

plot(printEQ2 and  array.size(marray) > 40 and shEQandMA ? array.get(marray, ida2-1) : na, color=color.red, linewidth = 1)

hline(0,"0 line", color=color.black, linestyle = hline.style_dotted)


if (last_bar_index-1) and array.size(newcurve2) > 20 and array.size(newcurve) > 20
    l = label.new(bar_index+2, array.get(newcurve2, array.size(newcurve2)-1), "Original Equity Curve", color=color.rgb(33, 149, 243, 85), textcolor = color.black, style = label.style_label_left)
    label.delete(l[1])
    f = label.new(bar_index+2, array.get(newcurve, array.size(newcurve)-1), "Filtered Equity Curve", color=color.rgb(69, 238, 97, 85), textcolor = color.black, style = label.style_label_left)
    label.delete(f[1])

Lebih banyak