Chiến lược này sử dụng sự chéo chéo của hai đường trung bình động như là tín hiệu giao dịch, kết hợp với ATR dừng lại cho xu hướng sau khi giao dịch. Ý tưởng cốt lõi là đi dài khi đường trung bình động nhanh vượt qua đường trung bình động chậm, và đi ngắn khi vượt qua dưới, trong khi sử dụng ATR để đặt mức dừng lỗ cho các điểm dừng theo dõi năng động.
Chiến lược này chủ yếu sử dụng hai bộ trung bình động để xác định hướng xu hướng. Trung bình di chuyển nhanh có thời gian 25 ngày, và trung bình di chuyển chậm có thời gian 100 ngày. Một tín hiệu mua được tạo ra khi MA nhanh vượt qua trên MA chậm, và một tín hiệu bán được tạo ra khi vượt qua dưới.
Để lọc ra một số tín hiệu sai, chiến lược thêm một bộ đếm chéo được gọi là crossCount. Các tín hiệu chỉ được kích hoạt khi số lượng chéo cho MA nhanh trong thời gian truy cập lại (mục tiêu 25 ngày) nhỏ hơn maxNoCross (mục tiêu 10).
Ngoài ra, chiến lược có một cơ chế xác nhận, trong đó tín hiệu cũng được xác nhận nếu giá quay trở lại giữa hai đường trung bình động sau tín hiệu ban đầu.
Sau khi nhập vị trí, chiến lược sử dụng ATR để thiết lập mức dừng lỗ. ATR đo phạm vi biến động giá trong một khoảng thời gian nhất định, và ở đây 14x của nó được sử dụng như khoảng cách dừng. Mức dừng nổi theo chuyển động giá.
Chiến lược có những lợi thế sau:
Sử dụng hai đường chéo MA với lọc, nó có thể nắm bắt hiệu quả các chuyển động xu hướng mạnh trong khi tránh các tín hiệu sai.
Cơ chế xác nhận ngăn chặn bị giả mạo bởi các vụ đột nhập giả.
Lệnh dừng lỗ ATR nổi giúp tối đa hóa lợi nhuận trong khi hạn chế rút tiền.
Nó có ít thông số tối ưu hóa và dễ thực hiện.
Áp dụng trên các thị trường bao gồm tiền điện tử và tài sản truyền thống.
Kết hợp nhiều chỉ số kỹ thuật cho độ bền.
Các rủi ro chính của chiến lược bao gồm:
Các đường băng MA thường xuyên vượt qua trong thời gian giới hạn phạm vi có thể gây ra nhiều tổn thất.
Cài đặt tham số ATR không chính xác có thể dẫn đến việc dừng quá rộng hoặc quá chặt.
Những khoảng trống lớn có thể trực tiếp kích hoạt dừng lại.
Các sự kiện tin tức lớn gây ra sự biến động lớn cũng có thể ngăn chặn các vị trí.
Các thông số MA không đầy đủ có thể dẫn đến việc thiếu xu hướng hoặc quá nhiều tín hiệu sai.
Hành động giá gần đây có thể làm cho các điểm dừng ATR lỗi thời.
Chiến lược có thể được tối ưu hóa thêm trong các khía cạnh sau:
Tối ưu hóa các thông số MA để tìm kết hợp tốt hơn, thử nghiệm các khoảng thời gian khác nhau và trung bình trọng số.
Kiểm tra các khoảng thời gian ATR khác nhau để tìm ra khoảng cách dừng tốt hơn.
Thêm các bộ lọc bổ sung như âm lượng tăng, chỉ số biến động để cải thiện chất lượng tín hiệu.
Bao gồm các chỉ số xu hướng để tránh những sự cố trong thị trường hỗn loạn.
Thêm các thuật toán học máy để tự động tối ưu hóa các thông số thông qua backtesting.
Tìm kiếm xác nhận hơn trong khung thời gian dài hơn để tránh tiếng ồn ngắn hạn.
Thực hiện các quy tắc thu lợi nhuận theo giai đoạn để mở rộng các vị trí có lợi nhuận.
Chiến lược này kết hợp hai đường chéo MA, lọc xu hướng, xác nhận và dừng ATR năng động để theo dõi xu hướng mạnh mẽ.
/*backtest start: 2023-10-02 00:00:00 end: 2023-11-01 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("QuantCat Intraday Strategy (15M)", overlay=true) //MA's for basic signals, can experiment with these values fastEMA = sma(close, 25) slowEMA = sma(close, 100) //Parameters for validation of position lookback_value = 25 maxNoCross=10 //value used for maximum number of crosses on a certain MA to mitigate noise and maximise value from trending markets //Amount of crosses on MA to filter out noise ema25_crossover = (cross(close, fastEMA)) == true ? 1 : 0 ema25_crossover_sum = sum(ema25_crossover, lookback_value) ///potentially change lookback value to alter results crossCount = (ema25_crossover_sum <= maxNoCross) //Entries long agrLong = ((crossover(fastEMA, slowEMA)) and (crossCount == true)) ? true : false consLong = ((close < fastEMA) and (close > slowEMA) and (fastEMA > slowEMA) and (crossCount == true)) ? true : false //Entries short agrShort = ((crossunder(fastEMA, slowEMA)) and (crossCount == true)) ? true : false consShort = ((close > fastEMA) and (close < slowEMA) and (fastEMA < slowEMA) and (crossCount == true)) ? true : false //ATR atrLkb = input(14, minval=1, title='ATR Stop Period') atrRes = input("15", title='ATR Resolution') atr = request.security(syminfo.tickerid, atrRes, atr(atrLkb)) //Strategy longCondition = ((agrLong or consLong) == true) if (longCondition) strategy.entry("Long", strategy.long) shortCondition = ((agrShort or consShort) == true) if (shortCondition) strategy.entry("Short", strategy.short) //Stop multiplier stopMult = 4 //horizontal stoplosses longStop = na longStop := shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * stopMult) : longStop[1] shortStop = na shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * stopMult) : shortStop[1] //Strategy exit functions strategy.exit("Long ATR Stop", "Long", stop=longStop) strategy.exit("Short ATR Stop", "Short", stop=shortStop) //Plots redgreen = (fastEMA > slowEMA) ? green : red p1 = plot(fastEMA, title="Fast EMA", color=redgreen, linewidth=2) p2 = plot(slowEMA, title="Slow EMA", color=redgreen, linewidth=2) fill(p1, p2, color=redgreen) s1 = plot(longStop, style=linebr, color=red, linewidth=2, title='Long ATR Stop') s2 = plot(shortStop, style=linebr, color=red, linewidth=2, title='Short ATR Stop') fill(p2, s1, color=red, transp=95) fill(p2, s2, color=red, transp=95)