Chiến lược chuyển động trung bình là một chiến lược giao dịch định lượng đơn giản nhưng hiệu quả dựa trên đường trung bình chuyển động. Nó sử dụng đường chuyển động trung bình nhanh và đường chuyển động trung bình chậm để tạo ra tín hiệu mua và bán. Khi đường nhanh xuyên qua đường chậm từ dưới, một tín hiệu mua được tạo ra. Khi đường nhanh xuyên qua đường chậm từ trên, một tín hiệu bán được tạo ra.
Lập luận cốt lõi của chiến lược này nằm ở việc sử dụng đường trung bình động để đánh giá xu hướng thị trường. Đường trung bình động có chức năng lọc ra tiếng ồn thị trường ngẫu nhiên. Đường trung bình động nhanh có thể phản ứng nhanh hơn với những thay đổi giá và phản ánh các xu hướng mới nhất, trong khi đường trung bình động chậm phản ứng chậm hơn với những thay đổi giá mới nhất và đại diện cho xu hướng trung bình đến dài hạn.
Cụ thể, chiến lược này đầu tiên xác định trung bình di chuyển nhanh sig1 và trung bình di chuyển chậm sig2. Sau đó, điểm mua và bán được xác định theo các mối quan hệ chéo giữa sig1 và sig2. Khi sig1 phá vỡ sig2 từ dưới, một điều kiện dài longCondition được tạo ra. Khi sig1 phá vỡ qua sig2 từ trên, một điều kiện ngắn shortCondition được tạo ra. Chiến lược sau đó đặt lệnh khi các điều kiện dài và ngắn được đáp ứng, và đặt lệnh dừng lỗ và lấy lợi nhuận để thoát.
Những lợi thế của chiến lược này là đáng kể:
Ngoài ra còn có một số rủi ro với chiến lược này:
Các biện pháp tối ưu hóa:
Nói chung, chiến lược chéo trung bình động là một chiến lược số lượng với logic đơn giản, tính thực tế mạnh mẽ và ổn định. Với điều chỉnh tham số và tối ưu hóa thích hợp, nó có thể tạo ra lợi nhuận ổn định trong các môi trường thị trường khác nhau. Đáng chú trọng và áp dụng cho các nhà giao dịch định lượng.
/*backtest start: 2023-11-14 00:00:00 end: 2023-11-16 04:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 // Simple yet effective MA cross strategy. // You'll have to tune the parameters to get an optimal win ratio. // If JPY or XAU or any other currency with pips defined as the // second decimal digit are involved, do not forget to set the respective flag on. // // Created by vitelot/yanez/Vts, who's the same fellow with different user names // December 2018 -- Merry Xmas // strategy("MA cross strategy Vts", overlay=true, initial_capital=1000, currency="EUR", pyramiding=0) yr = input(2016, title="Starting year to analyse") src = input(close, title="Source") maType = input( defval="EMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA"]) // isJPY = input(false, title="Is JPY or XAU involved?") // JPY and Gold have the pips defined as the 2 decimal digit maPar1 = input(26, minval=1, title="MA fast period") maPar2 = input(51, minval=2, title="MA slow period") atrPar = input(14,minval=1, title="ATR period") atrMulSL = input(1.5, title="SL ATR multiplicator") atrMulTP = input(1.0, title="TP ATR multiplicator") hma(sig, n) => // Hull moving average definition wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n))) mcg(sig,length) => // Mc Ginley MA definition mg = 0.0 mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4)) ma(t,sig,len) => if t =="SMA" sma(sig,len) else if t == "EMA" ema(sig,len) else if t == "HMA" hma(sig,len) else if t == "McG" // Mc Ginley mcg(sig,len) else wma(sig,len) sig1 = ma(maType, src, maPar1) sig2 = ma(maType, src, maPar2) tickFactor = isJPY? 1e3: 1e5 sl = atrMulSL*atr(atrPar)*tickFactor tp = atrMulTP*atr(atrPar)*tickFactor plot(sig1, color=aqua, title="MA1", linewidth=2) plot(sig2, color=orange, title="MA2", linewidth=2) longCondition = crossunder(sig2, sig1) and year>=yr // change the >= to == if you like exact years not a range if (longCondition) strategy.entry("Long", strategy.long, qty=1) // exit trade when SL and TP are hit strategy.exit("Exit Long", "Long", loss=sl, profit=tp) if (crossunder(sig1, sig2)) // or when the short condition is met strategy.close("Long") shortCondition = crossover(sig2,sig1) and year>=yr // change the >= to == if you like exact years not a range if (shortCondition) strategy.entry("Short", strategy.short, qty=1) strategy.exit("Exit Short", "Short", loss=sl, profit=tp) if (crossover(sig1,sig2)) strategy.close("Short")