Chiến lược Phá vỡ Động lực Trung bình Di chuyển

Tác giả:ChaoZhang, Ngày: 2023-11-27 16:25:54
Tags:

img

Tổng quan

Chiến lược Moving Average Momentum Breakout là một chiến lược giao dịch chứng khoán kết hợp các tín hiệu chéo trung bình chuyển động với các chỉ số động lực. Chiến lược sử dụng nhiều chỉ số kỹ thuật bao gồm Trung bình chuyển động nhân tố (EMA), Trung bình chuyển động đơn giản (SMA), Divergence hội tụ trung bình chuyển động (MACD) và chỉ số sức mạnh tương đối được sửa đổi (StockRSI) để tạo ra tín hiệu mua khi xác nhận xu hướng tăng dài hạn. Khi các chỉ số động lực ngắn hạn hiển thị tín hiệu đảo ngược, chiến lược kiếm lợi nhuận.

Chiến lược logic

Các thành phần chính của chiến lược này là:

  1. EMA/SMA Crossover: Đường EMA nhanh 9 giai đoạn vượt qua đường SMA chậm 21 giai đoạn để kích hoạt tín hiệu mua.

  2. Chỉ số MACD: Biểu đồ MACD cần phải dương tính khi kết hợp với tín hiệu chéo EMA/SMA như một xác nhận bổ sung.

  3. Chỉ số StockRSI: Các tín hiệu được kích hoạt khi StockRSI vượt quá mức OVERBOUGHT (80) hoặc dưới mức OVERSOLD (20).

  4. Bollinger Bands: Yêu cầu giá phải nằm trong các dải mà dải giữa là SMA 20 giai đoạn và chiều rộng của dải là hai độ lệch chuẩn.

  5. Ngừng mất mát và kiếm lợi nhuận: Tính toán dựa trên ATR 14 giai đoạn.

Chiến lược này đòi hỏi ít nhất 2 trong số 3 chỉ số để cung cấp tín hiệu mua, giá nằm trong Bollinger Bands và xu hướng dài hạn vẫn tăng để tạo ra tín hiệu mua cuối cùng.

Phân tích lợi thế

Các điểm mạnh chính của chiến lược này là:

  1. Kết quả kiểm tra hậu quả tuyệt vời: Nhiều chỉ số đã được chứng minh dẫn đến hiệu suất vượt trội so với chỉ số tham khảo và các chỉ số riêng lẻ.

  2. Các thông số tối ưu: Các thông số chính như thời gian EMA và Bollinger Bands được tối ưu hóa để cải thiện sự ổn định.

  3. Đánh giá giá giá trị của các sản phẩm: Bollinger Bands và ATR cho phép điều chỉnh động các điểm dừng để kiểm soát rủi ro tốt hơn.

  4. Dễ thực hiện: Cấu trúc mã sạch và dễ tiếp cận dữ liệu dẫn đến các hoạt động thực tế đơn giản.

Phân tích rủi ro

Mặc dù hiệu suất tốt, những rủi ro chính bao gồm:

  1. Những tín hiệu sai: Sự biến động bất thường của thị trường hoặc sự cố của các chỉ số có thể tạo ra các tín hiệu không chính xác.

  2. Các thông số không đầy đủ: Các thông số không phù hợp có thể dẫn đến giao dịch quá thường xuyên hoặc độ nhạy không đủ. Các thông số nên được điều chỉnh theo các sản phẩm và môi trường thị trường khác nhau.

  3. Stop Loss không phù hợp: Một mức dừng lỗ quá chặt chẽ có xu hướng bị dừng sớm, trong khi một mức dừng lỗ đặt quá rộng có thể dẫn đến tổn thất quá mức.

Để giải quyết các rủi ro trên, các biện pháp sau đây có thể được áp dụng:

  1. Can thiệp bằng tay: Trong các tình huống bất thường, các tín hiệu có thể được kiểm tra thủ công, điều chỉnh lại các tham số hoặc tạm dừng các chiến lược.

  2. Tối ưu hóa tham số: Các phương pháp khoa học và khách quan hơn như thuật toán di truyền có thể được sử dụng để tối ưu hóa có hệ thống.

  3. Đặt giá trị giá trị: Phạm vi dừng lỗ có thể được thiết lập ở mức 1-3 lần ATR để kết hợp biến động.

Cơ hội gia tăng

