Chiến lược Momentum Breakout là một chiến lược giao dịch định lượng theo xu hướng thị trường. Nó tính toán chỉ số động lực dựa trên giá lịch sử để xác định xu hướng và sức mạnh của các biến động giá thị trường, nhằm mục đích nắm bắt xu hướng trung và dài hạn trên thị trường. Nó đi dài khi động lực vượt qua từ tiêu cực sang tích cực, và đi ngắn khi động lực vượt qua từ tích cực sang tiêu cực. Chiến lược này phù hợp với các thị trường có xu hướng rõ ràng và có thể đạt được lợi nhuận dư thừa.
Cốt lõi của chiến lược này dựa trên chỉ số đà tăng. Chỉ số đà tăng là giá đóng cửa của thời kỳ hiện tại trừ giá đóng cửa N thời kỳ trước. Khi giá đóng cửa cuối cùng cao hơn N thời kỳ trước, đà tăng là dương tính, cho thấy xu hướng tăng; khi giá đóng cửa cuối cùng thấp hơn N thời kỳ trước, đà tăng là âm, cho thấy xu hướng giảm.
Chiến lược đầu tiên tính toán động lượng 18 giai đoạn, đó là kết thúc hiện tại trừ các kết thúc 18 giai đoạn trước, được lưu trữ trong mom0. Sau đó tính toán động lượng 1 giai đoạn của mom0, được lưu trữ trong mom1.
Khi mom0>0 và mom1>0, một tín hiệu dài được tạo ra, cho thấy động lực tăng mạnh. Khi mom0<0 và mom1<0, một tín hiệu ngắn được tạo ra, cho thấy động lực giảm mạnh.
Chiến lược ghi lại thời gian của các tín hiệu dài và ngắn gần đây nhất. Khi thời gian tín hiệu dài gần đây hơn thời gian tín hiệu ngắn, nó giữ vị trí dài. Khi thời gian tín hiệu ngắn gần đây hơn thời gian tín hiệu dài, nó giữ vị trí ngắn.
Những lợi thế của chiến lược này bao gồm:
Lý thuyết đơn giản và dễ hiểu, phù hợp với người mới bắt đầu giao dịch định lượng.
Các chỉ số động lực có thể nắm bắt xu hướng và sức mạnh thị trường với tỷ lệ thắng tương đối cao khi theo dõi xu hướng trung và dài hạn.
Bộ lọc động lượng kép giúp tránh tổn thất từ các vụ phá vỡ giả.
Nó thêm các vị trí sau tín hiệu để thiết lập các vị trí xu hướng và đạt được lợi nhuận vượt quá trong các thị trường xu hướng.
Việc dừng lỗ và thoát lỗ kịp thời kiểm soát kích thước lỗ giao dịch duy nhất và tránh lỗ lớn từ việc đảo ngược.
Một số rủi ro của chiến lược này cần lưu ý:
Khóa lệnh dừng lỗ trong thời gian rút ngắn trong xu hướng tăng, không thể nắm bắt toàn bộ xu hướng.
Các giao dịch mở và đóng thường xuyên trong các thị trường khác nhau làm tăng chi phí từ hoa hồng và trượt.
Tiếp tục nắm giữ theo hướng ban đầu sau khi đảo ngược xu hướng làm tăng tổn thất.
Cài đặt tham số không chính xác dẫn đến việc mất tín hiệu hoặc tạo ra tín hiệu sai.
Một số cách để tối ưu hóa chiến lược:
Tối ưu hóa các thông số động lượng bằng cách điều chỉnh tính toán độ dài động lượng dựa trên khung thời gian và thị trường.
Thêm các bộ lọc chỉ số khác như MACD, KD để tránh tổn thất từ sự đảo ngược xu hướng.
Tối ưu hóa chiến lược dừng lỗ bằng cách mở rộng dừng trong xu hướng và thắt chặt dừng ở các thị trường không có xu hướng.
Thêm các quy tắc kích cỡ vị trí để giảm kích thước trong không có xu hướng và tăng kích thước trong xu hướng để thu được nhiều lợi nhuận hơn.
Tối ưu hóa các tham số riêng biệt cho các sản phẩm khác nhau để cải thiện khả năng thích nghi.
Kết hợp các thuật toán học máy để tối ưu hóa các thông số một cách năng động.
Chiến lược Momentum Breakout là một hệ thống theo dõi xu hướng trực quan. Nó có thể nắm bắt hiệu quả các xu hướng trung và dài hạn và đạt được lợi nhuận tốt trong các thị trường xu hướng. Quản lý rủi ro thông qua tối ưu hóa dừng lỗ và sử dụng các chỉ số khác để đánh giá xu hướng cũng rất quan trọng. Với tối ưu hóa liên tục, chiến lược này có thể được phát triển thành một hệ thống giao dịch định lượng tạo lợi nhuận ổn định.
/*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)