Chiến lược kết hợp chéo trung bình động động

Tác giả:ChaoZhang, Ngày: 2024-02-05 10:23:10
Tags:

img

Tổng quan

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.

Chiến lược logic

Tính toán biến động thị trường

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.

Xác định các giai đoạn thị trường

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.

EMA/SMA Crossover

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.

MACD

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.

Bollinger Bands

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ố.

Quy tắc nhập cảnh

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.

Các quy tắc xuất cảnh

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.

Ưu điểm

Chiến lược có những điểm mạnh sau:

  1. Các hoạt động có hệ thống với sự can thiệp ít chủ quan hơn.

  2. Các thông số thích nghi được điều chỉnh dựa trên điều kiện thị trường.

  3. Độ chính xác tín hiệu cao hơn với sự kết hợp nhiều chỉ báo.

  4. Rủi ro thấp hơn với Bollinger Bands tự động dừng lỗ.

  5. Tất cả các điều kiện được làm tròn lọc để tránh tín hiệu sai.

  6. Động thái dừng lỗ và lấy lợi nhuận để theo xu hướng.

Rủi ro

Những rủi ro chính là:

  1. Chiến lược không hợp lệ nếu điều chỉnh tham số không chính xác.

  2. Mẫu lỗi do sự kiện đột ngột, khuyến cáo cập nhật logic.

  3. Tỷ lệ lợi nhuận nén từ chi phí giao dịch.

  4. Sự phức tạp cao hơn với nhiều mô-đun.

Tăng cường

Các hướng tối ưu hóa tiềm năng:

  1. Cải thiện các tiêu chí đánh giá môi trường thị trường.

  2. Đưa ra máy học để thích nghi tham số tự động.

  3. Thêm phân tích văn bản để phát hiện các sự kiện.

  4. Kiểm tra nhiều thị trường để tìm các thông số tốt nhất.

  5. Thực hiện chiến lược dừng lại để có lợi nhuận tốt hơn.

Kết luậ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)


Thêm nữa