Двойная экспоненциальная движущаяся средняя стратегия последовательности тренда - это стратегия последовательности тренда, основанная на экспоненциальных пересечениях движущейся средней (EMA). Она оценивает направление текущего тренда путем расчета быстрой линии EMA и медленной линии EMA и действует на их пересечения. Когда быстрая линия EMA пересекает линию медленной EMA, она определяется как быстрый сигнал. Когда быстрая линия EMA пересекает линию медленной EMA, она определяется как медленный сигнал. В зависимости от направления выявленного тренда эта стратегия может соответственно идти вперед или вперед.
Основная логика этой стратегии заключается в вычислении двух линий EMA разных периодов - одна действует как медвежья линия, а другая действует как быстрая линия. В частности, стратегия вычисляет 8-периодную быструю линию EMA с использованием индикатора Талиб как быструю линию. И она вычисляет 21-периодную медленную линию EMA как медвежью линию. Затем она оценивает перекрестные отношения между быстрой линией EMA и медленной линией EMA. Когда быстрая линия пересекает медленную линию, она определяет быстрый сигнал для длинного движения. Когда быстрая линия пересекает ниже медленной линии, она определяет медвежный сигнал для короткого движения.
С точки зрения фактического исполнения торговли, эта стратегия может идти только длинный, идти короткий только, или идти в обоих направлениях, когда кроссовер происходит между быстрыми и медленными линиями. Кроме того, стоп-лосс и взять прибыль цены настраиваются в стратегии. После открытия позиций, если цена идет в неблагоприятном направлении, стоп-лосс будет задействован для выхода позиций. Если цена достигнет ожидаемого целевого уровня, взять прибыль будет реализовать и закрыть позиции.
Самое большое преимущество стратегии Dual EMA Trend Following заключается в мощной способности идентификации тренда пересечения скользящих средних.
Кроме того, гибкие настройки на торговые направления делают стратегию адаптивной как к односторонним тенденциям, так и к двусторонним колебаниям, тем самым повышая применимость стратегии.
Наибольший риск этой стратегии заключается в ложных сигналах, вызванных частыми небольшими перекрестными переходами на рынках с ограниченным диапазоном. Это приведет к чрезмерному открытию позиций и потерям. Чтобы справиться с этим, мы можем увеличить периоды EMA, чтобы уменьшить время перекрестного перехода и вероятность ложных сигналов.
С другой стороны, слишком тесная настройка стоп-лосса также увеличивает вероятность того, что мы остановимся.
Эта стратегия может быть дополнительно оптимизирована в следующих аспектах:
Адаптивная корректировка по периодам EMA на основе волатильности рынка и результатов обратных тестов, избегая перенастройки в течение фиксированных периодов.
Добавление условий фильтрации для фильтрации ложных сигналов, например, сочетание с объемами торговли для фильтрации незначительных перекресток; или сочетание других индикаторов, таких как MACD и KDJ, чтобы избежать сигналов неопределенности.
Оптимизация стратегий стоп-лосса и прибыли, например, сочетание ATR для достижения динамического отслеживания SL/TP, предотвращение чрезмерного затягивания SL и преждевременного TP.
Проверка различных периодов хранения. Слишком длинные периоды хранения могут быть затронуты инцидентами, в то время как слишком короткие периоды приводят к высоким затратам на торговлю и затратам на сдвиг.
В целом, двойная стратегия последовательности трендов EMA является надежной и практичной торговой системой трендов. Она эффективно улавливает направления трендов с помощью системы перекрестка EMA. Между тем, гибкие настройки на торговых направлениях делают ее адаптивной; конфигурированные риски остановки потери и контроля прибыли. С дальнейшими оптимизациями и улучшениями эта стратегия может стать мощным инструментом для количественной торговли.
/*backtest start: 2024-01-02 00:00:00 end: 2024-02-01 00:00:00 period: 2h basePeriod: 15m 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/ // © TradersPostInc //@version=5 strategy('TradersPost Example MOMO Strategy', overlay=true, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0) startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range') endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range') timeCondition = true timeConditionEnd = timeCondition[1] and not timeCondition fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length') slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length') sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None']) fastEma = ta.ema(close, fastEmaLength) slowEma = ta.ema(close, slowEmaLength) isUptrend = fastEma >= slowEma isDowntrend = fastEma <= slowEma trendChanging = ta.cross(fastEma, slowEma) ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on) ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on) plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true) plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true) aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true) bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true) fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90) tradersPostBuy = trendChanging and isUptrend and timeCondition tradersPostSell = trendChanging and isDowntrend and timeCondition pips = syminfo.pointvalue / syminfo.mintick percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips']) stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0) stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0) takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0) takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0) stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}' sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}' exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' if (sides != "None") if tradersPostBuy strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage) strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage) if tradersPostSell strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage) strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage) exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}' strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage) strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage) strategy.close_all(when = timeConditionEnd)