Bollinger Band, Moving Average và Chiến lược giao dịch kết hợp MACD

Tác giả:ChaoZhang, Ngày: 2024-02-04 15:42:23
Tags:

img

Tổng quan chiến lược

Chiến lược này kết hợp Bollinger Band, đường trung bình động và MACD, tạo thành một hệ thống giao dịch tương đối hoàn chỉnh.

Tên chiến lược và lý do

Chiến lược được đặt tên là Triangle Anchoring Trend Tracking Strategy.

Logic giao dịch cơ bản là:

  1. So sánh Bollinger Mid Band, EMA và đường không MACD để xác định xem thị trường đang ở giai đoạn xu hướng tăng hay giảm.

  2. Tìm các cơ hội nhập. Sau khi xác định xu hướng, chiến lược kiểm tra xem EMA vượt qua BB Mid Band và liệu biểu đồ MACD vượt qua đường tín hiệu để xác định các mục nhập.

  3. Đặt mục tiêu lợi nhuận và dừng lỗ. Một khi nhập, mục tiêu cố định và mức dừng lỗ được đặt trước.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là sử dụng đồng thời các công cụ xu hướng, trung bình động và MACD để hướng dẫn các quyết định. Điều này cho phép đánh giá chính xác hơn về đà thị trường và cũng giúp nắm bắt một số sự đảo ngược.

Thứ nhất, BB Mid Band phản ánh rõ ràng hướng xu hướng chính hiện tại. Vai trò của EMA là theo dõi sự tiến bộ của xu hướng. So sánh và kết hợp của chúng cho phép xác định xu hướng chính xác hơn.

Thứ hai, chính BB có đặc điểm bao bì mạnh mẽ. Khu vực xung quanh dải giữa cũng chỉ ra một số mức hỗ trợ / kháng cự nhất định. Do đó, đường chéo EMA có giá trị tín hiệu.

Ngoài ra, MACD đo lường sự gia tăng và suy giảm của đà tăng / giảm. Kích thước tuyệt đối của nó đại diện cho cảm xúc cao hoặc thấp của đám đông, cũng gợi ý khả năng đảo ngược.

Cuối cùng, mục tiêu lợi nhuận được đặt trước và dừng lỗ kiểm soát rủi ro / phần thưởng của các giao dịch riêng lẻ, đảm bảo sự ổn định tổng thể.

Phân tích rủi ro

Mặc dù sử dụng nhiều công cụ phân tích, những rủi ro chính là:

  1. Các thông số BB không chính xác không thể phản ánh rõ xu hướng chính.

  2. Hệ thống EMA báo hiệu dài nhưng MACD không rõ ràng trở nên tích cực, lực giảm có thể mở rộng.

  3. Mục tiêu lợi nhuận / dừng lỗ phạm vi quá rộng, lỗ giao dịch duy nhất mở rộng.

Các giải pháp chính là:

  1. Điều chỉnh các thông số BB để đảm bảo dải giữa phản ánh hiệu quả xu hướng chính.

  2. Đưa ra nhiều chỉ số kỹ thuật hơn để đánh giá động lực bò / gấu.

  3. Đánh giá các giao dịch lịch sử và tối ưu hóa mục tiêu lợi nhuận / dừng lỗ.

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

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

  1. Đưa ra nhiều chỉ số như KDJ, ATR vv để hỗ trợ đánh giá xu hướng và cải thiện độ chính xác.

  2. Thực hiện các điểm dừng phức tạp hơn như điểm dừng kéo theo, điểm dừng đột phá, v.v.

  3. Đánh giá hiệu suất trên các sản phẩm khác nhau, điều chỉnh các thông số để phù hợp với các điều kiện thị trường khác nhau.

  4. Kiểm tra và điều chỉnh chiến lược dựa trên kết quả backtest trong các khung thời gian và thị trường khác nhau.

  5. Kết hợp máy học để tối ưu hóa tham số tự động và cập nhật chiến lược năng động.

Kết luận

Chiến lược này sử dụng BB, MA và MACD cùng nhau. Nó có phán đoán xu hướng rõ ràng, các đặc điểm phong bì nhất định và cũng nắm bắt một số sự đảo ngược. Với nhiều công cụ phụ trợ để đánh giá các mục nhập / xuất phát, nó có thể đạt được hiệu suất đáng tin cậy hơn. Đánh giá và nâng cao hơn nữa của chiến lược này được bảo đảm và dự kiến sẽ tạo ra một công cụ định lượng mạnh mẽ.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Combined Strategy", overlay=true, shorttitle="Comb Strat", default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// Precio de beneficio y Stop Loss
takeProfitTicks = 87636
stopLossTicks = 53350

// Bollinger Bands + EMA
length_bb = input(150, title="BB Length")
src_bb = input(close, title="BB Source")
mult = input(2.0, title="BB StdDev")
basis = ta.sma(src_bb, length_bb)
dev = mult * ta.stdev(src_bb, length_bb)
upper = basis + dev
lower = basis - dev

len_ema = input(34, title="EMA Length")
src_ema = input(close, title="EMA Source")
out_ema = ta.ema(src_ema, len_ema)

typeMA = input("SMA", title="Method")
smoothingLength = input(5, title="Length")

var float smoothingLine = na
if (typeMA == "SMA")
    smoothingLine := ta.sma(out_ema, smoothingLength)
else if (typeMA == "EMA")
    smoothingLine := ta.ema(out_ema, smoothingLength)

// MACD
fast_length = input(title="Fast Length", defval=9)
slow_length = input(title="Slow Length", defval=17)
src_macd = input(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing", minval=1, maxval=50, defval=9)
sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

fast_ma = sma_source == "SMA" ? ta.sma(src_macd, fast_length) : ta.ema(src_macd, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src_macd, slow_length) : ta.ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

// Condiciones de compra y venta
longCondition = (out_ema > basis) and (macd > signal) and (signal > 0)
shortCondition = (out_ema < basis) and (macd < signal) and (signal < 0)

// Variables de estado
var bool longExecuted = na
var bool shortExecuted = na

// Estrategia
if (longCondition and not longExecuted)
    strategy.entry("Long", strategy.long)
    longExecuted := true
    shortExecuted := na
if (shortCondition and not shortExecuted)
    strategy.entry("Short", strategy.short)
    shortExecuted := true
    longExecuted := na

// Take Profit y Stop Loss para Compras y Ventas Cortas
strategy.exit("Take Profit/Close Long", from_entry="Long", profit=takeProfitTicks, loss=stopLossTicks)
strategy.exit("Take Profit/Close Short", from_entry="Short", profit=takeProfitTicks, loss=stopLossTicks)

// Cierre de posiciones cuando la dirección cambia
if ((out_ema < basis) and (macd < signal))
    strategy.close("Long")
    longExecuted := na
if ((out_ema > basis) and (macd > signal))
    strategy.close("Short")
    shortExecuted := na

// Plots
plot(basis, "BB Basis", color=#FF6D00)
plot(upper, "BB Upper", color=color.new(#2962FF, 0.5))
plot(lower, "BB Lower", color=color.new(#2962FF, 0.5))

plot(smoothingLine, title="Smoothing Line", color=#f37f20, linewidth=2)

hline(0, "Zero Line", color=color.new(#787B86, 50))
plot(hist, title="Histogram", style=plot.style_columns, color=(hist >= 0 ? (hist[1] < hist ? color.green : color.red) : (hist[1] < hist ? color.red : color.green)))
plot(macd, title="MACD", color=color.blue)
plot(signal, title="Signal", color=color.orange)


Thêm nữa