Die doppelte gleitende Durchschnitts-Crossover-Handelsstrategie erzeugt Handelssignale, indem zwei gleitende Durchschnitte mit unterschiedlichen Parameter-Einstellungen berechnet und gehandelt werden, wenn sich die gleitenden Durchschnittswerte kreuzen.
Die Kernlogik dieser Strategie lautet:
Eingabeparameter: schnellere MA-Periode maLen1, langsamere MA-Periode maLen2, MA-Typ maTypeChoice
Berechnung eines schnelleren MA maValue1 und eines langsameren MA maValue2 anhand von Eingabeparametern
Definition der Kauf- und Verkaufsbedingungen durch Vergleich der beiden MA:
Kaufen, wenn maValue1 über maValue2 geht
Verkaufen, wenn maValue1 unter maValue2 fällt
Ausführung von Geschäften mit Kauf- und Verkaufssignalen
Visualisieren Sie MAs in verschiedenen Farben basierend auf ihrer Beziehung
Senden von Kauf- und Verkaufswarnsignalen
Nutzt ein doppeltes MA-Crossover-System, vermeidet falsche Signale von einem einzigen MA
Anpassungsfähige MA-Perioden für verschiedene Handelshorizonte
Einfache und unkomplizierte Logik, leicht zu verstehen und umzusetzen
Anpassungsfähige Signalwarnungen für eine zeitnahe Ausführung
Visualisierte MA-Trends bilden einen intuitiven Handelsindikator
Optimierbare Parameter zur Suche nach der besten Kombination
Anwendbar für Backtesting und Live-Handel
MA-Kreuzungen können falsche Signale erzeugen, zusätzliche Trend- und Musterbestätigung erforderlich
Bei Schwierigkeiten bei der Übertragung von MA entstehen unnötige Handelskosten
Falsche Parameter führen zu einem übermäßigen oder spärlichen Handel
Extreme Ereignisse verursachen enorme Kursschwankungen, die Verluste nicht begrenzen können
Langfristige Trendbruche machen kurzfristige Indikatoren ungültig
Erfordert häufige Überwachung, nicht vollständig automatisierbar
Risikomanagement:
Hinzufügen eines Trendfilters, um gegen den Trend zu handeln
Hinzufügen eines Musterfilters zur Bestätigung der Signalgültigkeit
Optimierung der Parameter für eine angemessene Handelsfrequenz
Einstellen von Stop-Loss/Take-Profit zur Begrenzung von Verlusten
Robustheitstest über lange Zeitrahmen
Preis- und Zeitfilter zur Vermeidung falscher Ausbrüche
Verschiedene MA-Parameter testen, um das optimale Ergebnis zu finden
Versuche verschiedene MA-Typen für die genauesten Signale
Hinzufügen eines Trendfilters, um Gegentrends zu vermeiden
Hinzufügen eines Volatilitätsfilters zur Identifizierung der richtigen Ausgangspunkte
Hinzufügen eines Preis/Zeitfilters zur Verringerung falscher Signale
Implementieren Sie die Kontrollen für den Slip bei realen Handelsgeschäften
Robustheitstest für verschiedene Instrumente und Zeitrahmen
Integration von automatischem Stop-Loss/Take-Profit
Maschinelles Lernen zur Verbesserung der Strategie erforschen
Der Dual Moving Average Crossover ist eine klassische technische Indikatorstrategie. Er erzeugt Signale von MA-Kreuzungen und kann durch Optimierung gute Backtest-Ergebnisse erzielen. Allerdings bleiben Risiken wie falsche Signale bestehen, die zusätzliche Filter erfordern.
/*backtest start: 2023-10-05 00:00:00 end: 2023-10-05 22:00:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // © sehweijun //study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="") // strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract) maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] ) maSrc = input( close, title="MA Source" ) maLen1 = input( 15, minval=1, title="MA Length" ) maLen2 = input( 95, minval=1, title="MA Length" ) maValue1 = if ( maTypeChoice == "EMA" ) ema( maSrc, maLen1 ) else if ( maTypeChoice == "WMA" ) wma( maSrc, maLen1 ) else if ( maTypeChoice == "SMA" ) sma( maSrc, maLen1 ) else 0 maValue2 = if ( maTypeChoice == "EMA" ) ema( maSrc, maLen2 ) else if ( maTypeChoice == "WMA" ) wma( maSrc, maLen2 ) else if ( maTypeChoice == "SMA" ) sma( maSrc, maLen2 ) else 0 buySignal = crossover( maValue1, maValue2 ) sellSignal = crossunder( maValue1, maValue2 ) mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 ) //plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 ) var color buyCandleColour = #00ff0a var color sellCandleColour = #ff1100 barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" ) bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour") alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!") alertcondition( buySignal, title="Buy signal!", message="Buy signal!") alertcondition( sellSignal, title="Sell signal!", message="Sell signal!") // Strategy Tester stratTesterOn = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true) entryTime = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session ) startTime = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session ) maxDailyLoss = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer ) maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer ) contractSize = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer ) tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true) fixedTPSL = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false) fixedTPValue = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" ) fixedSLValue = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" ) fromDay = input(defval = 1, title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970) thruDay = input(defval = 1, title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31) thruMonth = input(defval = 1, title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12) thruYear = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970) start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false // create function "within window of time" // strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash ) // strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash ) isTime(_position) => range = time( timeframe.period, _position + ':1234567' ) bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 ) if ( stratTesterOn and window() ) if ( buySignal and isTime( entryTime ) ) if ( not fixedTPSL ) strategy.close_all() strategy.entry( "Buy", strategy.long, contractSize ) if ( fixedTPSL and strategy.position_size == 0 ) strategy.entry( "Buy", strategy.long, contractSize ) strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue ) if ( sellSignal and isTime( entryTime )) if ( not fixedTPSL ) strategy.close_all() strategy.entry( "Sell", strategy.short, contractSize ) if ( fixedTPSL and strategy.position_size == 0 ) strategy.entry( "Sell", strategy.short, contractSize ) strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue ) if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 ) if ( maValue1 > maValue2 ) strategy.entry( "Buy", strategy.long, contractSize ) if ( fixedTPSL ) strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue ) else strategy.entry( "Sell", strategy.short, contractSize ) if ( fixedTPSL ) strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue ) strategy.close_all( when=not isTime( entryTime ) ) plot( strategy.equity )