
Chiến lược này sử dụng hai trung bình di chuyển, 8 chu kỳ và 21 chu kỳ. Khi di chuyển ngắn hạn trên trung bình di chuyển dài hạn, hãy làm nhiều hơn; Khi di chuyển ngắn hạn dưới trung bình di chuyển dài hạn, hãy làm trống.
Chiến lược này cũng giới thiệu một chỉ số độ lệch của đường trung bình di chuyển để lọc ra một số khoảng không có xu hướng, chỉ tạo ra tín hiệu giao dịch khi xu hướng rõ ràng hơn.
Cốt lõi của chiến lược này nằm ở sự giao thoa giữa đường trung bình di chuyển ngắn hạn và đường trung bình di chuyển dài hạn. Đường trung bình di chuyển ngắn hạn có thể nắm bắt xu hướng thay đổi giá nhanh hơn, trong khi đường trung bình di chuyển dài hạn có hiệu quả lọc tiếng ồn tốt hơn.
Chiến lược này cũng thiết lập một ngưỡng độ lệch. Chỉ khi độ lệch lớn hơn ngưỡng tích cực, tín hiệu nhiều được tạo ra, và chỉ khi độ lệch nhỏ hơn ngưỡng tiêu cực, tín hiệu trống được tạo ra. Điều này có thể lọc ra một số khoảng không có xu hướng rõ ràng, cho phép tín hiệu giao dịch có chất lượng cao hơn.
Cụ thể, chiến lược này có một logic tạo tín hiệu giao dịch như sau:
Chiến lược này có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Những rủi ro này có thể được tối ưu hóa bằng cách:
Chiến lược này cũng có thể được tối ưu hóa theo các hướng sau:
Chiến lược trung bình di chuyển kép này nói chung là đơn giản và thực tế, nó thu được các đặc điểm xu hướng khác nhau thông qua các tham số của hai chu kỳ của các phân kỳ và kết hợp với nhau để tạo ra tín hiệu giao dịch. Đồng thời, việc đưa ra các ngưỡng lệch độ làm tăng chất lượng tín hiệu. Chiến lược này có thể được sử dụng như một chiến lược cơ bản và mở rộng, có rất nhiều không gian tối ưu hóa và khả năng mở rộng.
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//written by sixpathssenin
//@version=4
strategy(title="Dual Moving Average",initial_capital=10000,overlay=true)
ma1= sma(close,8)
ma2= sma(close,21)
angleCriteria = input(title="Angle", type=input.integer, defval=7, minval=1, maxval=13)
i_lookback = input(2, "Angle Period", input.integer, minval = 1)
i_atrPeriod = input(10, "ATR Period", input.integer, minval = 1)
i_angleLevel = input(6, "Angle Level", input.integer, minval = 1)
i_maSource = input(close, "MA Source", input.source)
f_angle(_src, _lookback, _atrPeriod) =>
rad2degree = 180 / 3.141592653589793238462643 //pi
ang = rad2degree * atan((_src[0] - _src[_lookback]) / atr(_atrPeriod)/_lookback)
ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ma1,color=#FF0000)
plot(ma2,color=#00FF00)
crosso=crossover(ma1,ma2)
crossu=crossunder(ma1,ma2)
_lookback = 15
f_somethingHappened(_cond, _lookback) =>
bool _crossed = false
for i = 1 to _lookback
if _cond[i]
_crossed := true
_crossed
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)
long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)
if(long)
strategy.entry("Long",strategy.long)
if(short)
strategy.entry("short",strategy.short)