Chiến lược này sử dụng sự biến động của giá để đánh giá thời gian để vào hoặc thoát khỏi vị trí. Mục tiêu là tạo ra vị trí đa đầu khi giá biến động cao và kết thúc vị trí khi xu hướng giá chuyển sang thuận lợi.
Sử dụng chỉ số ATR để đo lường tỷ lệ biến động giá. Xác định giá trị ATR trong 20 chu kỳ gần nhất và tính toán trung bình di chuyển và chênh lệch chuẩn của nó. Nếu giá trị ATR hiện tại vượt quá trung bình cộng với một chênh lệch chuẩn, thì giá sẽ biến động cao hơn.
Sử dụng tỷ lệ thay đổi giá cặp một cấp để xác định xu hướng giá. Tính toán tỷ lệ thay đổi giá bán cuối đối số trong 20 chu kỳ gần đây nhất, tính trung bình di chuyển của nó, nếu tỷ lệ thay đổi hiện tại lớn hơn trung bình và dương trong 3 ngày liên tiếp, giá sẽ được coi là xu hướng tăng lên.
Khi giá biến động cao và giá có xu hướng tăng lên, hãy mở thêm vị thế. Khi giá giảm, giá dừng bị kích hoạt, hãy đóng vị thế.
Sử dụng các biến động giá cao và thấp và xu hướng để làm nhiều thời gian thả lỗ, tránh giao dịch thường xuyên trong thị trường biến động.
Động thái điều chỉnh giá dừng lỗ để tránh dừng lỗ quá nhẹ dẫn đến tổn thất lớn.
Khảo sát cho thấy, từ năm 2015 đến năm 2021, chiến lược này đạt mức lợi nhuận hàng năm 159%, cao hơn nhiều so với chiến lược Mua và Giữ 120%.
Cài đặt tham số ATR quá mạnh có thể dẫn đến quá ít cơ hội truy cập. Các tham số có thể được mở rộng một cách thích hợp để tăng tần suất truy cập.
Các chỉ số đánh giá xu hướng có thể gây ra sai lầm và không phù hợp với xu hướng thực tế, nên tăng yếu tố xác nhận để tránh tổn thất tiềm ẩn.
Chu kỳ phản hồi chỉ là 6 năm, cần mở rộng phạm vi mẫu và kiểm tra độ ổn định, tránh quá phù hợp.
Không thể đánh giá hiệu suất trong các tình huống cực đoan, chẳng hạn như nhanh chóng kiểm soát tình huống, cần can thiệp bằng tay hoặc cài đặt chương trình dừng.
Thêm các chỉ số xác nhận xu hướng, như MACD, KDJ, để xác định chính xác hướng xu hướng.
Các tham số ATR có thể được điều chỉnh tùy thuộc vào các loại khác nhau và tình hình thị trường để tối ưu hóa tỷ lệ biến động.
Thêm mô-đun đánh giá đột phá, cấu hình yếu tố tăng tốc xu hướng, tăng vị trí khi có đột phá.
Kiểm tra hiệu quả của các phương pháp dừng khác nhau, chẳng hạn như dừng phần trăm, dừng biến động.
Đánh giá số lần giao dịch, độ ổn định của đường cong lợi nhuận, mức rút tối đa, v.v. để đảm bảo chiến lược vững chắc.
Chiến lược này tích hợp lợi thế của sự biến động giá và phán đoán xu hướng, đánh giá giá có thể đảo ngược trong trường hợp biến động tăng lên, thiết lập dừng động để kiểm soát rủi ro, từ kết quả kiểm tra lại có lợi nhuận vượt trội tốt. Tuy nhiên, khoảng cách mẫu chỉ là 6 năm, thiết lập tham số quan trọng cần điều chỉnh theo thị trường khác nhau và cần giới thiệu nhiều yếu tố xác nhận để giảm khả năng phán đoán sai, ngoài ra, cần kiểm tra sức khỏe toàn diện hơn cho chiến lược để thực sự hoạt động trên sàn giao dịch. Nói chung, chiến lược này cung cấp một cách suy nghĩ sử dụng hoạt động đảo ngược biến động, nhưng cần tối ưu hóa và kiểm tra sâu hơn, chiến lược cũng có thể trở thành một chiến lược định lượng đáng tin cậy và ổn định.
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 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/
// © DojiEmoji (kevinhhl)
//@version=4
strategy("Mean Reversion (ATR) Strategy [KL]",overlay=true,pyramiding=1)
ENUM_LONG = "Long"
// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2000 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
TSL_line_color := color.black
stop_loss_price := TSL_source - ATR_X2_TSL
else if strategy.position_size > 0
stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }
// Variables for confirmations of entry {
_len_volat = input(20,title="Length of ATR to determine volatility")
_ATR_volat = atr(_len_volat)
_avg_atr = sma(_ATR_volat, _len_volat)
_std_volat = stdev(_ATR_volat,_len_volat)
signal_diverted_ATR = _ATR_volat > (_avg_atr + _std_volat) or _ATR_volat < (_avg_atr - _std_volat)
_len_drift = input(20,title="Length of Drift")//default set to const: _len_vol's default value
_prcntge_chng = log(close/close[1])
_drift = sma(_prcntge_chng, _len_drift) - pow(stdev(_prcntge_chng, _len_drift),2)*0.5
_chg_drift = _drift/_drift[1]-1
signal_uptrend = (_drift > _drift[1] and _drift > _drift[2]) or _drift > 0
entry_signal_all = signal_diverted_ATR and signal_uptrend
// }
alert_per_bar(msg)=>
prefix = "[" + syminfo.root + "] "
suffix = "(P=" + tostring(close) + "; atr=" + tostring(_ATR_volat) + ")"
alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)
// MAIN {
if within_timeframe
if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
alert_per_bar("TSL raised to " + tostring(stop_loss_price))
// EXIT:
if strategy.position_size > 0 and TSL_source <= stop_loss_price
exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
strategy.close(ENUM_LONG, comment=exit_msg)
// ENTRY:
else if entry_signal_all and (strategy.position_size == 0 or (strategy.position_size > 0 and close > stop_loss_price))
entry_msg = strategy.position_size > 0 ? "adding" : "initial"
strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)
if strategy.position_size == 0
stop_loss_price := float(0)
// }