Dies ist eine einfache, auf technischen Indikatoren basierende automatisierte Long-Trend-Strategie für Kryptowährungen wie Bitcoin und Ethereum, die darauf abzielt, große Aufwärtstrends zu erfassen und die Verluste durch Handelsgebühren durch häufigen Handel zu reduzieren.
Verwenden Sie den MACD, um die Trendrichtung zu bestimmen, lang, wenn der MACD nach oben kreuzt;
Berechnen Sie 20-Perioden-EMA, 100-Perioden-SMA und 200-Perioden-SMA, gehen Sie lang, wenn EMA und SMA zusammen nach oben zeigen;
Kaufen, wenn die EMA höher als die SMA und die SMA höher als die langsame SMA ist;
Setzen Sie die Stop-Loss-Linie, stoppen Sie, wenn der Preis den Stop-Loss durchbricht.
Schließung der Position, wenn der Kurs sinkt und die EMA unter der SMA fällt.
Diese Strategie kombiniert mehrere Indikatoren, um den Trend und den Zeitpunkt des Eintritts zu bestimmen, um von großen Aufwärtstrends zu profitieren.
Eine Kombination von mehreren Indikatoren kann helfen, falsche Ausbrüche und falsche Signale zu filtern.
Nur wenn man sich offensichtlichen Trends annimmt, kann man unnötige Trades reduzieren und die Handelsfrequenz verringern.
Der Stop Loss kann den maximalen Verlust pro Trade effektiv begrenzen.
Der Backtest zeigt eine gute Rentabilität bei BTC und ETH.
Einfache und klare Logik, leicht zu verstehen und umzusetzen, gut für Anfänger.
Hohe Erweiterbarkeit, um mehr Indikatoren für die Optimierung einzubeziehen.
Hohe Marktzufälligkeit, falsches Urteilsrisiko.
Einheitliche Positionsansätze können nicht systematische Risiken absichern.
Eine falsche Einstellung des Stop-Loss kann zu einem Überstop-Loss führen.
Backtest stellt keine Live-Ergebnisse dar, die tatsächliche Leistung muss noch validiert werden.
Die Auswirkungen auf die Handelskosten, die nicht berücksichtigt werden, können von den Live-Performances abweichen.
Es wurden keine Produktmerkmale berücksichtigt, Parameter-Ausrichtung erforderlich.
Versuche verschiedene Parameterkombinationen zur Optimierung der Indikatorparameter.
Fügen Sie Filter wie KDJ hinzu, um Eingangssignale zu filtern.
Optimieren Sie die Stop-Loss-Strategie, wie zum Beispiel das Hinzufügen eines dynamischen Stop-Loss.
Betrachten Sie die Größe der Positionen anhand der Kontogröße.
Unterscheidung der Produktmerkmale und entsprechende Anpassung der Parameter.
Mehr Zeiträume für die Analyse einbeziehen.
Probieren Sie verschiedene Produkte aus und finden Sie die am besten geeigneten.
Die Strategie Logik ist einfach und klar. Die Verwendung mehrerer Indikatoren kann helfen, falsche Signale effektiv auszufiltern. Aber weitere Optimierung von Parametern, Risikokontrolle usw. ist erforderlich, kombiniert mit Live-Handelsverifizierung, bevor die tatsächliche Anwendung. Mit richtigen Erweiterungen kann es zu einem sehr praktischen Krypto-Trend nach der Strategie werden.
/*backtest start: 2023-09-06 00:00:00 end: 2023-10-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075) //////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! ///////////////////// [macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7) //_rsi_len = input(14, title="RSI length") _rsi_len = 14 NewValue = 0 PreviousValue = 0 leverage = 1 smaPercentageIncrease = 0.0 SMA_PERCENT_INCREASE = 0.0 float atrValue = 0 bool bPositionOpened = false float stockPositionSize = 0 float volatilityPercentage = 0.0 bool bDisplayArrow = false bool bEMAIsRising = false bool bSMAIsRising = false bool bSMASlowIsRising = false bool bMACDIsRising = false bool bMACDHistIsRising = false bool bMACDSignalIsRising = false float stopLoss = input (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order //positionSize = input (1000, "in $") float positionSize = 1000 float currentPrice = close float stopLossPrice = 0 float entryPrice = 0 //----------------------------------------------------------- // === INPUT BACKTEST RANGE ONE YEAR //FromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31) //FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12) //FromYear = input(defval = 2020, title = "From Year", minval = 2017) FromDay = 01 FromMonth = 01 FromYear = 2019 //ToDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31) //ToMonth = input(defval = 01, title = "To Month", minval = 1, maxval = 12) //ToYear = input(defval = 2023, title = "To Year", minval = 2017) ToDay = 31 ToMonth = 12 ToYear = 2099 // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" //emaLength = input(20, "EMA Length") //smaLength = input(100, "SMA Length") //smaSlowLength = input(200, "SMA Length") emaLength = 20 smaLength = 100 smaSlowLength = 200 ema = ema(close, emaLength) sma = sma(close, smaLength) smaSlow = sma(close, smaSlowLength) plot(sma, color=color.green) plot(smaSlow, color=color.orange) plot(ema, color=color.yellow) //reload previous values stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1] entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1] bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1] positionSize := na(positionSize[1]) ? 50000 : positionSize[1] stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1] //leverage := na(leverage[1]) ? 1 : leverage[1] //ReEvaluate the direction of indicators bEMAIsRising := rising(ema, 2) bSMAIsRising := rising(sma, 3) bMACDIsRising := rising(macdLine, 3) bMACDHistIsRising := rising(macdHist, 1) bSMASlowIsRising := rising(smaSlow, 10) bMACDSignalIsRising := rising(macdSignalLine, 3) atrValue := atr(14) volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price //There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase //THIS DOES NOT WORK AT ALL!!!!! //if bSMASlowIsRising == true // //calculate the percentegage difference over the last 10 bars // smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100 // if smaPercentageIncrease < SMA_PERCENT_INCREASE // //Not enough increase we reset the flag // bSMASlowIsRising := false if (window()) //Check if we can open a LONG //sma > smaSlow and if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice) // add comparaison between macd and macd signal line //if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < currentPrice) //Enter in short position stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured. //calculate exit values stopLossPrice := currentPrice*(1-stopLoss/100) strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice)) entryPrice := currentPrice //store the entry price bPositionOpened := true bDisplayArrow := true //if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1]) or currentPrice < sma[1])) if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1]))) strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop //uncomment the below line to make the bot investing the full portfolio amount to test compounding effect. //positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage)) //reset some flags bPositionOpened := false bDisplayArrow := true entryPrice := 0.0