Sistem Penyu Connecticut

Penulis:ChaoZhang, Tarikh: 2023-11-06 10:23:12
Tag:

img

Ringkasan

Strategi ini adalah berdasarkan sistem perdagangan penyu yang terkenal dan cuba mengikuti peraturan asal sebanyak mungkin.

Logik Perdagangan

  • Tinggi N1 hari (default 20 hari) dan tinggi N2 hari (default 55 hari) digunakan untuk membina purata bergerak berganda.
  • N3 hari rendah (default 10 hari) dan N4 hari rendah (default 20 hari) digunakan untuk membina purata bergerak berganda.
  • Pergi panjang apabila harga penutupan melebihi paras tertinggi N2 hari. Tutup kedudukan apabila harga penutupan jatuh di bawah paras rendah N4 hari.
  • Piramid sehingga 5 kedudukan panjang tambahan, masing-masing 1 x ATR (default 1) di atas harga kemasukan sebelumnya.
  • Tetapkan stop loss tetap pada N x ATR (default 2) di bawah harga masuk.
  • Hanya membenarkan kemasukan baru selepas perdagangan sebelumnya adalah pemenang.

Analisis Kelebihan

Kelebihan strategi ini:

  • Mengikuti prinsip perdagangan trend dan menangkap trend jangka menengah hingga panjang.
  • Pemasaran MA berganda membentuk penapis, mengelakkan perdagangan berlebihan semasa penyatuan.
  • Tetapan stop loss adalah munasabah, mengelakkan terlalu lebar atau terlalu sempit.
  • Parameter boleh dikonfigurasi untuk menyesuaikan profil risiko-balasan.
  • Membolehkan piramid untuk lebih banyak keuntungan semasa trend yang kuat.

Analisis Risiko

Terdapat juga beberapa risiko:

  • Tidak dapat keluar tepat pada masanya apabila trend berbalik, membawa kepada kerugian besar.
  • Terlalu banyak piramid meningkatkan kekerapan perdagangan.
  • Penyesuaian parameter yang tidak betul menjadikan sistem terlalu agresif atau terlalu konservatif.
  • Bias ujian belakang, prestasi sebenar mungkin kurang.

Risiko boleh dikurangkan dengan:

  • Menambah isyarat pembalikan seperti divergensi MACD untuk mengurangkan kerugian.
  • Pengoptimuman parameter yang kukuh.
  • Menambah saiz kedudukan ke saiz kedudukan yang lebih rendah selepas kerugian besar.

Kawasan Peningkatan

Strategi ini boleh ditingkatkan dengan cara berikut:

  • Tambah logik perdagangan pendek untuk mendapat keuntungan daripada harga yang jatuh.
  • Tambah pengoptimuman stop loss untuk menyesuaikan berhenti berdasarkan tindakan harga.
  • Tambah modul pengukuran kedudukan untuk mengoptimumkan saiz piramid.
  • Masukkan indeks kekuatan trend seperti ADX untuk mengelakkan isyarat palsu.
  • Mengoptimumkan parameter untuk pulangan yang lebih lancar.
  • Pertimbangkan kos dagangan sebenar seperti slippage dan komisen.

Kesimpulan

Strategi ini mendapat keuntungan dengan mengikuti trend dan mempunyai hasil backtest yang baik. Tetapi prestasi sebenar perlu disahkan. Pengoptimuman lebih lanjut mengenai ketahanan parameter, stop loss dan saiz kedudukan diperlukan sebelum menerapkannya dalam perdagangan langsung. Secara keseluruhan ia mempunyai logika yang baik dan banyak potensi untuk peningkatan.


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Turtle", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1, pyramiding=5)

stopInput = input(2.0, "Stop N", step=.5)
pyramidInput = input(1, "Pyramid N", step=.5)
l1LongInput = input(20, "L1 Long", minval=5)
l2LongInput = input(55, "L2 Long", minval=5)
l1LongExitInput = input (10, "L1 Long Exit", minval=5)
l2LongExitInput = input (20, "L2 Long Exit", minval=5)

FromYear = input(2000, "From Year", minval=1900),   FromMonth = input(1, "From Month", minval=1, maxval=12),    FromDay = input(1, "From Day", minval=1, maxval=31)
ToYear = input(9999, "To Year", minval=1900),       ToMonth = input(1, "To Month", minval=1, maxval=12),        ToDay = input(1, "To Day", minval=1, maxval=31)
FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00),     ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59)
TradeDateIsAllowed() => time >= FromDate and time <= ToDate
l1Long = highest(l1LongInput)
l1LongExit = lowest(l1LongExitInput)
l2Long = highest(l2LongInput)
l2LongExit = lowest(l2LongExitInput)

