
Chiến lược theo dõi xu hướng động lực là một chiến lược theo dõi xu hướng dựa trên quy tắc giao dịch động lực. Nó sử dụng chỉ số động lực để xác định xu hướng và kết hợp với chỉ số động lực để lọc một số giao dịch ồn ào. Ưu điểm chính của chiến lược này là có thể nắm bắt xu hướng giá mạnh và tạo ra lợi nhuận vượt trội.
Chiến lược này sử dụng hệ thống phá vỡ cơ bản trong chỉ số đợt sóng để đánh giá xu hướng. Cụ thể, khi giá đóng cửa cao hơn mức cao nhất trong 20 ngày qua, đây là một tín hiệu lạc quan; khi giá đóng cửa thấp hơn mức thấp nhất trong 20 ngày qua, chiến lược này là tín hiệu giảm giá.
Để lọc ra một số giao dịch ồn, chiến lược này cũng thêm vào yếu tố động lực. Nếu giá dao động dưới 5 ATR, thì chiến lược sẽ không tham gia giao dịch. Điều này có thể tránh thiệt hại do giao dịch nhỏ do quá nhiều đầu trống.
Sau khi mở vị trí, chiến lược sử dụng giá trị N trong nguyên tắc để phá vỡ exit để dừng lỗ. Hệ thống này thiết lập điểm dừng lỗ dựa trên giá cao nhất và giá thấp nhất trong 20 ngày gần đây. Ví dụ: giá dừng đơn giản là ATR 2N dưới giá thấp nhất trong 20 ngày qua.
Ưu điểm lớn nhất của chiến lược này là nó kết hợp theo dõi xu hướng và quản lý động lực. Hệ thống giao dịch hải dương có thể nắm bắt chính xác xu hướng giá trung bình và tránh bị nhiễu bởi tiếng ồn thị trường. Trong khi đó, việc thêm bộ lọc động lực ATR có thể làm giảm thêm số lần giao dịch vô nghĩa, do đó tăng đáng kể lợi nhuận.
Cụ thể, chiến lược này có một số lợi thế:
Mặc dù chiến lược này có nhiều khả năng tối ưu hóa, nhưng nó cũng có một số rủi ro tiềm ẩn cần được đề phòng:
Theo phân tích rủi ro trên, chiến lược này có một số hướng tối ưu hóa chính:
Chiến lược theo dõi xu hướng động đợt sóng nói chung là một chương trình theo dõi xu hướng đường dài trung bình rất thực tế. Nó kết hợp cả xu hướng phán đoán xu hướng của chỉ số đợt sóng và bộ lọc chấn động của chỉ số ATR, có thể khóa hiệu quả xu hướng giá mạnh. Ngoài ra, kiểm soát rủi ro và tối ưu hóa tham số của chiến lược cũng được thực hiện rất phù hợp, có thể làm giảm khả năng rút lui.
/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Heiken Ashi BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// 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(2029, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// HA /////////////
haTicker = heikinashi(syminfo.tickerid)
haOpen = security(haTicker, "D", open)
haHigh = security(haTicker, "D", high)
haLow = security(haTicker, "D", low)
haClose = security(haTicker, "D", close)
///////////// Rate Of Change /////////////
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// Strategy ///////////////
long = haOpen < haClose and isMoving()
short = haOpen > haClose and isMoving()
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])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("L", strategy.long, when=long)
strategy.entry("S", strategy.short, when=short)
strategy.exit("L SL", "L", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
strategy.exit("S SL", "S", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
plotcandle(haOpen, haHigh, haLow, haClose, title='HA Candles', color = haOpen < haClose ? color.lime : color.red)
bgcolor(isMoving() ? long ? color.lime : short ? color.red : na : color.white, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)