Chiến lược này sử dụng chỉ số MACD để tạo tín hiệu giao dịch và kiểm soát rủi ro bằng cách sử dụng dừng tự điều chỉnh dựa trên ATR.
Đường chênh lệch delta của chỉ số MACD phá vỡ trục 0 tạo ra tín hiệu mua và bán.
Động thái dừng lỗ ATR được tính dựa trên N chu kỳ gần đây nhất. ATR có thể phản ánh tỷ lệ biến động của thị trường.
Vị trí dừng sẽ tự điều chỉnh theo biến động của tỷ lệ dao động và giảm bớt khi dao động tăng lên.
Cập nhật lệnh dừng lỗ trong thời gian thực khi nắm giữ tín hiệu để khóa lợi nhuận và kiểm soát rủi ro.
Khi lệnh dừng lỗ được kích hoạt, hãy rút khỏi vị trí và kiểm soát rủi ro.
Chỉ số MACD nhạy cảm với xu hướng theo dõi.
Hạn chế động có thể thích ứng với môi trường thị trường, tránh dừng lỗ quá gần hoặc quá xa.
Gạch đánh dấu điểm dừng lỗ được hiển thị, trực quan phản ánh tình trạng rủi ro.
Các quy tắc của chiến lược rất đơn giản, rõ ràng và dễ hiểu.
Việc rút tiền có thể kiểm soát được và quản lý rủi ro là hiệu quả.
Chỉ số MACD có thể tạo ra tín hiệu sai dẫn đến tổn thất không cần thiết.
Các tham số ATR được thiết lập không đúng, gây ảnh hưởng quá gần hoặc quá xa.
Rủi ro bị kích hoạt quá thường xuyên
Trở lại xu hướng khó khăn và mất thời gian.
Có thể có nguy cơ quá phù hợp khi tối ưu hóa tham số.
Kiểm tra sự kết hợp của các tham số MACD khác nhau để tìm tham số tối ưu.
Hãy thử các phương pháp khác để giảm tổn thất, như theo dõi giảm tổn thất.
Tối ưu hóa các tham số dừng lỗ, cân bằng tần số dừng lỗ và kiểm soát rủi ro.
Thêm một cơ chế đánh giá xu hướng để tránh đảo ngược dừng lỗ.
Cân nhắc về tác động của chi phí giao dịch và ngăn chặn giao dịch quá mức.
Sử dụng điểm trượt hoặc tăng cường dừng để đảm bảo hiệu lực dừng.
Chiến lược này dựa trên chỉ số MACD để phát tín hiệu, sử dụng ATR tự thích ứng để dừng lỗ động. Nó có thể kiểm soát rủi ro, có tính năng thực tế đơn giản. Tuy nhiên, tín hiệu MACD dễ bị đánh giá sai, đồng thời cơ chế dừng lỗ cần được tối ưu hóa liên tục. Nói chung, bằng cách điều chỉnh tham số, tối ưu hóa chiến lược dừng lỗ, v.v., có thể tạo ra một hệ thống giao dịch theo dõi xu hướng ổn định hơn.
/*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)