Chiến lược giao dịch chỉ số động lực đảo ngược kép

Tác giả:ChaoZhang, Ngày: 2023-12-25 12:02:57
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số động lực đảo ngược kép cho giao dịch. Nó tính toán chỉ số động lực đảo ngược trong một khoảng thời gian nhất định bằng cách sử dụng giá cao nhất, giá thấp nhất và giá đóng cửa, và tạo ra tín hiệu giao dịch khi chỉ số đảo ngược xuống từ vùng mua quá mức hoặc đảo ngược lên từ vùng bán quá mức. Nó cũng thiết lập một cơ chế dừng lỗ đột phá.

Chiến lược logic

Chỉ số cốt lõi của chiến lược này là Chỉ số Động lực Stochastic (SMI). Công thức tính toán của SMI là:

$$SMI = \frac{Close-(HH+LL)/2}{AVGDIFF/2}*100$$

Trong đó HH là giá cao nhất trong N ngày qua, LL là giá thấp nhất trong N ngày qua, N được xác định bởi tham số a; AVGDIFF là trung bình động trong M ngày của HH-LL, M được xác định bởi tham số b.

SMI cho thấy đặc điểm đảo ngược của giá. Khi giá cổ phiếu tiếp cận điểm cao nhất trong N ngày qua, SMI gần 100, cho thấy cổ phiếu đã mua quá mức; khi nó tiếp cận điểm thấp nhất trong N ngày qua, SMI gần -100, cho thấy đã bán quá mức. Các tín hiệu mua / bán được tạo ra khi SMI đảo ngược xuống từ mức 100 hoặc đảo ngược từ mức -100.

Chiến lược này sử dụng đường tín hiệu giao dịch là SMA di chuyển trung bình M ngày của SMI. Khi SMI đảo ngược xuống khỏi vùng mua quá mức và phá vỡ dưới SMA, một tín hiệu mua được tạo ra. Khi SMI đảo ngược từ vùng bán quá mức và phá vỡ trên SMA, một tín hiệu bán được tạo ra.

Ngoài ra, chiến lược đánh giá cơ thể nến để dừng lỗ.

Phân tích lợi thế

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

  1. Sử dụng nguyên tắc đảo ngược giá, nó có thể tạo ra các tín hiệu giao dịch tại các điểm đảo ngược và nắm bắt các cơ hội đảo ngược.

  2. SMI kết hợp giá cao nhất, giá thấp nhất và giá đóng cửa để đánh giá các điều kiện mua quá mức và bán quá mức, tạo ra các tín hiệu đáng tin cậy hơn.

  3. Với cơ thể nến phá vỡ dừng lỗ, nó có thể thoát khỏi các vị trí kịp thời và kiểm soát hiệu quả rủi ro.

  4. Chiến lược có ít thông số và dễ thực hiện và tối ưu hóa.

Phân tích rủi ro

Ngoài ra còn có một số rủi ro cho chiến lược này:

  1. Giao dịch đảo ngược thấy khó xác định thời gian chính xác của sự đảo ngược thành công và có thể phải chịu nhiều lỗ trước khi nắm bắt sự đảo ngược xu hướng.

  2. Việc đánh giá sai các điểm đảo ngược có thể dẫn đến sự gia tăng tổn thất.

  3. Các cơ thể phá vỡ dừng mất có thể quá nhạy cảm với khả năng cao bị mắc kẹt.

Các giải pháp là:

  1. Tối ưu hóa các thông số SMI để điều chỉnh tần suất giao dịch đảo ngược.

  2. Kết hợp các chỉ số khác để xác định thời gian đảo ngược.

  3. Điều chỉnh kích thước cơ thể để ngăn ngừa quá nhạy cảm.

Tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa các thông số a và b của SMI để điều chỉnh độ nhạy của việc thu thập các bước đảo ngược.

  2. Thêm các chỉ số khác để đánh giá để tránh bỏ lỡ các hướng xu hướng chính, ví dụ như đường trung bình động, chỉ số biến động v.v.

  3. Thêm nhiều phương pháp dừng lỗ hơn để tránh quá nhạy cảm hoặc không nhạy cảm, chẳng hạn như dừng lỗ sau, dừng lỗ đường cong vv

  4. Kết hợp các mô hình học máy để đánh giá xác suất thành công đảo ngược, tránh các giao dịch đảo ngược thất bại.

Kết luận

Kết luận, đây là một chiến lược giao dịch hai hướng dựa trên chỉ số động lực đảo ngược SMI. Ưu điểm nằm trong việc nắm bắt nhiều cơ hội giao dịch ngắn hạn hơn bằng cách sử dụng đảo ngược giá và tạo ra tín hiệu tại các điểm đảo ngược. Nhưng cũng có những rủi ro điển hình của giao dịch đảo ngược. Cần điều chỉnh tham số và tối ưu hóa stop loss để ngăn ngừa tổn thất khuếch đại. Nhìn chung, chiến lược này phù hợp với các nhà đầu tư quan tâm đến giao dịch đảo ngược, nhưng phải kết hợp các chỉ số khác và dừng lỗ nghiêm ngặt để kiểm soát rủi ro.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.0", shorttitle = "Stochastic str 1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
a = input(5, "Percent K Length")
b = input(3, "Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
up = SMIsignal < -1 * limit and close < open
dn = SMIsignal > limit and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Bottom", strategy.long, needlong == false ? 0 : lot)

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Top", strategy.short, needshort == false ? 0 : lot)
    
if  exit
    strategy.close_all()

Thêm nữa