
Ý tưởng chính của chiến lược này là thực hiện một chiến lược theo dõi xu hướng chính xác nhất có thể. Nó đánh giá khả năng tiếp tục của xu hướng tuyến tính hiện tại bằng cách tính toán các mức độ tin tưởng ngưng trệ của một số giá đóng cửa trong quá khứ. Chiến lược này giả định rằng một khi niềm tin vượt quá một mức độ nhất định, xu hướng tuyến tính đang diễn ra có nhiều khả năng tiếp tục.
Chiến lược này tính toán sự phù hợp tuyến tính của giá đóng cửa trong N lần qua bằng phương pháp hồi quy tuyến tính thông thường, để có được độ lệch k của sự phù hợp tuyến tính và độ lệch tiêu chuẩn so với giá đóng cửa σ ∈ . Sau đó, xác định độ tin cậy của xu hướng là k / σ ∈ .
Khi niềm tin của xu hướng vượt quá threshold nhập cảnh nhiều hơn, làm nhiều hơn; khi giảm xuống threshold vị thế ngang bằng nhiều hơn, làm ngang bằng. Tương tự, khi niềm tin của xu hướng thấp hơn threshold nhập cảnh trống hơn, làm trống; khi vượt quá threshold vị trí ngang bằng của threshold trống hơn, làm trống.
Bằng cách này, nó có thể lọc các tín hiệu từ các biến động giá cả hoang dã, không theo xu hướng tuyến tính rõ ràng.
Chiến lược này kết hợp các phương pháp hồi quy tuyến tính trong theo dõi xu hướng và thống kê, tránh theo các biến động giá ngắn hạn và chỉ theo xu hướng dài hạn, do đó có tần suất giao dịch thấp hơn và tỷ lệ thắng cao hơn.
Các tham số của chiến lược này có thể được điều chỉnh rộng rãi, có thể áp dụng cho các giống và thời gian khác nhau bằng cách điều chỉnh các tham số để đạt được tính phổ biến tốt.
Chiến lược này có nguy cơ bị mạo hiểm. Chiến lược này có thể gây ra tổn thất lớn khi giá có xu hướng đảo ngược rõ ràng. Ngoài ra, cài đặt tham số không đúng cũng có thể dẫn đến giao dịch quá mức hoặc bỏ lỡ cơ hội giao dịch tốt.
Bạn có thể thiết lập dừng lỗ để kiểm soát rủi ro mất mát. Đồng thời, bạn phải cẩn thận đánh giá các tùy chọn tham số để tránh tối ưu hóa quá mức.
Chiến lược này có thể được tối ưu hóa hơn trong các lĩnh vực sau:
Thêm stop loss, logic dừng để khóa lợi nhuận, kiểm soát rủi ro
Thêm tham số tự thích ứng với mô-đun tối ưu hóa để tham số có thể được điều chỉnh động
Thêm mô hình học máy để đánh giá điểm đảo ngược xu hướng, tiếp tục nâng cao tỷ lệ chiến lược
Thử nghiệm sự phù hợp của các giống khác nhau, thời gian, tăng khả năng phổ biến
Chiến lược này nói chung là một chiến lược định lượng dựa trên xu hướng dài hạn, kiểm soát rủi ro. Nó kết hợp theo dõi xu hướng và phương pháp hồi quy tuyến tính, có thể lọc các tín hiệu giao dịch tiếng ồn. Nó có thể điều chỉnh các tham số để phù hợp với các giống và chu kỳ khác nhau và là một chiến lược hiệu quả đáng để nghiên cứu và cải tiến.
/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © carefulCamel61097
// ################################################################################################
// "This is a trend following strategy that performed very well on the past 5 years"
// "Intended to be used on BTC-USDT, 4hr timeframe"
// "A factor 2 Leverage can be added by changing Order Size to 200% of equity"
// "Higher leverage is not recommended due to big drawdowns"
// "Also seems to work on 1D timeframe, although ideal parameters may be different"
// "Also seems to work on ETH-USDT and some other altcoins, although ideal parameters are different"
// ################################################################################################
//@version=5
strategy("Trend Following based on Trend Confidence", overlay=false )
// Inputs
source = input(close)
since = input(timestamp('2000-01-01'), title='Start trading interval')
till = input(timestamp('2030-01-01'), title='End trading interval')
length = input(30, title='Length')
longs_on = input.bool(true, title='Longs')
shorts_on = input.bool(true, title='Shorts')
// Parameters for best performance 2018 - 2022
// long_entry = input.float(0.26, step=0.01, title='Long entry threshold')
// long_exit = input.float(-0.10, step=0.01, title='Long exit threshold')
// short_entry = input.float(-0.24, step=0.01, title='Short entry threshold')
// short_exit = input.float(-0.04, step=0.01, title='Short exit threshold')
long_entry = input.float(0.25, step=0.01, title='Long entry threshold')
long_exit = input.float(-0.10, step=0.01, title='Long exit threshold')
short_entry = input.float(-0.25, step=0.01, title='Short entry threshold')
short_exit = input.float(-0.05, step=0.01, title='Short exit threshold')
stop_loss = input.float(10, step=1, title='Stop loss (percentage)') / 100
// Trend Confidence
linreg = ta.linreg(source, length, 0)
linreg_p = ta.linreg(source, length, 0+1)
x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
deviationSum := deviationSum + math.pow(source[i]-(slope*(x-i)+intercept), 2)
deviation = math.sqrt(deviationSum/(length))
slope_perc = slope / source[0]
deviation_perc = deviation / source[0]
trend_confidence = slope_perc / deviation_perc
// Strategy
in_interval = true
sl_long = strategy.position_avg_price * (1 - stop_loss)
sl_short = strategy.position_avg_price * (1 + stop_loss)
if in_interval and longs_on and ta.crossover(trend_confidence, long_entry)
strategy.entry("TC Long Entry", strategy.long)
strategy.exit("TC Long Exit", stop=sl_long)
if in_interval and longs_on and ta.crossunder(trend_confidence, long_exit)
strategy.close("TC Long Entry")
if in_interval and shorts_on and ta.crossunder(trend_confidence, short_entry)
strategy.entry("TC Short Entry", strategy.short)
strategy.exit("TC Short Exit", stop=sl_short)
if in_interval and shorts_on and ta.crossover(trend_confidence, short_exit)
strategy.close("TC Short Entry")
// Plots
plot(trend_confidence, "Trend Confidence", color.rgb(255, 255, 255))
plot(long_entry, "", color.rgb(0, 255, 0), linewidth=1)
plot(long_exit, "", color.rgb(255, 0, 0), linewidth=1)
plot(short_entry, "", color=bar_index % 10 == 0 ? color.rgb(0, 255, 0) : #00000000, linewidth=1)
plot(short_exit, "", color=bar_index % 10 == 0 ? color.rgb(255, 0, 0) : #00000000, linewidth=1)