Chiến lược này kết hợp các đường chéo trung bình chuyển động và các chỉ số động lực để theo dõi và đảo ngược xu hướng hiệu quả. Đầu tiên nó sử dụng các đường trung bình chuyển động nhanh và chậm để tạo ra tín hiệu đường chéo dài vàng và tín hiệu đường chéo ngắn. Sau đó với các chỉ số động lực của một số thông số nhất định, nếu động lực trên MA nhanh quay trở lại sau đường chéo vàng, xu hướng được coi là tiếp tục và vị trí dài sẽ được duy trì. Khi động lực giảm, nó được coi là đảo ngược xu hướng và vị trí hiện tại sẽ bị đóng.
Logic cốt lõi của chiến lược này dựa trên các tín hiệu xu hướng từ MA crossover và tín hiệu đảo ngược xu hướng từ các chỉ số động lực.
Tính toán giá MA nhanh1 (HMA 5 giai đoạn) và giá MA chậm2 (HMA 7 giai đoạn).
Chữ thập vàng với giá1 vượt trên giá2 tạo ra tín hiệu dài. Chữ thập chết với giá1 vượt dưới giá2 tạo ra tín hiệu ngắn. Đây là cách sử dụng phổ biến của MAs.
Sau tín hiệu dài, nếu động lực roc1 của giá lại xuất hiện, xu hướng được coi là tiếp tục và vị trí dài sẽ được duy trì.
Khi động lượng roc1 giảm xuống, nó được coi là đảo ngược xu hướng và vị trí hiện tại sẽ được đóng.
Thiết lập ngưỡng ADX để tránh tín hiệu sai khi không ở trạng thái xu hướng.
So với các chiến lược MA đơn giản, lợi thế lớn nhất của chiến lược này là việc giới thiệu các chỉ số động lực để xác định sự đảo ngược xu hướng nhanh chóng và chính xác hơn.
Bản thân MAs chậm lại các thay đổi giá, trong khi các chỉ số động lực có thể nhanh chóng bắt được các tín hiệu đảo ngược để dừng lỗ hoặc đảo ngược giao dịch kịp thời.
Các tín hiệu đảo ngược dựa trên động lực đáng tin cậy hơn, tránh các lệnh mở / đóng không cần thiết trong giao dịch xu hướng.
ADX tránh các tín hiệu sai trong các thị trường không có xu hướng, giữ chiến lược tập trung hơn vào xu hướng với tỷ lệ thắng cao hơn.
Logic là đơn giản và dễ hiểu, phù hợp cho người mới bắt đầu giao dịch algo.
Không gian tối ưu hóa lớn bằng cách điều chỉnh thời gian MA, tham số động lực vv cho các thị trường khác nhau.
Những rủi ro chính của chiến lược này xuất phát từ:
Bản chất chậm của MAs, có thể gây ra tín hiệu chậm trễ, bỏ lỡ các điểm vào tốt nhất.
Phá vỡ sai gây ra nhập hoặc ra không cần thiết. Cần tối ưu hóa thêm các thông số hoặc bộ lọc bổ sung.
Khám phá sự đảo ngược xu hướng dựa trên đà phát triển, có thể suy yếu trong các biến động thị trường lớn.
ADX không hoàn hảo trong việc phát hiện xu hướng và hợp nhất.
Không xem xét chi phí giao dịch. Đặt stop loss thích hợp khi áp dụng trong giao dịch thực.
Chiến lược có thể được tối ưu hóa thêm trong các khía cạnh sau:
Hãy thử các loại MA khác hoặc điều chỉnh các thông số MA để có hiệu ứng làm mịn tốt hơn.
Tối ưu hóa chiều dài chỉ số động lực để có độ nhạy cao hơn để bắt được sự đảo ngược giá.
Thiết lập bộ lọc giá khi động lực đảo ngược để tránh bị đánh lừa bởi biến động ngắn hạn.
Cải thiện việc sử dụng ADX bằng cách sử dụng các tham số khác nhau ở các mức ADX khác nhau.
Đưa ra các chỉ số âm lượng v.v. để cải thiện chất lượng tín hiệu và lọc các đột phá sai.
Thêm các cơ chế dừng lỗ để kiểm soát lỗ giao dịch duy nhất. Đánh giá chi phí giao dịch thực tế để thiết lập mục tiêu lợi nhuận và dừng lỗ thích hợp.
Chiến lược này kết hợp các lợi thế của MA và các chỉ số động lực để theo dõi xu hướng và nắm bắt sự đảo ngược. So với các chiến lược theo xu hướng thuần túy, nó có thể linh hoạt hơn trong việc đối phó với các giai đoạn thị trường khác nhau, tránh thua lỗ từ đỉnh điểm xu hướng trong khi giữ giao dịch xu hướng. Những cải tiến hơn nữa có thể được thực hiện thông qua tối ưu hóa tham số và giới thiệu các điều kiện phụ trợ. Nói chung, chiến lược có logic rõ ràng và đơn giản, rất phù hợp cho người mới bắt đầu giao dịch algo để học và áp dụng.
/*backtest start: 2023-09-23 00:00:00 end: 2023-10-23 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //study(title="MA Crossover Strategy", overlay = true) strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true) src = input(open, title="Source") price = request.security(syminfo.tickerid, timeframe.period, src) ma1 = input(5, title="1st MA Length") type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"]) ma2 = input(7, title="2nd MA Length") type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"]) adxlen = input(14, title="ADX Smoothing") dilen = input(14, title="DI Length") adxthreshold = input(20, title="ADX threshold") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) //study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="") //plot(sig, color=color.red, title="ADX") 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 f_hma(price, ma1) price2 = if (type2 == "SMA") sma(price, ma2) else if (type2 == "EMA") ema(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 = price1> price2 longCondition = price1> price2 and sig > adxthreshold if (longCondition) strategy.entry("Long", strategy.long) shortCondition = price1 < price2 and sig > adxthreshold if (shortCondition) strategy.entry("Short", strategy.short) lookback1 = input(1, "Lookback 1") roc1 = roc(price1, lookback1) ma1up = false ma1down = false ma2up = false ma2down = false ma1up := nz(ma1up[1]) ma1down := nz(ma1down[1]) ma2up := nz(ma2up[1]) ma2down := nz(ma2down[1]) trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01 if crossover(roc1, trendStrength1) ma1up := true ma1down := false if crossunder(roc1, -trendStrength1) ma1up := false ma1down := true shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold if (shortexitCondition) strategy.close("Short") longexitCondition = ma1down and ma1up[1] and sig > adxthreshold if (longexitCondition) strategy.close("Long")