Chiến lược có thể được cải thiện hơn nữa trong các lĩnh vực sau:

  1. Các cơ chế dừng lỗ mạnh mẽ hơn: Có thể kết hợp stop loss hoặc stop dựa trên đường trung bình động.

  2. Bộ lọc khối lượng: Thêm các chỉ số khối lượng để tránh đột phá sai.

  3. Các thông số động: Tự động tối ưu hóa các thông số như thời gian trung bình động và chiều rộng băng thông dựa trên các điều kiện thị trường thay đổi.

  4. Học máy: LSTM, RNN và các thuật toán khác có thể cho phép tối ưu hóa động các thông số.

Kết luận

Chiến lược Moving Average Momentum Breakout tận dụng những điểm mạnh của việc kết hợp nhiều chỉ số kỹ thuật, và đã đạt được lợi nhuận tốt với xác nhận dài hạn và ngắn hạn. Với các quy trình kiểm soát rủi ro tốt được thực hiện, chiến lược này có tiềm năng rộng lớn để cải thiện thêm các lĩnh vực như cơ chế dừng lỗ và lọc tín hiệu để đạt được lợi nhuận alpha nhất quán hơn.


/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true)

// Volatility
volatility = ta.atr(14)

// EMA/MA Crossover
fast_length = 9
slow_length = 21
fast_ma = ta.ema(close, fast_length)
slow_ma = ta.sma(close, slow_length)
crossover_signal = ta.crossover(fast_ma, slow_ma)

// MACD
[macdLine, signalLine, macdHistogram] = ta.macd(close, 12, 26, 9)
macd_signal = crossover_signal and (macdHistogram > 0)

// Bollinger Bands
source = close
basis = ta.sma(source, 20)
upper = basis + 2 * ta.stdev(source, 20)
lower = basis - 2 * ta.stdev(source, 20)

// Fractal-based Support and Resistance levels
isFractalHigh = high[2] < high[1] and high[1] > high[0]
isFractalLow = low[2] > low[1] and low[1] < low[0]
resistance = ta.valuewhen(isFractalHigh, high[1], 0)
support = ta.valuewhen(isFractalLow, low[1], 0)

// StockRSI
length = 14
K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length))
D = ta.sma(K, 3)
overbought = 80
oversold = 20
stockrsi_signal = ((K < D) and (K < oversold)) or ((K > D) and (K > overbought))

// Buy and sell conditions
mandatory_buy_conditions = (crossover_signal ? 1 : 0) + (macd_signal ? 1 : 0) + (stockrsi_signal ? 1 : 0)

// Long-term Trend Check
long_term_ma = ta.sma(close, 200)
long_term_bullish = close > long_term_ma
long_term_bearish = close < long_term_ma

// Plot the long-term MA for visual clarity
plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1)

// Simplified Buy and Sell conditions
buy_condition = long_term_bullish and (mandatory_buy_conditions >= 2) and (close > lower) and (close < upper)
sell_condition = (macdHistogram < 0) and (K > D) and (K > overbought)


// Potential SL and TP based on volatility
potential_SL = close - volatility
potential_TP = close + 2 * volatility

plot(potential_SL, title="SL Level", color=color.red, linewidth=1, style=plot.style_linebr)
plot(potential_TP, title="TP Level", color=color.green, linewidth=1, style=plot.style_linebr)

// ... (rest of your code above)

// State variable to track if we're in a position, a counter for trades, and a delayed counter for plotting
var bool inPosition = false
var tradeCounter = 0
var tradeCounterDelayed = 0 // Declaration of the variable

// Buy logic: Check if tradeCounter is 0 and the buy condition is met
if tradeCounter == 0 and buy_condition
    strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP)
    inPosition := true
    tradeCounter := tradeCounter + 1

// Sell logic: Check if tradeCounter is 1, the sell condition is met, and we are in a position
if tradeCounter == 1 and inPosition and sell_condition
    strategy.close("BUY")
    inPosition := false
    tradeCounter := tradeCounter - 1

// Update the delayed trade counter:
tradeCounterDelayed := tradeCounter

// Plotting
bgcolor(buy_condition ? color.new(color.green, 90) : sell_condition ? color.new(color.red, 90) : na)
plotshape(series=buy_condition and tradeCounterDelayed == 0, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small)
plotshape(series=sell_condition and tradeCounterDelayed == 1, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small)

// ... (rest of your code if any)


Thêm nữa