Tài nguyên đang được tải lên... tải...

Chiến lược ngắn dài chéo SMA với kiểm soát rút tiền đỉnh và tự động chấm dứt

Tác giả:ChaoZhang, Ngày: 2024-07-29 14:16:58
Tags:SMA

img

Tổng quan

Chiến lược này là một hệ thống giao dịch dài ngắn kết hợp các tín hiệu chéo trung bình di chuyển đơn giản (SMA) với kiểm soát rút đỉnh. Nó sử dụng sự chéo của SMA 14 giai đoạn và 28 giai đoạn để tạo ra các tín hiệu giao dịch dài và ngắn trong khi đồng thời theo dõi mức rút đỉnh của chiến lược. Khi rút vượt quá ngưỡng đã đặt trước, chiến lược sẽ tự động ngừng giao dịch. Ngoài ra, chiến lược bao gồm một tính năng phân tích chu kỳ đỉnh đến đáy chi tiết để giúp các nhà giao dịch hiểu rõ hơn về đặc điểm rủi ro của chiến lược.

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

  1. Sản xuất tín hiệu thương mại:

    • Một tín hiệu dài được tạo ra khi SMA 14 giai đoạn vượt trên SMA 28 giai đoạn.
    • Một tín hiệu ngắn được tạo ra khi SMA 14 giai đoạn vượt qua dưới SMA 28 giai đoạn.
  2. Kiểm soát lượng rút tối đa:

    • Theo dõi thời gian thực của đường cong vốn chủ sở hữu của chiến lược, ghi lại các điểm cao trong lịch sử (đỉnh).
    • Khi vốn chủ sở hữu hiện tại giảm xuống dưới đỉnh, nó đi vào trạng thái rút vốn, ghi lại điểm thấp nhất (thấp nhất).
    • Tỷ lệ rút vốn được tính bằng: (Peak - Trough) / Peak * 100%.
    • Nếu tỷ lệ rút tiền vượt quá ngưỡng rút tiền tối đa đã được đặt trước, chiến lược sẽ ngừng mở các vị trí mới.
  3. Phân tích chu kỳ từ đỉnh đến cuối:

    • Đặt tỷ lệ phần trăm rút tối thiểu để xác định chu kỳ đỉnh đến đáy hợp lệ.
    • Đối với mỗi chu kỳ hợp lệ đã hoàn thành, ghi lại số chu kỳ, tỷ lệ phần trăm chạy trước, tỷ lệ phần trăm rút và thời gian kết thúc.
    • Phân tích hiển thị dẫn đến định dạng bảng để dễ dàng xem xét hiệu suất lịch sử của chiến lược.

Ưu điểm chiến lược

  1. Kết hợp theo dõi xu hướng và kiểm soát rủi ro: Chiến lược chéo SMA là một phương pháp theo xu hướng cổ điển, trong khi kiểm soát rút tiền đỉnh cung cấp một lớp quản lý rủi ro bổ sung.

  2. Khả năng thích nghi cao: Bằng cách đặt các thông số về ngưỡng rút vốn tối đa và tối thiểu, chiến lược có thể được điều chỉnh linh hoạt theo môi trường thị trường khác nhau và sở thích rủi ro cá nhân.

  3. Các chỉ số rủi ro minh bạch: Phân tích chu kỳ từ đỉnh đến đáy cung cấp thông tin chi tiết về việc rút tiền trong lịch sử, cho phép các nhà giao dịch trực quan hiểu các đặc điểm rủi ro của chiến lược, giúp đưa ra các quyết định giao dịch sáng suốt hơn.

  4. Kiểm soát rủi ro tự động: Khi rút tiền vượt quá ngưỡng đã đặt trước, chiến lược sẽ tự động ngừng giao dịch.

  5. Phân tích hiệu suất toàn diện: Ngoài các số liệu kiểm tra ngược thông thường, chiến lược cung cấp dữ liệu chu kỳ từ đỉnh đến đáy chi tiết, bao gồm tỷ lệ phần trăm chạy lên, tỷ lệ phần trăm rút và thông tin về thời gian, tạo điều kiện phân tích sâu về hiệu suất chiến lược.

Rủi ro chiến lược

  1. Sự phụ thuộc quá mức vào dữ liệu lịch sử: Chiến lược chéo SMA dựa trên dữ liệu giá lịch sử và có thể phản ứng chậm trong các thị trường thay đổi nhanh chóng, dẫn đến các tín hiệu sai.

  2. Giao dịch thường xuyên: Trong các thị trường dao động, SMA có thể vượt qua thường xuyên, dẫn đến giao dịch quá mức và chi phí giao dịch cao.

  3. Khả năng rút tiền lớn: Mặc dù kiểm soát thu hút tối đa, một sự sụt giảm lớn trong thời gian biến động thị trường nghiêm trọng vẫn có thể dẫn đến tổn thất đáng kể.

  4. Độ nhạy của tham số: Hiệu suất chiến lược phụ thuộc rất nhiều vào sự lựa chọn các khoảng thời gian SMA và ngưỡng rút vốn.

  5. Những cơ hội thay đổi bị bỏ qua: Khi giao dịch dừng lại sau khi đạt đến ngưỡng rút tiền tối đa, chiến lược có thể bỏ lỡ cơ hội được mang lại bởi sự đảo ngược thị trường.

