Двойная стратегия динамической скользящей средней

Автор:Чао Чжан, Дата: 2023-12-13 16:37:05
Тэги:

img

Обзор

Эта стратегия использует наклон скользящей средней (MA) и наклон индикаторов импульса для принятия торговых решений. Она сравнивает наклон MA и наклон импульса с установленными порогами и генерирует торговые сигналы, когда оба наклон превышают пороги. Стратегия также содержит фильтр низкой волатильности, который использует другой MA для генерации сигналов, когда волатильность рынка низкая.

Логика стратегии

Основой этой стратегии является сравнение двух кривых наклона. Во-первых, он рассчитывает наклон индикатора MA и импульса. Наклон отражает скорость изменения и направление кривой. Затем используются два порога, когда как наклон MA, так и наклон импульса превышают соответствующие пороги, генерируются торговые сигналы.

Например, когда как наклон MA, так и наклон импульса превышают верхнюю линию, генерируется сигнал покупки; когда обе кривые падают ниже нижней линии, генерируется сигнал продажи. Это может отфильтровать некоторые ложные сигналы.

Фильтр низкой волатильности использует долгосрочный MA для определения волатильности рынка. Когда волатильность низкая, MA с разными параметрами используется для генерации торговых сигналов для адаптации к различным состояниям рынка.

Анализ преимуществ

Эта стратегия имеет следующие преимущества:

  1. Двойной фильтр для настройки торговых сигналов может отфильтровать шум и улучшить качество сигнала.

  2. Фильтр низкой волатильности позволяет стратегии адаптироваться к различным рыночным условиям с эластичностью.

  3. Высокая настройка для различных параметров может быть оптимизирована для различных продуктов.

  4. Он не содержит функции переокраски, чтобы уменьшить воздействие от настройки кривой.

Анализ рисков

Эта стратегия также сопряжена с некоторыми рисками:

  1. Двойной фильтр может отфильтровывать некоторые реальные сигналы и упускать возможности.

  2. Определение порога фильтра низкой волатильности требует тщательного тестирования.

  3. Настройки параметров для показателей MA и импульса должны быть оптимизированы для конкретных продуктов, а универсальные параметры трудно определить.

  4. Функция отсутствия переокраски не может полностью избежать проблемы настройки кривой обратного теста, и реальная производительность торговли все еще нуждается в проверке.

  5. Высокая настраиваемость увеличивает сложность пространства параметров и сложность оптимизации.

Руководство по оптимизации

Стратегия может быть оптимизирована в следующих направлениях:

  1. Проверить больше комбинаций показателей MA и импульса, чтобы найти наилучшие показатели соответствия.

  2. Оптимизировать параметры длины MA и индикаторы импульса для сбалансирования задержки и шума.

  3. Оптимизировать параметры для расчета наклона, чтобы найти более стабильные комбинации показателей.

  4. Испытать различные показатели и параметры низкой волатильности для улучшения эластичности.

  5. Испытание на различных продуктах и сроках для определения наилучшего применяемого объема.

  6. Построить адаптивные механизмы параметров для уменьшения рабочей нагрузки ручной оптимизации.

Заключение

Это очень гибкая и настраиваемая стратегия двойного MA. Она ссылается как на информацию о цене, так и на импульс для принятия решений, которые могут эффективно отфильтровывать ложные сигналы. Фильтр низкой волатильности также делает стратегию более эластичной для адаптации к изменениям рынка.

