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

移动平均线 RSI ADX ATR 布林带 MA BB 动量 趋势 波动率
Дата создания: 2025-05-26 17:32:14 Последнее изменение: 2025-05-26 17:32:14
Копировать: 0 Количество просмотров: 270
2
Подписаться
319
Подписчики

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

Обзор

Эта двулинейная динамическая система отслеживания трендов и обратного трейдинга является полноценной количественной торговой стратегией, объединяющей элементы отслеживания трендов и обратного трейдинга. Эта стратегия использует движущиеся средние для определения направления рыночной тенденции на двух различных циклах (100 и 500), а также интегрирует несколько технических индикаторов в качестве фильтрующих условий, включая RSI (относительно сильный индекс), ADX (средний индекс) и ATR (средняя реальная волновая величина). Система допускает много направлений торговли, как сверх, так и ниже, и применяет различные правила входа и выхода в зависимости от различных рыночных условий.

Стратегический принцип

Основные принципы стратегии основаны на механизме двойной проверки, основанном на идентификации тенденций и подтверждении динамики:

  1. Выявление тенденций: Стратегия использует скользящую среднюю на 100 и 500 циклов (возможно, EMA или SMA) для определения тенденции на рынке. Когда MA100 находится выше MA500, это считается тенденцией к росту; наоборот, это может быть тенденцией к снижению.

  2. Условия приема

    • Цена должна быть выше MA100 и MA500 одновременно
    • Избирательные условия фильтрации тенденций: MA100 > MA500
    • Опциональные условия фильтрации RSI: RSI должен быть выше его скользящей средней
    • Опциональные условия фильтрации ADX: ADX должен быть выше его скользящей средней, чтобы обеспечить интенсивность тренда
    • Опциональные условия фильтрации ATR: ATR должен быть выше его скользкой средней, чтобы обеспечить достаточную волатильность
  3. Условия для головоломки

    • Цена должна быть ниже MA100 и MA500 одновременно
    • Цена должна быть ниже, чем в Брин-банке (что указывает на перепродажу)
    • RSI должен быть ниже установленного порога (по умолчанию 33, что указывает на перепродажу)
    • Выборные условия фильтрации ATR
    • Сильный верхний барьер: если MA100 превышает установленный процент от MA500, не вступайте в позицию в открытом положении (избегайте позиции в открытом положении в сильной тенденции к повышению)
  4. Управление рисками и стратегия выхода из игры

    • Множественный стоп: процент, установленный ниже начальной цены (по умолчанию 3%)
    • Дополнительные выступления: когда цена упадет ниже MA500
    • Стоп-стоп: процент от цены входа (по умолчанию 3%)
    • Порог головы: процент ниже цены входа (по умолчанию 4%)
    • Управление деньгами: по умолчанию на каждую сделку используется 100% средств счета, одна пирамида допускает загрузку

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

