Chiến lược giao dịch điểm số đa chỉ số

Tác giả:ChaoZhang, Ngày: 2023-11-07 16:16:45
Tags:

img

Tổng quan

Chiến lược giao dịch điểm số đa chỉ số tích hợp điểm số chỉ số kỹ thuật để xác định hướng xu hướng và sức mạnh cho giao dịch tự động. Nó xem xét một nhóm các chỉ số bao gồm Ichimoku Cloud, HMA, RSI, Stoch, CCI và MACD. Mỗi kết quả chỉ số được ghi điểm và điểm số tổng thể được tính bằng cách tính trung bình tất cả các điểm số chỉ số. Khi điểm số tổng thể vượt quá ngưỡng, đi dài. Khi dưới ngưỡng, đi ngắn.

Chiến lược logic

Chiến lược bao gồm một số phần:

  1. Tính toán một nhóm các chỉ số bao gồm Ichimoku Cloud, Hull Moving Average, Relative Strength Index, Stochastic, Commodity Channel Index và Moving Average Convergence Divergence.

  2. Đánh giá mỗi chỉ số, cho điểm tích cực cho tín hiệu tăng và điểm âm cho tín hiệu giảm.

  3. Tổng cộng và trung bình tất cả các chỉ số để có được điểm tổng thể.

  4. So sánh điểm số tổng thể với ngưỡng đã đặt trước để xác định hướng xu hướng tổng thể.

  5. Mở vị trí dựa trên phán đoán, dài khi tăng, ngắn khi giảm.

  6. Thiết lập dừng lỗ và lấy lợi nhuận dựa trên ATR.

Chiến lược sử dụng đầy đủ những lợi thế của nhiều chỉ số để xác định xu hướng thị trường. so với chỉ số duy nhất, nó giúp lọc một số tín hiệu sai và tăng độ tin cậy.

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ác chỉ số đa kết hợp giúp cải thiện độ chính xác tín hiệu. Chỉ số duy nhất dễ bị tín hiệu sai. Điểm số và tính trung bình giúp lọc các tín hiệu sai một cách hiệu quả.

  2. Sử dụng các chỉ số mạnh để xác định xu hướng và động lực. Ví dụ, Ichimoku Cloud cho xu hướng, Stochastics cho quá mua và quá bán.

  3. Giao dịch tự động tránh tác động cảm xúc và tuân thủ chặt chẽ các tín hiệu chiến lược.

  4. Sử dụng ATR để dừng lỗ và lấy lợi nhuận giúp quản lý rủi ro.

  5. Các thông số và ngưỡng điểm có thể được tối ưu hóa cho các sản phẩm khác nhau.

  6. Logic đơn giản và rõ ràng, dễ hiểu và sửa đổi.

Phân tích rủi ro

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

  1. Nhiều chỉ số kết hợp không nhất thiết là tốt hơn một chỉ số duy nhất.

  2. Điểm số trung bình không thể tránh hoàn toàn tổn thất khi các chỉ số cung cấp tín hiệu sai.

  3. Các điểm dừng ATR có thể quá gần hoặc quá lỏng.

  4. Tránh quá mức gắn kết từ tối ưu hóa quá mức. Kiểm tra độ bền trên các sản phẩm và thời gian khác nhau.

  5. Tần suất giao dịch cao làm tăng chi phí giao dịch cũng ảnh hưởng đến lợi nhuận cuối cùng.

Hướng dẫn 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. Kiểm tra nhiều kết hợp chỉ số hơn để tìm lựa chọn tối ưu cho sản phẩm cụ thể.

  2. Điều chỉnh trọng số điểm, tối ưu hóa thuật toán điểm.

  3. Các thông số ATR động để phù hợp hơn với sự biến động của thị trường.

  4. Thêm các bộ lọc giao dịch để giảm tần suất giao dịch không cần thiết, chẳng hạn như bộ lọc xu hướng hoặc bộ lọc khối lượng.

  5. Tối ưu hóa từng bước để tìm phạm vi tham số, sau đó tối ưu hóa ngẫu nhiên / lưới cho bộ tham số tốt nhất.

  6. Kiểm tra độ bền trên nhiều sản phẩm và khung thời gian để tránh quá phù hợp.

  7. Kết hợp với các chiến lược giao dịch hiệu quả khác cho danh mục đầu tư.

