Двойной импульс прорыв и волатильность фильтрации алгоритмической стратегии торговли

Автор:Чао Чжан, Дата: 2023-12-22 12:01:21
Тэги:

img

Обзор

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

Принцип стратегии

К основным составляющим этой стратегии относятся:

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

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

  3. Волатильность ATR оценивается как высокая или низкая по параметризированной линии скользящей средней.

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

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

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

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

По сравнению с одиночными индикаторами импульса, двойная конструкция может улучшить эффективность суждения.

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

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

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

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

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

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

  2. Попробуйте заменить индикаторы импульса с двойной EMA на 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")



Больше