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

Tác giả:ChaoZhang, Ngày: 2023-11-23 11:53:27
Tags:

img

Tổng quan

Chiến lược theo dõi xu hướng rùa xung là một chiến lược theo xu hướng dựa trên các quy tắc giao dịch rùa. Nó sử dụng các chỉ số rùa để xác định xu hướng và kết hợp các số liệu xung để lọc một số giao dịch tiếng ồn. Ưu điểm chính của chiến lược này là khả năng nắm bắt xu hướng giá mạnh và đạt được lợi nhuận dư thừa.

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

Chiến lược này sử dụng hệ thống đột phá trong Chỉ số Rùa để xác định hướng xu hướng. Cụ thể, khi giá đóng cao hơn mức giá cao nhất trong 20 ngày qua, đó là tín hiệu tăng và đi dài; khi giá đóng thấp hơn mức giá thấp nhất trong 20 ngày qua, đó là tín hiệu giảm và chiến lược đi ngắn.

Để lọc ra một số giao dịch tiếng ồn, chiến lược này cũng kết hợp một yếu tố động lực. Nếu biến động giá thấp hơn 5 ATRs, chiến lược sẽ không tham gia giao dịch. Điều này tránh thiệt hại từ whipsaws trong thị trường bên.

Sau khi mở các vị trí, chiến lược sử dụng N-breakout exits trong các quy tắc Turtle ban đầu để dừng lỗ. Hệ thống này thiết lập stop loss dựa trên giá cao nhất và thấp nhất trong 20 ngày qua. Ví dụ, stop loss cho các vị trí dài sẽ là 2N ATRs dưới mức thấp nhất trong 20 ngày qua. Lợi nhuận cho chiến lược này rất đơn giản - được thiết lập ở mức 10% tổng giá trị tài khoản.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nó kết hợp cả việc theo dõi xu hướng và quản lý đà. Hệ thống Rùa có thể nắm bắt chính xác xu hướng trung hạn trong giá mà không bị xáo trộn bởi tiếng ồn thị trường. Bộ lọc đà ATR bổ sung làm giảm thêm số lượng giao dịch không cần thiết, do đó làm tăng rất nhiều tiềm năng lợi nhuận.

Cụ thể, chiến lược này có những điểm mạnh sau đây:

  1. Các chỉ số rùa xác định chính xác xu hướng và theo dõi xu hướng trung hạn.
  2. Bộ lọc động lực giảm các giao dịch không cần thiết và tránh thua lỗ về tần suất giao dịch.
  3. Các biện pháp kiểm soát rủi ro vững chắc cho phép dừng lỗ kịp thời khi xu hướng đảo ngược.
  4. Nhìn chung việc điều chỉnh chiến lược phù hợp với các nguyên tắc ban đầu của Turtle.

Phân tích rủi ro

Mặc dù có tiềm năng tối ưu hóa hơn nữa, chiến lược cũng mang theo một số rủi ro để phòng ngừa:

  1. Không giải quyết biến động quá mức đối với cổ phần dài hạn.
  2. Giá dừng lỗ có nguy cơ được đưa ra trong các sự đảo ngược cực đoan, dẫn đến tổn thất cao hơn dự kiến.
  3. Thiếu mục tiêu lợi nhuận có nghĩa là nắm giữ quá mức và rủi ro nắm giữ các vị trí dưới nước.

Cơ hội gia tăng

Dựa trên các rủi ro trên, các cơ hội tối ưu hóa chính bao gồm:

  1. Xem xét các mô hình kích thước vị trí động điều chỉnh cho sự biến động để cắt giảm kích thước trên các giao dịch thua lỗ.
  2. Thêm các cơ chế đảo ngược để giảm hoặc đảo ngược các mẫu đầu như đầu & vai hoặc đầu kép.
  3. Thêm mục tiêu lợi nhuận để cổ phần được giảm khi lợi nhuận tích lũy đạt % tổng vốn.

Kết luận

Tổng thể, chiến lược theo dõi xu hướng Momentum Turtle là một hệ thống mạnh mẽ để theo dõi xu hướng trung và dài hạn. Nó kết hợp các chỉ số Turtle để xác định xu hướng và bộ lọc ATR để quản lý biến động để nắm bắt xu hướng mạnh mẽ. Ngoài ra, kiểm soát rủi ro và điều chỉnh tham số là vững chắc để giảm giảm. Các cải tiến hơn nữa như kích thước năng động, đảo ngược và lấy lợi nhuận có thể cải thiện hiệu suất.


/*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)

Thêm nữa