Diese Strategie basiert auf den goldenen Kreuz- und Todeskreuzsignalen des 50-tägigen gleitenden Durchschnitts und des 200-tägigen gleitenden Durchschnitts von BTC, kombiniert mit zusätzlichen technischen Indikatoren, um Kauf- und Verkaufssignale zu generieren.
Wenn der 50-Tage- gleitende Durchschnitt über den 200-Tage- gleitenden Durchschnitt überschreitet, um ein
Zusätzlich zu den grundlegenden gleitenden Durchschnitten
EMA-Indikator: Berechnen Sie einen EMA-Indikator mit Länge + Offset, wenn er nach oben geht, zeigt der aktuelle Markt aufwärts, können wir kaufen.
Vergleichen Sie den Wertverhältnis zwischen gleitendem Durchschnitt und EMA: Wenn der EMA-Wert höher als der gleitende 50-Tage-Durchschnitt ist, wird ein Kaufsignal generiert.
Überprüfen Sie, ob der Preis im Vergleich zum Tief der vorherigen K-Linie um mehr als 1% gefallen ist.
Durch die Kombination der Verwendung mehrerer oben genannten Indikatoren können einige falsche Signale herausgefiltert werden und die Handelsentscheidungen der Strategie zuverlässiger sein.
Diese Strategie hat folgende Vorteile:
Die Verwendung gleitender Durchschnitte als Haupthandelssignal kann Marktlärm filtern und die Trendrichtung identifizieren.
Die Kombination mit mehreren zusätzlichen technischen Indikatoren kann die Signalzuverlässigkeit erhöhen und falsche Signale filtern.
Die Einführung geeigneter Stop-Loss-Strategien kann den Einzelverlust wirksam kontrollieren.
Die relativ einfache Handelslogik ist leicht zu verstehen und umzusetzen und eignet sich für Anfänger des quantitativen Handels.
Es gibt viele konfigurierbare Parameter, die nach Ihren Vorlieben angepasst werden können.
Diese Strategie birgt auch einige Risiken:
Der gleitende Durchschnitt selbst weist ein starkes Verzögerungsmerkmal auf, möglicherweise fehlende Chancen für eine schnelle Preisumkehr.
Durch das Hinzufügen von Hilfsindikatoren wird die Anzahl der Regeln erhöht und die Wahrscheinlichkeit, dass falsche Signale erzeugt werden, erhöht.
Eine unsachgemäße Einstellung des Stop-Loss kann zu vergrößerten Verlusten führen.
Auch unangemessene Parameter-Einstellungen (wie beispielsweise gleitende Durchschnittslänge usw.) beeinflussen die Strategieergebnisse.
Die entsprechenden Lösungen:
Der gleitende Durchschnittszyklus wird angemessen verkürzt und der Parameteroptimierungsbereich erhöht.
Erhöhen Sie die Datenmenge des Backtests, um die Signalkwalität zu überprüfen.
Die Stop-Loss-Range sollte während der Einstellung von Take-Profit-Stops ordnungsgemäß lockern.
Die Parameteroptimierung erhöhen, um die besten Parameterkombinationen zu finden.
Diese Strategie kann auch in folgenden Richtungen optimiert werden:
Erhöhung der Algorithmen für maschinelles Lernen zur automatischen Optimierung von Parametern.
Hinzufügen von zusätzlichen Indikatoren, um mehrere Teilstrategien zu entwickeln und Entscheidungen über einen Abstimmungsmechanismus zu treffen.
Versuchen Sie Breakout-Strategien, um Preisdurchbrüche zu erkennen.
Verwenden Sie Deep Learning, um Preistrends vorherzusagen.
Optimierung von Stop-Loss-Mechanismen zur Erreichung eines dynamischen Tracking-Stop-Loss.
Die oben genannten Optimierungen können die Entscheidungsgenauigkeit verbessern und die Rentabilität und Stabilität der Strategie erhöhen.
Diese Strategie trifft hauptsächlich Handelsentscheidungen basierend auf dem gleitenden Durchschnitts-Crossover von BTC, unterstützt durch technische Indikatoren wie EMA, um Signale zu filtern. Die Strategie verfügt über eine starke Trendverfolgungsfähigkeit und hohe Konfigurationsfähigkeit, was sie als quantitative Handelsstrategie für Anfänger geeignet macht. Es gibt jedoch auch bestimmte Rückstandsrisiken, vor denen man sich hüten muss. Die nächsten Optimierungsrichtungen können aus mehreren Dimensionen wie maschinelles Lernen, Portfoliostrategie, Stop-Loss-Strategie usw. stammen.
/*backtest start: 2023-11-06 00:00:00 end: 2023-12-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('JayJay BTC Signal', overlay=true, initial_capital=100, currency='USD', default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_value=0, calc_on_every_tick=true) securityNoRepaint(sym, tf, src) => request.security(sym, tf, src[barstate.isrealtime ? 1 : 0])[barstate.isrealtime ? 0 : 1] //200 50 Moving Average ma50Len = input.int(50, minval=1, title='MA50-Length') ma50Src = input(close, title='MA50-Source') ma50Show = input(true, title='Show SMA50 on chart') ma50Close = ta.sma(ma50Src, ma50Len) ma50CloseTimeframe = input.timeframe("240", "Ma50 Timeframe", group = "EMA Options") ma50Open = ta.sma(open, ma50Len) ma200Len = input.int(200, minval=1, title='MA200-Length') ma200Src = input(close, title='MA200-Source') ma200Show = input(true, title='Show SMA200 on chart') ma200CloseTimeframe = input.timeframe("D", "Ma200 Timeframe", group = "EMA Options") ma200Close = ta.sma(ma200Src, ma200Len) ma200Open = ta.sma(open, ma200Len) //plot(ma200Close, color=color.new(#0b6ce5, 0), title='MA200') //plot(ma50Close, color=color.new(#00d8ff, 0), title='MA50') sma50 = securityNoRepaint(syminfo.tickerid, ma50CloseTimeframe, ma50Close) plot(sma50 and ma50Show ? sma50 : na, color=color.new(#00d8ff, 0), title='SMA50') sma200 = securityNoRepaint(syminfo.tickerid, ma200CloseTimeframe, ma200Close) plot(sma200 and ma200Show ? sma200 : na, color=color.new(#00d8ff, 0), title='SMA200') // Short/Long EMA // Define the offset value EMAOffsetValue = input.int(2, title='EMA Offset', minval=0) emaplot = input(true, title='Show EMA on chart') len = input.int(20, minval=1, title='ema Length') + EMAOffsetValue emaCloseTimeframe = input.timeframe("240", "EMA 1 Timeframe", group = "EMA Options") emaOpen = ta.ema(open, len) emaClose = ta.ema(close, len) ema = securityNoRepaint(syminfo.tickerid, emaCloseTimeframe, emaClose) up = emaClose > ema[1] down = emaClose < ema[1] mycolor = up ? color.green : down ? color.red : color.blue plot(ema and emaplot ? ema : na, title='Signal EMA', color=mycolor, linewidth=3) //plot(emaClose and emaplot ? emaClose : na, title='Signal 20 EMA', color=color.yellow, linewidth=3) ma50GreaterThanMa200 = sma50 > sma200 last3BarUp = ema > ema[1] startLong = up and ema > sma50 and ma50GreaterThanMa200 and (100 - (sma50 / ema * 100) > 1.0) startFrom = input(timestamp("20 Jan 2000 00:00"), "StartFrom") yearFilter = true alertLongPositionMessage = "{\"direction:\": \"long\", \"action\": \"{{strategy.order.action}}\", \"price\": \"{{strategy.order.price}}\", \"qty\": \"{{strategy.position_size}}\", \"symbol\": \"{{ticker}}\", \"date\": \"{{time}}\"}" if true and startLong and yearFilter strategy.entry('Long', strategy.long, comment = "Long", alert_message = alertLongPositionMessage) longStopLossLevel = open * 0.05 strategy.exit('StopLoss', from_entry='Long',comment = "StopLoss!", loss=longStopLossLevel, profit=close * 0.3, alert_message = alertLongPositionMessage) longPercentageChange = low / close[1] * 100 - 100 is1PercentLower = longPercentageChange < -0.1 closeLongPositionWhen = (down and is1PercentLower) or (emaClose < sma50) if closeLongPositionWhen strategy.close('Long', comment = "Fuck It!", alert_message = alertLongPositionMessage) bgcolor(startLong ? color.green : na, transp=90)