Chiến lược này sử dụng chỉ số MACD để tạo ra các tín hiệu giao dịch và dừng lỗ dựa trên ATR thích nghi để kiểm soát rủi ro.
Đường chéo delta MACD 0 tạo ra tín hiệu mua và bán.
Chỉ số giá trị giá trị của ATR được tính trên cơ sở số N thời gian gần đây của ATR, phản ánh sự biến động.
Stop loss điều chỉnh thích nghi với sự thay đổi biến động, mở rộng khi biến động tăng lên.
Cập nhật dừng lỗ trong thời gian thực khi trong các vị trí, để khóa trong lợi nhuận và kiểm soát rủi ro.
Các vị trí thoát khi stop loss được kích hoạt để quản lý rủi ro.
MACD rất nhạy cảm trong việc theo dõi xu hướng.
Các điểm dừng thích nghi phù hợp với các môi trường thị trường khác nhau, tránh các điểm dừng quá chặt hoặc lỏng lẻo.
Các đường dừng trực quan trực quan phản ánh tình trạng rủi ro.
Quy tắc chiến lược đơn giản và rõ ràng, dễ hiểu và thực hiện.
Việc rút tiền có thể kiểm soát được và quản lý rủi ro hiệu quả.
MACD có thể tạo ra các tín hiệu sai gây ra tổn thất không cần thiết.
Các thông số ATR không đúng dẫn đến việc dừng quá chặt hoặc lỏng lẻo.
Nguy cơ dừng quá thường xuyên.
Khó dừng lại kịp thời khi xu hướng đảo ngược.
Rủi ro quá mức khi tối ưu hóa các thông số.
Kiểm tra các thông số MACD để kết hợp tối ưu.
Hãy thử các phương pháp dừng khác như dừng theo dõi.
Tối ưu hóa dừng để cân bằng tần suất và kiểm soát rủi ro.
Thêm bộ lọc xu hướng để ngăn chặn dừng đảo ngược.
Xem xét tác động của chi phí giao dịch để tránh giao dịch quá mức.
Sử dụng trượt hoặc tăng cường dừng để đảm bảo dừng được kích hoạt.
Chiến lược này giao dịch các tín hiệu MACD với các điểm dừng động ATR thích nghi. Nó có tính năng rủi ro và tính đơn giản có thể kiểm soát được. Nhưng các tín hiệu MACD có thể sai, và các điểm dừng cần tối ưu hóa liên tục. Nhìn chung, với điều chỉnh tham số, tối ưu hóa dừng, vv, nó có thể trở thành một hệ thống theo xu hướng mạnh mẽ.
/*backtest start: 2023-01-01 00:00:00 end: 2023-02-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MACD BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true /////////////// MACD /////////////// fastLength = input(13) slowlength = input(30) MACDLength = input(12) MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD /////////////// Strategy /////////////// long = crossover(delta, 0) short = crossunder(delta, 0) last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) /////////////// Dynamic ATR Stop Losses /////////////// atrLkb = input(2, minval=1, title='ATR Stop Period') atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') atr1 = atr(atrLkb) longStop = 0.0 longStop := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1] shortStop = 0.0 shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1] /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0) strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0) /////////////// Plotting /////////////// barcolor(long ? color.lime : short ? color.red : na) plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2) plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2) bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)