Sumber dimuat naik... memuat...

Strategi Perdagangan Piramida Dinamik Supertrend Berbilang Tempoh

Penulis:ChaoZhang, Tarikh: 2025-01-06 17:02:35
Tag:ATRSTSL

img

Ringkasan

Ini adalah strategi perdagangan piramid berdasarkan beberapa penunjuk Supertrend. Ia mengenal pasti peluang perdagangan kebarangkalian tinggi menggunakan tiga penunjuk Supertrend dengan tempoh dan pengganda yang berbeza. Strategi ini menggunakan entri piramid dinamik yang membolehkan sehingga tiga kedudukan, digabungkan dengan keadaan stop-loss dinamik dan keluar yang fleksibel untuk memaksimumkan keuntungan sambil mengawal risiko.

Prinsip Strategi

Strategi ini menggunakan tiga penunjuk Supertrend dengan tetapan parameter yang berbeza: pantas, sederhana, dan perlahan. Isyarat kemasukan adalah berdasarkan persimpangan dan arah trend penunjuk ini, melaksanakan pendekatan piramida tiga lapisan: kemasukan pertama apabila penunjuk pantas menunjuk ke bawah manakala titik sederhana menunjuk ke atas dan titik perlahan ke bawah; kemasukan kedua melalui pecah apabila kedua-dua penunjuk pantas dan sederhana menunjuk ke bawah; kemasukan ketiga melalui pecah apabila harga membuat paras tertinggi baru. Keluar dikendalikan melalui pelbagai mekanisme termasuk stop-loss dinamik, berhenti harga purata, dan pembalikan trend keseluruhan.

Kelebihan Strategi

  1. Mekanisme pengesahan berbilang meningkatkan ketepatan dagangan
  2. Pendekatan piramid secara ketara memperkuat keuntungan di pasaran trend
  3. Mekanisme stop-loss dinamik melindungi keuntungan sambil membolehkan trend berkembang
  4. Mekanisme keluar yang fleksibel menyesuaikan diri dengan baik dengan keadaan pasaran yang berbeza
  5. Ukuran kedudukan berasaskan peratusan disesuaikan dengan saiz modal yang berbeza

Risiko Strategi

  1. Boleh menghasilkan isyarat palsu yang kerap di pasaran yang berbeza
  2. Pyramiding boleh membawa kepada pengeluaran yang lebih besar semasa pembalikan trend tiba-tiba
  3. Pelbagai penunjuk boleh menyebabkan isyarat tertunda
  4. Pengoptimuman parameter menghadapi risiko terlalu banyak Ia disyorkan untuk melaksanakan pengurusan wang yang ketat dan pengujian belakang untuk mengawal risiko ini.

Arahan pengoptimuman

  1. Tambah penapis persekitaran pasaran untuk menyesuaikan parameter secara dinamik berdasarkan turun naik
  2. Mengoptimumkan jarak kemasukan dan peruntukan saiz kedudukan
  3. Memperkenalkan penunjuk teknikal tambahan untuk menapis isyarat palsu
  4. Membangunkan mekanisme parameter penyesuaian untuk menyesuaikan diri dengan perubahan pasaran
  5. Meningkatkan mekanisme keluar dengan menambah sasaran keuntungan dan hentian berdasarkan masa

Ringkasan

Strategi ini menangkap peluang trend melalui beberapa penunjuk Supertrend dan entri piramid, sambil mengawal risiko dengan mekanisme stop-loss dinamik dan mekanisme keluar yang fleksibel.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy('4Vietnamese 3x Supertrend', overlay=true, max_bars_back=1000, initial_capital = 10000000000, slippage = 2, commission_type = strategy.commission.percent, commission_value = 0.013, default_qty_type=strategy.percent_of_equity, default_qty_value = 33.33, pyramiding = 3, margin_long = 0, margin_short = 0)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Inputs

