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 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:
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í.
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.
Theo dõi xu hướng trong khi giới hạn lỗ.
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.
Chỉ số ATR không nhạy cảm với sự đảo ngược mạnh và khoảng trống.
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.
Khả năng mất mát cao sau khi lấy lợi nhuận một phần.
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.
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.
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.
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.
Tối ưu hóa tham số trên ATR nhân để dừng và lấy lợi nhuận.
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.
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))