Chiến lược động lực chéo trung bình di chuyển kép

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

img

Tổng quan

Chiến lược này sử dụng nguyên tắc chéo trung bình động kép, kết hợp chỉ số MACD để đánh giá xu hướng và làm nổi bật nền chéo, và xác nhận các mục nhập bằng các dấu chấm mẫu, nhằm nắm bắt xu hướng trung hạn trên thị trường.

Chiến lược logic

Chiến lược này xây dựng các đường trung bình động kép bằng cách sử dụng EMA nhanh và EMA chậm, và xác định hướng xu hướng dựa trên sự chéo chéo giữa các đường nhanh và chậm. Nó cũng tính toán MACD và tín hiệu, và vẽ sự khác biệt của chúng dưới dạng biểu đồ.

Theo mã, chiều dài đường nhanh là 12 và chiều dài đường chậm là 26, đại diện cho xu hướng ngắn hạn và dài hạn.

Crossover logic:

  • trend_up = macd > tín hiệu: đường nhanh vượt qua đường chậm, cho thấy xu hướng tăng ngắn hạn

  • trend_dn = macd < tín hiệu: đường nhanh vượt dưới đường chậm, cho thấy xu hướng giảm ngắn hạn

Khám phá điểm chéo:

  • cross_UP = tín hiệu [1] >= macd [1] và tín hiệu < macd: đường nhanh băng qua đường chậm từ dưới

  • cross_DN = tín hiệu [1] <= macd [1] và tín hiệu > macd: đường nhanh băng qua đường chậm từ trên

Sự thay đổi màu sắc histogram xác định sức mạnh động lực:

  • histA_IsUp = Cột histogram tăng và lớn hơn 0, tăng động trong xu hướng tăng

  • histA_IsDown = Cột histogram giảm nhưng vẫn lớn hơn 0, động lực suy yếu trong xu hướng tăng

  • Cùng một logic dưới 0

Ưu điểm

  1. Trung bình di chuyển kép xác định xu hướng trung hạn, tránh tiếng ồn ngắn hạn

  2. MACD giúp đánh giá xu hướng ngắn hạn và động lực cho lợi nhuận cao hơn

  3. Thay đổi màu sắc biểu đồ giúp xác định thời gian nhập tốt hơn

  4. Crossover màu nền làm nổi bật tín hiệu

  5. Thời gian trung bình động có thể tùy chỉnh phù hợp với môi trường thị trường khác nhau

  6. Các thông số MACD điều chỉnh tối ưu hóa chỉ số

  7. Cung cấp nhiều xác nhận nhập cảnh: xu hướng, chéo, đột phá mô hình

Rủi ro

  1. Hai MAs không nhạy cảm với biến động ngắn hạn, có thể bỏ lỡ cơ hội ngắn hạn

  2. Hiệu ứng MACD kém với cài đặt tham số không đúng, có thể tạo ra tín hiệu sai

  3. Các mục chỉ dựa trên MAs và MACD có một số điểm mù

  4. Không có cơ chế dừng lỗ dẫn đến nguy cơ tăng lỗ

  5. Thiếu quản lý tiền tệ nghiêm ngặt và kích thước vị trí

Các giải pháp có thể:

  1. Kết hợp các chỉ số khác để xác định phạm vi dao động ngắn hạn và kiểm soát rủi ro

  2. Tối ưu hóa các thông số MACD và thử nghiệm trên các thị trường khác nhau

  3. Thêm mô hình, động lực vv để xác nhận tín hiệu

  4. Thiết lập các cơ chế dừng lỗ để hạn chế kích thước lỗ

  5. Thêm mô-đun quản lý tiền vào kích thước các vị trí dựa trên vốn

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

  1. Kiểm tra và tối ưu hóa các kết hợp tham số MA để thích nghi thị trường nhiều hơn

  2. Hãy thử các loại MA khác nhau như VWAP, Bollinger midline v.v.

  3. Xem xét khối lượng giao dịch để tránh phá vỡ sai

  4. Bao gồm RSI vv để xác nhận mua quá mức / bán quá mức

  5. Xây dựng các cơ chế dừng lỗ mạnh mẽ như dừng theo dõi, dừng biến động vv

  6. Bao gồm kích thước vị trí dựa trên kích thước tài khoản

  7. Xem xét máy học để tối ưu hóa tham số

  8. Mở rộng vũ trụ chiến lược cho cách tiếp cận danh mục đầu tư nâng cao

Kết luận

Chiến lược này tích hợp bộ lọc xu hướng trung bình động kép và động lực MACD, thêm các tính năng mô hình, xây dựng một hệ thống giao dịch trung hạn tương đối ổn định. Ưu điểm chính nằm trong việc nắm bắt xu hướng chính trong khi tránh tiếng ồn ngắn hạn. Nhưng cũng có những lĩnh vực có thể được cải thiện, như thêm cơ chế dừng lỗ và quản lý rủi ro. Nhìn chung, đây là một ví dụ khái niệm có giá trị, nhưng đòi hỏi kiểm tra toàn diện và tinh chỉnh cho giao dịch trực tiếp.


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