// Supertrend Settings
STATRLENGTH1 = input.int(10, title='Fast Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT1 = input.float(1, title='Fast Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH2 = input.int(11, title='Medium Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT2 = input.float(2, title='Medium Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')
STATRLENGTH3 = input.int(12, title='Slow Supertrend ATR Length', group='SUPERTREND SETTINGS')
STATRMULT3 = input.float(3, title='Slow Supertrend ATR Multiplier', group='SUPERTREND SETTINGS')

isUseHighestOf2RedCandleSetup = input.bool(false, group = "Setup Filters")


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculations 
[superTrend1, dir1] = ta.supertrend(STATRMULT1, STATRLENGTH1)
[superTrend2, dir2] = ta.supertrend(STATRMULT2, STATRLENGTH2)
[superTrend3, dir3] = ta.supertrend(STATRMULT3, STATRLENGTH3)

// directionST1 = dir1 == 1 and dir1[1] == 1 ? false : dir1 == -1 and dir1[1] == -1 ? true : false
// directionST2 = dir2 == 1 and dir2[1] == 1 ? false : dir2 == -1 and dir2[1] == -1 ? true : false
// directionST3 = dir3 == 1 and dir3[1] == 1 ? false : dir3 == -1 and dir3[1] == -1 ? true : false


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Calculate highest from supertrend1 uptrend
var float highestGreen = 0
if dir1 < 0 and highestGreen == 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    highestGreen := high
if highestGreen > 0 and (isUseHighestOf2RedCandleSetup ? close < open : true)
    if high > highestGreen
        highestGreen := high
if dir1 >= 0
    highestGreen := 0


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry SL
var entrySL4Long1 = false
var entrySL4Long2 = false
var entrySL4Long3 = false

isUseEntrySL = input.bool(true, group = "Entry SL Option")
dataToCalculate = input.source(low, group = "Entry SL Option")

if isUseEntrySL and (dir1 > 0 and dir2 < 0 and dir3 < 0)
    if strategy.opentrades >= 1
        if dataToCalculate > strategy.opentrades.entry_price(0)
            entrySL4Long1 := true
        else 
            entrySL4Long1 := false

        if entrySL4Long1 and close > strategy.opentrades.entry_price(0)
            strategy.exit('exit1', from_entry = 'long1', stop = strategy.opentrades.entry_price(0))

    if strategy.opentrades >= 2 
        if dataToCalculate > strategy.opentrades.entry_price(1)
            entrySL4Long2 := true
        else 
            entrySL4Long2 := false
    
        if entrySL4Long2 and close > strategy.opentrades.entry_price(1)
            strategy.exit('exit2', from_entry = 'long2', stop = strategy.opentrades.entry_price(1))   

    if strategy.opentrades >= 3 
        if dataToCalculate > strategy.opentrades.entry_price(2) 
            entrySL4Long3 := true
        else 
            entrySL4Long3 := false
    
        if entrySL4Long3 and close >  strategy.opentrades.entry_price(2)
            strategy.exit('exit3', from_entry = 'long3', stop = strategy.opentrades.entry_price(2))

if strategy.closedtrades > strategy.closedtrades[1]
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit3'
        entrySL4Long3 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit2'
        entrySL4Long2 := false
    if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit1'
        entrySL4Long1 := false

    
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Entry
if dir3 < 0
    if dir2 > 0 and dir1 < 0
        strategy.entry('long1', strategy.long)
    else if dir2 < 0
        strategy.entry('long2', strategy.long, stop=superTrend1)
else
    if dir1 < 0 and highestGreen > 0
        strategy.entry('long3', strategy.long, stop=highestGreen)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Exit
isUseAllDowntrendExit = input.bool(true, group = "Exit Type")
if isUseAllDowntrendExit and dir3 > 0 and dir2 > 0 and dir1 > 0 and close < open
    strategy.close_all()

isUseAvgPriceInLoss = input.bool(true, group = "Exit Type")
if isUseAvgPriceInLoss and strategy.position_avg_price > close //and strategy.position_avg_price <= close[1]
    //  and (dir1 > 0 or dir2 > 0 or dir3 > 0)
    //  and strategy.opentrades >= 1  
    //  and strategy.opentrades >= 3  
    strategy.close_all()

isUseAllPositionsInLoss = input.bool(false, group = "Exit Type")
if isUseAllPositionsInLoss
      and (
       false
         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close))

         or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)
             and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close)
             and ((not na(strategy.opentrades.entry_price(2))) and strategy.opentrades.entry_price(2) > close))
         )
    strategy.close_all()


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Plot
plot(superTrend1, title='Fast Supertrend',      color=dir1 == 1 and dir1[1] == 1 ? color.red : dir1 == -1 and dir1[1] == -1 ? color.green : na)
plot(superTrend2, title='Medium Supertrend',    color=dir2 == 1 and dir2[1] == 1 ? color.red : dir2 == -1 and dir2[1] == -1 ? color.green : na)
plot(superTrend3, title='Slow Supertrend',      color=dir3 == 1 and dir3[1] == 1 ? color.red : dir3 == -1 and dir3[1] == -1 ? color.green : na)


Berkaitan

Lebih lanjut