Kết luận

Chiến lược điểm số đa chỉ số cải thiện độ chính xác và độ tin cậy tín hiệu thông qua tính trung bình điểm số chỉ số. Với không gian tối ưu hóa lớn, nó có thể được tối ưu hóa cho kết quả tốt trên các sản phẩm khác nhau. Rủi ro quá mức cần chú ý để giữ tối ưu hóa tham số và kiểm tra chiến lược khoa học. Là một ý tưởng chiến lược với các hướng tối ưu hóa rộng, nó xứng đáng được nghiên cứu và áp dụng thêm.


/*backtest
start: 2022-10-31 00:00:00
end: 2023-11-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Ichi HMA RSI Stoch CCI MACD Technicals Rating Strategy",shorttitle="TRSv420",overlay=true,default_qty_type=strategy.percent_of_equity,default_qty_value=50,commission_type=strategy.commission.percent,commission_value=0.05)
res = input("", title="Indicator Timeframe", type=input.resolution)
Period = input(defval = 14, title = "Period Length", minval = 2)
MinSignalStrength= input(title="Minimum Signal Strength", type=input.float, defval=1.1, minval=0.00, maxval=2.00, step=0.1)
Price = input(defval=open, title="Price Source", type=input.source)
Use_Only_Buy= input(false, title = "Use ONLY BUY mode",type=input.bool)
Use_Only_Sell= input(false, title = "Use ONLY SELL mode",type=input.bool)
Use_ATR_SL_TP= input(true, title = "Use ATR for TP & SL",type=input.bool)
Use_Ichimoku= input(true, title = "Use Ichimoku",type=input.bool)
Use_HMA= input(true, title = "Use Hull MA",type=input.bool)
Use_RSI= input(true, title = "Use RSI",type=input.bool)
Use_Stoch= input(true, title = "Use Stoch",type=input.bool)
Use_CCI= input(true, title = "Use CCI",type=input.bool)
Use_MACD= input(true, title = "Use MacD",type=input.bool)
// Ichimoku Cloud
donchian(len) => avg(lowest(len), highest(len))
ichimoku_cloud() =>
    conversionLine = donchian(9)
    baseLine = donchian(26)
    leadLine1 = avg(conversionLine, baseLine)
    leadLine2 = donchian(52)
    [conversionLine, baseLine, leadLine1, leadLine2]
[IC_CLine, IC_BLine, IC_Lead1, IC_Lead2] = ichimoku_cloud()    
calcRatingMA(ma, src) => na(ma) or na(src) ? na : (ma == src ? 0 : ( ma < src ? 1 : -1 ))
calcRating(buy, sell) => buy ? 1 : ( sell ? -1 : 0 )
calcRatingAll() =>
    //============== HMA =================
    HMA10 = hma(Price, Period)
    HMA20 = hma(Price, 20)
    HMA30 = hma(Price, 30)
    HMA50 = hma(Price, 50)
    HMA100 = hma(Price, 100)
    HMA200 = hma(Price, 200)
    // Relative Strength Index, RSI
    RSI = rsi(Price,14)
    // Stochastic
    lengthStoch = 14
    smoothKStoch = 3
    smoothDStoch = 3
    kStoch = sma(stoch(Price, high, low, lengthStoch), smoothKStoch)
    dStoch = sma(kStoch, smoothDStoch)
    // Commodity Channel Index, CCI
    CCI = cci(Price, 20)
    // Moving Average Convergence/Divergence, MACD
    [macdMACD, signalMACD, _] = macd(Price, 12, 26, 9)
    // -------------------------------------------
    PriceAvg = hma(Price, Period)
    DownTrend = Price < PriceAvg
    UpTrend = Price > PriceAvg
    float ratingMA = 0
    float ratingMAC = 0
    if(Use_HMA)
        if not na(HMA10)
            ratingMA := ratingMA + calcRatingMA(HMA10, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA20)
            ratingMA := ratingMA + calcRatingMA(HMA20, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA30)
            ratingMA := ratingMA + calcRatingMA(HMA30, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA50)
            ratingMA := ratingMA + calcRatingMA(HMA50, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA100)
            ratingMA := ratingMA + calcRatingMA(HMA100, Price)
            ratingMAC := ratingMAC + 1
        if not na(HMA200)
            ratingMA := ratingMA + calcRatingMA(HMA200, Price)
            ratingMAC := ratingMAC + 1
    if(Use_Ichimoku)
        float ratingIC = na
        if not (na(IC_Lead1) or na(IC_Lead2) or na(Price) or na(Price[1]) or na(IC_BLine) or na(IC_CLine))
            ratingIC := calcRating(
             IC_Lead1 > IC_Lead2 and Price > IC_Lead1 and Price < IC_BLine and Price[1] < IC_CLine and Price > IC_CLine,
             IC_Lead2 > IC_Lead1 and Price < IC_Lead2 and Price > IC_BLine and Price[1] > IC_CLine and Price < IC_CLine)
        if not na(ratingIC)
            ratingMA := ratingMA + ratingIC
            ratingMAC := ratingMAC + 1
    ratingMA := ratingMAC > 0 ? ratingMA / ratingMAC : na
    float ratingOther = 0
    float ratingOtherC = 0
    if(Use_RSI)
        ratingRSI = RSI
        if not(na(ratingRSI) or na(ratingRSI[1]))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(ratingRSI < 30 and ratingRSI[1] < ratingRSI, ratingRSI > 70 and ratingRSI[1] > ratingRSI)
    if(Use_Stoch)
        if not(na(kStoch) or na(dStoch) or na(kStoch[1]) or na(dStoch[1]))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(kStoch < 20 and dStoch < 20 and kStoch > dStoch and kStoch[1] < dStoch[1], kStoch > 80 and dStoch > 80 and kStoch < dStoch and kStoch[1] > dStoch[1])
    if(Use_CCI)
        ratingCCI = CCI
        if not(na(ratingCCI) or na(ratingCCI[1]))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(ratingCCI < -100 and ratingCCI > ratingCCI[1], ratingCCI > 100 and ratingCCI < ratingCCI[1])
    if(Use_MACD)
        if not(na(macdMACD) or na(signalMACD))
            ratingOtherC := ratingOtherC + 1
            ratingOther := ratingOther + calcRating(macdMACD > signalMACD, macdMACD < signalMACD)
    ratingOther := ratingOtherC > 0 ? ratingOther / ratingOtherC : na
    float ratingTotal = 0
    float ratingTotalC = 0
    if not na(ratingMA)
        ratingTotal := ratingTotal + ratingMA
        ratingTotalC := ratingTotalC + 1
        ratingTotal := ratingTotal + ratingOther
        ratingTotalC := ratingTotalC + 1
    ratingTotal := ratingTotalC > 0 ? ratingTotal / ratingTotalC : na
    [ratingTotal, ratingOther, ratingMA, ratingOtherC, ratingMAC]
[ratingTotal, ratingOther, ratingMA, ratingOtherC, ratingMAC]  = security(syminfo.tickerid, res, calcRatingAll(), lookahead=false)
tradeSignal = ratingTotal+ratingOther+ratingMA
dynSLpoints(factor) => factor * atr(14) / syminfo.mintick
if not (Use_Only_Sell)
    strategy.entry("long", strategy.long, when = tradeSignal > MinSignalStrength)
if not (Use_Only_Buy)    
    strategy.entry("short", strategy.short, when = tradeSignal < -MinSignalStrength)
if(Use_ATR_SL_TP)
    strategy.exit("sl/tp", loss = dynSLpoints(3), trail_points = dynSLpoints(5), trail_offset = dynSLpoints(2))

Thêm nữa