Hướng dẫn tối ưu hóa chiến lược

  1. giới thiệu điều chỉnh tham số động: Xem xét điều chỉnh động các giai đoạn SMA và ngưỡng rút vốn dựa trên sự biến động của thị trường để thích nghi với môi trường thị trường khác nhau.

  2. Các bộ lọc thị trường bổ sung: Bao gồm các chỉ số kỹ thuật hoặc các yếu tố cơ bản khác, chẳng hạn như RSI hoặc khối lượng, để lọc các tín hiệu sai tiềm năng.

  3. Thực hiện nhập cảnh và xuất cảnh theo giai đoạn: Thay vì các hoạt động tất cả hoặc không có gì, thực hiện xây dựng và đóng cửa vị trí theo giai đoạn để giảm nguy cơ các quyết định đơn lẻ.

  4. Thêm cơ chế lấy lợi nhuận: Ngoài việc kiểm soát rút tiền, thêm một chức năng lợi nhuận năng động để khóa lợi nhuận và cải thiện lợi nhuận tổng thể.

  5. Tối ưu hóa quản lý tiền: Thực hiện phân loại vị trí năng động dựa trên kích thước tài khoản và biến động thị trường để kiểm soát rủi ro tốt hơn.

  6. giới thiệu thuật toán học máy: Sử dụng các kỹ thuật học máy để tối ưu hóa các quy trình lựa chọn tham số và tạo tín hiệu, cải thiện khả năng thích nghi và độ chính xác chiến lược.

Kết luận

Chiến lược ngắn dài chéo SMA kết hợp với kiểm soát rút xuống đỉnh và chấm dứt tự động là một hệ thống giao dịch định lượng cân bằng theo xu hướng và quản lý rủi ro. Nó nắm bắt xu hướng thị trường thông qua các chéo trung bình động đơn giản trong khi quản lý rủi ro giảm bằng cách sử dụng kiểm soát rút xuống đỉnh.

Trong khi chiến lược có một số rủi ro vốn có, chẳng hạn như quá phụ thuộc vào dữ liệu lịch sử và độ nhạy của các tham số, nó có thể cải thiện đáng kể độ bền và lợi nhuận của nó thông qua tối ưu hóa và cải tiến thích hợp.

Nhìn chung, chiến lược này cung cấp cho các nhà giao dịch một điểm khởi đầu tốt có thể được tùy chỉnh và tối ưu hóa để đáp ứng các mục tiêu giao dịch cá nhân và sở thích rủi ro.


/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

capital = 10000

//@version=5
strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100)

// The code below is from Tradingwhale LLC
/// ==============================================================================
//  Peak-Trough Cycles with Date and Prev. RunUp
// Initialize variables
showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?")
min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.")
maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.")

var float equityPeak = na
var float equityTrough = na
var int cycleCount = 0
var bool inDrawdown = false
var float initialCapital = capital
var float prevTrough = initialCapital
var float prevRunUp = na
var bool useLighterGray = true
var int lastYear = na

// Variable to indicate whether the strategy should end
var bool end_strategy = false

// Table to display data
var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1)

// Function to convert float to percentage string
f_to_percent(value) =>
    str.tostring(value, "#.##") + "%"

// Function to get month/year string without commas
get_month_year_string() =>
    str.tostring(year) + "/" + str.tostring(month)

// Update the table headers
if (bar_index == 0 and showTable)
    table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal)

// Track peaks and troughs in equity
if (na(equityPeak) or strategy.equity > equityPeak)
    if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle
        drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
        if drawdownPercentage > min_trough
            cycleCount += 1
            prevRunUp := (equityPeak - prevTrough) / prevTrough * 100
            if cycleCount <= 20 and showTable
                currentYear = year
                if na(lastYear) or currentYear != lastYear
                    useLighterGray := not useLighterGray
                    lastYear := currentYear
                rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50)
                table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal)
            prevTrough := equityTrough
    equityPeak := strategy.equity
    equityTrough := na
    inDrawdown := false
else if (strategy.equity < equityPeak)
    equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity)
    inDrawdown := true

// Calculate if the strategy should end
if not na(equityPeak) and not na(equityTrough)
    drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
    if drawdownPercentage >= maxdraw
        end_strategy := true


// This code below is from Tradingview, but with additions where commented (see below)

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Short Entry Id", strategy.short)



Có liên quan

Thêm nữa