Chiến lược giao dịch trung bình động kép

Tác giả:ChaoZhang, Ngày: 2023-12-01 18:13:21
Tags:

img

Tổng quan

Chiến lược giao dịch Momentum Dual Moving Average là một chiến lược giao dịch ngắn hạn sử dụng cả động lực giá và các chỉ số xu hướng. Chiến lược sử dụng giá đóng, giá mở, kênh giá, RSI nhanh và các chỉ số khác để tạo ra tín hiệu giao dịch. Nó sẽ thiết lập các vị trí dài hoặc ngắn khi giá đột phá hoặc tín hiệu chỉ số xuất hiện. Nó cũng thiết lập các điều kiện dừng lỗ để buộc thanh lý khi lỗ đạt đến một mức độ nhất định.

Nguyên tắc chiến lược

Chiến lược đưa ra quyết định giao dịch chủ yếu dựa trên các chỉ số đánh giá sau:

  1. Kênh giá: Tính toán giá cao nhất và thấp nhất của 30 ngọn nến gần đây nhất để xác định phạm vi kênh. Giá đóng trên điểm giữa kênh được coi là tăng. Giá đóng dưới điểm giữa kênh được coi là giảm.

  2. RSI nhanh: Tính toán giá trị RSI của 2 ngọn nến mới nhất. RSI dưới 25 được coi là quá bán và RSI trên 75 được coi là quá mua.

  3. Đường Yin Yang: Tính toán kích thước thực thể của 2 ngọn nến mới nhất. Hai ngọn nến màu đỏ cho thấy tín hiệu giảm trong khi hai ngọn nến màu xanh lá cây cho thấy tín hiệu tăng.

  4. Điều kiện dừng lỗ: buộc thanh lý khi lỗ đạt một tỷ lệ phần trăm nhất định để hạn chế lỗ.

Với các tín hiệu kết hợp từ các chỉ số xu hướng, động lực và mua quá mức / bán quá mức, chiến lược ngắn hạn này có thể xác định hiệu quả sự đảo ngược và tạo ra các tín hiệu giao dịch kịp thời.

Phân tích lợi thế

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

  1. Cải thiện độ chính xác tín hiệu bằng cách kết hợp nhiều chỉ số, giúp lọc các tín hiệu sai.

  2. Phản ứng nhanh hơn đối với các điểm biến đổi do sử dụng RSI nhanh, nhạy hơn RSI thông thường.

  3. Độ tin cậy cao trên các sản phẩm và khung thời gian khác nhau, nhờ tối ưu hóa tham số nghiêm ngặt trong các thử nghiệm ngược.

  4. Cơ chế dừng lỗ tự động để kiểm soát tổn thất tiềm năng vượt quá mong đợi.

Phân tích rủi ro

Một số rủi ro của chiến lược này:

  1. Thiết lập tham số kênh giá không chính xác có thể gây sốc. Các kênh quá hẹp có thể gây ra sự đột phá sai.

  2. Thời gian giữ vị trí đơn phương có thể quá dài trong các xu hướng mạnh, vượt quá dự báo.

  3. Thiết lập điểm dừng lỗ không chính xác có thể làm tăng tổn thất.

Chúng ta có thể giảm thiểu và giảm thiểu những rủi ro này bằng cách điều chỉnh các thông số kênh, tối ưu hóa thời gian nhập cảnh, điều chỉnh động các điểm dừng lỗ vv.

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

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

  1. Kết hợp các thuật toán học máy để đạt được tối ưu hóa tham số tự động, tăng khả năng thích nghi.

  2. Kết hợp nhiều nguồn dữ liệu hơn như tin tức để cải thiện quyết định giao dịch và độ chính xác tín hiệu.

  3. Phát triển các cơ chế định hình vị trí năng động dựa trên điều kiện thị trường để kiểm soát tốt hơn rủi ro.

  4. Mở rộng khả năng áp dụng cho giao dịch tùy chọn nhị phân tương lai để tăng thêm lợi nhuận tuyệt đối.

Kết luận

Chiến lược này kết hợp các kỹ thuật khác nhau bao gồm đột phá giá, tín hiệu chỉ báo, dừng lỗ vv. Nó đã chứng minh sự ổn định và hiệu suất tốt trong các thử nghiệm ngược và giao dịch trực tiếp. Khi các công nghệ thuật toán và dữ liệu tiến bộ, vẫn còn lợi nhuận đáng kể cho chiến lược này. Có thể mong đợi cải tiến liên tục.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's Price Channel Strategy v1.2", shorttitle = "Price Channel str 1.2", overlay=true, 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 = 100000, title = "capital, %")
uset = input(true, defval = true, title = "Use trend entry")
usect = input(true, defval = true, title = "Use counter-trend entry")
usersi = input(true, defval = true, title = "Use RSI strategy")
pch = input(30, defval = 30, minval = 2, maxval = 200, title = "Price Channel Period")
showcl = input(true, defval = true, title = "Price Channel")
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")
src = close

//Price channel
lasthigh = highest(src, pch)
lastlow = lowest(src, pch)
center = (lasthigh + lastlow) / 2
trend = low > center ? 1 : high < center ? -1 : trend[1]
col = showcl ? blue : na
col2 = showcl ? black : na
plot(lasthigh, color = col2, linewidth = 2)
plot(lastlow, color = col2, linewidth = 2)
plot(center, color = col, linewidth = 2)

//Bars
bar = close > open ? 1 : close < open ? -1 : 0
rbars = sma(bar, 2) == -1
gbars = sma(bar, 2) == 1

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

//Signals
body = abs(close - open)
abody = sma(body, 10)
up1 = rbars and close > center and uset
dn1 = gbars and close < center and uset
up2 = close <= lastlow and close < open and usect
dn2 = close >= lasthigh and close > open and usect
up3 = fastrsi < 25 and close > center and usersi
dn3 = fastrsi > 75 and close < center and usersi
exit = (((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2)
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

//Trading
if up1 or up2 or up3
    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 or dn3
    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