Chiến lược này được gọi là Chiến lược giao dịch robot MACD. Nó xác định thời gian mua và bán trên thị trường bằng cách tính toán mối quan hệ giữa đường nhanh và đường chậm của chỉ số MACD và áp dụng lệnh dừng lỗ để kiểm soát rủi ro.
Đường MACD là một chỉ số thị trường thông thường. Đường MACD bao gồm một đường nhanh và một đường chậm. Đường nhanh là một đường trung bình di chuyển ngắn hạn và đường chậm là một đường trung bình di chuyển dài hạn. Mối quan hệ giữa hai phản ánh tình trạng mua và bán trên thị trường. Khi đường nhanh vượt qua đường chậm, đó là tín hiệu mua, và khi nó vượt qua dưới, đó là tín hiệu bán.
Trong chiến lược này, đường nhanh và đường chậm được tính bằng thuật toán EMA tương ứng, và các khoảng thời gian có thể được tùy chỉnh. Để cải thiện chất lượng tín hiệu, một đường tín hiệu được thêm vào, sử dụng thuật toán EMA để làm mịn giá trị MACD một lần nữa.
Khi xác định thời gian mua, hãy kiểm tra không chỉ đường chéo vàng của đường nhanh và đường chậm, mà còn xem giá trị tuyệt đối của MACD có lớn hơn đường mua tùy chỉnh hay không.
Khi xác định thời gian bán, đường chết của đường nhanh và đường chậm và đường tín hiệu là tích cực được yêu cầu phải được đáp ứng cùng một lúc, sau đó một tín hiệu bán được phát hành để đóng vị trí.
Chiến lược có những lợi thế sau:
Chiến lược này cũng có một số rủi ro:
Những rủi ro này có thể được giảm bằng cách điều chỉnh các tham số một cách thích hợp, kết hợp các chỉ số khác, v.v.
Chiến lược có thể được tối ưu hóa theo các hướng sau:
Nhìn chung, đây là một chiến lược theo xu hướng với độ tin cậy cao. Bằng cách đánh giá xu hướng thông qua chỉ số MACD và kiểm soát rủi ro bằng cách dừng lỗ, lợi nhuận đầu tư ổn định có thể đạt được. Bước tiếp theo là tối ưu hóa thêm các tham số, kết hợp các chỉ số khác và kết hợp học máy để cải thiện lợi nhuận chiến lược.
/*backtest start: 2022-12-11 00:00:00 end: 2023-12-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(shorttitle = "GBPUSD MACD", title = "GBPUSD MACD") fastMA = input(title="Fast moving average", defval = 12, minval = 7) slowMA = input(title="Slow moving average", defval = 26, minval = 7) lastColor = yellow [currMacd,_,_] = macd(close[0], fastMA, slowMA, 9) [prevMacd,_,_] = macd(close[1], fastMA, slowMA, 9) plotColor = currMacd > 0 ? currMacd > prevMacd ? lime : green : currMacd < prevMacd ? maroon : red plot(currMacd, style = histogram, color = plotColor, linewidth = 3) plot(0, title = "Zero line", linewidth = 1, color = gray) //MACD // Getting inputs fast_length = input(title="Fast Length", defval=12) slow_length = input(title="Slow Length", defval=26) src = input(title="Source", defval=close) signal_length = input(title="Signal Smoothing", minval = 1, maxval = 50, defval =9) sma_source = input(title="Simple MA(Oscillator)", type=bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=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=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) ///END OF MACD //Long and Close Long Lines linebuy = input(title="Enter Long", type=float, defval=-0.00045) linesell = input(title="Close Long", type=float, defval=0.0001) //Plot Long and Close Long Lines plot(linebuy,color=green),plot(linesell,color=red) //Stop Loss Input sl_inp = input(0.05, title='Stop Loss %', type=float)/100 //Order Conditions longCond = crossover(currMacd, linebuy) exitLong = crossover(currMacd, signal) and signal > 0 stop_level = strategy.position_avg_price * (1 - sl_inp) //Order Entries strategy.entry("long", strategy.long, when=longCond==true) strategy.close("long", when=exitLong==true) strategy.exit("Stop Loss", stop=stop_level)