Эта стратегия сочетает в себе скользящие средние перекрестки и индикаторы импульса, чтобы эффективно отслеживать и обращать вспять тенденции. Сначала она использует быстрые и медленные скользящие средние, чтобы генерировать длинные сигналы с золотым крестом и короткие сигналы с смертельным крестом. Затем с индикаторами импульса определенных параметров, если импульс на быстром MA снова появляется после золотого креста, тренд считается продолжающимся и длинная позиция будет сохранена. Когда импульс падает, он считается обратным трендом, и существующая позиция будет закрыта. Такая же логика применяется к коротким сигналам с смертельным крестом при отслеживании обратного тренда.
Основная логика этой стратегии основана на сигналах тренда от кроссоверов MA и сигналах обратного тренда от индикаторов импульса.
Вычислить быструю MA1 (5-периодную HMA) и медленную MA2 (7-периодную HMA).
Золотой крест с ценой1, пересекающейся над ценой2, генерирует длинный сигнал. Смертный крест с ценой1, пересекающейся ниже ценой2, генерирует короткий сигнал.
После длинного сигнала, если импульс цены roc1 снова появляется, тенденция считается продолжающейся и длинная позиция будет сохранена.
Когда импульс roc1 падает, это считается обратным трендом и существующая позиция будет закрыта.
Введите порог ADX, чтобы избежать ошибочных сигналов, когда они не находятся в состоянии тренда.
По сравнению с простыми стратегиями MA, наибольшее преимущество этой стратегии заключается в введении индикаторов импульса для более быстрого и точного определения отмены тренда.
В то время как индикаторы импульса могут быстро улавливать сигналы об обратном движении для своевременной остановки потерь или обратной торговли.
Сигналы обратного движения, основанные на импульсе, более надежные, избегая ненужных открытых/закрытых ордеров во время трендовой торговли.
ADX избегает неправильных сигналов на рынках, не имеющих тенденций, сохраняя стратегию более ориентированной на тенденции с более высокими шансами на выигрыш.
Логика проста и понятна, подходит для начинающих трейдеров.
Большое пространство для оптимизации путем корректировки периодов MA, параметров импульса и т. д. для разных рынков.
Основными рисками этой стратегии являются:
Отставание МА, которое может вызвать задержку сигналов, отсутствие лучших входных точек.
Ложные прорывы, вызывающие ненужные входы или выходы, требуют дальнейшей оптимизации параметров или дополнительных фильтров.
Выявление обратного тренда зависит от импульса, который может ослабеть во время огромных колебаний рынка.
ADX несовершенен в обнаружении тенденций и консолидации. Неправильные пороговые настройки могут вызвать проблемы.
Не учитывая затраты на торговлю, следует установить правильный стоп-лосс при применении в реальной торговле.
Стратегия может быть дополнительно оптимизирована в следующих аспектах:
Попробуйте другие виды МА или скорректируйте параметры МА для улучшения эффекта сглаживания.
Оптимизировать длину индикатора импульса для повышения чувствительности для обнаружения переворотов цен.
Установите фильтры цены, когда импульс переворачивается, чтобы избежать заблуждения краткосрочными колебаниями.
Улучшить использование ADX с помощью различных параметров на разных уровнях ADX.
Внедрить индикаторы громкости и т.д. для улучшения качества сигнала и фильтрации ложных прорывов.
Добавьте механизмы остановки потери для контроля потери на одной сделке.
Эта стратегия сочетает в себе преимущества показателей MA и импульса для отслеживания тенденций и улавливания обратных сдвигов. По сравнению с чистыми стратегиями, следующими за трендом, она может быть более гибкой в работе с различными этапами рынка, избегая потерь от кульминации тренда, сохраняя при этом тренд торговли. Дальнейшие улучшения могут быть достигнуты путем оптимизации параметров и внедрения вспомогательных условий. В целом, стратегия имеет ясную и простую логику, очень подходящую для обучения и применения новичками в торговле альго.
/*backtest start: 2023-09-23 00:00:00 end: 2023-10-23 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //study(title="MA Crossover Strategy", overlay = true) strategy("MA Crossover Strategy with MA Turning Point Exits", overlay=true) src = input(open, title="Source") price = request.security(syminfo.tickerid, timeframe.period, src) ma1 = input(5, title="1st MA Length") type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA"]) ma2 = input(7, title="2nd MA Length") type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA"]) adxlen = input(14, title="ADX Smoothing") dilen = input(14, title="DI Length") adxthreshold = input(20, title="ADX threshold") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) //study("Average Directional Index", shorttitle="ADX", format=format.price, precision=2, resolution="") //plot(sig, color=color.red, title="ADX") f_hma(_src, _length)=> _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length))) price1 = if (type1 == "SMA") sma(price, ma1) else if (type1 == "EMA") ema(price, ma1) else f_hma(price, ma1) price2 = if (type2 == "SMA") sma(price, ma2) else if (type2 == "EMA") ema(price, ma2) else f_hma(price, ma2) //plot(series=price, style=line, title="Price", color=black, linewidth=1, transp=0) plot(series=price1, style=line, title="1st MA", color=blue, linewidth=2, transp=0) plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0) //longCondition = price1> price2 longCondition = price1> price2 and sig > adxthreshold if (longCondition) strategy.entry("Long", strategy.long) shortCondition = price1 < price2 and sig > adxthreshold if (shortCondition) strategy.entry("Short", strategy.short) lookback1 = input(1, "Lookback 1") roc1 = roc(price1, lookback1) ma1up = false ma1down = false ma2up = false ma2down = false ma1up := nz(ma1up[1]) ma1down := nz(ma1down[1]) ma2up := nz(ma2up[1]) ma2down := nz(ma2down[1]) trendStrength1 = input(2, title="Minimum slope magnitude * 100", type=float) * 0.01 if crossover(roc1, trendStrength1) ma1up := true ma1down := false if crossunder(roc1, -trendStrength1) ma1up := false ma1down := true shortexitCondition = ma1up and ma1down[1] and sig > adxthreshold if (shortexitCondition) strategy.close("Short") longexitCondition = ma1down and ma1up[1] and sig > adxthreshold if (longexitCondition) strategy.close("Long")