Xu hướng theo chiến lược dựa trên đường chéo trung bình động

Tác giả:ChaoZhang, Ngày: 2024-02-23 12:21:40
Tags:

img

Tổng quan

Chiến lược này xác định hướng xu hướng giá bằng cách tính toán hai đường trung bình động với các thiết lập tham số khác nhau và so sánh các tình huống chéo của chúng, để thực hiện xu hướng sau khi giao dịch. Khi đường trung bình động nhanh phá vỡ đường trung bình động chậm từ dưới, nó được đánh giá là tín hiệu tăng. Khi đường trung bình động nhanh phá vỡ đường trung bình động chậm từ trên, nó được đánh giá là tín hiệu giảm. Chiến lược này có thể đạt được đánh giá xu hướng của các chu kỳ khác nhau bằng cách điều chỉnh các tham số.

Nguyên tắc chiến lược

Chiến lược này sử dụng hai bộ trung bình động với các cài đặt tham số khác nhau để so sánh. Các tham số trung bình động đầu tiên được đặt bởi len1 và type1, và các tham số trung bình động thứ hai được đặt bởi len2 và type2.

Khi đường trung bình di chuyển nhanh vượt qua đường trung bình di chuyển chậm để tạo thành đường chéo vàng, nó được đánh giá là tín hiệu tăng.

Tùy theo hướng của tín hiệu chéo, các vị trí dài hoặc ngắn sẽ được thực hiện. Khi một tín hiệu tăng được kích hoạt, nếu tham số needlong là đúng, một vị trí dài sẽ được mở với số lượng default_qty_value hoặc percentage_of_equity. Khi một tín hiệu giảm được kích hoạt, nếu tham số needshort là đúng, một vị trí ngắn sẽ được mở với số lượng default_qty_value hoặc percentage_of_equity.

Ưu điểm

  1. Hỗ trợ sự kết hợp 7 loại trung bình động khác nhau để thích nghi linh hoạt với điều kiện thị trường
  2. Tùy chỉnh các thông số của hai đường trung bình động để đánh giá xu hướng dài hạn và trung hạn ngắn hạn
  3. Các quy tắc đánh giá tín hiệu đơn giản và rõ ràng, dễ hiểu và thực hiện
  4. Hỗ trợ các vị trí dài và ngắn, có thể thực hiện các giao dịch theo dõi xu hướng

Rủi ro và giải pháp

  1. Các đường trung bình động có tính chất chậm và có thể bỏ lỡ các điểm đảo ngược giá
    Giải pháp: Gióng ngắn đúng chu kỳ trung bình động hoặc sử dụng kết hợp với các chỉ số khác

  2. Không phù hợp với các thị trường biến động cao và đảo ngược thường xuyên
    Giải pháp: Thêm điều kiện lọc để tránh giao dịch trên thị trường dao động

  3. Có một số rủi ro của tín hiệu sai
    Giải pháp: Thêm các chỉ số lọc khác để kết hợp để cải thiện độ tin cậy tín hiệu

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa sự kết hợp chu kỳ của các đường trung bình động và kiểm tra tác động của các tham số chu kỳ dài và ngắn đối với lợi nhuận chiến lược
  2. Kiểm tra hiệu suất của các loại trung bình động khác nhau để tìm thuật toán trung bình động tối ưu
  3. Thêm biến số khối lượng giao dịch hoặc Bollinger Bands để kết hợp để cải thiện chất lượng tín hiệu
  4. Tối ưu hóa chiến lược quản lý vị thế để cải thiện phương pháp tỷ lệ phần trăm_của_tài sản

Tóm lại

Chiến lược này đánh giá xu hướng giá bằng cách so sánh các chéo chéo của hai đường trung bình động, và thực hiện các hoạt động dài và ngắn tương ứng để nắm bắt và lợi nhuận từ xu hướng. Ưu điểm là các quy tắc tín hiệu đơn giản và rõ ràng, các tham số có thể điều chỉnh, khả năng áp dụng mạnh mẽ, và nó có thể được tối ưu hóa và điều chỉnh cho các môi trường thị trường khác nhau.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title = "Noro's MAs Cross Tests v1.0", shorttitle = "MAs Cross tests 1.0", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 0)