Благодаря улучшениям в оптимизации параметров и выборе индикаторов эта стратегия может стать жизнеспособным выбором для реальной торговли.


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-12 00:00:00
period: 1h
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/
// © Allenlk
//@version=4
strategy("DRSI DMA Scalping Strategy", shorttitle="DRSIDMA", overlay=false, initial_capital=1000, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//Inputs
matype             = input(7, minval=1, maxval=8, title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA, 8=Tilson T3", group="Moving Average")
masrc              = input(close, title="MA Source", group="Moving Average")
malen              = input(5, title="Moving Average Length - LookBack Period", group="Moving Average")
factorT3           = input(defval=7, title="Tilson T3 Factor - *.10 - so 7 = .7 etc.", minval=0, group="Moving Average")
maderiv            = input(3, title="MA Slope Lookback", minval=1, group="Moving Average")
masmooth           = input(5, title="MA Slope Smoothing", minval=1, group="Moving Average")
momtype            = input(3, minval=1, maxval=3, title="1=RSI, 2=CCI, 3=RSI/ROC", group="Momentum Moving Average")
momsrc             = input(close, title="Momentum Source", group="Momentum Moving Average")
momlen             = input(3, title="Momentum Length", minval=1, group="Momentum Moving Average")
momderiv           = input(8, title="Momentum Slope Lookback", minval=1, group="Momentum Moving Average")
momsmooth          = input(7, title="Momentum Slope Smoothing", minval=1, group="Momentum Moving Average")
higherTf           = input("1", title="Higher timeframe?", type = input.resolution, group="Time Resolution")
higherTfmult       = input(130, title="MA Slope multiplier for Alternate Resolutions (Make the waves of the blue line similar size as the orange line)", group="Time Resolution")
buffup             = input(0.02, title="Buy when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
bufflow            = input(-0.03, title="Sell when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
lowVolMALength     = input(28, title="Big MA Length", minval=1, group="Low Volatility Function")
MAlength           = input(10, title="Low Volatility Moving Average Length", minval=1, group="Low Volatility Function")
MAThresh           = input(0.05, title="Low Volatility Buy and Sell Threshold", step=0.01, group="Low Volatility Function")
Volminimum         = input(2.5, title="Minimum volatility to trade", minval=0, step=0.01, group="Low Volatility Function")

//Low Volatility Function
//When Volatility is low refer to the slope of a long moving average
low_vol_MA         = sma(close, lowVolMALength)
low_vol_down       = (low_vol_MA[3] - low_vol_MA[1]) > MAThresh
low_vol_up         = (low_vol_MA[3] - low_vol_MA[1]) < MAThresh * -1
percent_volatility = (1 - (low / high)) * 100
chng_MA            = sma(percent_volatility, MAlength)
bad_vol            = chng_MA < Volminimum

//No repaint function
nrp_funct(_symbol, _res, _src) => security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0])

//hull ma definition
hullma = wma(2*wma(masrc, malen/2)-wma(masrc, malen), round(sqrt(malen)))

//TEMA definition
ema1 = ema(masrc, malen)
ema2 = ema(ema1, malen)
ema3 = ema(ema2, malen)
tema = 3 * (ema1 - ema2) + ema3

//Tilson T3
factor = factorT3 *.10
gd(masrc, malen, factor) => ema(masrc, malen) * (1 + factor) - ema(ema(masrc, malen), malen) * factor 
t3(masrc, malen, factor) => gd(gd(gd(masrc, malen, factor), malen, factor), malen, factor) 
tilT3 = t3(masrc, malen, factor) 
 
//MA Type 
avg = matype == 1 ? sma(masrc,malen) : matype == 2 ? ema(masrc,malen) : matype == 3 ? wma(masrc,malen) : matype == 4 ? hullma : matype == 5 ? vwma(masrc, malen) : matype == 6 ? rma(masrc,malen) : matype == 7 ? 3 * (ema1 - ema2) + ema3 : tilT3

//MA Slope Percentage
DeltaAvg      = (avg / avg[maderiv]) - 1
SmoothedAvg   = sma(DeltaAvg, masmooth) 
MAout         = nrp_funct(syminfo.tickerid, higherTf, SmoothedAvg) * higherTfmult

//Momentum indicators
Momentum = momtype == 1 ? rsi(momsrc, momlen) : momtype == 2 ? cci(momsrc, momlen) : momtype == 3 ? rsi(roc(momsrc,momlen),momlen) : na

//Momentum Slope Percentage
Deltamom = (Momentum / Momentum[momderiv]) - 1
SmoothedMom = sma(Deltamom, momsmooth) 
Momout   = nrp_funct(syminfo.tickerid, higherTf, SmoothedMom)

//Plottings
plot(buffup, color=color.green, title="Buy line")
plot(bufflow, color=color.red, title="Sell line")
plot(MAout, color=color.blue, linewidth=2, title="MA Slope")
plot(Momout, color=color.orange, linewidth=2, title="Momentum Slope")

longCondition = bad_vol ? low_vol_up : MAout > buffup and Momout > buffup
if (longCondition)
    strategy.entry("Buy", strategy.long)

shortCondition = bad_vol ? low_vol_down : MAout < bufflow and Momout < bufflow
if (shortCondition)
    strategy.entry("Sell", strategy.short)

Больше