Chiến lược dừng nhiều lần ATR tốt nhất là một chiến lược theo xu hướng sử dụng số nhân của phạm vi trung bình thực sự (ATR) để thiết lập các điểm dừng lỗ và điều chỉnh rủi ro một cách năng động. Nó có thể thoát khỏi các vị trí kịp thời khi xu hướng giá thay đổi để tránh tổn thất lớn.
Chiến lược này đầu tiên tính toán các đường trung bình động đơn giản của các giai đoạn SMA nhanh và chậm. Nó sẽ dài khi SMA nhanh vượt qua SMA chậm, và ngắn khi SMA nhanh vượt qua dưới SMA chậm.
Sau khi nhập, nó theo dõi giá trị ATR trong thời gian thực. ATR đại diện cho sự biến động trung bình trong một khoảng thời gian xem lại nhất định. Chiến lược cho phép chúng ta đặt khoảng thời gian ATR ( mặc định 14) và nhân ( mặc định 2). Hệ thống tính toán giá trị ATR khi nhập, sau đó nhân nó bằng nhân đặt như khoảng cách dừng.
Ví dụ, nếu ATR sau khi nhập là 50 điểm, và nhân được đặt là 2, thì khoảng cách dừng sẽ là 100 điểm. Nếu giá sau đó di chuyển hơn 100 điểm, lệnh dừng lỗ sẽ được kích hoạt. Điều này cho phép dừng lỗ kịp thời để tránh mất quá nhiều.
Chiến lược này cũng xem xét xác định xu hướng. Stop loss dài chỉ được kích hoạt khi tín hiệu mua phù hợp với xu hướng tăng. Stop loss ngắn phù hợp với xu hướng giảm.
Các đường dừng lỗ được vẽ trên biểu đồ để chúng ta có thể xác minh chúng trong thời gian thực. Khi các điều kiện dừng lỗ được kích hoạt, các vị trí tương ứng sẽ được hệ thống tự động đóng.
Lợi thế lớn nhất của chiến lược này là nó điều chỉnh năng động khoảng cách dừng lỗ và tự động sửa đổi rủi ro dựa trên sự thay đổi biến động của thị trường. Khi biến động mở rộng, khoảng cách dừng cũng tăng, làm giảm khả năng dừng lỗ bị ảnh hưởng. Trong các thị trường biến động thấp, khoảng cách dừng giảm.
So với khoảng cách dừng lỗ cố định, phương pháp này kiểm soát hiệu quả lỗ trên cơ sở mỗi giao dịch trong khi theo dõi xu hướng. Nó đảm bảo không gian lợi nhuận cũng như quản lý rủi ro.
Ngoài ra, kết hợp với xác định xu hướng, các phương pháp dừng lỗ như vậy có thể làm giảm khả năng bị dừng bởi whipsaws trong các vùng củng cố.
Rủi ro chính của chiến lược này là cơ hội giá giảm trong ngắn hạn trong một vị trí, kích hoạt dừng lỗ. Đặc biệt nếu thời gian ATR quá ngắn, khoảng cách dừng không thể lọc hoàn toàn tác động của biến động ngắn hạn.
Một rủi ro khác là giá có thể vượt qua mức dừng lỗ trong các động thái bạo lực. Điều này sẽ yêu cầu cài đặt nhân ATR lớn hơn, nhưng điều đó cũng có nghĩa là giảm tiềm năng lợi nhuận.
Cuối cùng, chiến lược không xem xét tác động của giao dịch sau giờ và trước thị trường đối với giá trị ATR. Điều này có thể dẫn đến tính toán dữ liệu ATR không chính xác khi mở hoặc đóng.
Chiến lược có thể được tối ưu hóa trong một số khía cạnh:
Tối ưu hóa các tham số thời gian ATR và thử nghiệm các kết hợp tốt nhất cho các thị trường khác nhau
So sánh số lần ATR cố định so với động về mặt lợi nhuận
Kết hợp dữ liệu sau giờ vào tính toán ATR để giảm khoảng trống trên mở
Thiết lập điều kiện ATR: chỉ cho phép dừng khi ATR đạt đến một số mức nhất định, tránh dừng không cần thiết trong môi trường biến động thấp
Thêm nhiều bộ lọc: xu hướng chính, chỉ số khối lượng / động lực vv.
Chiến lược dừng nhiều lần ATR tốt nhất cân bằng hiệu quả theo xu hướng và kiểm soát rủi ro bằng cách điều chỉnh năng động khoảng cách dừng.
Tất nhiên một số rủi ro vẫn còn, như khoảng cách giá và dừng quá nhạy cảm.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //@author=Daveatt //This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ SystemName = "BEST ATR Stop Multiple Strategy" TradeId = "BEST" InitCapital = 100000 InitPosition = 100 InitCommission = 0.075 InitPyramidMax = 1 CalcOnorderFills = true CalcOnTick = true DefaultQtyType = strategy.fixed DefaultQtyValue = strategy.fixed Precision = 2 Overlay=true strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay ) fastSMAperiod = input(defval=15, title='Fast SMA', type=input.integer, minval=2, step=1) slowSMAperiod = input(defval=45, title='Slow SMA', type=input.integer, minval=2, step=1) src = close // Calculate moving averages fastSMA = sma(src, fastSMAperiod) slowSMA = sma(src, slowSMAperiod) // Calculate trading conditions enterLong = crossover(fastSMA, slowSMA) enterShort = crossunder(fastSMA, slowSMA) // trend states since_buy = barssince(enterLong) since_sell = barssince(enterShort) buy_trend = since_sell > since_buy sell_trend = since_sell < since_buy is_signal = enterLong or enterShort // get the entry price entry_price = valuewhen(enterLong or enterShort, src, 0) // Plot moving averages plot(series=fastSMA, color=color.teal) plot(series=slowSMA, color=color.orange) // Plot the entries plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small) plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small) /////////////////////////////// //======[ Trailing STOP ]======// /////////////////////////////// // use SL? useSL = input(true, "Use stop Loss") // ATR multiple Stop stop_atr_length = input(14,title="ATR Length", minval=1, type=input.integer) stop_atr_mult = input(2,title="ATR Multiple", minval=0.05, step=0.1, type=input.float) // Global STOP stop_price = 0.0, stop_price := nz(stop_price[1]) // STOP ATR var stop_atr = 0.0 var entry_stop_atr = 0.0 stop_atr := nz(atr(stop_atr_length)) if enterLong or enterShort entry_stop_atr := stop_atr * stop_atr_mult // display the ATR value multiple plotshape(enterLong, title='ATR Long Stop value', style=shape.labelup, location=location.bottom, color=color.green, transp=0, text='', textcolor=color.navy, editable=true, size=size.small, show_last=1, size=size.small) // var label atr_long_label = na // var label atr_short_label = na lapos_y_entry_up = lowest(30) lapos_y_entry_dn = highest(30) // text_label = "ATR value: " + tostring(stop_atr, '#.#') + "\n\nATR Multiple value: " + tostring(entry_stop_atr, '#.#') // if enterLong // label.delete(atr_long_label) // atr_long_label := label.new(bar_index, lapos_y_entry_up, text=text_label, // xloc=xloc.bar_index, yloc=yloc.price, color=color.green, style=label.style_labelup, textcolor=color.white, // size=size.normal) // if enterShort // label.delete(atr_short_label) // atr_short_label := label.new(bar_index, lapos_y_entry_dn, text=text_label, // xloc=xloc.bar_index, yloc=yloc.price, color=color.red, style=label.style_labeldown, textcolor=color.black, // size=size.normal) // Determine trail stop loss prices longStopPrice = 0.0, shortStopPrice = 0.0 longStopPrice := if useSL and buy_trend stopValue = entry_price - entry_stop_atr else 0 shortStopPrice := if useSL and sell_trend stopValue = entry_price + entry_stop_atr else 999999 ////////////////////////////////////////////////////////////////////////////////////////// //*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS ***// ////////////////////////////////////////////////////////////////////////////////////////// cond_long_stop_loss_hit = useSL and buy_trend and crossunder(low, longStopPrice[1]) cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) // Plot stop loss values for confirmation plot(series=useSL and buy_trend and low >= longStopPrice ? longStopPrice : na, color=color.fuchsia, style=plot.style_cross, linewidth=2, title="Long Trail Stop") plot(series=useSL and sell_trend and high <= shortStopPrice ? shortStopPrice : na, color=color.fuchsia, style=plot.style_cross, linewidth=2, title="Short Trail Stop") close_long = cond_long_stop_loss_hit close_short = cond_short_stop_loss_hit // Submit entry orders strategy.entry(TradeId + " L", long=true, when=enterLong) strategy.close(TradeId + " L", when=close_long) //if (enterShort) strategy.entry(TradeId + " S", long=false, when=enterShort) strategy.close(TradeId + " S", when=close_short)