Chiến lược ATR Stop nhiều lần tốt nhất

Tác giả:ChaoZhang, Ngày: 2024-02-21 14:24:22
Tags:

img

Tổng quan

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 logic

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.

Phân tích lợi thế

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ố.

Phân tích rủi ro

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.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong một số khía cạnh:

  1. 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

  2. So sánh số lần ATR cố định so với động về mặt lợi nhuận

  3. 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ở

  4. 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

  5. Thêm nhiều bộ lọc: xu hướng chính, chỉ số khối lượng / động lực vv.

Kết luận

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)


Thêm nữa