//@version=5
strategy(title="Histogram MacD MVP_V2.1", shorttitle="Histogram MacD MVP_2.1")
//Plot Inputs
res           = input.timeframe("",  "Indicator TimeFrame")
fast_length   = input.int(title="Fast Length", defval=12)
slow_length   = input.int(title="Slow Length", defval=26)
src           = input.source(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, 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"])
// Show Plots T/F
show_macd     = input.bool(true, title="Show MACD Lines", group="Show Plots?", inline="SP10")
show_macd_LW  = input.int(3, minval=0, maxval=5, title = "MACD Width", group="Show Plots?", inline="SP11")
show_signal_LW= input.int(2, minval=0, maxval=5, title = "Signal Width", group="Show Plots?", inline="SP11")
show_Hist     = input.bool(true, title="Show Histogram", group="Show Plots?", inline="SP20")
show_hist_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP20")
show_trend    = input.bool(true, title = "Show MACD Lines w/ Trend Color", group="Show Plots?", inline="SP30")
show_HB       = input.bool(false, title="Show Highlight Price Bars", group="Show Plots?", inline="SP40")
show_cross    = input.bool(false, title = "Show BackGround on Cross", group="Show Plots?", inline="SP50")
show_dots     = input.bool(true, title = "Show Circle on Cross", group="Show Plots?", inline="SP60")
show_dots_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP60")

//show_trend    = input(true, title = "Colors MACD Lines w/ Trend Color", group="Show Plots?", inline="SP5")
// MACD Lines colors
col_macd      = input.color(#FF6D00, "MACD Line  ",  group="Color Settings", inline="CS1")
col_signal    = input.color(#2962FF, "Signal Line  ",  group="Color Settings", inline="CS1")
col_trnd_Up   = input.color(#4BAF4F, "Trend Up      ",  group="Color Settings", inline="CS2")
col_trnd_Dn   = input.color(#B71D1C, "Trend Down    ",  group="Color Settings", inline="CS2")
// Histogram Colors
col_grow_above = input.color(#26A69A, "Above   Grow",  group="Histogram Colors", inline="Hist10")
col_fall_above = input.color(#FF5252, "Fall",  group="Histogram Colors", inline="Hist10")
col_grow_below = input.color(#FF5252, "Below Grow",  group="Histogram Colors", inline="Hist20")
col_fall_below = input.color(#f8f524, "Fall",  group="Histogram Colors", inline="Hist20")
// Alerts T/F Inputs
alert_Long    = input.bool(true, title = "MACD Cross Up", group = "Alerts", inline="Alert10")
alert_Short   = input.bool(true, title = "MACD Cross Dn", group = "Alerts", inline="Alert10")
alert_Long_A  = input.bool(false, title = "MACD Cross Up & > 0", group = "Alerts", inline="Alert20")
alert_Short_B = input.bool(false, title = "MACD Cross Dn & < 0", group = "Alerts", inline="Alert20")
// Calculating
fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal
// MACD Trend and Cross Up/Down conditions
trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0
// Condition that changes Color of MACD Line if Show Trend is turned on..
trend_col = show_trend  and trend_up ? col_trnd_Up : trend_up ? col_macd : show_trend  and trend_dn ? col_trnd_Dn: trend_dn ? col_macd : na 

//Var Statements for Histogram Color Change
var bool histA_IsUp = false
var bool histA_IsDown = false
var bool histB_IsDown = false
var bool histB_IsUp = false
histA_IsUp   := hist == hist[1] ? histA_IsUp[1] : hist > hist[1] and hist > 0
histA_IsDown := hist == hist[1] ? histA_IsDown[1] : hist < hist[1] and hist > 0
histB_IsDown := hist == hist[1] ? histB_IsDown[1] : hist < hist[1] and hist <= 0
histB_IsUp   := hist == hist[1] ? histB_IsUp[1] : hist > hist[1] and hist <= 0

hist_col =  histA_IsUp ? col_grow_above : histA_IsDown ? col_fall_above : histB_IsDown ? col_grow_below : histB_IsUp ? col_fall_below :color.silver 

// Plot Statements
//Background Color
bgcolor(show_cross and cross_UP ? col_trnd_Up : na, editable=false)
bgcolor(show_cross and cross_DN ? col_trnd_Dn : na, editable=false)
//Highlight Price Bars
barcolor(show_HB and trend_up ? col_trnd_Up : na, title="Trend Up", offset = 0, editable=false)
barcolor(show_HB and trend_dn ? col_trnd_Dn : na, title="Trend Dn", offset = 0, editable=false)
//Regular Plots
plot(show_Hist and hist ? hist : na, title="Histogram", style=plot.style_columns, color=color.new(hist_col ,0),linewidth=show_hist_LW)
plot(show_macd  and signal ? signal : na, title="Signal", color=color.new(col_signal, 0),  style=plot.style_line ,linewidth=show_signal_LW)
plot(show_macd  and macd ? macd : na, title="MACD", color=color.new(trend_col, 0),  style=plot.style_line ,linewidth=show_macd_LW)
hline(0, title="0 Line", color=color.new(color.gray, 0), linestyle=hline.style_dashed, linewidth=1, editable=false)
plot(show_dots and cross_UP ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)
plot(show_dots and cross_DN ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)

//Alerts
if alert_Long and cross_UP
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short and cross_DN
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Down.", alert.freq_once_per_bar_close)
//Alerts - Stricter Condition - Only Alerts When MACD Crosses UP & MACD > 0 -- Crosses Down & MACD < 0
if alert_Long_A and cross_UP_A
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD > 0 And Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short_B and cross_DN_B
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD < 0 And Crosses Down.", alert.freq_once_per_bar_close)


if (histA_IsUp)
	strategy.entry("buy", strategy.long, comment="buy")
if (histA_IsDown)
	strategy.entry("sell", strategy.short, comment="sell")


Thêm nữa