Strategi kuantitatif berdasarkan penunjuk arah aliran super dan perdagangan keluk ekuiti


Tarikh penciptaan: 2024-01-15 11:41:53 Akhirnya diubah suai: 2024-01-15 11:41:53
Salin: 1 Bilangan klik: 601
1
fokus pada
1617
Pengikut

Strategi kuantitatif berdasarkan penunjuk arah aliran super dan perdagangan keluk ekuiti

Gambaran keseluruhan

Idea utama dalam strategi ini adalah untuk menggabungkan indikator hypertrend dengan perdagangan kurva nilai bersih. Apabila indikator hypertrend menghantar isyarat membeli atau menjual, kami tidak melakukan perdagangan secara langsung, tetapi menilai apakah kurva nilai bersih semasa lebih rendah daripada rata-rata bergerak.

Prinsip Strategi

Strategi ini terdiri daripada dua bahagian utama:

  1. Penunjuk Super Trend
  2. Perdagangan kurva nilai bersih

Rumus pengiraan penunjuk trend adalah seperti berikut:

Naik = harga sumber - ATR kali * ATR Laluan bawah = harga sumber + ATR kali * ATR

Di antaranya, ATR menunjukkan purata gelombang sebenar. Indikator super trend menggunakan ATR untuk mengatur naik ke bawah, memberi isyarat menjual apabila harga menembusi atas dan membeli apabila harga menembusi bawah.

Idea perdagangan kurva nilai bersih adalah bahawa kita mengambil rata-rata bergerak pada kurva nilai bersih strategi dan, apabila kurva nilai bersih lebih rendah daripada rata-rata bergerak, menghentikan perdagangan dalam strategi semasa dan menunggu kurva nilai bersih naik kembali melebihi rata-rata bergerak untuk memulakan perdagangan lagi.

Strategi ini menggabungkan kedua-dua, selepas indikator overtrend menghasilkan isyarat perdagangan, kita tidak berdagang secara langsung, tetapi menilai apakah keluk nilai bersih semasa lebih tinggi daripada purata bergerak. Hanya apabila kedua-duanya memenuhi syarat, kita akan membuka kedudukan. Ini dapat menghalang risiko indikator overtrend itu sendiri dan mencegah kerugian yang terlalu besar.

Analisis kelebihan

Kelebihan utama strategi ini ialah:

  1. Ia boleh menghalang risiko penunjuk trend yang melampau. Penunjuk trend yang melampau sendiri tidak dapat mengelakkan kerugian dengan berkesan, dan perdagangan kurva nilai bersih dapat mengatasi kelemahan ini.

  2. Apabila perdagangan tidak menguntungkan, anda boleh menangguhkan perdagangan strategi untuk mengelakkan kerugian yang terlalu besar. Tunggu sehingga pasaran berubah dan boleh dibuka semula.

  3. Ia boleh menguruskan kedudukan secara automatik, tanpa memerlukan campur tangan manusia. Ia secara automatik ditangguhkan apabila keluk nilai bersih adalah di bawah purata bergerak, dan secara automatik dibuka apabila lebih tinggi.

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Penetapan parameter yang salah boleh menyebabkan ketidakupayaan untuk memainkan perdagangan kurva nilai bersih dengan berkesan. Perlu memilih kitaran purata bergerak yang sesuai.

  2. Apabila trend pasaran berubah, mungkin tidak dapat menyesuaikan kedudukan tepat pada masanya.

  3. Oleh kerana perlu menunggu keluk nilai bersih naik, ia mungkin terlepas peluang masuk yang lebih baik.

Kaedah pencegahan:

  1. Parameter pengoptimuman untuk memilih kitaran purata bergerak yang terbaik.

  2. Mengubah kedudukan tepat pada masanya, dengan menggabungkan trend penilaian dengan petunjuk lain.

  3. Memperolehi peluang yang lebih baik untuk mengurangkan peluang untuk terlepas masuk ke dalam pasaran.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Uji kombinasi parameter yang berbeza untuk mencari kitaran ATR dan pengganda ATR terbaik.

  2. Cuba jenis purata bergerak lain, seperti purata bergerak indeks, purata bergerak Hull, dan lain-lain.

  3. Menambah petunjuk lain untuk menilai trend pasaran, dan menyesuaikan kedudukan tepat pada masanya apabila trend berubah.

  4. Mengoptimumkan kitaran purata bergerak untuk mencari titik keseimbangan terbaik. Kitaran yang terlalu panjang akan kehilangan peluang, dan kitaran yang terlalu pendek akan sering ditangguhkan.

  5. Mengoptimumkan syarat untuk menghentikan perdagangan, seperti menetapkan garis stop-loss, hanya berhenti selepas kerugian mencapai tahap tertentu.

ringkaskan

Strategi ini dengan bijak menggabungkan indikator hypertrend dan perdagangan kurva nilai bersih. Ia mengekalkan kelebihan indikator hypertrend untuk menentukan trend, tetapi ia juga mengawal risiko dengan berkesan melalui perdagangan kurva nilai bersih. Hasil ujian menunjukkan bahawa dalam kebanyakan kes, penggunaan perdagangan kurva nilai bersih akan mengurangkan tahap keuntungan.

Kod 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])