Эта стратегия использует двойные скользящие средние, в частности 8-периодные и 21-периодные.
Стратегия также включает в себя наклон скользящей средней линии, чтобы отфильтровать некоторые периоды, не являющиеся трендом, и производить сигналы только тогда, когда тенденция более очевидна.
Основа этой стратегии заключается в перекрестке краткосрочных и долгосрочных скользящих средних. Более короткий MA может быстрее улавливать изменения тренда, в то время как более длинный MA имеет лучший эффект фильтрации шума. Установление восходящего тренда предполагается, когда более короткий MA пересекает более длинный MA, что приводит к длинному сигналу; установление нисходящего тренда предполагается, когда более короткий MA пересекает ниже более длинного MA, что приводит к короткому сигналу.
Стратегия также устанавливает порог наклона. Только когда наклон больше положительного порогового значения, будет генерироваться длинный сигнал. Только когда наклон меньше отрицательного порогового значения, будет генерироваться короткий сигнал. Это помогает отфильтровать зоны, где нет выраженной тенденции, что приводит к торговым сигналам более высокого качества.
В частности, логика генерации торговых сигналов:
Преимущества этой стратегии включают:
Эта стратегия также сопряжена с некоторыми рисками:
Некоторые способы оптимизации на основе этих рисков:
Некоторые направления для оптимизации стратегии:
В целом, эта стратегия двойного MA проста и практична. Захватывая различные характеристики тренда через два параметра периода и объединяя их для генерации торговых сигналов. Между тем, включение порога наклона улучшает качество сигнала. Эта стратегия может служить базовой для расширений, с большим пространством и потенциалом оптимизации.
/*backtest start: 2024-01-09 00:00:00 end: 2024-01-16 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //written by sixpathssenin //@version=4 strategy(title="Dual Moving Average",initial_capital=10000,overlay=true) ma1= sma(close,8) ma2= sma(close,21) angleCriteria = input(title="Angle", type=input.integer, defval=7, minval=1, maxval=13) i_lookback = input(2, "Angle Period", input.integer, minval = 1) i_atrPeriod = input(10, "ATR Period", input.integer, minval = 1) i_angleLevel = input(6, "Angle Level", input.integer, minval = 1) i_maSource = input(close, "MA Source", input.source) f_angle(_src, _lookback, _atrPeriod) => rad2degree = 180 / 3.141592653589793238462643 //pi ang = rad2degree * atan((_src[0] - _src[_lookback]) / atr(_atrPeriod)/_lookback) ang _angle = f_angle(ma2, i_lookback, i_atrPeriod) plot(ma1,color=#FF0000) plot(ma2,color=#00FF00) crosso=crossover(ma1,ma2) crossu=crossunder(ma1,ma2) _lookback = 15 f_somethingHappened(_cond, _lookback) => bool _crossed = false for i = 1 to _lookback if _cond[i] _crossed := true _crossed longcrossed = f_somethingHappened(crosso,_lookback) shortcrossed = f_somethingHappened(crossu,_lookback) long = longcrossed and _angle > angleCriteria short= shortcrossed and _angle < -(angleCriteria) if(long) strategy.entry("Long",strategy.long) if(short) strategy.entry("short",strategy.short)