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 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
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
MACD giúp đánh giá xu hướng ngắn hạn và động lực cho lợi nhuận cao hơn
Thay đổi màu sắc biểu đồ giúp xác định thời gian nhập tốt hơn
Crossover màu nền làm nổi bật tín hiệu
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
Các thông số MACD điều chỉnh tối ưu hóa chỉ số
Cung cấp nhiều xác nhận nhập cảnh: xu hướng, chéo, đột phá mô hình
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
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
Các mục chỉ dựa trên MAs và MACD có một số điểm mù
Không có cơ chế dừng lỗ dẫn đến nguy cơ tăng lỗ
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ể:
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
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
Thêm mô hình, động lực vv để xác nhận tín hiệu
Thiết lập các cơ chế dừng lỗ để hạn chế kích thước lỗ
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
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
Hãy thử các loại MA khác nhau như VWAP, Bollinger midline v.v.
Xem xét khối lượng giao dịch để tránh phá vỡ sai
Bao gồm RSI vv để xác nhận mua quá mức / bán quá mức
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
Bao gồm kích thước vị trí dựa trên kích thước tài khoản
Xem xét máy học để tối ưu hóa tham số
Mở rộng vũ trụ chiến lược cho cách tiếp cận danh mục đầu tư nâng cao
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")