
Chiến lược này là một hệ thống giao dịch đa luồng kết hợp các tín hiệu giao dịch chéo SMA đơn giản và kiểm soát lùi đỉnh. Nó sử dụng các giao dịch chéo SMA 14 và 28 để tạo tín hiệu giao dịch đa luồng, đồng thời theo dõi thời gian thực về việc lùi đỉnh của chiến lược. Chiến lược sẽ tự động ngừng giao dịch khi lùi vượt quá ngưỡng dự kiến. Ngoài ra, chiến lược cũng bao gồm một phân tích chu kỳ đỉnh - thung lũng chi tiết để giúp thương nhân hiểu rõ hơn về đặc điểm rủi ro của chiến lược.
Tín hiệu giao dịch được tạo ra:
Kiểm soát hồi phục đỉnh điểm:
Phân tích chu kỳ đỉnh - đáy:
Kết hợp theo dõi xu hướng và kiểm soát rủi ro: Chiến lược giao chéo SMA là một phương pháp theo dõi xu hướng cổ điển, trong khi kiểm soát lùi đỉnh cung cấp một lớp quản lý rủi ro bổ sung. Sự kết hợp này có thể kiểm soát hiệu quả rủi ro đi xuống trong khi nắm bắt xu hướng thị trường.
Khả năng thích nghi: Bằng cách thiết lập các giá trị tối đa và tối thiểu cho sự rút lui theo tham số, chiến lược có thể được điều chỉnh một cách linh hoạt theo các điều kiện 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ỳ đỉnh-hạ cung cấp thông tin chi tiết về lịch sử rút lui, cho phép các nhà giao dịch hiểu trực quan về đặc điểm rủi ro của chiến lược, giúp đưa ra quyết định giao dịch thông minh hơn.
Kiểm soát rủi ro tự động: Khi rút ra vượt quá ngưỡng dự kiến, chiến lược tự động dừng giao dịch, một cơ chế có thể ngăn chặn hiệu quả tổn thất liên tục trong môi trường thị trường bất lợi.
Phân tích hiệu quả toàn diện: Ngoài các chỉ số đo đạc thông thường, chiến lược cũng cung cấp dữ liệu chi tiết về chu kỳ đỉnh - đáy, bao gồm thông tin về mức tăng, mức thu hồi và thời gian, giúp phân tích sâu hơn về hiệu suất chiến lược.
Dựa quá nhiều vào dữ liệu lịch sử: Chiến lược giao chéo SMA dựa trên dữ liệu giá lịch sử có thể phản ứng chậm trong thị trường thay đổi nhanh, dẫn đến tín hiệu sai.
Giao dịch thường xuyên: Trong một thị trường bất ổn, SMA có thể bị giao dịch quá nhiều và có thể dẫn đến chi phí giao dịch cao.
Có khả năng rút lui mạnh mẽ: Mặc dù có sự kiểm soát rút lui tối đa, nhưng một lần giảm lớn có thể dẫn đến tổn thất lớn trong thời gian thị trường biến động mạnh.
Tính nhạy cảm của tham số: Hiệu suất của chiến lược phụ thuộc rất nhiều vào chu kỳ SMA và sự lựa chọn của các ngưỡng thu hồi. Thiết lập tham số không phù hợp có thể dẫn đến kết quả tối ưu.
Lỡ mất cơ hội để thay đổi: Chiến lược này có thể bỏ lỡ cơ hội của thị trường đảo ngược khi đạt đến mức dừng giao dịch khi đạt được ngưỡng tháo gỡ tối đa.
Ghi chú thay đổi tham số động: Có thể xem xét điều chỉnh chu kỳ SMA và rút gọn theo biến động của thị trường để phù hợp với môi trường thị trường khác nhau.
Thêm bộ lọc thị trường bổ sung: Kết hợp với các chỉ số kỹ thuật khác hoặc các yếu tố cơ bản, như RSI hoặc khối lượng giao dịch, để lọc các tín hiệu giả mạo tiềm ẩn.
Có thể có một số người tham gia và ra khỏi sân: Thay vì hoạt động toàn kho, có thể thực hiện các đợt xây dựng kho và kho để giảm nguy cơ quyết định đơn lẻ.
Tham gia hệ thống ngăn chặn: Trên cơ sở kiểm soát rút lui, thêm chức năng dừng động để khóa lợi nhuận và tăng tỷ lệ lợi nhuận tổng thể.
Tối ưu hóa quản lý tài chính: Thực hiện quản lý vị trí động dựa trên quy mô tài khoản và biến động thị trường để kiểm soát rủi ro tốt hơn.
Lập trình thuật toán học máy: Sử dụng công nghệ học máy để tối ưu hóa lựa chọn tham số và quá trình tạo tín hiệu, nâng cao khả năng thích ứng và độ chính xác của chiến lược.
Chiến lược SMA giao thoa đa luồng kết hợp kiểm soát lùi đỉnh và tự động chấm dứt là một hệ thống giao dịch định lượng kết hợp theo dõi xu hướng và quản lý rủi ro. Nó nắm bắt xu hướng thị trường bằng cách giao thoa các đường trung bình di chuyển đơn giản, đồng thời sử dụng kiểm soát lùi đỉnh để quản lý rủi ro giảm.
Mặc dù có một số rủi ro vốn có của chiến lược, chẳng hạn như sự phụ thuộc quá nhiều vào dữ liệu lịch sử và tính nhạy cảm của tham số, nhưng nó có thể được cải thiện đáng kể bằng cách tối ưu hóa và cải tiến thích hợp, chẳng hạn như giới thiệu điều chỉnh tham số động, thêm bộ lọc thị trường bổ sung và quản lý quỹ thông minh hơn.
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, trên cơ sở đó có thể được tùy chỉnh và tối ưu hóa hơn nữa để đáp ứng mục tiêu giao dịch và sở thích rủi ro của cá nhân. Thiết kế mô đun của chiến lược cũng giúp nó dễ dàng tích hợp với các chiến lược giao dịch khác hoặc các công nghệ quản lý rủi ro, tạo nền tảng cho việc xây dựng các hệ thống giao dịch phức tạp và toàn diện hơn.
/*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)