Chiến lược giao dịch Momentum cá nhân

Tác giả:ChaoZhang, Ngày: 2023-11-23 15:18:27
Tags:

img

Tổng quan

Đây là một chiến lược giao dịch được cá nhân hóa kết hợp các chỉ số động lực và lọc thực thể nến. Nó sử dụng toàn diện ba chỉ số kỹ thuật - Chỉ số động lực chứng khoán, chỉ số RSI nhanh và lọc thực thể nến để thực hiện một chiến lược dựa trên đột phá động lực trong khi cũng xem xét các điều kiện mua quá mức và bán quá mức.

Logic giao dịch

Chiến lược sử dụng ba chỉ số sau đây để đánh giá tín hiệu giao dịch:

  1. Chỉ số Động lực Chế độ (SMI): Nó kết hợp khoảng cách giữa các thực thể nến và vị trí tương đối của giá đóng cửa để đánh giá sức mạnh hoặc điểm yếu của động lực giá. Nó tạo ra tín hiệu mua khi SMI vượt qua đường ranh giới và tín hiệu bán khi vượt qua đường ranh giới.

  2. Chỉ số RSI nhanh (7 ngày): Nó đánh giá các điều kiện mua quá mức và bán quá mức của giá. RSI dưới 20 tạo ra tín hiệu mua là bán quá mức trong khi trên 80 tạo ra tín hiệu bán là mua quá mức.

  3. Bộ lọc thực thể nến: Tính toán kích thước thực thể nến trung bình trong 10 ngày qua. Chỉ bật tín hiệu khi thực thể nến ngày hôm nay vượt quá một phần ba của mức trung bình đó để tránh các tín hiệu không hợp lệ.

Chiến lược này đầu tiên đánh giá các tín hiệu từ SMI và RSI. Nếu yêu cầu tín hiệu chỉ số nào đó được đáp ứng, sau đó kết hợp bộ lọc thực thể nến để xác định xem tín hiệu đó có hợp lệ hay không và tạo tín hiệu giao dịch nếu hợp lệ.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Phán đoán chính xác và đáng tin cậy hơn với sự kết hợp của nhiều chỉ số.

  2. Thêm bộ lọc thực thể nến tránh các tín hiệu không hợp lệ.

  3. Bằng cách kết hợp các điều kiện mua quá mức / bán quá mức, dễ dàng hơn để nắm bắt các tín hiệu tại các điểm đảo ngược xu hướng.

  4. Tăng cơ hội lợi nhuận với giao dịch dài / ngắn hai hướng.

  5. Giao dịch vị trí một phần tránh mất mát một lần quá mức.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Chỉ số có thể tạo ra tín hiệu sai dẫn đến tổn thất.

  2. Giao dịch vị trí một phần không thể tận dụng đầy đủ các cơ hội xu hướng theo từng hướng.

  3. Là chỉ số chính, SMI nhạy cảm với cài đặt tham số.

  4. Giao dịch thường xuyên với chiến lược hai hướng làm tăng chi phí giao dịch.

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

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

  1. Tối ưu hóa các thông số cho SMI và RSI để tìm kết hợp thông số tốt nhất.

  2. Tăng quy mô vị trí và cơ chế quản lý vị trí để đạt được lợi nhuận cao hơn trong thời gian xu hướng.

  3. Thêm các chiến lược dừng lỗ để giảm rủi ro mất một lần.

  4. Kết hợp nhiều chỉ số để đánh giá độ tin cậy của tín hiệu và giảm tín hiệu sai.

  5. Chấp nhận hợp đồng hiệu quả để giảm chi phí giao dịch.

Kết luận

Chiến lược này sử dụng toàn diện các chỉ số lọc thực thể SMI, RSI nhanh và nến để thực hiện một chiến lược giao dịch cá nhân dựa trên đà phát triển, đánh giá mua quá mức / bán quá mức. Nó có những lợi thế như phán đoán chính xác, xác định các tín hiệu hợp lệ, kết hợp các điều kiện mua quá mức / bán quá mức và giao dịch hai hướng, nhưng cũng có những rủi ro như độ nhạy của tham số, không thể khai thác đầy đủ xu hướng và các hoạt động thường xuyên. Bằng cách liên tục tối ưu hóa các tham số, tăng kích thước vị trí và quản lý dừng lỗ, giảm các tín hiệu sai, chiến lược có thể đạt được hiệu suất giao dịch tốt hơn.


/*backtest
start: 2023-10-23 00:00:00
end: 2023-11-22 00:00:00
period: 6h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.2", shorttitle = "Stochastic str 1.2", 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")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, 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")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//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 Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Thêm nữa