Strategi Dagangan Kuantitatif Berdasarkan Penunjuk Supertrend dan Dagangan Curve Ekuiti

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

img

Ringkasan

Idea utama strategi ini adalah untuk menggabungkan penunjuk Supertrend dengan perdagangan kurva ekuiti. Apabila penunjuk Supertrend menghasilkan isyarat beli atau jual, kita tidak secara langsung melaksanakan perdagangan. Sebaliknya, kita memeriksa sama ada kurva ekuiti semasa berada di bawah purata bergerak. Kita akan membuka kedudukan hanya apabila kurva ekuiti berada di atas purata bergerak. Apabila kurva ekuiti berada di bawah purata bergerak, kita akan menghentikan perdagangan untuk strategi semasa. Ini dapat secara berkesan mencegah pengembangan kerugian.

Logika Strategi

Strategi ini terutamanya terdiri daripada dua bahagian:

  1. Indikator Supertrend
  2. Perdagangan Lorong Ekuiti

Rumus pengiraan untuk penunjuk Supertrend adalah:

Band Atas = Harga Sumber - Pengganda ATR * ATR Band bawah = Harga Sumber + ATR Multiplier * ATR

Di mana ATR bermaksud Julat Benar Purata. Indikator Supertrend menggunakan ATR untuk menetapkan jalur atas dan bawah. Penembusan di atas jalur atas mewakili isyarat jual, sementara penembusan di bawah jalur bawah mewakili isyarat beli.

Idea di sebalik perdagangan lengkung ekuiti adalah bahawa kita mengambil purata bergerak lengkung ekuiti strategi. Apabila lengkung ekuiti jatuh di bawah purata bergeraknya, kita menghentikan perdagangan untuk strategi semasa dan menunggu lengkung ekuiti bangkit kembali di atas purata bergerak sebelum membolehkan perdagangan semula.

Strategi ini menggabungkan kedua-dua teknik, supaya selepas penunjuk Supertrend menghasilkan isyarat perdagangan, kita tidak memasuki perdagangan secara langsung. Sebaliknya, kita memeriksa sama ada kurva ekuiti semasa di atas purata bergeraknya. Hanya apabila kedua-dua syarat dipenuhi, kita akan membuka kedudukan. Ini dapat mengurangkan risiko yang melekat pada penunjuk Supertrend itu sendiri dan mencegah kerugian yang berlebihan.

Kelebihan

Kelebihan utama strategi ini ialah:

  1. Ia dapat mencegah risiko penunjuk Supertrend dengan berkesan. Penunjuk Supertrend itu sendiri tidak dapat mengekang kerugian dengan berkesan. Perdagangan kurva ekuiti menebus kekurangan ini.

  2. Apabila perdagangan menjadi tidak menguntungkan, ia menghentikan perdagangan untuk mengelakkan kerugian yang berlebihan.

  3. Ia boleh menguruskan kedudukan secara automatik tanpa campur tangan manual. Perdagangan dihentikan secara automatik apabila kurva ekuiti jatuh di bawah purata bergerak, dan dilanjutkan apabila kurva ekuiti bangkit kembali di atasnya.

Risiko

Terdapat juga beberapa risiko dengan strategi ini:

  1. Tetapan parameter yang salah boleh menjadikan perdagangan kurva ekuiti tidak berkesan. Tempoh purata bergerak yang sesuai perlu dipilih.

  2. Ia mungkin gagal menyesuaikan kedudukan dengan segera apabila trend pasaran berubah.

  3. Ia mungkin terlepas peluang perdagangan yang baik sambil menunggu lengkung ekuiti bangkit semula.

Tindakan balas:

  1. Mengoptimumkan parameter dan memilih tempoh purata bergerak terbaik.

  2. Menggabungkan penunjuk lain untuk menilai trend dan menyesuaikan kedudukan dengan sewajarnya.

  3. Memendekkan tempoh perdagangan yang digantung untuk mengurangkan kemungkinan peluang yang hilang.

Arahan pengoptimuman

Kita boleh mengoptimumkan strategi dari aspek berikut:

  1. Uji kombinasi parameter yang berbeza untuk mencari tempoh dan pengganda ATR yang optimum.

  2. Cuba jenis purata bergerak lain, seperti purata bergerak eksponen, purata bergerak Hull dan sebagainya.

  3. Tambah penunjuk lain untuk menentukan trend pasaran, dan sesuaikan kedudukan apabila trend berubah.

  4. Mengoptimumkan tempoh purata bergerak untuk mencari keseimbangan yang terbaik.

  5. Mengoptimumkan keadaan untuk menghentikan perdagangan, seperti menetapkan ambang stop loss sebelum penggantungan.

Kesimpulan

Strategi ini dengan bijak menggabungkan penunjuk Supertrend dengan perdagangan kurva ekuiti, memanfaatkan kekuatan kedua-dua teknik. Hasil ujian menunjukkan bahawa dalam kebanyakan kes, menggunakan perdagangan kurva ekuiti sebenarnya mengurangkan keuntungan. Oleh itu, strategi ini lebih sesuai untuk peniaga pertahanan. Dengan parameter dan pengoptimuman logik, ia boleh menjadi strategi perdagangan kuantitatif yang sangat praktikal.


/*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 lanjut