Chiến lược dừng lỗ động dựa trên ATR

Tác giả:ChaoZhang, Ngày: 2023-10-10 10:50:21
Tags:

Tổng quan

Chiến lược này sử dụng chỉ số ATR để thiết lập các điểm dừng lỗ năng động và điều chỉnh các vị trí dừng lỗ dựa trên biến động giá, để kiểm soát rủi ro. Chủ yếu nó đi dài khi 5EMA vượt trên 20EMA, và sau đó sử dụng chỉ số ATR để thiết lập các vị trí dừng lỗ và lấy lợi nhuận.

Chiến lược logic

Chiến lược này đầu tiên đánh giá xem 5EMA vượt trên 20EMA để mua dài. Sau khi vào, nó tính số nhân ATR của giá nhập vào giá hiện tại bằng cách sử dụng chỉ số ATR và đặt vị trí dừng lỗ ở mức 1.5ATR dưới giá nhập. Khi giá tăng, vị trí dừng lỗ được nâng dần để tăng lợi nhuận của vị trí.

Cụ thể, chiến lược xác định các biến sau:

  • entry_price: giá nhập cảnh
  • stop_price: giá dừng lỗ
  • take_profit_price: giá lấy lợi nhuận
  • atr_down: ATR downline
  • atr_up: ATR lên đường
  • atr_current: dòng ATR hiện tại
  • atr_ref: Giá trị ATR

Sau khi nhập, nó tính atr_ref là giá trị ATR hiện tại và atr_div là số nhân ATR của giá nhập vào giá hiện tại. Sau đó đặt các vị trí của atr_down, atr_current và atr_up dựa trên atr_div. Giá dừng lỗ stop_price được đặt ở mức 1.5ATR dưới giá nhập.

Khi giá tăng, bằng cách so sánh giá hiện tại và atr_up, nếu avg vượt trên atr_up, nó tính lại vị trí đường atr_div và ATR, do đó dần dần nâng đường dừng lỗ để tăng lợi nhuận.

Nếu giá tăng trên 3ATR của giá nhập cảnh, nó sẽ đóng một phần vị trí để khóa lợi nhuận và đặt tookProfit thành true. Sau đó nếu giá tiếp tục tăng, nó sẽ tiếp tục tăng stop loss. Khi stop loss được kích hoạt, nó kiểm tra tookProfit - nếu đã lấy lợi nhuận một phần trước đó, nó sẽ chỉ đóng vị trí còn lại; nếu không đóng toàn bộ vị trí.

Ưu điểm

  1. Sử dụng chỉ số ATR để điều chỉnh stop loss một cách năng động có thể thiết lập khoảng cách dừng hợp lý dựa trên biến động thị trường.

  2. Theo dõi xu hướng trong khi giới hạn lỗ.

  3. Cơ chế lấy lợi nhuận một phần khóa trong một số lợi nhuận và làm giảm rủi ro.

Rủi ro

  1. Chỉ số ATR không nhạy cảm với sự đảo ngược mạnh và khoảng trống.

  2. EMA không thể xác định sự đảo ngược xu hướng, có thể nhập vào các vị trí mới khi thay đổi xu hướng.

  3. Khả năng mất mát cao sau khi lấy lợi nhuận một phần.

  4. Các thông số cần tối ưu hóa hơn nữa, 1,5ATR dừng và 3ATR lấy lợi nhuận nên được điều chỉnh cho các sản phẩm khác nhau.

Cải tiến

  1. Xem xét thêm các chỉ số dừng lỗ khác như Kênh Donchian để bù đắp sự chậm trễ của ATR.

  2. Kiểm tra các đường trung bình động khác nhau hoặc thêm MACD v.v. để đánh giá sự đảo ngược xu hướng.

  3. Tối ưu hóa tỷ lệ lợi nhuận phần và tần suất cho các sản phẩm khác nhau.

  4. Tối ưu hóa tham số trên ATR nhân để dừng và lấy lợi nhuận.

  5. Hiệu suất thử nghiệm trong xu hướng yếu, có thể vô hiệu hóa chiến lược trong xu hướng yếu.

Tóm lại

Chiến lược này có một logic rõ ràng về việc sử dụng ATR để quản lý dừng lỗ năng động, đây là điểm mạnh lớn nhất của nó. Tuy nhiên, ATR có những hạn chế như tụt hậu. Thêm các chỉ số dừng và xu hướng khác sẽ cải thiện nó. Ngoài ra, lợi nhuận bán phần cũng cần tối ưu hóa trên các sản phẩm.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ekinbasarkomur

//@version=5
strategy("[EKIN] ATR Exit Strategy", overlay=true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = true)

// Simple EMA tracking
fastEMA = ta.ema(close, 5)
slowEMA = ta.ema (close, 20)
atr = ta.atr(14)

// We define entry price for future reference
var float entry_price = na
// We define stop and take profit for future calculations
var float stop_price = na
var float take_profit_price = na

// We define atr limtim its here
var float atr_down = na
var float atr_up = na
var float atr_current = na
var float atr_ref = na

avg = (low + high) / 2

// Conditions
enterCondition = ta.crossover(fastEMA, slowEMA)
var bool tookProfit = false
timePeriod = time >= timestamp(syminfo.timezone, 2021, 12, 15, 0, 0)
InTrade = strategy.position_size > 0

// Go long if conditions are met
if (enterCondition and timePeriod and not InTrade)
    // Calculate and update variables
    entry_price := avg
    atr_ref := atr
    atr_div = int((avg - entry_price) / atr_ref)
    atr_down := entry_price + (atr_ref * (atr_div - 1.5))
    atr_up := entry_price + (atr_ref * (atr_div + 1))
    atr_current := entry_price + (atr_ref * atr_div) 
    stop_price := (entry_price - (atr_ref * 1.5))
    take_profit_price := (entry_price + (atr_ref * 3))
    strategy.order("buy", strategy.long, qty = 2)

// Enter here if in position
if InTrade or tookProfit
    stopCondition = avg < stop_price
    takeProfitCondition = avg > take_profit_price

    if avg < atr_down
        stopCondition := true

    // Move stop price and exit price if price for each atr price increase
    if avg > atr_up
        if tookProfit
            atr_ref := atr
        atr_div = int((avg - entry_price) / atr_ref)
        atr_down := entry_price + (atr_ref * (atr_div - 1))
        atr_up := entry_price + (atr_ref * (atr_div + 1))
        atr_current := entry_price + (atr_ref * atr_div) 

    // Take half of the investment if current price is 3 atr higher than entry price
    if (takeProfitCondition and timePeriod and InTrade and not tookProfit)
        strategy.order("take_half_profit", strategy.short, qty = 1)
        tookProfit := true

    // Exit position if conditions are met and reset the variables
    if (stopCondition and timePeriod and InTrade)
        if tookProfit
            strategy.order("exit", strategy.short, qty = 1)
        else
            strategy.order("stop_loss", strategy.short, qty = 2)

        tookProfit := false

// Plot EMA's
plot(fastEMA, color = color.blue)
plot(slowEMA, color = color.yellow)

// Plot ATR Limit/Stop positions
profit_plot = plot(series = InTrade?atr_up:na, title = "profit", color = color.green, style=plot.style_linebr)
close_plot = plot(series = InTrade?atr_current:na, title = "close", color = color.white, style=plot.style_linebr)
stop_plot = plot(series = InTrade?atr_down:na, title = "stop_loss", color = color.red, style=plot.style_linebr)
fill(profit_plot, close_plot, color = color.new(color.green, 80))
fill(close_plot, stop_plot, color =color.new(color.red,80))

Thêm nữa