Chiến lược đột phá Double Turtle

Tác giả:ChaoZhang, Ngày: 2023-11-28 16:25:41
Tags:

img

Tổng quan

Chiến lược đột phá rùa đôi tích hợp chiến lược đột phá giao dịch rùa và nguyên tắc dừng lỗ chuyển động của Linda Raschke, với hiệu suất đột phá tuyệt vời và kiểm soát rủi ro nghiêm ngặt. Chiến lược đồng thời theo dõi sự đột phá giá lên và xuống, thiết lập các vị trí dài hoặc ngắn khi đột phá xảy ra và sử dụng dừng lỗ chuyển động và chuyển lợi nhuận để quản lý các vị trí.

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

Lý thuyết cốt lõi là đi ngắn khi phá vỡ chu kỳ nhỏ ở điểm cao chu kỳ lớn, và đi dài khi phá vỡ chu kỳ nhỏ ở điểm thấp chu kỳ lớn. Sau khi mở một vị trí, thiết lập dừng lỗ chuyển động và chuyển lợi nhuận, dừng lỗ đầu tiên để xác nhận rủi ro. Khi số lượng nắm giữ tích lũy vào số lượng lấy lợi nhuận, hủy lệnh dừng lỗ trong chu kỳ tiếp theo, sau đó thoát ra một nửa vị trí và thiết lập dừng lỗ chuyển động và lấy lợi nhuận chuyển động để khóa lợi nhuận và theo dõi chênh lệch.

Các bước hoạt động cụ thể là:

  1. Tính toán chu kỳ lớn (20 chu kỳ) điểm cao trướcHigh và chu kỳ nhỏ (4 chu kỳ) điểm cao nhỏPeriodHigh.

  2. Khi điểm cao của đường K mới nhất lớn hơn mức prevHigh, và mức prevHigh lớn hơn mức smallPeriodHigh, nó cho thấy điểm cao chu kỳ lớn phá vỡ điểm cao chu kỳ nhỏ.

  3. Sau khi mở một vị trí, đặt một lệnh dừng lỗ di chuyển. Chờ cho vị trí đảo ngược trước khi hủy lệnh dừng lỗ để tránh bị dừng.

  4. Khi số lượng nắm giữ đạt được số chu kỳ lợi nhuận chuyển động được thiết lập (hiện tại là 0 chu kỳ), thoát ra một nửa vị trí trong chu kỳ tiếp theo và thiết lập lệnh dừng lỗ chuyển động và chuyển lợi nhuận để theo dõi chênh lệch và khóa lợi nhuận.

  5. Đối với các bước đột phá của các điểm thấp, các vị trí dài được thiết lập dựa trên các mối quan hệ đột phá giữa các mức thấp trong chu kỳ lớn và các mức thấp trong chu kỳ nhỏ.

Phân tích lợi thế

Đây là một chiến lược đột phá rất toàn diện với những lợi thế sau:

  1. Kết hợp giao dịch rùa chu kỳ hai có thể xác định hiệu quả các tín hiệu đột phá.

  2. Việc sử dụng các kỹ thuật dừng lỗ và chuyển đổi lợi nhuận kiểm soát nghiêm ngặt rủi ro và tránh tổn thất lớn.

  3. Ra khỏi 2 giai đoạn, lấy lợi nhuận một nửa vị trí tại một thời điểm, sau đó hoàn toàn ra khỏi thông qua di chuyển lấy lợi nhuận, khóa trong lợi nhuận.

  4. Xem xét cả các giao dịch dài và ngắn, phù hợp với các đặc điểm của các thị trường đa trống xen kẽ.

  5. Kết quả backtesting tuyệt vời với hiệu suất giao dịch thực sự mạnh mẽ.

Phân tích rủi ro

Những rủi ro và biện pháp đối phó chính là như sau:

  1. Nguy cơ đột phá sai: điều chỉnh các tham số chu kỳ phù hợp để đảm bảo tính hợp lệ của đột phá.

  2. Rủi ro theo đuổi tăng và giết chết giảm.

  3. Rủi ro của stop loss bị rửa sạch.

  4. Rủi ro của quá nhạy cảm di chuyển dừng lỗ Điều chỉnh cài đặt trượt sau khi dừng lỗ để tránh dừng không cần thiết.

