Chiến lược hấp thụ biến động hai hướng

Tác giả:ChaoZhang, Ngày: 2023-11-21 12:04:19
Tags:

img

Tổng quan

Chiến lược này là một chiến lược giao dịch hai hướng theo dõi biến động. Nó sử dụng chỉ số Average True Range (ATR) để thiết lập dừng lỗ và xác định hướng xu hướng dựa trên giá vượt qua mức dừng lỗ. Nó mở các vị trí ngược khi hướng xu hướng thay đổi.

Chiến lược logic

Chiến lược này sử dụng ATR 3 ngày để tính biến động. Giá trị ATR nhân với một hệ số được sử dụng như mức dừng lỗ. Khi giá vượt quá mức dừng lỗ, nó đánh giá nó là xu hướng tăng và đóng các vị trí dài khi giá giảm xuống dưới mức dừng lỗ. Khi giá dưới mức dừng lỗ, nó đánh giá nó là xu hướng giảm và đóng các vị trí ngắn khi giá tăng lên trên mức dừng lỗ. Nó mở các vị trí ngược khi xu hướng thay đổi. Mức dừng lỗ được tối ưu hóa trong xu hướng và đặt lại khi xu hướng thay đổi.

Phân tích lợi thế

  • Sử dụng ATR để theo dõi biến động thị trường một cách năng động và giảm khả năng dừng lỗ bị tấn công
  • Lợi nhuận giao dịch hai hướng từ biến động thị trường
  • Mở các vị trí ngược sớm trong những thay đổi xu hướng để tăng tỷ lệ thắng

Phân tích rủi ro

  • Sự biến động cực đoan có thể gây ra sự thất bại dừng lỗ khi ATR chậm lại
  • Rủi ro GAP tồn tại cho các vị trí dài
  • Có thể giao dịch lợi nhuận nhỏ thường xuyên

Để giảm thiểu rủi ro: tăng hệ số ATR cho các mức dừng rộng hơn, hạn chế tần suất giao dịch, đặt mức lợi nhuận tối thiểu, v.v.

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

  • Kết hợp các chỉ số khác cho tín hiệu thay đổi xu hướng
  • Tối ưu hóa các thông số ATR
  • Thêm điều khiển kích thước giao dịch

Tóm lại

Đây là một chiến lược dừng kéo theo hai hướng ổn định nói chung. ATR thiết lập mức dừng năng động để kiểm soát giảm. Giao dịch hai hướng cũng làm tăng cơ hội lợi nhuận. Tăng cường tối ưu hóa hơn có thể làm cho chiến lược mạnh mẽ hơn, tăng khả năng theo dõi xu hướng.


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

//@version=2
strategy("BCH Swinger v1", overlay=true, commission_value = 0.25, default_qty_type=strategy.percent_of_equity, default_qty_value = 100)

/////////////////////////////////////////////////////////////
//START - SET DATE RANGE

// === BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2017, title = "From Year")
ToMonth   = input(defval = 10, title = "To Month", minval = 1)
ToDay     = input(defval = 01, title = "To Day", minval = 1)
ToYear    = input(defval = 2020, title = "To Year")

startDate = time > timestamp(FromYear, FromMonth, FromDay, 1, 1)
endDate = time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
withinTimeRange = true

/////////////////////////////////////////////////////////////
//END - SET DATE RANGE



/////////////////////////////////////////////////////////////
//START - INDICATORS

length = input(3)
mult = input(1, minval = 0.01)
atr_ = atr(length)
max1 = max(nz(max_[1]), close)
min1 = min(nz(min_[1]), close)
is_uptrend_prev = nz(is_uptrend[1], true)
stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_
vstop_prev = nz(vstop[1])
vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend = close - vstop1 >= 0
is_trend_changed = is_uptrend != is_uptrend_prev
max_ = is_trend_changed ? close : max1
min_ = is_trend_changed ? close : min1
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1
plot(vstop, color = is_uptrend ? yellow : red, style=circles, linewidth=2)

/////////////////////////////////////////////////////////////
//END - INDICATORS



/////////////////////////////////////////////////////////////
//START - TRADING RULES
direction = input(defval=1, title = "Strategy Direction",  minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

condition1 = close > vstop and withinTimeRange
condition2 = close < vstop and withinTimeRange

strategy.entry("BUY", strategy.long, when = condition1)
strategy.entry("SELL", strategy.short, when = condition2)

/////////////////////////////////////////////////////////////
//END - TRADING RULES

Thêm nữa