
Chiến lược này kết hợp các chỉ số chuyển động và chuyển động để theo dõi hiệu quả xu hướng và đảo ngược kịp thời. Chiến lược này sử dụng các đường trung bình di chuyển nhanh và đường trung bình di chuyển chậm để tạo ra tín hiệu giao dịch vàng và giao dịch chết. Sau đó kết hợp các chỉ số chuyển động với một số tham số nhất định, nếu các chỉ số chuyển động trên đường trung bình di chuyển nhanh tăng trở lại, thì nó được coi là xu hướng tiếp tục, giữ nhiều; khi các chỉ số chuyển động giảm, thì nó được coi là xu hướng đảo ngược, bằng phẳ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 hình thành từ các đường trung bình di chuyển và các chỉ số động lực để xác định xu hướng đảo ngược. Logic mã của các phần quan trọng như sau:
Tính giá trị trung bình di chuyển nhanh price1 và giá trị trung bình di chuyển chậm price2 ◄ trong đó price1 là HMA 5 chu kỳ, price2 là HMA 7 chu kỳ ◄
Khi giá 1 vượt qua giá 2 tạo ra tín hiệu đa, và khi giá 1 vượt qua giá 2 tạo ra tín hiệu trống. Đây là cách sử dụng thông thường dựa trên đường trung bình di chuyển.
Sau khi kích hoạt nhiều tín hiệu, nếu chỉ số động lựcroc1 của giá trung bình di chuyển nhanh price1 tăng trở lại, thì nó được coi là xu hướng tiếp tục và duy trì nhiều trạng thái.
Khi chỉ số động lựcroc1 giảm, xu hướng được coi là đảo ngược và thực hiện vị trí bằng phẳng.
Tiếp đó, giới thiệu ADX threshold, được sử dụng để lọc các tín hiệu sai trong trạng thái không theo xu hướng, chỉ khi ADX cao hơn threshold thì sẽ tạo ra tín hiệu thực tế.
Lợi thế lớn nhất của chiến lược này so với chiến lược trung bình di chuyển đơn giản là việc đưa ra các chỉ số động lực để xác định xu hướng đảo ngược, có thể theo dõi xu hướng và đảo ngược kịp thời và chính xác hơn. Các lợi thế cụ thể như sau:
Đường trung bình di chuyển tự nó phản ứng chậm với sự thay đổi của giá, trong khi chỉ số động lượng có thể bắt được tín hiệu đảo ngược nhanh hơn, có lợi cho việc dừng lỗ kịp thời hoặc mở lệnh đảo ngược.
Các tín hiệu đảo ngược được xác định dựa trên các chỉ số động lực có thể được tin cậy hơn, có thể giảm bớt việc mở các vị trí ngang hàng không cần thiết trong giao dịch xu hướng.
Việc sử dụng chỉ số ADX tránh các tín hiệu sai trong thị trường không xu hướng, cho phép chiến lược tập trung nhiều hơn vào giai đoạn xu hướng, do đó tăng khả năng kiếm lợi nhuận.
Chiến lược logic rõ ràng và đơn giản, dễ hiểu và dễ theo dõi, phù hợp cho người mới bắt đầu học giao dịch thuật toán.
Các tham số chỉ số có thể được tối ưu hóa cho các thị trường khác nhau bằng cách điều chỉnh chu kỳ trung bình di chuyển, tham số động lượng.
Những rủi ro chính trong chiến lược này là:
Đường trung bình di chuyển tự nó bị trễ phản ứng với sự thay đổi giá, có thể dẫn đến tín hiệu bị trễ và bỏ lỡ thời gian đầu vào tốt nhất.
Bước đột phá giả tạo ra mở hoặc đóng vị trí không cần thiết, cần tối ưu hóa các tham số chỉ số hơn nữa hoặc đưa ra các điều kiện lọc bổ sung.
Xu hướng đảo ngược dựa trên chỉ số động lực, hiệu quả của chỉ số động lực có thể bị giảm giá khi thị trường thay đổi mạnh mẽ.
Chỉ số ADX không có khả năng đánh giá xu hướng và cân bằng hoàn hảo, thiết lập ngưỡng quá cao hoặc quá thấp sẽ gây ra vấn đề.
Chiến lược này không tính đến chi phí giao dịch, khi sử dụng thực tế, hãy chú ý thiết lập điểm dừng lỗ để kiểm soát rủi ro.
Chiến lược này có thể được tối ưu hóa hơn nữa ở những khía cạnh sau:
Thử các loại trung bình di chuyển khác hoặc điều chỉnh các tham số trung bình di chuyển để tối ưu hóa hiệu quả trơn tru của chỉ số.
Tối ưu hóa tham số chiều dài của chỉ số động lực để nó có thể nắm bắt được sự đảo ngược giá một cách nhạy cảm hơn.
Cố gắng đặt bộ lọc giá khi chỉ số động lực đảo ngược để tránh bị lừa bởi những biến động ngắn hạn.
Tăng cường hơn nữa việc sử dụng ADX, chẳng hạn như sử dụng các tham số khác nhau cho các cấp ADX khác nhau.
Các điều kiện phụ trợ như chỉ số khối lượng giao dịch được giới thiệu, cải thiện chất lượng tín hiệu, lọc các đột phá giả.
Thêm các biện pháp ngăn chặn để kiểm soát tổn thất đơn lẻ. Đánh giá mức phí của thị trường thực tế và thiết lập các điểm dừng hợp lý.
Chiến lược này kết hợp các lợi thế của chỉ số trung bình di chuyển và chỉ số động lực, để thực hiện theo dõi xu hướng và nắm bắt sự đảo ngược. So với theo dõi xu hướng thuần túy, chiến lược này có thể đáp ứng linh hoạt hơn với các giai đoạn khác nhau của thị trường, trong khi vẫn giữ xu hướng giao dịch, tránh thiệt hại do trở lại.
/*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")