Chiến lược này tạo ra các tín hiệu giao dịch bằng cách tính toán các loại trung bình động khác nhau (Simple Moving Average SMA, Exponential Moving Average EMA, Hull Moving Average HMA và Weighted Moving Average VWMA) và phát hiện các điểm chéo giữa chúng, để xác định xu hướng thị trường và theo dõi nó. Nó tạo ra tín hiệu mua khi MA ngắn hạn vượt qua trên MA dài hạn từ dưới, và bán tín hiệu khi sự vượt qua ngược lại xảy ra.
Ý tưởng cốt lõi của chiến lược này là đánh giá xu hướng thị trường bằng cách so sánh hai đường trung bình động. Cụ thể, nó cho phép cấu hình hai MA với các loại và chiều dài khác nhau thông qua các thông số đầu vào. MA đầu tiên có thời gian dài hơn để đại diện cho xu hướng chính, trong khi MA thứ hai có thời gian ngắn hơn cho xu hướng ngắn hạn hiện tại.
Khi MA ngắn hạn vượt qua MA dài hạn từ dưới, nó báo hiệu rằng xu hướng ngắn hạn đang tăng cường và thị trường đang đi lên. Do đó, một tín hiệu mua được tạo ra tại điểm chéo này. Ngược lại, khi MA ngắn hạn vượt qua dưới MA dài hạn, nó cho thấy xu hướng ngắn hạn đang suy yếu và thị trường đang đảo ngược xuống. Theo đó, một tín hiệu bán được tạo ra sau đó.
Bằng cách phát hiện các giao thoa MA như vậy, chiến lược này theo xu hướng thị trường đối với thương mại.
Giải pháp:
Chiến lược này dựa trên ý tưởng cổ điển sử dụng MA crossover để phát hiện xu hướng lớn. Với sự kết hợp MA linh hoạt, nó rất đơn giản để thực hiện và phù hợp với tự động hóa giao dịch thuật toán. Nhìn chung nó khá thực tế nhưng để lại chỗ cho các cải tiến như điều chỉnh tham số, bộ lọc bổ sung vv để cải thiện hiệu suất hơn nữa.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //study(title="MA Crossover Strategy", overlay = true) strategy("MA Crossover Strategy", overlay=true) src = input(close, title="Source") price = request.security(syminfo.tickerid, timeframe.period, src) ma1 = input(25, title="1st MA Length") type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA", "VWMA"]) ma2 = input(7, title="2nd MA Length") type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA", "VWMA"]) f_hma(_src, _length)=> _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length))) price1 = if (type1 == "SMA") sma(price, ma1) else if (type1 == "EMA") ema(price, ma1) else if (type1 == "VWMA") vwma(price, ma1) else f_hma(price, ma1) price2 = if (type2 == "SMA") sma(price, ma2) else if (type2 == "EMA") ema(price, ma2) else if (type2 == "VWMA") vwma(price, ma2) else f_hma(price, ma2) //plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0) plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0) plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0) longCondition = crossover(price1, price2) if (longCondition) strategy.entry("Long", strategy.long) shortCondition = crossunder(price1, price2) if (shortCondition) strategy.entry("Short", strategy.short)