Основная идея этой стратегии состоит в том, чтобы внедрить систему, которая может гибко выбирать диапазон дат обратного тестирования для удовлетворения различных потребностей пользователей, чтобы они могли автоматически или вручную устанавливать время начала и окончания обратного тестирования.
Стратегия предоставляет четыре варианта выбора диапазона дат через входные параметры: с использованием всех данных истории, недавних указанных дней, недавних указанных недель или ручным указанием диапазона дат. Стратегия будет динамически устанавливать окно обратного теста на основе выбранного диапазона дат, сохраняя при этом логику торговли неизменной, чтобы можно было сравнивать разницу производительности в разных временных окнах.
Стратегия состоит из двух модулей: выбор диапазона дат обратного тестирования и стратегия двойной торговли MA.
Как гибкая и настраиваемая структура для выбора диапазона дат, преимущества удовлетворяют различные потребности пользователей в тестировании. В сочетании с простой, но эффективной логикой торговли с двойным MA, он может быстро проверять и сравнивать стратегии. Последующие оптимизации, такие как добавление фильтров или логики остановки потери, могут сделать стратегию более практичной для живой торговли. В общем, стратегия имеет хорошую масштабируемость и справочную ценность.
/*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