Chiến lược này sử dụng hai đường trung bình động, cụ thể là 8 giai đoạn và 21 giai đoạn. Nó tạo ra tín hiệu dài khi MA ngắn hơn vượt qua đường dài hơn, và tín hiệu ngắn khi MA ngắn hơn vượt qua đường dài hơn.
Chiến lược cũng kết hợp độ nghiêng của đường trung bình động để lọc ra một số giai đoạn không có xu hướng và chỉ tạo ra tín hiệu khi xu hướng rõ ràng hơn.
Cốt lõi của chiến lược này nằm trong sự chéo chéo giữa các đường trung bình động ngắn hạn và dài hạn. MA ngắn hơn có thể nắm bắt những thay đổi xu hướng nhanh hơn, trong khi MA dài hơn có hiệu ứng lọc tiếng ồn tốt hơn. Việc thiết lập xu hướng tăng được đề xuất khi MA ngắn hơn vượt qua MA dài hơn, dẫn đến tín hiệu dài; Việc thiết lập xu hướng giảm được đề xuất khi MA ngắn hơn vượt qua dưới MA dài hơn, dẫn đến tín hiệu ngắn.
Chỉ khi độ dốc lớn hơn giá trị ngưỡng dương thì tín hiệu dài sẽ được tạo ra. Chỉ khi độ dốc nhỏ hơn giá trị ngưỡng âm thì tín hiệu ngắn sẽ được tạo ra. Điều này giúp lọc ra các khu vực không có xu hướng rõ rệt, dẫn đến tín hiệu giao dịch chất lượng cao hơn.
Cụ thể, logic để tạo tín hiệu giao dịch là:
Những lợi thế của chiến lược này bao gồm:
Một số rủi ro cũng tồn tại với chiến lược này:
Một số cách tối ưu hóa dựa trên những rủi ro này:
Một số hướng để tối ưu hóa chiến lược:
Tóm lại, chiến lược MA kép này rất đơn giản và thực tế. Bằng cách nắm bắt các đặc điểm xu hướng khác nhau thông qua hai thông số thời gian và kết hợp chúng để tạo ra tín hiệu giao dịch. Trong khi đó, kết hợp ngưỡng độ dốc cải thiện chất lượng tín hiệu. Chiến lược này có thể phục vụ như một cơ sở cơ bản cho các phần mở rộng, với không gian tối ưu hóa và tiềm năng rộng rãi.
/*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)