Chiến lược giao dịch đa thời gian dựa trên đường trung bình động

Tác giả:ChaoZhang, Ngày: 2023-12-26 10:13:34
Tags:

img

Tổng quan

Chiến lược này kết hợp ba chỉ số - Moving Average, Bollinger Bands và Relative Strength Index (RSI) cho giao dịch chứng khoán đa giai đoạn. Nó xem xét các chéo giữa các đường trung bình di chuyển nhanh và chậm, RSI dưới 50 và giá đóng bên dưới BB giữa khi mua. Nó xem xét RSI trên 70 và giá đóng bên trên BB trên khi bán.

Chiến lược logic

Các chỉ số này bao gồm các đường trung bình di chuyển nhanh và chậm. Các đường chéo của đường nhanh trên đường chậm tạo ra tín hiệu mua. Thứ hai, các dải Bollinger với các dải giữa, trên và dưới. Giá gần dải dưới trình bày cơ hội mua trong swing low, trong khi giá gần dải trên trình bày cơ hội bán ở swing high. Cuối cùng, chỉ số RSI phản ánh tốc độ và tỷ lệ thay đổi của hành động giá và xác định các swing high và swing low tiềm năng.

Cụ thể, chiến lược này trước tiên yêu cầu giá trung bình động nhanh vượt trên mức trung bình động chậm, cho thấy xu hướng tăng mạnh gợi ý mua. Nó cũng yêu cầu chỉ số RSI dưới 50, cho thấy giá có thể ở mức bán quá mức và giới thiệu cơ hội mua. Ngoài ra, nó yêu cầu giá đóng bên dưới dải trung bình BB, cho thấy xu hướng giá dao động thấp và một điểm nhập tốt.

Đối với lấy lợi nhuận và dừng lỗ, khi chỉ số RSI tăng trên 70, nó cho thấy giá có thể ở mức mua quá mức và động lực xu hướng tăng đang suy giảm, phù hợp để lấy lợi nhuận.

Ưu điểm

Chiến lược kết hợp các điểm mạnh của đường trung bình động, Bollinger Bands và RSI để xác định chính xác hơn các điểm nhập và thoát.

  1. Đường trung bình động xác định động lực xu hướng tăng giá. Dải giữa BB xác định điểm dao động thấp nhất để vào. RSI tránh mua ở đỉnh giá. Ba thứ cùng nhau cung cấp cơ hội mua tương đối lý tưởng trong xu hướng tăng giá.

  2. Sự kết hợp của RSI và BB băng thượng nắm bắt giá dao động cao tốt để lấy lợi nhuận để tránh các điều kiện mua quá mức.

  3. Đánh giá nhiều giai đoạn cho phép nắm bắt các cơ hội giao dịch trên các khung thời gian để tối đa hóa lợi nhuận.

  4. Các quy tắc giao dịch hợp lý làm cho chiến lược dễ hiểu cho các khoản đầu tư trung bình đến dài hạn.

Rủi ro

Mặc dù kết hợp các chỉ số để cải thiện độ chính xác quyết định, vẫn có những rủi ro chính:

  1. Các tham số cho các chỉ số cần điều chỉnh kinh nghiệm.

  2. Thích hợp hơn cho thị trường tăng. Trong thị trường gấu, tốc độ giảm giá có thể làm cho dừng lỗ không hiệu quả.

  3. Rủi ro cổ phiếu duy nhất vẫn tồn tại mặc dù danh mục đầu tư cần phải đa dạng hóa đầu tư trên các tài sản.

  4. Tần suất giao dịch có khả năng quá cao. Thiết lập tham số tối ưu có thể dẫn đến giao dịch thường xuyên, gây ra chi phí giao dịch và thuế cao hơn.

Giải pháp:

  1. Điều chỉnh các thông số dựa trên các thử nghiệm ngược để đạt được tần số tín hiệu phù hợp.

  2. Điều chỉnh các khoảng thời gian trung bình động đến tần suất nhập trung bình và giảm thiểu tổn thất.

  3. Phân phối đầu tư trên nhiều tài sản hơn để giảm thiểu rủi ro chỉ có một cổ phiếu.

  4. Nới lỏng các tiêu chí mua và lợi nhuận một cách vừa phải để giảm tần suất giao dịch.

