Chiến lược giao dịch định lượng đối với kênh ATR

Tác giả:ChaoZhang, Ngày: 2023-12-11 15:38:25
Tags:

img

Tổng quan

Đây là một chiến lược dài chỉ xác định tín hiệu nhập cảnh khi giá phá vỡ dưới dải dưới của kênh ATR, và lấy lợi nhuận khi giá đạt đến dải giữa (EMA) hoặc dải trên của kênh ATR. Nó cũng sử dụng ATR để tính mức dừng lỗ. Chiến lược này phù hợp cho các giao dịch ngắn hạn nhanh chóng.

Chiến lược logic

Khi giá phá vỡ dưới dải ATR thấp hơn, nó báo hiệu một sự sụt giảm bất thường. Chiến lược sẽ đi dài vào lần mở nến tiếp theo. Stop loss được thiết lập ở giá nhập trừ ATR stop loss nhân ATR. Lợi nhuận được lấy ở dải giữa (EMA) hoặc dải ATR trên. Nếu thanh hiện tại đóng thấp hơn mức thấp của thanh trước, sau đó sử dụng thanh trước thấp như lợi nhuận.

Cụ thể, logic chính bao gồm:

  1. Tính toán ATR và dải giữa (EMA)
  2. Xác định bộ lọc thời gian
  3. Xác định tín hiệu dài khi giá < dải ATR thấp hơn
  4. Nhập dài tại quán bar tiếp theo mở
  5. Giá kỷ lục
  6. Tính toán giá dừng lỗ
  7. Lợi nhuận khi giá > dải giữa (EMA) hoặc dải ATR trên
  8. Stop out khi giá < giá stop loss

Phân tích lợi thế

Những lợi thế của chiến lược này:

  1. Sử dụng kênh ATR cho tín hiệu vào và ra đáng tin cậy
  2. Chỉ lâu sau khi sự bất thường giảm tránh theo đuổi cao
  3. Kiểm soát rủi ro dừng lỗ nghiêm ngặt
  4. Thích hợp cho các giao dịch ngắn hạn nhanh chóng
  5. Logic đơn giản dễ thực hiện và tối ưu hóa

Phân tích rủi ro

Có một số rủi ro:

  1. Tần suất giao dịch cao dẫn đến chi phí giao dịch cao hơn và trượt
  2. Có thể xảy ra các kích hoạt dừng lỗ liên tiếp
  3. Tối ưu hóa tham số không phù hợp ảnh hưởng đến hiệu suất
  4. Sự biến động giá lớn có thể dẫn đến mức dừng lỗ quá lớn

Những rủi ro này có thể được giảm bằng cách điều chỉnh thời gian ATR, nhân dừng lỗ v.v. Chọn các nhà môi giới có phí giao dịch thấp cũng rất quan trọng.

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

Chiến lược có thể được cải thiện bằng cách:

  1. Thêm các chỉ số bộ lọc khác để tránh bỏ lỡ các tín hiệu đầu vào tốt nhất
  2. Tối ưu hóa thời gian ATR
  3. Xem xét cơ chế tái nhập cảnh
  4. Kích thước dừng lỗ thích nghi
  5. Thêm bộ lọc xu hướng để tránh giao dịch ngược xu hướng

Kết luận

Tóm lại, đây là một chiến lược đảo ngược trung bình đơn giản và thực tế dựa trên kênh ATR. Nó có các quy tắc nhập khẩu rõ ràng, dừng lỗ nghiêm ngặt và lợi nhuận hợp lý. Ngoài ra còn có chỗ cho điều chỉnh tham số. Nếu các nhà giao dịch có thể chọn đúng biểu tượng và kiểm soát rủi ro với dừng lỗ, chiến lược này có thể đạt được kết quả tốt.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 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/
// © Bcullen175

//@version=5
strategy("ATR Mean Reversion", overlay=true, initial_capital=100000,default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=6E-5) // Brokers rate (ICmarkets = 6E-5)
SLx = input(1.5, "SL Multiplier", tooltip = "Multiplies ATR to widen stop on volatile assests, Higher values reduce risk:reward but increase winrate, Values below 1.2 are not reccomended")
src = input(close, title="Source")
period = input.int(10, "ATR & MA PERIOD")
plot(open+ta.atr(period))
plot(open-ta.atr(period))
plot((ta.ema(src, period)), title = "Mean", color=color.white)

i_startTime     = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime       = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")

// Check filter(s)
f_dateFilter = true

atr = ta.atr(period)

// Check buy/sell conditions
var float buyPrice = 0
buyCondition    = low < (open-ta.atr(period)) and strategy.position_size == 0 and f_dateFilter
sellCondition   = (high > (ta.ema(close, period)) and strategy.position_size > 0 and close < low[1]) or high > (open+ta.atr(period))
stopDistance    = strategy.position_size > 0 ? ((buyPrice - atr)/buyPrice) : na
stopPrice       = strategy.position_size > 0 ? (buyPrice - SLx*atr): na
stopCondition   = strategy.position_size > 0 and low < stopPrice

// Enter positions
if buyCondition
    strategy.entry(id="Long", direction=strategy.long)

if buyCondition[1]
    buyPrice := open

// Exit positions
if sellCondition or stopCondition
    strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
    buyPrice := na

// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)


Thêm nữa