Chiến lược đột phá theo xu hướng


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

Chiến lược đột phá theo xu hướng

Tổng quan

Chiến lược phá vỡ động lực là một chiến lược giao dịch định lượng theo xu hướng thị trường. Nó bằng cách tính toán các chỉ số động lực của giá lịch sử, đánh giá xu hướng và cường độ của chuyển động giá thị trường, để nắm bắt xu hướng đường dài của thị trường.

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

Chiến lược này chủ yếu dựa trên chỉ số động lực. Chỉ số động lực là giá đóng cửa của chu kỳ hiện tại trừ giá đóng cửa trước chu kỳ N. Khi giá đóng cửa của một dòng K mới nhất cao hơn trước chu kỳ N, động lực là dương, thể hiện động lực tăng; Khi giá đóng cửa của một dòng K mới nhất thấp hơn trước chu kỳ N, động lực là âm, thể hiện động lực giảm.

Chiến lược đầu tiên tính toán động lực với độ dài 18 chu kỳ, tức là giá đóng cửa hiện tại trừ giá đóng cửa trước chu kỳ 18, để có được mom0 ⋅ và sau đó tính toán động lực một chu kỳ của mom0 để có được mom1 ⋅.

Khi mom0>0 và mom1>0 tạo ra tín hiệu làm nhiều, điều này cho thấy giá tăng mạnh; khi mom0 và mom1 tạo ra tín hiệu làm ngắn, điều này cho thấy giá giảm mạnh.

Chiến lược sẽ ghi lại thời gian của tín hiệu mua và bán gần nhất, giữ vị trí mua khi thời gian mua và bán lớn hơn thời gian mua và bán.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. Các chiến lược được thiết kế rõ ràng, đơn giản, dễ hiểu và phù hợp cho người mới bắt đầu giao dịch số lượng.

  2. Chỉ số động lực có thể nắm bắt xu hướng và cường độ của thị trường, theo dõi xu hướng đường dài trung bình có tỷ lệ thắng cao hơn.

  3. Sử dụng bộ lọc động lượng kép, bạn có thể lọc một số thiệt hại do đột phá giả.

  4. Sau khi tín hiệu giao dịch được tạo ra, bạn sẽ đặt cược để thiết lập vị trí xu hướng, có thể nhận được lợi nhuận vượt trội từ xu hướng.

  5. Việc rút lỗ kịp thời có thể kiểm soát tổn thất đơn lẻ và tránh thiệt hại quá lớn do đảo ngược.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro cần lưu ý:

  1. Việc điều chỉnh ngắn hạn trong các giao dịch đa đầu dẫn đến việc dừng lỗ, không thể nắm bắt toàn bộ chu kỳ.

  2. Có thường xuyên mở và tháo lỗ trong tình huống chấn động, dễ dàng tăng phí giao dịch và mất điểm trượt. Các điều kiện lọc có thể được nới lỏng thích hợp, giảm tần suất giao dịch.

  3. Sau khi xu hướng đảo ngược vẫn giữ vị trí theo hướng ban đầu gây ra tổn thất mở rộng. Có thể kết hợp với chỉ số xu hướng để đánh giá xu hướng đảo ngược.

  4. Cài đặt tham số không đúng có thể gây ra tín hiệu giao dịch bị lỗi hoặc tạo ra tín hiệu sai. Cần điều chỉnh tham số cho các thị trường khác nhau.

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

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Tối ưu hóa tham số động lực, tính toán độ dài động lực cho các chu kỳ khác nhau và điều chỉnh thị trường, cải thiện chất lượng tín hiệu.

  2. Thêm các bộ lọc cho các chỉ số khác như MACD, KD, v.v. để tránh mất mát do đảo ngược xu hướng.

  3. Tối ưu hóa chiến lược dừng lỗ, nới lỏng dừng lỗ thích hợp trong xu hướng giao dịch; thị trường không theo xu hướng thắt chặt dừng lỗ thích hợp.

  4. Tăng chiến lược quản lý vị trí, giảm vị trí khi không có xu hướng; tăng vị trí khi có xu hướng để có được nhiều lợi nhuận hơn.

  5. Tối ưu hóa các tham số cho các giống khác nhau, nâng cao khả năng thích ứng của tham số.

  6. Thêm các thuật toán học máy cho phép chiến lược tối ưu hóa các tham số động.

Tóm tắt

Chiến lược phá vỡ động lực tổng thể là một chiến lược theo dõi xu hướng đơn giản và trực quan. Nó có thể nắm bắt hiệu quả xu hướng đường dài trong thị trường và thu được lợi nhuận tốt hơn trong tình trạng xu hướng. Ngoài ra, cần chú ý đến kiểm soát rủi ro, tối ưu hóa chiến lược dừng lỗ và hỗ trợ đánh giá xu hướng bằng các chỉ số khác. Bằng cách tối ưu hóa liên tục, chiến lược này có thể được tạo thành một hệ thống giao dịch định lượng có lợi nhuận ổn định.

Mã nguồn chiến lược
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, 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 ///////////////
_0 = input(false,  "════════ Test Period ═══════")
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

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 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]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)