Cơ hội gia tăng

Vẫn còn nhiều chỗ để tối ưu hóa:

  1. Thêm nhiều bộ lọc như khối lượng để đảm bảo khối lượng mua lớn hơn, cải thiện độ chính xác quyết định.

  2. Kết hợp các mô-đun định kích thước vị trí để định kích thước vị trí theo cách động dựa trên điều kiện thị trường.

  3. Sử dụng các thuật toán học sâu để tự động điều chỉnh các tham số thông qua đào tạo trên các tập dữ liệu lớn.

  4. Đưa ra nhiều khung thời gian cho các phán quyết để mở rộng tính áp dụng.

Kết luận

Nhìn chung, chiến lược có logic rõ ràng, dễ hiểu, kết hợp các chỉ số để giảm tín hiệu sai. Việc điều chỉnh các tham số và thêm các chỉ số có thể tiếp tục tăng cường độ bền và độ chính xác quyết định. Nó phù hợp với đầu tư trung và dài hạn và giao dịch định lượng. Tuy nhiên, không có chiến lược nào loại bỏ hoàn toàn rủi ro thị trường.


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

//
//@author Alorse
//@version=4
strategy("MACD + BB + RSI [Alorse]", shorttitle="BB + MACD + RSI [Alorse]", overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=1000, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.01) 

txtVer = "1.0.1"
version = input(title="Version", type=input.string, defval=txtVer, options=[txtVer], tooltip="This is informational only, nothing will change.")
src = input(title="Source", type=input.source, defval=close)

// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=12, group="MACD")
slow_length = input(title="Slow Length", type=input.integer, defval=26, group="MACD")
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input(title="Oscillator MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input(title="Signal Line MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)

// Bollinger Bands
bbGroup = "Bollindger Bands"
length = input(20, title="Length", group=bbGroup)
mult = input(2.0, title="StdDev", minval=0.001, maxval=5, group=bbGroup)

basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev

// RSI
rsiGroup = "RSI"
lenRSI = input(14, title="Length", minval=1, group=rsiGroup)
// lessThan = input(50, title="Less than", minval=1 , maxval=100, group=rsiGroup)
RSI = rsi(src, lenRSI)

// Strategy Conditions
buy = crossover(macd, signal) and RSI < 50 and close < basis
sell = RSI > 70 and close > upper


// Stop Loss
slGroup = "Stop Loss"
useSL = input(false, title="╔══════   Enable   ══════╗", group=slGroup, tooltip="If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.")
SLbased = input(title="Based on", type=input.string, defval="Percent", options=["ATR", "Percent"], group=slGroup, tooltip="ATR: Average True Range\nPercent: eg. 5%.")
multiATR = input(10.0, title="ATR   Mult", type=input.float, group=slGroup, inline="atr")
lengthATR = input(14, title="Length", type=input.integer, group=slGroup, inline="atr")
SLPercent = input(10, title="Percent", type=input.float, group=slGroup) * 0.01

longStop = 0.0
shortStop = 0.0

if SLbased == "ATR"
    longStop := valuewhen(buy, low, 0) - (valuewhen(buy, rma(tr(true), lengthATR), 0) * multiATR)
    longStopPrev = nz(longStop[1], longStop)
    longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

    shortStop := (valuewhen(sell, rma(tr(true), lengthATR), 0) * multiATR) + valuewhen(sell, high, 0)
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := close[1] > shortStopPrev ? max(shortStop, shortStopPrev) : shortStop
if SLbased == "Percent"
    longStop  := strategy.position_avg_price * (1 - SLPercent)
    shortStop := strategy.position_avg_price * (1 + SLPercent)

strategy.entry("Long", true, when=buy)
strategy.close("Long", when=sell, comment="Exit")

if useSL
    strategy.exit("Stop Loss", "Long", stop=longStop)


Thêm nữa