
Chiến lược này là một chiến lược theo dõi xu hướng, kết hợp Nadaraya-Watson regression và ATR channel để xác định hướng và điểm vào của xu hướng. Khi giá phá vỡ đường mòn xuống, làm nhiều hơn; Khi giá phá vỡ đường mòn lên, bằng phẳng.
Đầu tiên, chiến lược này sử dụng Nadaraya-Watson Nuclear Regression để tính toán đường cong của hai giai đoạn tụt hậu khác nhau, sau đó so sánh sự giao nhau của hai đường cong để xác định hướng xu hướng. Cụ thể, tính toán đường cong của giai đoạn h và giai đoạn h-lag tương ứng, được đánh giá là thuận lợi khi đi qua đường cong giai đoạn h trên đường cong giai đoạn h-lag; được đánh giá là lạc quan khi đi qua đường cong giai đoạn h dưới đường cong giai đoạn h-lag.
Thứ hai, chiến lược này sử dụng đường ATR để xác định điểm vào. Đường trên là đường cong quay trở lại cộng với ATR n-phần, đường cong quay trở lại là đường cong quay trở lại trừ ATR n-phần.
Cuối cùng, thiết lập một cơ chế dừng lỗ. Nếu giá liên tục stopLossBars gốc K thấp hơn giá nhập, dừng lỗ.
Chiến lược này kết hợp phân tích hồi quy và đột phá kênh để nắm bắt chính xác hơn về hướng và cường độ của xu hướng thị trường. Phương pháp này làm giảm tín hiệu giả và do đó tăng sự ổn định của chiến lược so với việc sử dụng chỉ số như đường trung bình di chuyển để xác định xu hướng.
Ngoài ra, ATR channel đã thiết lập các điểm vào hợp lý để tránh nhầm vào gần điểm đảo ngược xu hướng. Các cơ chế dừng lỗ cũng kiểm soát hiệu quả các tổn thất đơn lẻ.
Vì vậy, chiến lược này có những lợi thế như khả năng nhận diện xu hướng mạnh mẽ, xuất cảnh chính xác hơn và có thể kiểm soát rủi ro dừng lỗ đơn lẻ.
Rủi ro lớn nhất của chiến lược này là khi phá vỡ kênh ATR, giá có thể đang đảo ngược hoặc cân bằng, dẫn đến không phù hợp để vào hoặc dừng lại ngay sau khi vào.
Ngoài ra, đường cong regression và đường ATR đều cần phải tối ưu hóa các tham số nhất định. Nếu các tham số được thiết lập không đúng cách, phân tích regression sẽ không hiệu quả, hoặc ATR quá lớn và quá nhỏ, sẽ ảnh hưởng đến hiệu quả của chiến lược.
Có thể xem xét kết hợp với các chỉ số khác để đánh giá xu hướng và tín hiệu đảo ngược, chẳng hạn như VOLUME, MACD, v.v., để tăng sự ổn định và chính xác của chiến lược.
Các hàm hạt nhân trong phân tích hồi quy cũng có thể được điều chỉnh, chẳng hạn như xem xét hạt nhân Epanechnikov, để xem có thể có được hiệu quả phù hợp tốt hơn hay không.
Chu kỳ ATR và nhân của kênh ATR cũng cần được kiểm tra và tối ưu hóa để tìm ra sự kết hợp tham số tốt nhất.
Chiến lược này sử dụng tổng hợp các phương pháp phân tích hồi quy và phá vỡ kênh để xác định hướng và cường độ của xu hướng, đặt điểm vào tại các điểm hợp lý và đặt điểm dừng để đạt được chiến lược theo dõi xu hướng ổn định. Có rất nhiều không gian để tối ưu hóa các chiến lược phụ và đáng để thử nghiệm và cải thiện thêm.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Custom Strategy with Stop Loss and EMA", overlay=true)
src = input(close, title='Source')
h = input(10, title='Lookback Window', tooltip='The number of bars used for the estimation.')
r = input(10, title='Relative Weighting', tooltip='Relative weighting of time frames.')
x_0 = input(50, title='Start Regression at Bar', tooltip='Bar index on which to start regression.')
lag = input(2, title='Lag', tooltip='Lag for crossover detection.')
stopLossBars = input(3, title='Stop Loss Bars', tooltip='Number of bars to check for stop loss condition.')
emaPeriod = input(46, title='EMA Period', tooltip='Period for Exponential Moving Averages.')
lenjeje = input(32, title='ATR Period', tooltip='Period to calculate upper and lower band')
coef = input(2.7, title='Multiplier', tooltip='Multiplier to calculate upper and lower band')
// Function for Nadaraya-Watson Kernel Regression
kernel_regression1(_src, _size, _h) =>
_currentWeight = 0.0
_cumulativeWeight = 0.0
for i = 0 to _size + x_0
y = _src[i]
w = math.pow(1 + (math.pow(i, 2) / ((math.pow(_h, 2) * 2 * r))), -r)
_currentWeight += y * w
_cumulativeWeight += w
[_currentWeight, _cumulativeWeight]
// Calculate Nadaraya-Watson Regression
[currentWeight1, cumulativeWeight1] = kernel_regression1(src, h, h)
yhat1 = currentWeight1 / cumulativeWeight1
[currentWeight2, cumulativeWeight2] = kernel_regression1(src, h-lag, h-lag)
yhat2 = currentWeight2 / cumulativeWeight2
// Calculate Upper and Lower Bands
upperjeje = yhat1 + coef * ta.atr(lenjeje)
lowerjeje = yhat1 - coef * ta.atr(lenjeje)
// Plot Upper and Lower Bands
plot(upperjeje, color=color.rgb(0, 247, 8), title="Upper Band", linewidth=2)
plot(lowerjeje, color=color.rgb(255, 0, 0), title="Lower Band", linewidth=2)
// Calculate EMAs
emaLow = ta.ema(low, emaPeriod)
emaHigh = ta.ema(high, emaPeriod)
// Plot EMAs
plot(emaLow, color=color.rgb(33, 149, 243, 47), title="EMA (Low)", linewidth=2)
plot(emaHigh, color=color.rgb(255, 153, 0, 45), title="EMA (High)", linewidth=2)
// Long Entry Condition
longCondition = low < lowerjeje
strategy.entry("Long", strategy.long, when=longCondition)
// Stop Loss Condition
stopLossCondition = close[1] < strategy.position_avg_price and close[2] < strategy.position_avg_price and close[3] < strategy.position_avg_price
strategy.close("Long", when=stopLossCondition)
// Close and Reverse (Short) Condition
shortCondition = high > upperjeje
strategy.close("Long", when=shortCondition)
strategy.entry("Short", strategy.short, when=shortCondition)