Strategi kuantitatif berdasarkan indikator tren super dan perdagangan kurva ekuitas


Tanggal Pembuatan: 2024-01-15 11:41:53 Akhirnya memodifikasi: 2024-01-15 11:41:53
menyalin: 1 Jumlah klik: 601
1
fokus pada
1617
Pengikut

Strategi kuantitatif berdasarkan indikator tren super dan perdagangan kurva ekuitas

Ringkasan

Inti dari strategi ini adalah menggabungkan indikator hypertrend dengan perdagangan kurva nilai bersih. Kami tidak melakukan perdagangan langsung ketika indikator hypertrend mengirimkan sinyal beli atau jual, tetapi menilai apakah kurva nilai bersih saat ini lebih rendah dari rata-rata bergerak. Kami hanya akan membuka posisi ketika kurva nilai bersih lebih tinggi dari rata-rata bergerak.

Prinsip Strategi

Strategi ini terdiri dari dua bagian utama:

  1. Indikator Transtrend
  2. Transaksi kurva nilai bersih

Rumus perhitungan indikator supertrend adalah sebagai berikut:

naik rel = harga sumber - ATR kali * ATR Jalur bawah = harga sumber + ATR kali * ATR

Di antaranya, ATR menunjukkan rata-rata gelombang nyata. Indikator supertrend menggunakan ATR untuk mengatur naik turun, sinyal jual ketika harga menembus tren naik, sinyal beli ketika harga menembus tren turun.

Gagasan trading pada kurva nilai bersih adalah bahwa kita mengambil rata-rata bergerak dari kurva nilai bersih strategi, dan ketika kurva nilai bersih berada di bawah rata-rata bergerak, kita menghentikan perdagangan pada strategi saat ini dan menunggu kurva nilai bersih naik kembali di atas rata-rata bergerak untuk memulai perdagangan lagi.

Strategi ini menggabungkan keduanya, setelah indikator overtrend menghasilkan sinyal perdagangan, kami tidak melakukan perdagangan langsung, tetapi menilai apakah kurva nilai bersih saat ini lebih tinggi dari rata-rata bergerak. Hanya jika keduanya memenuhi syarat, kami akan membuka posisi. Ini dapat secara efektif menghindari risiko indikator overtrend itu sendiri dan mencegah kerugian yang terlalu besar.

Analisis Keunggulan

Keuntungan utama dari strategi ini adalah:

  1. Indikator overtrend sendiri tidak dapat secara efektif menghindari kerugian, perdagangan kurva nilai bersih dapat mengatasi kekurangan ini.

  2. Ketika perdagangan tidak menguntungkan, Anda dapat menghentikan perdagangan strategi untuk menghindari kerugian yang terlalu besar. Anda dapat menunggu sampai pasar bergeser dan dibuka kembali.

  3. Posisi dapat dikelola secara otomatis, tanpa intervensi manusia. Ketika kurva nilai bersih berada di bawah rata-rata bergerak, posisi akan dihentikan secara otomatis, dan jika berada di atas rata-rata bergerak, posisi akan dibuka secara otomatis.

Analisis risiko

Strategi ini juga memiliki beberapa risiko:

  1. Setting parameter yang salah dapat menyebabkan ketidakmampuan untuk melakukan perdagangan kurva nilai bersih secara efektif. Periode rata-rata bergerak yang tepat harus dipilih.

  2. Ketika tren pasar berubah, mungkin tidak dapat menyesuaikan posisi tepat waktu. Hal ini dapat menyebabkan kerugian.

  3. Karena perlu menunggu kurva nilai bersih naik, mungkin akan kehilangan kesempatan masuk yang lebih baik.

Tanggapan:

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

  2. Ada beberapa indikator yang dapat digunakan untuk mengevaluasi tren, seperti:

  3. Memperpendekorasi waktu trading yang ditangguhkan dengan tepat untuk mengurangi kemungkinan terjadinya kegagalan.

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Uji kombinasi parameter yang berbeda untuk menemukan siklus ATR optimal dan ATR multipel.

  2. Cobalah jenis moving average lainnya, seperti moving average indeks, moving average Hull, dan lain-lain.

  3. Menambahkan indikator lain untuk menilai tren pasar, dan menyesuaikan posisi tepat waktu ketika tren berubah.

  4. Optimalkan siklus rata-rata bergerak untuk menemukan titik keseimbangan yang optimal. Periode yang terlalu panjang akan kehilangan kesempatan, dan sesi yang terlalu pendek akan sering dihentikan.

  5. Mengoptimalkan kondisi untuk menghentikan perdagangan, seperti menetapkan batas stop loss, hanya berhenti setelah kerugian mencapai tingkat tertentu.

Meringkaskan

Strategi ini secara cerdik menggabungkan indikator hypertrend dan perdagangan kurva net. Strategi ini mempertahankan keuntungan dari indikator hypertrend untuk menilai tren, tetapi secara efektif mengendalikan risiko melalui perdagangan kurva net. Hasil pengujian menunjukkan bahwa dalam kebanyakan kasus, perdagangan kurva net mengurangi tingkat keuntungan.

Kode Sumber Strategi
/*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])