Chiến lược dừng lỗ ATR tốt nhất


Ngày tạo: 2024-02-21 14:24:22 sửa đổi lần cuối: 2024-02-21 14:24:22
sao chép: 1 Số nhấp chuột: 943
1
tập trung vào
1617
Người theo dõi

Chiến lược dừng lỗ ATR tốt nhất

Tổng quan

Chiến lược ATR tốt nhất là một chiến lược theo dõi xu hướng, sử dụng nhân của sóng thực trung bình (ATR) để thiết lập điểm dừng, điều chỉnh rủi ro động. Khi xu hướng giá thay đổi, nó có thể dừng lại kịp thời và tránh thiệt hại lớn.

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

Chiến lược này đầu tiên tính toán trung bình di chuyển đơn giản của chu kỳ SMA nhanh và chu kỳ SMA chậm, làm nhiều khi vượt qua SMA chậm trên SMA nhanh và làm tròn khi vượt qua SMA chậm dưới SMA nhanh.

Sau khi nhập, nó sẽ theo dõi giá trị của ATR trong thời gian thực. ATR biểu thị độ dao động trung bình trong một chu kỳ nhất định trong quá khứ. Chính sách này cho phép chúng tôi thiết lập độ dài chu kỳ của ATR (bằng mặc định 14) và nhân số (bằng mặc định 2).

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 là 100 điểm. Nếu giá sau đó chạy trên 100 điểm, lệnh dừng sẽ được kích hoạt. Điều này có thể dừng lỗ kịp thời và tránh thiệt hại quá lớn.

Chiến lược này đồng thời xem xét xu hướng, chỉ khi tín hiệu mua phù hợp với xu hướng tăng lên, lệnh dừng dài sẽ được kích hoạt. Các tín hiệu giảm giá được kích hoạt khi phù hợp với xu hướng giảm.

Đường dừng sẽ được vẽ trên biểu đồ, chúng tôi có thể xác minh trong thời gian thực. Khi điều kiện dừng được kích hoạt, vị trí tương ứng cũng sẽ được hệ thống tự động thanh toán.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là khả năng điều chỉnh động khoảng dừng, có thể tự động sửa đổi lỗ hổng rủi ro theo biến động của thị trường. Khi tỷ lệ biến động mở rộng, khoảng dừng cũng sẽ mở rộng, làm giảm khả năng phá vỡ. Trong thị trường biến động thấp, khoảng dừng cũng sẽ thu hẹp.

Khác với Stop Loss Fixed, phương pháp này có thể kiểm soát hiệu quả tổn thất đơn lẻ trong khi theo dõi xu hướng. Nó đảm bảo không gian lợi nhuận và chú ý đến quản lý rủi ro.

Ngoài ra, kết hợp với phán đoán xu hướng, phương pháp dừng lỗ như vậy có thể làm giảm các trường hợp bị vứt bỏ do chấn động trong khu vực sắp xếp.

Phân tích rủi ro

Rủi ro chính của chiến lược này là có nguy cơ giá rút ngắn trong thời gian giữ vị trí, kích hoạt lệnh dừng lỗ. Đặc biệt là khi chu kỳ ATR quá ngắn, khoảng cách dừng lỗ 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à trong một tình huống căng thẳng, giá có thể vượt qua đường dừng. Điều này đòi hỏi phải thiết lập một hệ số dừng lớn hơn, nhưng cũng có nghĩa là thu hẹp không gian lợi nhuận.

Cuối cùng, chiến lược này không tính đến tác động của giao dịch đêm và giao dịch trước cửa đối với giá trị ATR. Điều này có thể dẫn đến dữ liệu ATR được tính toán bởi chiến lược không chính xác khi mở hoặc đóng cửa.

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ố chu kỳ ATR, thử nghiệm các kết hợp tham số tốt nhất trong các thị trường khác nhau

  2. So sánh lợi nhuận của các thiết lập nhân cố định và biến động

  3. ATR được tính toán kết hợp với giá đêm và giá trước, giảm tác động của giá mở

  4. Thiết lập điều kiện ATR: chỉ được kích hoạt khi ATR đạt đến một mức nhất định, có thể tránh mất mát không cần thiết trong thị trường biến động thấp

  5. Kết hợp nhiều điều kiện lọc: thông tin như xu hướng cấp độ lớn, chỉ số năng lượng

Tóm tắt

Chiến lược ATR tốt nhất cho phép cân bằng hiệu quả giữa theo dõi xu hướng và kiểm soát rủi ro bằng cách điều chỉnh động khoảng cách dừng lỗ. So với khoảng cách dừng lỗ cố định, nó có thể hạn chế hiệu quả tổn thất đơn trong khi đảm bảo không gian lợi nhuận.

Tất nhiên, vẫn cần lưu ý đến một số rủi ro tiềm ẩn, chẳng hạn như giá tăng vọt, dừng lỗ quá nhạy cảm.

Mã nguồn chiến lược
/*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)