Стратегия Dual Moving Average Trend Tracking является количественной торговой стратегией, которая отслеживает тенденции цен на акции.
Эта стратегия в основном основана на двойной экспоненциальной скользящей средней системе для определения направления ценовой тенденции. Стратегия использует две быстрые и медленные EMA с различными параметрами, быстрая EMA1 реагирует на изменения цен быстрее, а медленная EMA2 реагирует на изменения цен медленнее. Когда быстрая линия пересекает медленную линию, это сигнал покупки, указывающий на то, что цена начала расти; когда быстрая линия пересекает ниже медленной линии, это сигнал продажи, указывающий на то, что цена начала падать.
Кроме того, стратегия также вводит индикатор ADX для оценки силы тренда. ADX рассчитывает колебания цен для оценки силы тренда. Когда ADX повышается, это означает, что тенденция укрепляется; когда ADX падает, это означает, что тенденция ослабевает. Стратегия устанавливает условия торговли фильтром через индикатор ADX, выдавая торговые сигналы только тогда, когда сила тренда относительно сильна.
В частности, правила генерации сигнала в стратегии:
Это может эффективно отфильтровать недействительные сигналы с более слабой силой тренда, что еще больше улучшает стабильность торговой системы.
Эта стратегия имеет следующие основные преимущества:
Указывает среднесрочные и долгосрочные тенденции цен: Двойная система EMA может эффективно определять средне- и долгосрочные тенденции цен и избегать помех от краткосрочного шума рынка.
Фильтрует ложные прорывы: Оценивая силу тренда с помощью индикатора ADX, он избегает ненужных потерь, вызванных ложными прорывами вокруг поворотных точек тренда.
Большое пространство оптимизации параметров: Параметры быстрой и медленной линии, параметры ADX и многое другое имеют место для оптимизации, которая может дать лучшие результаты торговли через комбинации параметров.
Высокая адаптивность: Эта стратегия подходит для большинства акций и временных рамок и была проверена на различных рынках.
Легко внедряется: Эта стратегия требует только простых показателей скользящих средних, потребляет мало ресурсов, легко программируется и имеет низкие практические затраты на применение.
Эта стратегия также сопряжена с определенными рисками, в основном сосредоточенными в следующих областях:
Риск изменения тенденцииЛюбая стратегия тренда не может точно определить точки переворота тренда и неизбежно понесет большие убытки, когда реальный тренд фактически перевернется.
Превышение риска оптимизации: Оптимизация параметров в крайние пределы может также привести к чрезмерной адаптации стратегии к историческим данным, что снизит стабильность и практический эффект стратегии.
Риск события черного лебедя: крупные неожиданные события нарушат первоначальную модель ценового тренда, в результате чего индикатор скользящей средней не будет работать, что потребует ручного вмешательства или установки стоп-лосса для контроля потерь.
Для устранения вышеуказанных рисков мы можем оптимизировать следующие аспекты:
Введите дополнительные показатели для определения переломных моментов цен, например, объем торговли, который увеличится при появлении переломных моментов цен.
Правильно расслабить параметры ADX, чтобы обеспечить возможность захвата на ранних этапах тренда.
Проводить многогрупповое обучение и тестирование комбинаций параметров и выбирать комбинации с хорошей стабильностью и практическим эффектом.
Существуют также некоторые направления, в которых эта стратегия может быть оптимизирована:
Внедрение механизмов остановки потерь: Установите движущуюся стоп-лосс или процентную стоп-лосс, которая может активно останавливать потери при обратном тренде, чтобы избежать чрезмерных потерь.
Комбинированные показатели объема торговлиНапример, объем торгов, который может избежать ошибочных сигналов при увеличении объема торгов в переломные моменты цен.
Параметровая самоадаптивная оптимизация: позволяет адаптировать параметры показателей в соответствии с изменениями рынка в режиме реального времени, а не фиксированные статические параметры, что может значительно повысить стабильность стратегий.
Внедрение машинного обучения: Использовать алгоритмы машинного обучения для анализа большого количества исторических данных для определения параметров для скользящих средних и ADX, и даже предсказать будущие движения цен.
Оптимизация перекрестного цикла: параметры различных циклов торговли могут устанавливаться по-разному, и оптимальная конфигурация в каждом цикле может быть проверена.
В целом стратегия Dual Moving Average Trend Tracking является зрелой и стабильной стратегической идеей. Эта стратегия фиксирует средне- и долгосрочные ценовые тенденции через двойную систему EMA и имеет индикатор ADX для фильтрации сигналов, который может эффективно фиксировать тенденции цен на акции и избегать помех от краткосрочного шума рынка. В то же время эта стратегия также имеет определенные риски, требующие оптимизации комбинаций параметров и методов остановки убытков, и даже может внедрить больше вспомогательных индикаторов и алгоритмов машинного обучения для повышения стабильности стратегии. В общем, стратегия Dual Moving Average Trend Tracking имеет хороший баланс и является количественной стратегической идеей, подходящей для средне- и долгосрочных инвесторов.
/*backtest start: 2022-12-14 00:00:00 end: 2023-11-10 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Kitaec Strategy4", shorttitle = "Kitaec str4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot") len = input(14, defval=14, minval=1, maxval=1000, title="Smoothing") len2 = input(14, defval=14, minval=1, maxval=1000, title="Smoothing2") len3=input(550) src = close ema1=ema(src, len) ema2=ema(ema1, len2) d=ema1-ema2 zlema=ema1+d ema21=ema(src, (len/3)*2) ema22=ema(ema21, (len2/3)*2) d2=ema21-ema22 zlema2=ema21+d2 ema31=ema(src, len3) ema32=ema(ema21, len3) d3=ema31-ema32 zlema3=ema31+d2 fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //MAs //ma1 = security(tickerid, "60", vwma(src, len)[1]) //ma2 = security(tickerid, "120", vwma(src, len)[1]) //plot(ma1, linewidth = 2, color = blue, title = "MA") //plot(ma2, linewidth = 2, color = red, title = "MA2") // ADX lenadx = 14 lensig = 14 limadx = 18 up = change(high) down = -change(low) trur = rma(tr, lenadx) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, lenadx) / trur) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, lenadx) / trur) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig) adx2 = ema(adx, 14) adx2i = ema(adx2,14) dadx2 = adx2 - adx2i zladx2 = adx2 + dadx2 plus2 = ema(plus, 14) plus2i = ema (plus2, 14) dplus2 = plus2 - plus2i zlplus2 = plus2 + dplus2 minus2 = ema(minus, 14) minus2i = ema (minus2, 14) dminus2 = minus2 - minus2i zlminus2 = minus2 + dminus2 vwma = vwma(close, 150) vwma2 = ema(vwma, 9) vwma2i = ema(vwma2, 9) dvwma2 = vwma2 - vwma2i zlvwma2 = vwma2 + dvwma2 rmax=rma(src, len) rmax2=rma(rmax, len2) rmd=rmax-rmax2 zlrmax=rmax+rmd rmaxz=rma(src, (len/3)*2) rmaxz2=rma(rmaxz, (len2/3)*2) rmzd=rmaxz-rmaxz2 zlrmaxz=rmaxz+rmzd rmaxcol2=zlrmaxz[1] > zlema2[1] ? red:lime rmaxcol= zlrmax[1] > zlema[1] ? red:lime rmazlema3=rma(zlema3, 100) plot(rmazlema3, color=gray, linewidth=2) plot(zlema, color=green) plot(zlema2, color=yellow) plot(zlema3, color=teal, linewidth=2) plot(ema2, color=na) plot(rmax, color=rmaxcol2, linewidth=3) plot(zlrmax, color=rmaxcol, linewidth=3) //Trading size = strategy.position_size lot = 0.0 lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1] if zlrmax[1] < zlema[1] strategy.entry("Buy", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if zlrmax[1] > zlema[1] strategy.entry("Sell", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))