Handelsstrategie mit mehreren Indikatoren

Schriftsteller:ChaoZhang, Datum: 2023-11-07 16:16:45
Tags:

img

Übersicht

Die Multi-Indikator-Scoring-Handelsstrategie integriert technische Indikatoren, um die Trendrichtung und Stärke für den automatisierten Handel zu identifizieren. Sie berücksichtigt eine Gruppe von Indikatoren, darunter Ichimoku Cloud, HMA, RSI, Stoch, CCI und MACD. Jedes Indikator-Ergebnis wird erzielt und die Gesamtscore wird berechnet, indem alle Indikatoren-Scores gemittelt werden. Wenn die Gesamtscore über dem Schwellenwert liegt, gehen Sie lang. Wenn unter dem Schwellenwert liegt, gehen Sie kurz.

Strategie Logik

Die Strategie besteht aus mehreren Teilen:

  1. Berechnen Sie eine Gruppe von Indikatoren, darunter Ichimoku Cloud, Hull Moving Average, Relative Strength Index, Stochastic, Commodity Channel Index und Moving Average Convergence Divergence.

  2. Geben Sie eine positive Punktzahl für ein bullisches Signal und eine negative Punktzahl für ein bärisches Signal.

  3. Summe und Durchschnitt aller Indikatoren Punkte, um eine Gesamtpunktzahl zu erhalten.

  4. Vergleichen Sie die Gesamtscore mit dem vorgegebenen Schwellenwert, um die allgemeine Trendrichtung zu bestimmen.

  5. Offene Positionen basierend auf Urteilen, lang bei Aufschwung, kurz bei Abstieg.

  6. Setzen Sie Stop-Loss und Gewinn auf Basis von ATR.

Die Strategie nutzt die Vorteile mehrerer Indikatoren zur Bestimmung der Marktentwicklung voll aus und hilft im Vergleich zu einem einzigen Indikator, einige falsche Signale zu filtern und die Zuverlässigkeit zu erhöhen.

Analyse der Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Die Kombination mehrerer Indikatoren verbessert die Signalgenauigkeit. Ein einzelner Indikator ist anfällig für falsche Signale.

  2. Verwenden Sie Indikatoren Stärken, um Trend und Dynamik zu identifizieren.

  3. Der automatisierte Handel vermeidet emotionale Auswirkungen und folgt streng den Strategie-Signalen.

  4. Die Verwendung von ATR für Stop Loss und Take Profit hilft beim Risikomanagement.

  5. Die Parameter und die Bewertungsschwelle können für verschiedene Produkte optimiert werden.

  6. Einfache und klare Logik, leicht zu verstehen und zu ändern.

Risikoanalyse

Die Risiken dieser Strategie:

  1. Mehrfache Indikatoren kombiniert sind nicht unbedingt besser als ein einzelner. Wiederholte Tests sind notwendig, um optimale Parameter zu finden.

  2. Durchschnittswerte können Verluste nicht vollständig vermeiden, wenn Indikatoren falsche Signale geben.

  3. Die ATR-Haltestellen können zu nahe oder zu locker sein und müssen je nach Produktart angepasst werden.

  4. Vermeiden Sie Überanpassung durch übermäßige Optimierungen.

  5. Eine hohe Handelsfrequenz erhöht die Transaktionskosten, was sich auch auf die Endrendite auswirkt.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Testen Sie mehr Indikatorenkombinationen, um eine optimale Auswahl für ein bestimmtes Produkt zu finden.

  2. Anpassen der Indikator-Werte, optimieren Sie den Algorithmus.

  3. Dynamische ATR-Parameter, um die Marktvolatilität besser anzupassen.

  4. Hinzufügen von Handelsfiltern zur Verringerung unnötiger Handelsfrequenz, wie zum Beispiel Trendfilter oder Volumenfilter.

  5. Schrittweise optimieren, um den Parameterbereich zu finden, dann zufällig / Raster optimieren für den besten Parameter-Set.

  6. Die Robustheit wird auf mehreren Produkten und Zeitrahmen getestet, um eine Überanpassung zu vermeiden.

  7. Kombination mit anderen effektiven Handelsstrategien für das Portfolio.

Schlussfolgerung

Die Multi-Indikator-Scoring-Strategie verbessert die Signalgenauigkeit und Zuverlässigkeit durch Durchschnittswert der Indikator-Scores. Mit großem Optimierungsraum kann sie für gute Ergebnisse auf verschiedenen Produkten optimiert werden. Überfitting-Risiken benötigen Aufmerksamkeit, um die Parameteroptimierung und die Strategieprüfung wissenschaftlich zu halten. Als Strategieidee mit breiten Optimierungsrichtungen verdient sie weitere Forschung und Anwendung.


/*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))

Mehr