// 
// ADX, +-DI
// https://www.tradingview.com/script/rlMJ05yl-ADX-and-DI-pine-script-3-0/
//
len = 14
th = 20
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

// Back to Turtle

filter = true // not (DIPlus < ADX and DIMinus < ADX) and DIPlus > DIMinus
var win = false
var totalPrice = 0.0
var buyPrice = 0.0
var avgPrice = 0.0
var nextBuyPrice = 0.0
var stopPrice = 0.0
var totalBuys = 0

var bool inBuy = false
var float l1LongPlot = highest(l1LongInput)
var float l2LongPlot = highest(l2LongInput)

n = atr(14)

var mode = 'L1'
string longLevel = na

if not inBuy 
    l1LongPlot := highest(l1LongInput)[1]
    l2LongPlot := highest(l2LongInput)[1]
    
    if (close > l2Long[1] and filter)
        mode := 'L2'
        if TradeDateIsAllowed() 
            strategy.close_all()
            strategy.entry("long", strategy.long, comment="L2")
            longLevel := 'L2'

        win := false
        buyPrice := close
        totalBuys := 1
        totalPrice := buyPrice
        avgPrice := buyPrice
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        inBuy := true
    else 
        if (close > l1Long[1] and filter)
            mode := 'L1'
            if not win
                if TradeDateIsAllowed()
                    strategy.close_all()
                    strategy.entry("long", strategy.long, comment="L1")
                    longLevel := 'L1'
            win := false
            buyPrice := close
            totalBuys := 1
            totalPrice := buyPrice
            avgPrice := buyPrice
            stopPrice := close-(stopInput*n)
            nextBuyPrice := high+(pyramidInput*n)
            inBuy := true
        else 
            inBuy := false

else
    l1LongPlot := l1LongPlot[1]
    l2LongPlot := l2LongPlot[1]
    
    if close > nextBuyPrice and TradeDateIsAllowed() and totalBuys < 6
        strategy.entry("long", strategy.long, comment="LP")
        longLevel := 'P'
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        totalBuys := totalBuys + 1
        totalPrice := totalPrice + buyPrice
        avgPrice := totalPrice / totalBuys

    if (close < stopPrice) 
        inBuy := false
        if TradeDateIsAllowed()
            if (close >= avgPrice)
                longLevel := 'SG'
            else 
                longLevel := 'SR'
            strategy.close("long", strategy.long)
        win := false
        buyPrice := 0
        avgPrice := 0
    else
        if (mode == 'L1' and close > l2Long[1] and filter)
            if win
                inBuy := true
                win := false
                mode := 'L2'
                if TradeDateIsAllowed()
                    strategy.close_all()
                    longLevel := 'L2'
                    strategy.entry("long", strategy.long, comment="L2")
                buyPrice := close
                totalBuys := 1
                totalPrice := buyPrice
                avgPrice := buyPrice
                stopPrice := close-(stopInput*n)
                nextBuyPrice := close+(pyramidInput*n)
        else
            if (close < l1LongExit[1] or close < l2LongExit[1])
                inBuy := false
                if TradeDateIsAllowed()
                    strategy.close("long", strategy.long)
                if close < avgPrice
                    longLevel := 'SR'
                    win := false
                else
                    longLevel := 'SG'
                    win := true
                buyPrice := 0

plot(l1LongPlot, title="l1 long", linewidth=3, style=plot.style_stepline, color=color.green)
plot(l1LongExit[1], title="l1 exit", linewidth=3, style=plot.style_stepline, color=color.red)

plot(l2LongPlot, title="l2 long", linewidth=2, style=plot.style_stepline, color=color.green)
plot(l2LongExit[1], title="l2 exit", linewidth=2, style=plot.style_stepline, color=color.red)

plot(stopPrice, title="stop", linewidth=2, style=plot.style_stepline, color=color.purple)

plotarrow(longLevel == 'L1' ? 1 : 0, colordown=color.black, colorup=color.green, transp=40)
plotarrow(longLevel == 'L2' ? 1 : 0, colordown=color.black, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SR' ? -1 : 0, colordown=color.red, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SG' ? -1 : 0, colordown=color.green, colorup=color.purple, transp=40)




Lebih lanjut