Chiến lược giao dịch chuyển động

Tác giả:ChaoZhang, Ngày: 2024-02-05 10:44:19
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch dao động khoảng thời gian hàng ngày dựa trên các kỹ thuật động lực sử dụng ATR Stops. Nó được tạo ra bởi Kory Hoang từ Stably.

Chiến lược xác định hướng xu hướng bằng cách sử dụng các chỉ số động lực và thiết lập các đường dừng lỗ dựa trên ATR để thực hiện giao dịch swing low buy-high sell.

Chiến lược logic

Mã đầu tiên thiết lập khoảng thời gian backtesting.

Sau đó, trong phần chỉ số, các chỉ số sau đây được tính:

  • atr(): tính toán ATR cho stop loss;
  • max_/min_: giá cao nhất/giá thấp nhất của thanh trước;
  • is_uptrend: đánh giá liệu nó có trong xu hướng tăng hay không;
  • vstop: đường dừng lỗ;

Lý thuyết chính để đánh giá xu hướng là:

Nếu đóng cửa cao hơn đường dừng lỗ giảm trước đó, nó được đánh giá là xu hướng tăng; nếu đóng cửa thấp hơn đường dừng lỗ tăng trước đó, nó được đánh giá là xu hướng giảm.

Khi xu hướng thay đổi, điều chỉnh vị trí đường dừng lỗ.

Cụ thể, trong xu hướng tăng, đường dừng lỗ được đặt ở mức giá cao nhất của thanh trước trừ giá trị ATR; trong xu hướng giảm, đường dừng lỗ được đặt ở mức giá thấp nhất của thanh trước cộng với giá trị ATR.

Điều này nhận ra xu hướng sau khi dừng lỗ.

Trong phần Quy tắc giao dịch, mở các vị trí dài / ngắn khi giá vượt qua đường dừng lỗ.

Phân tích lợi thế

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

  1. Đánh giá hướng xu hướng bằng cách sử dụng các kỹ thuật động lực, kịp thời bắt gặp các điểm chuyển hướng và tránh các sự đột phá sai.
  2. ATR dừng lỗ theo dõi giá cao nhất / thấp nhất, có thể kiểm soát rủi ro tốt.
  3. Đơn giản và rõ ràng chiến lược logic, dễ hiểu và thực hiện.
  4. Có thể giao dịch giá thấp, giá cao giữa các bước.

Phân tích rủi ro

Ngoài ra còn có một số rủi ro:

  1. Các tham số ATR không chính xác có thể làm cho stop loss quá lỏng lẻo hoặc quá chặt chẽ.
  2. Các whipsaws dữ dội có thể xảy ra trong các xu hướng dao động, gây ra các lệnh dừng thua liên tiếp.
  3. Tần suất giao dịch cao, hoa hồng cao hơn.

Một số tối ưu hóa:

  1. Kiểm tra các thông số ATR khác nhau để tìm ra tối ưu.
  2. Tối ưu hóa dừng lỗ kết hợp các số liệu biến động trên ATR.
  3. Thêm bộ lọc xu hướng để tránh giao dịch không cần thiết trong thời gian thị trường hỗn loạn.

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

Một số hướng để tối ưu hóa chiến lược này:

  1. Kiểm tra các tham số ATR khác nhau để tìm ra tối ưu. Kiểm tra lại nhiều bộ tham số và đánh giá tỷ lệ lợi nhuận / rủi ro.

  2. Tối ưu hóa stop loss kết hợp các số liệu biến động trên ATR. Thêm số liệu biến động, thư giãn stop loss đúng trong các giai đoạn biến động tăng.

  3. Thêm bộ lọc xu hướng để tránh giao dịch trong thị trường hỗn loạn. Thêm chỉ số đánh giá xu hướng, chỉ giao dịch khi xu hướng rõ ràng.

  4. Thêm cơ chế kích thước vị trí. Điều chỉnh kích thước vị trí dựa trên tỷ lệ sử dụng tài khoản, thời gian dừng lỗ liên tiếp vv

  5. Thêm kiểm soát rủi ro lỗ hổng qua đêm.

Kết luận

Là một chiến lược giao dịch swing hàng ngày cơ bản, logic tổng thể là rõ ràng. Nó đánh giá xu hướng với các kỹ thuật động lực và sử dụng ATR để ngăn chặn lỗ, kiểm soát rủi ro hiệu quả.

Vẫn còn nhiều chỗ để tối ưu hóa, có thể cải thiện từ các khía cạnh như phán đoán xu hướng, phương pháp dừng lỗ, kích thước vị trí vv để làm cho chiến lược thực tế hơn.


/*backtest
start: 2023-01-29 00:00:00
end: 2024-02-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("BTC Swinger", 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 = 2010, title = "From Year")
ToMonth   = input(defval = 12, title = "To Month", minval = 1)
ToDay     = input(defval = 31, 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