Sistem Penyu Laut Connecticut


Tarikh penciptaan: 2023-11-06 10:23:12 Akhirnya diubah suai: 2023-11-06 10:23:12
Salin: 1 Bilangan klik: 663
1
fokus pada
1617
Pengikut

Sistem Penyu Laut Connecticut

Gambaran keseluruhan

Strategi ini dibangunkan berdasarkan sistem dagangan pelaut yang terkenal, mengikut peraturan asal sebanyak mungkin. Ia adalah sistem trend-following, yang membentuk isyarat masuk dan keluar melalui garis-garis berganda.

Prinsip Strategi

  • Garis N1 dan N2 (default 20 dan 55) dibina dengan menggunakan harga tertinggi.
  • Garis N3 dan N4 (default 10 dan 20) dibina dengan menggunakan harga minimum.
  • Apabila harga penutupan melebihi N2, buat lebih banyak; apabila harga penutupan berada di bawah N4, buat kosong.
  • Selepas melakukan lebih banyak, setiap kenaikan adalah N kali ATR ((default 1 kali), menambah sekali, sehingga 5 kali.
  • Tetapkan satu stop loss yang tetap, dengan default ATR N kali ganda di bawah harga kemasukan (default 2 kali ganda).
  • Kedudukan baru hanya dibenarkan selepas perdagangan terdahulu menang.

Analisis kelebihan

Strategi ini mempunyai kelebihan berikut:

  • Mengikut prinsip perdagangan trend, ia mampu menangkap trend garis tengah dan panjang.
  • Garis-garis yang sama membentuk syarat penapisan untuk mengelakkan perdagangan yang kerap berlaku semasa gegaran.
  • Tetapan tracking stop loss adalah munasabah dan mengelakkan stop loss terlalu longgar atau terlalu ketat.
  • Menggunakan tetapan parameter untuk menyesuaikan ciri-ciri risiko dan keuntungan sistem.
  • Ia membolehkan penambahan mata wang untuk mendapatkan keuntungan yang lebih besar daripada trend.

Analisis risiko

Strategi ini mempunyai beberapa risiko:

  • Tidak dapat menghentikan kerugian dalam masa yang tepat apabila trend berbalik, yang boleh menyebabkan kerugian yang lebih besar.
  • Terlalu banyak deposit boleh membawa kepada risiko perdagangan berlebihan.
  • Tetapan parameter yang tidak betul boleh menyebabkan sistem terlalu radikal atau konservatif.
  • Risiko penyesuaian data retesting, kesan keras mungkin lebih lemah daripada retesting.

Anda boleh mengurangkan risiko dengan:

  • Meningkatkan penilaian isyarat pembalikan, seperti MACD yang menyimpang dan sebagainya, mengurangkan kerugian berlawanan arah.
  • Mengoptimumkan parameter, menjadikan parameter sistem stabil.
  • Tambah kaedah Position Sizing. Kurangkan kedudukan apabila terdapat kerugian besar.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  • Menambah logik perdagangan kosong, membolehkan strategi untuk mendapatkan keuntungan dalam keadaan turun.
  • Tambah modul pengoptimuman garis henti supaya garis henti dapat disesuaikan dengan turun naik harga.
  • Menambah modul pengurusan kedudukan untuk mengoptimumkan saiz setiap kedudukan.
  • Menggabungkan indeks trend seperti ADX untuk menilai trend yang kuat dan lemah, untuk mengelakkan perdagangan yang salah.
  • Mengoptimumkan parameter untuk mendapatkan keluk keuntungan yang lebih rata.
  • Pertimbangkan kos urus niaga seperti slippage, yuran, dan lain-lain.

ringkaskan

Strategi ini mendapat keuntungan dengan mengesan trend dan mempunyai kelebihan pengukuran tertentu. Namun, kesan langsung masih perlu diuji, lebih banyak pengoptimuman parameter kelembapan, dan pengoptimuman modul pengurusan stop loss dan kedudukan untuk menjadikan strategi lebih sesuai untuk perdagangan langsung. Secara keseluruhannya, strategi ini masuk akal dan mempunyai potensi peningkatan yang besar.

Kod sumber strategi
/*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)