Hệ thống Rùa biển Connecticut


Ngày tạo: 2023-11-06 10:23:12 sửa đổi lần cuối: 2023-11-06 10:23:12
sao chép: 1 Số nhấp chuột: 663
1
tập trung vào
1617
Người theo dõi

Hệ thống Rùa biển Connecticut

Tổng quan

Chiến lược này được phát triển dựa trên hệ thống giao dịch nổi tiếng của Hải Dương, tuân theo các quy tắc nguyên thủy nhất có thể. Nó là một hệ thống theo dõi xu hướng, hình thành tín hiệu nhập và thoát thông qua hai đường cong.

Nguyên tắc chiến lược

  • Sử dụng giá cao nhất để tính toán đường nơm N1 và đường nơm N2 (bằng mặc định là ngày 20 và ngày 55).
  • Sử dụng giá tối thiểu để tính toán đường nơm N3 và đường nơm N4 (bằng mặc định là ngày 10 và ngày 20) để xây dựng đường nơm hai chiều.
  • Khi giá đóng cửa vượt quá đường n2 ngày, làm nhiều; khi giá đóng cửa thấp hơn đường n4 ngày, bằng.
  • Sau khi thực hiện thêm, mỗi lần tăng một lần ATR N lần ((1 lần theo mặc định), đặt cược một lần, tối đa là 5 lần.
  • Thiết lập một dừng cố định, mặc định là ATR N lần dưới giá nhập cảnh ((Điều mặc định là 2 lần).
  • Chỉ được phép vào vị trí mới sau khi giao dịch trước đó đã thắng.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  • Theo nguyên tắc giao dịch xu hướng, có thể bắt được xu hướng đường dài và đường trung.
  • Giao dịch được thực hiện trong các trường hợp có sự biến động, trong đó có các trường hợp có sự biến động.
  • Theo dõi các thiết lập dừng hợp lý, tránh dừng quá rộng hoặc quá hẹp.
  • Sử dụng thiết lập tham số để điều chỉnh các đặc điểm lợi nhuận rủi ro của hệ thống.
  • Các nhà đầu tư khác cũng có thể sử dụng các giao dịch này để tăng lợi nhuận.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  • Không thể dừng lại kịp thời khi xu hướng đảo ngược có thể dẫn đến tổn thất lớn.
  • Lưu trữ quá nhiều lần có thể dẫn đến nguy cơ giao dịch quá mức.
  • Thiết lập tham số không đúng cách có thể dẫn đến hệ thống quá cực đoan hoặc bảo thủ.
  • Dữ liệu phản hồi có nguy cơ phù hợp, hiệu quả của đĩa cứng có thể yếu hơn phản hồi.

Bạn có thể làm giảm nguy cơ bằng cách:

  • Tăng khả năng đánh giá tín hiệu đảo ngược, như MACD lệch, giảm tổn thất ngược.
  • Tối ưu hóa các tham số, làm cho các tham số của hệ thống ổn định.
  • Tăng phương pháp đo kích thước vị trí. Giảm vị trí khi thua lỗ lớn.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  • Thêm logic giao dịch không đầu để chiến lược có thể thu lợi nhuận trong thời gian giảm giá.
  • Thêm mô-đun tối ưu hóa đường dừng để đường dừng có thể điều chỉnh phù hợp với biến động giá.
  • Thêm mô-đun quản lý vị trí để tối ưu hóa kích thước mỗi lần đặt hàng.
  • Kết hợp với chỉ số xu hướng như ADX để đánh giá xu hướng mạnh hoặc yếu, tránh giao dịch sai.
  • Tối ưu hóa tham số để có được đường cong lợi nhuận mịn hơn.
  • Lưu ý chi phí giao dịch như điểm trượt, phí xử lý.

Tóm tắt

Chiến lược này thu được lợi nhuận bằng cách theo dõi xu hướng và có một số lợi thế phản hồi. Tuy nhiên, hiệu quả thực tế vẫn cần được kiểm tra, cần tối ưu hóa thêm các tham số ổn định, hoàn thiện các mô-đun quản lý lỗ hổng và vị trí để làm cho chiến lược phù hợp hơn với giao dịch thực tế. Nhìn chung, chiến lược này là một ý tưởng hợp lý và có tiềm năng cải thiện rất lớn.

Mã nguồn chiến lược
/*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)