Chiến lược này là một chiến lược giao dịch tự động dựa trên sự chéo chéo trung bình động kép của chỉ số kỹ thuật MACD. Nó sử dụng sự chéo chéo đường tín hiệu của MACD để xác định hướng xu hướng để theo xu hướng.
Chiến lược này đầu tiên tính toán ba đường của chỉ số MACD: đường nhanh, đường chậm và biểu đồ. Đường nhanh là một đường trung bình di chuyển nhanh hơn trong một khoảng thời gian ngắn hơn trong khi đường chậm là một đường trung bình di chuyển chậm hơn trong một khoảng thời gian dài hơn. Biểu đồ là sự khác biệt giữa đường nhanh và đường chậm. Khi đường nhanh vượt qua đường chậm, đó là tín hiệu chéo vàng chỉ ra tín hiệu mua. Khi đường nhanh vượt qua dưới đường chậm, đó là tín hiệu chéo chết chỉ ra tín hiệu bán.
Chiến lược này sử dụng logic này để đi dài trên các đường chéo vàng và gần vị trí trên các đường chéo chết; hoặc đi ngắn trên các đường chéo chết và gần vị trí trên các đường chéo vàng để tự động theo xu hướng. Trong khi đó, chiến lược cũng đánh giá xem đường MACD tuyệt đối có dương hay âm để tránh các tín hiệu sai và đảm bảo thực sự nắm bắt các điểm đảo ngược xu hướng.
Giảm rủi ro:
Chiến lược có thể được tăng cường từ các khía cạnh sau:
Kết hợp các chỉ số khác như KDJ, Bollinger Bands vv để xác nhận tín hiệu và lọc tín hiệu sai
Cải thiện cơ chế nhập, ví dụ: thêm bộ lọc thoát để tránh nhập sớm hoặc muộn
Tối ưu hóa cài đặt tham số, điều chỉnh thời gian dòng nhanh và chậm dựa trên khung thời gian và chế độ thị trường khác nhau
Thêm stop loss để kiểm soát lỗ giao dịch duy nhất
Mở rộng sang các sản phẩm khác như ngoại hối, tiền điện tử vv
/*backtest start: 2023-01-16 00:00:00 end: 2024-01-22 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © DeMindSET //@version=4 strategy("MACD Trend Follow Strategy", overlay=false) // Getting inputs LSB = input(title="Long/Short", defval="Long only", options=["Long only", "Short only" , "Both"]) fast_length = input(title="Fast Length", type=input.integer, defval=12) slow_length = input(title="Slow Length", type=input.integer, defval=26) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length) slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) plot(macd, title="MACD", color=col_macd, transp=0) plot(signal, title="Signal", color=col_signal, transp=0) // Bull= macd > signal Bear= macd < signal ConBull=macd>0 ConBear=macd<0 // Green= Bull and ConBull Red= Bear and ConBear Yellow= Bull and ConBear Blue= Bear and ConBull // bcolor = Green ? color.green : Red ? color.red : Yellow ? color.yellow : Blue ? color.blue : na barcolor(color=bcolor) // === INPUT BACKTEST RANGE === FromYear = input(defval = 2019, title = "From Year", minval = 1920) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2009) ToMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" if LSB == "Long only" and Green strategy.entry("L",true) if LSB == "Long only" and Red strategy.close("L",qty_percent=100,comment="TP Long") if LSB == "Both" and Green strategy.entry("L",true) if LSB == "Both" and Red strategy.entry("S",false) if LSB == "Short only" and Red strategy.entry("S",false) if LSB == "Short only" and Green strategy.close("S",qty_percent=100,comment="TP Short")