Diese Strategie ist eine typische gleitende Durchschnitts-Crossover-Strategie, die zwei Sätze von gleitenden Durchschnitten verwendet, einen schnellen und einen langsamen. Wenn der schnellen gleitenden Durchschnitt über den langsamen gleitenden Durchschnitt überschreitet, wird ein Kaufsignal generiert. Wenn der schnelle unter den langsamen überschreitet, wird ein Verkaufssignal generiert. Die Strategie verwendet sowohl EMA als auch SMA für die gleitenden Durchschnitte, wobei EMAs als schnelle Linien und SMAs als langsame Linien dienen. Die Verwendung mehrerer gleitender Durchschnitte kann dazu beitragen, falsche Signale zu filtern und die Zuverlässigkeit zu verbessern.
Die Kernlogik beruht auf Kreuzungen zwischen schnellen und langsamen gleitenden Durchschnittslinien, um Ein- und Ausgänge zu bestimmen.
Insbesondere werden zwei Sätze von schnellen und langsamen gleitenden Durchschnitten berechnet:
Crossovers werden dann zwischen den schnellen EMAs und den langsamen SMAs überprüft:
Um falsche Signale zu filtern, ist eine zweite EMA/SMA-Kreuzung zur Bestätigung erforderlich:
Durch die Anforderung von zwei schnellen/langsamen MA-Kreuzungen können viele falsche Signale herausgefiltert und die Zuverlässigkeit verbessert werden.
Wenn Sie Signal-Trigger kaufen, gehen Sie lang, wenn Sie Signal-Trigger verkaufen, gehen Sie kurz.
Die Strategie legt auch die Gewinnnahme und den Stop-Loss auf der Grundlage des Input-Prozentsatzes des Einstiegspreises fest.
Zu den Vorteilen dieser Strategie gehören:
Risiken der Strategie:
Um Risiken zu kontrollieren:
Die Strategie kann weiter optimiert werden, indem
Zusammenfassend generiert die Dual-MA-Crossover-Strategie Signale mit schnellen/langsamen MA-Kreuzungen, setzt Profit und Stop-Loss ein, um Risiken zu kontrollieren, und ist einfach, intuitiv und einfach zu implementieren.
/*backtest start: 2023-02-20 00:00:00 end: 2024-02-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © JMLSlop //@version=4 src = close strategy("Crossover moving averages", shorttitle="Cross MA-EMA", overlay=true, calc_on_order_fills=false) // first fast EMA len = input(8, "Length", type=input.integer, minval=1) doma1 = input(true, title="EMA") out1 = ema(src, len) //Second fast EMA len2 = input(21, minval=1, title="Length") doma2 = input(true, title="EMA") out2 = ema(src, len2) //First slow MA len3 = input(50, minval=1, title="Length") doma3 = input(true, title="SMA") out3 = sma(src, len3) //Second slow MA len4 = input(200, minval=1, title="Length") doma4 = input(true, title="SMA") out4 = sma(src, len4) // Profit profit = input(8, "Profit/lost %", type=input.float, minval=1) * 0.01 plot(doma1 and out1 ? out1: na, color=color.blue, linewidth=1, title="1st EMA") plot(doma2 and out2 ? out2: na, color=color.red, linewidth=1, title="2nd EMA") plot(doma3 and out3 ? out3: na, color=color.green, linewidth=2, title="1st MA") plot(doma4 and out4 ? out4: na, color=color.orange, linewidth=3, title="2nd MA") // Orders config takeProfitPrice = (strategy.position_size > 0) ? strategy.position_avg_price + open*profit : (strategy.position_size < 0) ? strategy.position_avg_price - (open*profit) : na longStopPrice = strategy.position_avg_price * (1 - profit) shortStopPrice = strategy.position_avg_price * (1 + profit) longCondition2 = (out2>out3 and (crossover(out1, out4) or crossover(out1[1], out4[1]) or crossover(out1[2], out4[2]) or (crossover(out1[3], out4[3]))) or (out2>out3 and (crossover(out1, out3) or crossover(out1[1], out3[1]) or crossover(out1[2], out3[2]) or crossover(out1[3], out3[3])))) if (longCondition2) strategy.entry("Enter L", strategy.long) shortCondition2 = (out2<out3 and (crossunder(out1, out4) or crossunder(out1[1], out4[1]) or crossunder(out1[2], out4[2]) or crossunder(out1[3], out4[3]))) or (out2<out3 and (crossunder(out1, out3) or crossunder(out1[1], out3[1]) or crossunder(out1[2], out3[2]) or crossunder(out1[3], out3[3]))) if (shortCondition2) strategy.entry("Enter S", strategy.short) if (strategy.position_size > 0) strategy.exit("Exit L", limit=takeProfitPrice, stop=longStopPrice) if (strategy.position_size < 0) strategy.exit("Exit S", limit=takeProfitPrice, stop=shortStopPrice)