Chiến lược giao dịch chuyển động trung bình động là một chiến lược giao dịch kết hợp tích hợp nhiều chỉ số kỹ thuật và phát hiện điều kiện thị trường. Nó tính toán biến động thị trường một cách năng động và xác định ba giai đoạn thị trường dựa trên khoảng cách giá từ trung bình chuyển động dài hạn và biến động: biến động, xu hướng và hợp nhất.
Sử dụng chỉ số ATR để đo biến động thị trường trong 14 ngày gần đây. Sau đó áp dụng bộ lọc SMA 100 ngày để có được biến động trung bình.
Tính toán khoảng cách giữa giá và SMA 200 ngày. Nếu khoảng cách tuyệt đối vượt quá 1,5 lần biến động trung bình với một hướng rõ ràng, nó được xác định là một thị trường xu hướng. Nếu biến động hiện tại vượt quá 1,5 lần trung bình, đó là một thị trường biến động.
Thời gian EMA nhanh là 10 ngày. Thời gian SMA chậm là 30 ngày. Một tín hiệu mua được tạo ra khi EMA nhanh vượt qua SMA chậm.
Tính toán MACD với 12, 26, 9 tham số. Một biểu đồ MACD dương cho tín hiệu mua.
Tính toán kênh lệch chuẩn 20 ngày. Nếu chiều rộng kênh nhỏ hơn SMA 20 ngày của chính nó, nó đang củng cố.
Biến động: Nhập dài khi giao thoa hoặc MACD dương tính với giá bên trong dải.
Xu hướng: Nhập dài khi giao thoa hoặc MACD dương tính.
Củng cố: Nhập dài khi chéo và giá trên dải dưới.
Toàn bộ: Ra khi MACD âm trong 2 thanh và giá giảm 2 ngày.
Biến động: Thêm ra ngoài khi StockRSI mua quá mức.
Củng cố: Thêm thoát khi giá dưới dải trên.
Chiến lược có những điểm mạnh sau:
Các hoạt động có hệ thống với sự can thiệp ít chủ quan hơn.
Các thông số thích nghi được điều chỉnh dựa trên điều kiện thị trường.
Độ chính xác tín hiệu cao hơn với sự kết hợp nhiều chỉ báo.
Rủi ro thấp hơn với Bollinger Bands tự động dừng lỗ.
Tất cả các điều kiện được làm tròn lọc để tránh tín hiệu sai.
Động thái dừng lỗ và lấy lợi nhuận để theo xu hướng.
Những rủi ro chính là:
Chiến lược không hợp lệ nếu điều chỉnh tham số không chính xác.
Mẫu lỗi do sự kiện đột ngột, khuyến cáo cập nhật logic.
Tỷ lệ lợi nhuận nén từ chi phí giao dịch.
Sự phức tạp cao hơn với nhiều mô-đun.
Các hướng tối ưu hóa tiềm năng:
Cải thiện các tiêu chí đánh giá môi trường thị trường.
Đưa ra máy học để thích nghi tham số tự động.
Thêm phân tích văn bản để phát hiện các sự kiện.
Kiểm tra nhiều thị trường để tìm các thông số tốt nhất.
Thực hiện chiến lược dừng lại để có lợi nhuận tốt hơn.
Chiến lược Dynamic Moving Average Crossover Combo là một hệ thống giao dịch định lượng đa chỉ số thông minh. Nó điều chỉnh các tham số theo động dựa trên điều kiện thị trường để thực hiện giao dịch dựa trên quy tắc có hệ thống. Chiến lược rất thích nghi và xác định. Nhưng các tham số và các mô-đun bổ sung cần được giới thiệu cẩn thận để tránh sự phức tạp quá mức. Nhìn chung đây là một ý tưởng chiến lược định lượng khả thi.
/*backtest start: 2024-01-28 00:00:00 end: 2024-02-04 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Improved Custom Strategy", shorttitle="ICS", overlay=true) // Volatility volatility = ta.atr(14) avg_volatility_sma = ta.sma(volatility, 100) avg_volatility = na(avg_volatility_sma) ? 0 : avg_volatility_sma // Market Phase detection long_term_ma = ta.sma(close, 200) distance_from_long_term_ma = close - long_term_ma var bool isTrending = math.abs(distance_from_long_term_ma) > 1.5 * avg_volatility and not na(distance_from_long_term_ma) var bool isVolatile = volatility > 1.5 * avg_volatility // EMA/MA Crossover fast_length = 10 slow_length = 30 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 or (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) isConsolidating = (upper - lower) < ta.sma(upper - lower, 20) // StockRSI length = 14 K = 100 * (close - ta.lowest(close, length)) / (ta.highest(close, length) - ta.lowest(close, length)) D = ta.sma(K, 3) overbought = 75 oversold = 25 var float potential_SL = na var float potential_TP = na var bool buy_condition = na var bool sell_condition = na // Buy and Sell Control Variables var bool hasBought = false var bool hasSold = true // Previous values tracking prev_macdHistogram = macdHistogram[1] prev_close = close[1] // Modify sell_condition with the new criteria if isVolatile buy_condition := not hasBought and crossover_signal or macd_signal and (close > lower) and (close < upper) sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2]) potential_SL := close - 0.5 * volatility potential_TP := close + volatility if isTrending buy_condition := not hasBought and crossover_signal or macd_signal sell_condition := hasBought and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2]) potential_SL := close - volatility potential_TP := close + 2 * volatility if isConsolidating buy_condition := not hasBought and crossover_signal and (close > lower) sell_condition := hasBought and (close < upper) and (macdHistogram < 0 and prev_macdHistogram < 0) and (close < prev_close and prev_close < close[2]) potential_SL := close - 0.5 * volatility potential_TP := close + volatility // Update the hasBought and hasSold flags if buy_condition hasBought := true hasSold := false if sell_condition hasBought := false hasSold := true // Strategy Entry and Exit if buy_condition strategy.entry("BUY", strategy.long, stop=potential_SL, limit=potential_TP) strategy.exit("SELL_TS", from_entry="BUY", trail_price=close, trail_offset=close * 0.05) if sell_condition strategy.close("BUY") // Visualization plotshape(series=buy_condition, style=shape.labelup, location=location.belowbar, color=color.green, text="BUY", size=size.small) plotshape(series=sell_condition, style=shape.labeldown, location=location.abovebar, color=color.red, text="SELL", size=size.small) plot(long_term_ma, color=color.gray, title="200-Day MA", linewidth=1) 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) bgcolor(isVolatile ? color.new(color.purple, 90) : isTrending ? color.new(color.blue, 90) : isConsolidating ? color.new(color.orange, 90) : na)