Chiến lược theo dõi xu hướng của Momentum Turtle


Ngày tạo: 2023-11-23 11:53:27 sửa đổi lần cuối: 2023-11-23 11:53:27
sao chép: 0 Số nhấp chuột: 630
1
tập trung vào
1621
Người theo dõi

Chiến lược theo dõi xu hướng của Momentum Turtle

Tổng quan

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.

Nguyên tắc chiến lược

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.

Phân tích lợi thế

Ư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ế:

  1. Chỉ số Bạch Dương có khả năng xác định xu hướng chính xác và có thể theo dõi hiệu quả xu hướng trung hạn.
  2. Cơ chế lọc động lượng có thể giảm giao dịch không cần thiết và tránh mất trên số lần giao dịch
  3. Các biện pháp kiểm soát rủi ro đã được đưa ra để có thể dừng lỗ kịp thời khi xu hướng đảo ngược
  4. Nhìn chung, các tham số chiến lược đã được tối ưu hóa đầy đủ và phù hợp với nguyên tắc của Bờ biển.

Phân tích rủi ro

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:

  1. Không thể giải quyết được vấn đề biến động quá mức của các vị trí dài hạn. Không tính đến yếu tố biến động, kích thước vị trí của hệ thống biển có thể dẫn đến tổn thất đơn lẻ quá lớn.
  2. Khi thị trường đảo ngược mạnh, giá dừng có thể bị phá vỡ, dẫn đến tổn thất vượt quá dự kiến.
  3. Hệ thống không đặt mục tiêu lợi nhuận, dễ bị quá mức giữ. Điều này có thể dẫn đến rủi ro đơn lẻ.

Hướng tối ưu hóa

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:

  1. Có thể xem xét thêm thuật toán vị thế động với điều chỉnh tỷ lệ biến động, để có thể giảm vị thế chủ động khi lỗ giữ vị trí đạt đến một mức độ nhất định.
  2. Thêm cơ chế đảo ngược, xem xét giảm bớt hoặc làm trống ngược khi hình thành hình dạng tương tự như đỉnh đầu vai và đỉnh đôi.
  3. Tăng mục tiêu lợi nhuận. Khi lợi nhuận tích lũy đạt đến một tỷ lệ nhất định của tổng tài sản tài khoản, bạn có thể giảm một phần tiền trả lại.

Tóm tắt

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.

Mã nguồn chiến lược
/*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)