Diese Strategie identifiziert die aktuelle Trendrichtung, indem sie gleitende Durchschnitte verschiedener Zeiträume berechnet und Handelssignale in Kombination mit dem RSI-Indikator erzeugt. Wenn der kurze Zeitraum gleitende Durchschnitt über den langen Zeitraum gleitenden Durchschnitt kreuzt, wird der Trend betrachtet und ein Kaufsignal erzeugt. Wenn der kurze Zeitraum gleitende Durchschnitt unter dem langen Zeitraum gleitenden Durchschnitt kreuzt, wird der Trend als umgekehrt betrachtet und ein Verkaufssignal erzeugt. Der RSI-Indikator wird verwendet, um falsche Signale zu vermeiden, die durch geringfügige Preisschwankungen verursacht werden.
Berechnen Sie einfache gleitende Durchschnitte für 10, 20, 50, 100 und 200 Tage.
Berechnen Sie den 14-Tage-RSI-Wert.
Wenn der 10-Tage-SMA über den 50-Tage-SMA liegt und der RSI größer als 30 ist und der 20-Tage-SMA größer oder gleich dem 100-Tage-SMA oder der 50-Tage-SMA größer oder gleich dem 100-Tage-SMA ist, kauft man.
Der Stop-Loss-Preis wird mit dem Eintrittspreis multipliziert mit (1 - Stop-Loss-Prozentsatz) festgelegt.
Verkaufen, wenn:
Diese Strategie beurteilt den Markttrend anhand gleitender Durchschnitte und setzt Stop Loss, um Risiken zu kontrollieren. Der RSI filtert falsche Ausbrüche aus. Er kauft, wenn der kurzfristige SMA über den langfristigen SMA überschreitet, was einen Aufwärtstrend anzeigt, und setzt eine Stop Loss-Linie, um Risiken während der Halteperiode zu kontrollieren. Er verkauft, wenn ein Trendumkehrsignal auftritt oder der Stop Loss-Preis ausgelöst wird.
Die Optimierung kann durch Anpassung der gleitenden Durchschnittsperioden, Stop-Loss-Levels usw. erfolgen.
Die Strategie hat insgesamt eine klare Logik, indem sie gleitende Durchschnitte für die Trendbestimmung und die Einstellung von Stop-Loss zur Risikokontrolle verwendet. Es ist eine typische Trendverfolgungsstrategie. Weitere Verbesserungen können durch Parameter-Tuning und Hinzufügen anderer Indikatoren erzielt werden. Aber keine Strategie ist perfekt, kontinuierliche Anpassungen und Optimierungen sind erforderlich, um mit Marktunsicherheiten zusammen mit einem angemessenen Risikomanagement fertig zu werden.
/*backtest start: 2022-09-30 00:00:00 end: 2023-10-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("MA_Script", overlay=true) // STEP 1: // Configure trail stop level with input options (optional) longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1) // Configure backtest start date with inputs startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31) startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12) startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100) // See if this bar's time happened on/after start date afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) // Calculate Relative Strength Index rsiValue=rsi(close, 14) // Calculate moving averages MA10_Val =sma(close, 10) //plot(MA10_Val, color=color.yellow, linewidth=1) MA20_Val =sma(close, 20) plot(MA20_Val, color=color.green, linewidth=1) MA50_Val =sma(close, 50) plot(MA50_Val, color=color.red, linewidth=1) MA100_Val =sma(close, 100) plot(MA100_Val, color=color.blue, linewidth=1) MA200_Val =sma(close, 200) plot(MA200_Val, color=color.purple, linewidth=1) // Calculate candlestick C_BodyHi = max(close, open) C_BodyLo = min(close, open) C_Body = C_BodyHi - C_BodyLo C_UpShadow = high - C_BodyHi C_DnShadow = C_BodyLo - low // STEP 2: // Calculate entry trading conditions buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >= MA100_Val) or (MA50_Val >= MA100_Val)) avg_price = (close + open)/2 // First Entry if (afterStartDate) strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1) plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n') // Determine trail stop loss prices longStopPrice=0.0 longStopPrice :=if (strategy.position_size > 0) stopValue=C_BodyHi * (1 - longTrailPerc) max(stopValue, longStopPrice[1]) else 0 plot(longStopPrice, color=color.orange, linewidth=1) bought_1=strategy.position_size[0] > strategy.position_size[1] entry_Point_1=valuewhen(bought_1, avg_price, 0) // STEP 3: // Calculate exit trading conditions sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val) sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0) sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1) sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11) plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n') id_val = "" stop_val = close condition = false if sellCondition_1 id_val := "Exit By Stop Loss At 7%" stop_val := entry_Point_1*0.93 condition := true else if sellCondition_2 id_val := "Exit By Take Profit based on MA" stop_val := close condition := true else if sellCondition_3 id_val := "Exit By Trailing Stop" stop_val := longStopPrice condition := true // Submit exit orders for trail stop loss price if (strategy.position_size > 0) //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1) //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2) strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)