Die Kernidee dieser Strategie besteht darin, einen Rahmen zu implementieren, der den Backtest-Datumbereich flexibel auswählen kann, um den unterschiedlichen Bedürfnissen der Benutzer gerecht zu werden, so dass sie automatisch oder manuell die Start- und Endzeiten für den Backtest festlegen können.
Die Strategie bietet vier Optionen für die Auswahl des Datumsbereichs durch Eingabeparameter: die Verwendung aller Daten der Vergangenheit, die letzten angegebenen Tage, die letzten angegebenen Wochen oder die manuelle Angabe eines Datumsbereichs. Die Strategie setzt das Backtest-Fenster dynamisch auf der Grundlage des ausgewählten Datumsbereichs, wobei die Handelslogik unverändert bleibt, so dass die Leistungsdifferenz unter verschiedenen Zeitfenstern verglichen werden kann.
Die Strategie besteht aus zwei Modulen: Auswahl des Backtest-Datumsbereichs und Doppel-MA-Handelsstrategie.
Als flexibler und anpassbarer Rahmen für die Auswahl des Datumsbereichs erfüllen die Vorteile verschiedene Testbedürfnisse der Benutzer. In Kombination mit einer einfachen, aber effektiven doppelten MA-Handelslogik kann er Strategien schnell überprüfen und vergleichen. Nachfolgeoptimierungen wie das Hinzufügen von Filtern oder Stop-Loss-Logik können die Strategie für den Live-Handel praktischer machen. Zusammenfassend hat der Strategie-Rahmen eine gute Skalierbarkeit und einen guten Referenzwert.
/*backtest start: 2022-12-29 00:00:00 end: 2024-01-04 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title = "How To Auto Set Date Range", shorttitle = " ", overlay = true) // Revision: 1 // Author: @allanster // === INPUT MA === fastMA = input(defval = 14, title = "FastMA", type = input.integer, minval = 1, step = 1) slowMA = input(defval = 28, title = "SlowMA", type = input.integer, minval = 1, step = 1) // === INPUT BACKTEST RANGE === useRange = input(defval = "WEEKS", title = "Date Range", type = input.string, confirm = false, options = ["ALL", "DAYS", "WEEKS", "MANUAL"]) nDaysOrWeeks = input(defval = 52, title = "# Days or Weeks", type = input.integer, minval = 1) FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 15, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2014) ToMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2014) // === FUNCTION EXAMPLE === window() => true // === LOGIC === buy = crossover(sma(close, fastMA), sma(close, slowMA)) // buy when fastMA crosses over slowMA sell = crossunder(sma(close, fastMA), sma(close, slowMA)) // sell when fastMA crosses under slowMA // === EXECUTION === strategy.entry("L", strategy.long, when=window() and buy) // buy long when "within window of time" AND crossover strategy.close("L", when=window() and sell) // sell long when "within window of time" AND crossunder // === PLOTTING === plot(sma(close, fastMA), title = 'FastMA', color = color.aqua, linewidth = 2, style = plot.style_line) // plot FastMA plot(sma(close, slowMA), title = 'SlowMA', color = color.yellow, linewidth = 2, style = plot.style_line) // plot SlowMA