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.
Strategi ini terutama terdiri dari dua bagian:
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 utama dari strategi ini adalah:
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.
Ketika perdagangan menjadi tidak menguntungkan, kita menghentikan perdagangan untuk menghindari kerugian yang berlebihan.
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.
Ada juga beberapa risiko dengan strategi ini:
Pengaturan parameter yang salah dapat membuat perdagangan kurva ekuitas tidak efektif.
Ia mungkin gagal menyesuaikan posisi dengan segera ketika tren pasar berubah.
Hal ini mungkin kehilangan peluang perdagangan yang baik sementara menunggu kurva ekuitas untuk rebound.
Tindakan balas:
Optimalkan parameter dan pilih periode rata-rata bergerak terbaik.
Menggabungkan indikator lain untuk menilai tren dan menyesuaikan posisi sesuai.
Memperpendek durasi perdagangan yang ditangguhkan untuk mengurangi kemungkinan kesempatan yang hilang.
Kita dapat mengoptimalkan strategi dari aspek berikut:
Uji kombinasi parameter yang berbeda untuk menemukan periode ATR dan pengganda optimal.
Coba jenis lain dari rata-rata bergerak, seperti rata-rata bergerak eksponensial, Hull rata-rata bergerak dll
Tambahkan indikator lain untuk menentukan tren pasar, dan sesuaikan posisi ketika tren berubah.
Optimalkan periode rata-rata bergerak untuk menemukan keseimbangan terbaik. Periode yang terlalu panjang dapat kehilangan kesempatan, sementara yang terlalu pendek dapat berhenti terlalu sering.
Mengoptimalkan kondisi untuk menghentikan perdagangan, seperti menetapkan ambang stop loss sebelum penangguhan.
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])