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.
Strategi ini terutamanya terdiri daripada dua bahagian:
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 utama strategi ini ialah:
Ia dapat mencegah risiko penunjuk Supertrend dengan berkesan. Penunjuk Supertrend itu sendiri tidak dapat mengekang kerugian dengan berkesan. Perdagangan kurva ekuiti menebus kekurangan ini.
Apabila perdagangan menjadi tidak menguntungkan, ia menghentikan perdagangan untuk mengelakkan kerugian yang berlebihan.
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.
Terdapat juga beberapa risiko dengan strategi ini:
Tetapan parameter yang salah boleh menjadikan perdagangan kurva ekuiti tidak berkesan. Tempoh purata bergerak yang sesuai perlu dipilih.
Ia mungkin gagal menyesuaikan kedudukan dengan segera apabila trend pasaran berubah.
Ia mungkin terlepas peluang perdagangan yang baik sambil menunggu lengkung ekuiti bangkit semula.
Tindakan balas:
Mengoptimumkan parameter dan memilih tempoh purata bergerak terbaik.
Menggabungkan penunjuk lain untuk menilai trend dan menyesuaikan kedudukan dengan sewajarnya.
Memendekkan tempoh perdagangan yang digantung untuk mengurangkan kemungkinan peluang yang hilang.
Kita boleh mengoptimumkan strategi dari aspek berikut:
Uji kombinasi parameter yang berbeza untuk mencari tempoh dan pengganda ATR yang optimum.
Cuba jenis purata bergerak lain, seperti purata bergerak eksponen, purata bergerak Hull dan sebagainya.
Tambah penunjuk lain untuk menentukan trend pasaran, dan sesuaikan kedudukan apabila trend berubah.
Mengoptimumkan tempoh purata bergerak untuk mencari keseimbangan yang terbaik.
Mengoptimumkan keadaan untuk menghentikan perdagangan, seperti menetapkan ambang stop loss sebelum penggantungan.
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])