needlong = input(true, "long")
needshort = input(true, "short")

len2 = input(15, defval = 15, minval = 2, maxval = 1000, title = "Fast MA length")
type2 = input(1, defval = 1, minval = 1, maxval = 7, title = "Fast MA Type")
src2 = input(close, defval = close, title = "Fast MA Source")

len1 = input(30, defval = 30, minval = 2, maxval = 1000, title = "Slow MA length")
type1 = input(1, defval = 1, minval = 1, maxval = 7, title = "Slow MA Type")
src1 = input(close, defval = close, title = "Slow MA Source")

col = input(false, defval = false, title = "Color of bar")

o = input(false, title = "1 SMA, 2 EMA, 3 VWMA, 4 DEMA, 5 TEMA, 6 KAMA, 7 Price Channel") 

//DEMA 1
dema1 = 2 * ema(src1, len1) - ema(ema(close, len1), len1)

//TEMA 1
xEMA1 = ema(src1, len1)
xEMA2 = ema(xEMA1, len1)
xEMA3 = ema(xEMA2, len1)
tema1 = 3 * xEMA1 - 3 * xEMA2 + xEMA3

//KAMA 1
xvnoise = abs(src1 - src1[1])
nfastend = 0.20
nslowend = 0.05
nsignal = abs(src1 - src1[len1])
nnoise = sum(xvnoise, len1)
nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2) 
kama1 = nz(kama1[1]) + nsmooth * (src1 - nz(kama1[1]))

//PriceChannel 1
lasthigh1 = highest(src1, len1)
lastlow1 = lowest(src1, len1)
center1 = (lasthigh1 + lastlow1) / 2

//DEMA 2
dema2 = 2 * ema(src2, len2) - ema(ema(close, len2), len2)

//TEMA 2
xEMA12 = ema(src2, len2)
xEMA22 = ema(xEMA12, len2)
xEMA32 = ema(xEMA22, len2)
tema2 = 3 * xEMA12 - 3 * xEMA22 + xEMA32

//KAMA 2
xvnoise2 = abs(src2 - src2[1])
nfastend2 = 0.20
nslowend2 = 0.05
nsignal2 = abs(src2 - src2[len2])
nnoise2 = sum(xvnoise2, len2)
nefratio2 = iff(nnoise2 != 0, nsignal2 / nnoise2, 0)
nsmooth2 = pow(nefratio2 * (nfastend2 - nslowend2) + nslowend2, 2) 
kama2 = nz(kama2[1]) + nsmooth2 * (src2 - nz(kama2[1]))

//PriceChannel 2
lasthigh2 = highest(src2, len2)
lastlow2 = lowest(src2, len2)
center2 = (lasthigh2 + lastlow2) / 2

//MAs
ma1 = type1 == 1 ? sma(src1, len1) : type1 == 2 ? ema(src1, len1) : type1 == 3 ? vwma(src1, len1) : type1 == 4 ? dema1 : type1 == 5 ? tema1 : type1 == 6 ? kama1 : type1 == 7 ? center1 : 0
ma2 = type2 == 1 ? sma(src2, len2) : type2 == 2 ? ema(src2, len2) : type2 == 3 ? vwma(src2, len2) : type2 == 4 ? dema2 : type2 == 5 ? tema2 : type2 == 6 ? kama2 : type2 == 7 ? center2 : 0
plot(ma1, color = blue, linewidth = 3, transp = 0)
plot(ma2, color = red, linewidth = 3, transp = 0)

//Signals
trend = ma2 > ma1 ? 1 : ma2 < ma1 ? -1 : trend[1]
up = trend == 1 and ((close < open and close[1] < open[1]) or col == false)
dn = trend == -1 and ((close > open and close[1] > open[1]) or col == false)

if up
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)

if dn
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)

Thêm nữa