Количественная стратегия с двойным импульсным прорывом и фильтром волатильности


Дата создания: 2023-12-22 12:01:21 Последнее изменение: 2023-12-22 12:01:21
Копировать: 0 Количество просмотров: 825
1
Подписаться
1621
Подписчики

Количественная стратегия с двойным импульсным прорывом и фильтром волатильности

Обзор

Эта стратегия используется для определения тенденции путем пересечения двойной динамики EMA и динамики DEMA в ценах, а также для фильтрации ложных прорывов в сочетании с показателем волатильности ATR, реализуя количественную торговую стратегию с двумя показателями волатильности и фильтрацией волатильности.

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

Стратегия включает в себя следующие части:

  1. Для расчета цены используют EMA и DEMA как двойные динамические индикаторы. Более длинные EMA отражают долгосрочные тенденции, а DEMA - более чувствительные краткосрочные динамические индикаторы.

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

  3. ATR колеблется с помощью параметризации скользящих средних. Когда ATR колеблется ниже скользящих средних, то допускается запускание сигналов движущегося веса.

  4. Параметры, используемые для управления временным циклом ATR, длительностью ATR, типом и длительностью скользящих средних ATR и т. д.

  5. Установление правил для остановки, остановки и отслеживания остановки многоочередных позиций.

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

Такая стратегия двойной фильтрации EMA позволяет значительно уменьшить количество ложных сигналов и частоту торгов в обычной стратегии EMA Gold Fork Dead Fork. После добавления показателя волатильности ATR можно эффективно отфильтровать ошибочные сигналы, вызванные мелкими колебаниями, чтобы избежать попадания в ловушку.

По сравнению с одним динамическим показателем, стратегия использует дизайн с двумя показателями, что позволяет повысить эффективность суждения. DEMA является более чувствительным краткосрочным динамическим показателем, который сочетается со стабильной длинной линией EMA и образует более надежный комбинированный сигнал.

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

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

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

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

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

  1. Испытание различных комбинаций параметров динамических показателей, чтобы найти оптимальный параметр.

  2. Попробуйте отрегулировать динамический показатель с помощью двойной ЭМА на MACD или другие показатели.

  3. Тестирование различных показателей волатильности, таких как ATR, индекс волатильности рынка и т. д.

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

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

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

Стратегия объединяет динамические показатели и анализ волатильности, разработанная на прочной теоретической основе. С помощью корректировки параметров и оптимизации правил она может стать стабильной и надежной количественной торговой стратегией.

Исходный код стратегии
/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 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/
// © Qorbanjf

//@version=4
strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)


// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
//longLossPerc = input(title="Long Stop Loss (%)",
    // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
longTrailPerc = input(title="Trail stop loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=50) * 0.01
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3000) / 100

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)


// ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))

// variables for enter position
enterLong = crossover(dema1, ema1) and atrp < maFilter

// variables for exit position
sale = crossunder(dema1, ema1)

// stop loss
//longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)

// trail stop
// Determine trail stop loss prices
longStopTrail = 0.0

longStopTrail := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopTrail[1])
else
    0
//Take profit Percentage
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

//Enter trades when conditions are met
strategy.entry(id="long",
 long=strategy.long,
 when=enterLong,
 comment="long")

//
strategy.close("long", when = sale, comment = "Sell")
//place exit orders (only executed after trades are active)

strategy.exit(id="sell",
 limit = longExitPrice,
 stop = longStopTrail,
 comment = "SL/TP")