Эта стратегия генерирует торговые сигналы, основанные на перекрестке и перекрестке линий быстрой и медленной EMA, относящихся к стратегии следующего тренда.
Основная логика этой стратегии включает в себя следующие части:
Вычислить быструю и медленную EMA: Используйте ta.ema() для расчета быстрой EMA длины fastInput и медленной EMA длины slowInput.
Установите временной диапазон обратного тестирования: Используйте useDateFilter, чтобы установить, нужно ли фильтровать временной диапазон обратного тестирования, и используйте backtestStartDate и backtestEndDate, чтобы установить время начала и окончания.
Создание торговых сигналов: Используйте ta.crossover() и ta.crossunder() для сравнения быстрой и медленной EMA, генерируя сигналы покупки, когда быстрая EMA пересекает медленную EMA, и сигналы продажи, когда быстрая EMA пересекает медленную EMA.
Обработка заказов за пределами временного диапазона: отменить незаполненные заказы за пределами временного диапазона обратного тестирования и сгладить все позиции.
График линий EMA: График быстрых и медленных линий EMA на графике.
Это очень простая стратегия, следующая за тенденцией, с следующими преимуществами:
Простая логика, легкая для понимания и реализации.
EMA сглаживает данные о ценах и уменьшает шум торговли.
Настраиваемые периоды EMA, адаптируемые к различным рыночным условиям.
Гибкий временной диапазон обратного тестирования для тестирования конкретных периодов времени.
Оптимизируемые условия входа и выхода могут быть объединены с другими показателями.
Эта стратегия также сопряжена с некоторыми рисками:
Стратегия двойной EMA является грубой, неспособной гибко адаптироваться к изменениям рынка.
Риск частой торговли и повторной торговли.
Неправильные параметры EMA могут вызывать неправильные торговые сигналы.
Необоснованный промежуток времени обратного тестирования может привести к переподключению.
Риск неизбежного снижения и потерь.
Риски можно управлять с помощью оптимизации параметров, фильтрации колебаний, стоп-лосса и т.д.
Эта стратегия может быть оптимизирована в следующих аспектах:
Оптимизировать периоды EMA для поиска наилучшей комбинации параметров.
Добавить другие показатели для фильтрации ненужных сделок.
Добавить стоп-лосс для контроля одиночных потерь.
Включите тренд, фильтры волатильности, чтобы уменьшить частоту торговли.
Испытывайте различные продукты, чтобы найти лучшее соответствие.
Используйте скольжение, комиссию для более реалистичного обратного теста.
Подводя итог, это очень простая стратегия двойного перекрестка EMA с четкой логикой, сравнивая быстрые и медленные EMA. Преимущество заключается в простой реализации, но у нее также есть такие проблемы, как частые торговли, перенапряжение. Следующим шагом является улучшение оптимизации параметров, управления рисками для более надежной стратегии.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("MollyETF_EMA_Crossover", overlay = true, initial_capital = 100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity) fastInput = input( 10, "Fast EMA") slowInput = input( 21, "Slow EMA") // Calculate two moving averages with different lengths. float fastMA = ta.ema(close, fastInput) float slowMA = ta.ema(close, slowInput) // STEP 1. Create inputs that configure the backtest's date range useDateFilter = input.bool(true, title="Filter Date Range of Backtest", group="Backtest Time Period") backtestStartDate = input(timestamp("1 Jan 2018"), title="Start Date", group="Backtest Time Period", tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") backtestEndDate = input(timestamp("7 Sep 2023"), title="End Date", group="Backtest Time Period", tooltip="This end date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " + "zone of the chart or of your computer.") // STEP 2. See if current bar falls inside the date range inTradeWindow = true // STEP 3. Include the date filter with the entry order conditions // Enter a long position when `fastMA` crosses over `slowMA`. if inTradeWindow and ta.crossover(fastMA, slowMA) strategy.entry("buy", strategy.long) // Enter a short position when `fastMA` crosses under `slowMA`. if inTradeWindow and ta.crossunder(fastMA, slowMA) strategy.close_all(comment="sell") // STEP 4. With the backtest date range over, exit all open // trades and cancel all unfilled pending orders if not inTradeWindow and inTradeWindow[1] strategy.cancel_all() strategy.close_all(comment="Date Range Exit") // Plot the moving averages. plot(fastMA, "Fast MA", color.aqua) plot(slowMA, "Slow MA", color.orange)