Chiến lược giao dịch MACD với ATR Stop Loss thích nghi

Tác giả:ChaoZhang, Ngày: 2023-09-20 15:23:00
Tags:

Tổng quan

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.

Chiến lược logic

  1. Đường chéo delta MACD 0 tạo ra tín hiệu mua và bán.

  2. 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.

  3. 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.

  4. 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.

  5. Các vị trí thoát khi stop loss được kích hoạt để quản lý rủi ro.

Ưu điểm

  1. MACD rất nhạy cảm trong việc theo dõi xu hướng.

  2. 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.

  3. Các đường dừng trực quan trực quan phản ánh tình trạng rủi ro.

  4. Quy tắc chiến lược đơn giản và rõ ràng, dễ hiểu và thực hiện.

  5. Việc rút tiền có thể kiểm soát được và quản lý rủi ro hiệu quả.

Rủi ro

  1. 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.

  2. 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.

  3. Nguy cơ dừng quá thường xuyên.

  4. Khó dừng lại kịp thời khi xu hướng đảo ngược.

  5. Rủi ro quá mức khi tối ưu hóa các thông số.

Tăng cường

  1. Kiểm tra các thông số MACD để kết hợp tối ưu.

  2. Hãy thử các phương pháp dừng khác như dừng theo dõi.

  3. Tối ưu hóa dừng để cân bằng tần suất và kiểm soát rủi ro.

  4. Thêm bộ lọc xu hướng để ngăn chặn dừng đảo ngược.

  5. Xem xét tác động của chi phí giao dịch để tránh giao dịch quá mức.

  6. Sử dụng trượt hoặc tăng cường dừng để đảm bảo dừng được kích hoạt.

Kết luận

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)

Thêm nữa