Стратегические преимущества

  1. Высокая степень адаптацииСтратегия: обеспечивает высокую настраиваемость с помощью нескольких опциональных фильтров (RSI, ADX, ATR), которые могут быть адаптированы к различным рыночным условиям и стилям трейдеров. Пользователь может гибко включать или выключать эти фильтры в зависимости от текущей ситуации на рынке.

  2. Двусторонние сделкиВ отличие от простого слежения за трендом или системы обратного отсчета, эта стратегия сочетает в себе два метода торговли, позволяя делать больше в условиях повышающего тренда или делать меньше в условиях крайней перепродажи, что увеличивает возможности для получения прибыли.

  3. Определение интеллектуальных тенденцийИспользование двух равнолинейных систем ((MA100 и MA500) обеспечивает более надежный анализ тенденций и более эффективное отфильтрование ложных прорывов по сравнению с одной равнолинейной системой.

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

  5. Предотвращение реверса в преследованииВ воздушной торговле установлен механизм “блокировки сильного подъема”, когда MA100 превышает установленный процент от MA500, запрещается дифференцированное использование, что эффективно предотвращает риски, связанные с регрессией в сильной рыночной ситуации.

  6. Механизм многократного подтвержденияВходящий сигнал требует совместного подтверждения нескольких технических показателей, что значительно снижает вероятность ложного сигнала и повышает устойчивость стратегии.

  7. Гибкий механизм выходаСтратегия: Различная логика выхода разработана для многоголовых и пустых голов, многоголовые могут использовать MA500 в качестве динамического остановки, а пустые голов имеют фиксированную цель остановки, соответствующую характеристикам торговли в разных направлениях.

Стратегический риск

  1. Параметр Чувствительность: Стратегия зависит от множества технических показателей и параметров, незначительные изменения которых могут привести к значительным различиям в результатах обратной измерения. В реальной торговле оптимальные параметры могут меняться с изменением состояния рынка, существует риск чрезмерного соответствия историческим данным. Решение заключается в использовании пошаговой оптимизации и прогрессивных тестов для проверки стабильности параметров.

  2. Риск отставания: Показатели, такие как скользящие средние, по своей сути являются отсталыми, и в сильно волатильных рынках они могут не успеть вовремя захватить переломные моменты, что приводит к задержке входа или выхода из рынка. Рекомендуется соответствующее сокращение цикла скользящих средних или увеличение других ведущих показателей в высоко волатильных рынках.

  3. Плохая динамика в период смены тренда: во время рыночных потрясений или перехода в тренд, стратегия может часто генерировать ложные сигналы, что приводит к последовательным потерям. Решение заключается в добавлении механизма распознавания состояния рынка, автоматически снижающего позиции или приостанавливающего торговлю при распознавании рыночных потрясений.

  4. Риски управления капиталомСтратегия по умолчанию использует 100% средств счета, плюс позволяет один пирамидальный залог, при неблагоприятных обстоятельствах может быть большой вывод. Рекомендуется корректировать размер позиции в соответствии с индивидуальной способностью к риску и избегать использования всех средств для торговли.

  5. Риск ликвидности: в рынках или периодах с низкой ликвидностью, возможно, есть риск увеличения скольжения или невозможности совершения сделки по ожидаемой цене. Рекомендуется использовать стратегию для работы с основными торговыми парами и периодами с достаточной ликвидностью.

  6. Риск Чёрной лебеди: фиксированный процентный стоп может быть неэффективно реализован в экстремальных рыночных условиях, особенно в случае скачка цен. Рекомендуется установить максимальные лимиты потери и учитывать экстремальный риск хеджирования производными, такими как использование опционов.

Направление оптимизации стратегии

  1. Введение классификации состояния рынка: существующая стратегия использует одни и те же параметры при различных состояниях рынка (тенденция, волатильность, высокая волатильность, низкая волатильность), можно рассмотреть возможность добавления функции распознавания состояния рынка и оптимизации различных комбинаций параметров для различных состояний. Конкретная реализация может делить состояние рынка на показатели волатильности (например, процент ATR) или показатели интенсивности тренда (например, ADX-падеж).

  2. Оптимизация управления капиталомВ настоящее время используется фиксированная пропорциональность средств в счетах, но можно улучшить управление динамическими позициями на основе волатильности, увеличивая позиции в условиях низкой волатильности и уменьшая позиции в условиях высокой волатильности для достижения баланса риска. Можно использовать относительную величину ATR для динамической корректировки пропорции средств для каждой сделки.

  3. Добавить фильтр времени: некоторые рынки могут быть лучше или хуже в определенный период времени, можно добавить функцию фильтрации времени, чтобы избежать исторических периодов плохого результата. Это может быть достигнуто путем анализа стратегической эффективности в разные периоды времени (например, азиатские, европейские, американские торговые часы).

  4. Подтверждение многократных временных рамок: текущая стратегия работает только в одном временном периоде (((3 часа), можно рассмотреть возможность добавления подтверждения тренда в более высоких временных периодах, чтобы увеличить выигрыш только при совпадении направления тренда в более высоких временных периодах. Например, многоголовый сигнал на трехчасовом графике выполняется только при повышении тренда на солнечном графике.

  5. Динамическая остановка и остановкаВместо фиксированных процентов используются динамические, основанные на рыночной волатильности стопы и остановки, что позволяет стратегии лучше адаптироваться к различным волатильным условиям. Можно использовать множители ATR для установки стопов и остановочных точек, автоматически расширяя пределы стопов при увеличении волатильности.

  6. Интеграция эмоциональных показателейВ качестве дополнительных фильтров используются индикаторы рыночных настроений, такие как объем торгов, процентные ставки (в случае с долгосрочными контрактами) или премии на фьючерсы, чтобы избежать обратной торговли в экстремальных эмоциональных состояниях. Эти индикаторы могут служить предупреждающим сигналом о перегреве или переохлаждении рынка.

  7. Оптимизация машинного обучения: Динамически выбирает оптимальную комбинацию параметров с использованием алгоритмов машинного обучения, автоматически корректирует параметры стратегии в зависимости от недавнего состояния рынка. Это может быть достигнуто путем реализации параметровой оптимизации или методов усиленного обучения с помощью прокрутки.

Подвести итог

Двухлинейная динамическая система отслеживания трендов и обратной торговли - это изысканно разработанная количественная торговая стратегия, которая обеспечивает высокую адаптивность и настраиваемость путем сочетания равнолинейной системы, динамических показателей и фильтров волатильности, сохраняя при этом краткость стратегии. Основные преимущества этой стратегии заключаются в ее многократном механизме подтверждения и гибкой системе фильтрации, что позволяет ей адаптироваться к различным рыночным условиям.

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

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

Исходный код стратегии
/*backtest
start: 2024-05-26 00:00:00
end: 2025-05-25 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("Momentum Long + Short Strategy (BTC 3H)", overlay=true,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=100,
     initial_capital=1000,
     commission_type=strategy.commission.percent,
     commission_value=0.1,
     slippage=1,
     pyramiding=1)


// ==============================================================================
// === LONG TRADE SETTINGS
// ==============================================================================
enableLongs     = input.bool(true,  "Enable Long Trades", group="LONG TRADE SETTINGS")
slPercentLong   = input.float(3.0, "Long Stop Loss %", minval=0.1, group="LONG TRADE SETTINGS")

useRSIFilter     = input.bool(false, "Enable RSI Filter", group="LONG FILTER SETTINGS")
useADXFilter     = input.bool(false, "Enable ADX Filter", group="LONG FILTER SETTINGS")
useATRFilter     = input.bool(false, "Enable ATR Filter", group="LONG FILTER SETTINGS")
useTrendFilter   = input.bool(true,  "Require MA100 > MA500", group="LONG FILTER SETTINGS")

smoothType      = input.string("EMA", "Smoothing Type", options=["EMA", "SMA"], group="LONG FILTER SETTINGS")
smoothingLength = input.int(100, "Smoothing Length (for filters)", group="LONG FILTER SETTINGS")

rsiLengthLong   = input.int(14, "RSI Length", group="RSI FILTER")
adxLength       = input.int(14, "ADX Length", group="ADX FILTER")
atrLength       = input.int(14, "ATR Length", group="ATR FILTER")


// ==============================================================================
// === SHORT TRADE SETTINGS
// ==============================================================================
enableShorts         = input.bool(false, "Enable Short Trades", group="SHORT TRADE SETTINGS")
slPercentShort       = input.float(3.0, "Short Stop Loss %", minval=0.1, group="SHORT TRADE SETTINGS")
tpPercentShort       = input.float(4.0, "Short Take Profit %", minval=0.1, group="SHORT TRADE SETTINGS")
rsiLengthShort       = input.int(14, "RSI Length", group="SHORT FILTER SETTINGS")
rsiThresholdShort    = input.float(33, "RSI Threshold", minval=1, maxval=100, group="SHORT FILTER SETTINGS")
bbLength             = input.int(20, "Bollinger Band Length", group="SHORT FILTER SETTINGS")
useATRFilterShort    = input.bool(true, "Enable ATR Filter (Short)", group="SHORT FILTER SETTINGS")
useStrongUptrendBlock = input.bool(true, "Block Shorts if MA100 > MA500 by (%)", group="SHORT FILTER SETTINGS")
shortTrendGapPct     = input.float(2.0, "Threshold (%) for Blocking Shorts", minval=0.1, group="SHORT FILTER SETTINGS")


// ==============================================================================
// === COMMON INDICATORS
// ==============================================================================
ma100 = smoothType == "EMA" ? ta.ema(close, 100) : ta.sma(close, 100)
ma500 = smoothType == "EMA" ? ta.ema(close, 500) : ta.sma(close, 500)
priceAboveMAs = close > ma100 and close > ma500
trendAlignment = not useTrendFilter or ma100 > ma500

plot(ma100, title="MA 100", color=color.orange)
plot(ma500, title="MA 500", color=color.blue)


// ==============================================================================
// === LONG FILTER LOGIC
// ==============================================================================
rsiLong = ta.rsi(close, rsiLengthLong)
rsiSmooth = smoothType == "EMA" ? ta.ema(rsiLong, smoothingLength) : ta.sma(rsiLong, smoothingLength)
rsiPass = not useRSIFilter or rsiLong > rsiSmooth

dmi(len) =>
    up       = ta.change(high)
    down     = -ta.change(low)
    plusDM   = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM  = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur     = ta.rma(ta.tr, len)
    plusDI   = 100 * ta.rma(plusDM, len) / trur
    minusDI  = 100 * ta.rma(minusDM, len) / trur
    dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
    ta.rma(dx, len)

adx = dmi(adxLength)
adxSmooth = smoothType == "EMA" ? ta.ema(adx, smoothingLength) : ta.sma(adx, smoothingLength)
adxPass = not useADXFilter or adx > adxSmooth

atr = ta.atr(atrLength)
atrSmooth = smoothType == "EMA" ? ta.ema(atr, smoothingLength) : ta.sma(atr, smoothingLength)
atrPass = not useATRFilter or atr > atrSmooth


// ==============================================================================
// === SHORT FILTER LOGIC
// ==============================================================================
rsiShort = ta.rsi(close, rsiLengthShort)
bbBasis = ta.sma(close, bbLength)
bbDev   = ta.stdev(close, bbLength)
bbLower = bbBasis - bbDev * 2
priceBelowBB = close < bbLower
priceBelowMAs = close < ma100 and close < ma500
rsiOversold = rsiShort < rsiThresholdShort

atrShort = ta.atr(atrLength)
atrShortSmoothed = smoothType == "EMA" ? ta.ema(atrShort, smoothingLength) : ta.sma(atrShort, smoothingLength)
atrShortPass = not useATRFilterShort or atrShort > atrShortSmoothed

emaGapTooWide = (ma100 - ma500) / ma500 * 100 > shortTrendGapPct
strongUptrendBlock = not useStrongUptrendBlock or not emaGapTooWide


// ==============================================================================
// === ENTRY CONDITIONS
// ==============================================================================
longCondition = enableLongs and priceAboveMAs and trendAlignment and rsiPass and adxPass and atrPass
shortCondition = enableShorts and priceBelowMAs and priceBelowBB and rsiOversold and atrShortPass and strongUptrendBlock

if longCondition
    strategy.entry("Long", strategy.long)

if shortCondition
    strategy.entry("Short", strategy.short)


// ==============================================================================
// === EXIT CONDITIONS
// ==============================================================================
longStop = strategy.position_avg_price * (1 - slPercentLong / 100)
strategy.exit("SL Long", from_entry="Long", stop=longStop)

if strategy.position_size > 0 and close < ma500
    strategy.close("Long", comment="TP Below MA500")

shortStop = strategy.position_avg_price * (1 + slPercentShort / 100)
shortTP   = strategy.position_avg_price * (1 - tpPercentShort / 100)

strategy.exit("SL/TP Short", from_entry="Short", stop=shortStop, limit=shortTP)