Hướng dẫn tối ưu hóa

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

  1. Thêm bộ lọc đột phá khối lượng để đảm bảo tính xác thực của các đột phá.

  2. Thêm các chỉ số đánh giá xu hướng để tránh mở các vị trí vào cuối xu hướng.

  3. Kết hợp nhiều chu kỳ thời gian hơn để xác định thời gian đột phá.

  4. Tăng các thuật toán học máy để tối ưu hóa động các thông số.

  5. Kết hợp với các chiến lược khác để điều chỉnh thống kê.

Tóm lại

Chiến lược đột phá rùa đôi sử dụng kỹ thuật chu kỳ kép, lý thuyết đột phá và các phương pháp quản lý rủi ro nghiêm ngặt để đảm bảo tỷ lệ thắng cao trong khi đảm bảo lợi nhuận ổn định. Mô hình chiến lược này đơn giản và rõ ràng, dễ hiểu và áp dụng, và nó là một chiến lược định lượng tuyệt vời. Chiến lược này vẫn có tiềm năng tối ưu hóa lớn. Các nhà đầu tư có thể đổi mới trên cơ sở này để tạo ra các hệ thống giao dịch tốt hơn.


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

//@version=3
strategy(title = "Turtle soup plus one", shorttitle = "Turtle soup plus one", overlay=true)

bigPeriod = input(20)
smallPeriod = input(4)
takeProfitBars = input(0)
trailingStop = input(5, title = "Trailing stop percentages")
if (strategy.position_size == 0)
    strategy.cancel("Long")
    strategy.cancel("Short")
    strategy.cancel("Stop")



stopLossPrice = 0.1
stopLossPrice := nz(stopLossPrice[1])
takeProfitStarted = false
takeProfitStarted := nz(takeProfitStarted[1])

prevHigh = highest(high, bigPeriod - smallPeriod)[smallPeriod]
smallPeriodHigh = highest(high, smallPeriod - 1)[1]
if (high > prevHigh and prevHigh > smallPeriodHigh and close > prevHigh and strategy.position_size == 0)
    strategy.order("Short", strategy.short, stop = prevHigh)

if strategy.position_size < 0 and strategy.position_size[1] == 0
    stopLossPrice := high[1]
    strategy.order("Stop", strategy.long, qty = -strategy.position_size, stop = stopLossPrice)
    takeProfitStarted := false

if (strategy.position_size < 0 and sum(strategy.position_size, takeProfitBars) == strategy.position_size * takeProfitBars and close < strategy.position_avg_price and not takeProfitStarted)
    takeProfitStarted := true
    strategy.cancel("Stop")
    strategy.order("ExitHalf", strategy.long, qty = ceil(-strategy.position_size / 2), stop = close)
    if (strategy.position_size != -1)
        strategy.exit("ExitFull", "Short", qty = -strategy.position_size - ceil(-strategy.position_size / 2), loss = stopLossPrice, trail_price  = close, trail_offset = -(close - strategy.position_avg_price) * trailingStop / 100 / syminfo.mintick)
        

prevLow = lowest(low, bigPeriod - smallPeriod)[smallPeriod]
smallPeriodLow = lowest(low, smallPeriod - 1)[1]
if (low < prevLow and prevLow < smallPeriodLow and close < prevLow and strategy.position_size == 0)
    strategy.order("Long", strategy.long, stop = prevLow)

if strategy.position_size > 0 and strategy.position_size[1] == 0
    stopLossPrice := low[1]
    strategy.order("Stop", strategy.short, qty = strategy.position_size, stop = stopLossPrice)
    takeProfitStarted := false

if (strategy.position_size > 0 and sum(strategy.position_size, takeProfitBars) == strategy.position_size * takeProfitBars and close > strategy.position_avg_price and not takeProfitStarted)
    takeProfitStarted := true
    strategy.cancel("Stop")
    strategy.order("ExitHalf", strategy.short, qty = ceil(strategy.position_size / 2), stop = close)
    if (strategy.position_size != 1)
        strategy.exit("ExitFull", "Long", qty = strategy.position_size - ceil(strategy.position_size / 2),loss = stopLossPrice, trail_price  = close, trail_offset = (close - strategy.position_avg_price) * trailingStop / 100 / syminfo.mintick)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2038, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Thêm nữa