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.
Sản xuất tín hiệu thương mại:
Kiểm soát lượng rút tối đa:
Phân tích chu kỳ từ đỉnh đến cuối:
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.
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.
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.
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.
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.
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.
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.
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ể.
Độ 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.
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.
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.
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.
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ẻ.
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ể.
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.
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.
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)