Стратегия адаптивного ценового канала

Автор:Чао Чжан, Дата: 2023-12-04 16:33:45
Тэги:

img

Обзор

Эта стратегия представляет собой адаптивную стратегию ценового канала, основанную на индикаторе среднего истинного диапазона (ATR) и среднем направленном индексе (ADX).

Логика стратегии

  1. Вычислить максимальный максимум (HH) и минимальный минимум (LL) за данную длину.

  2. Вычислить +DI и -DI на основе движения цен вверх и вниз.

  3. Если ADX < 25, рынок считается боковым. Если закрыть > верхний канал (HH - ATR мультипликатор * ATR), идти длинный. Если закрыть < нижний канал (LL + ATR мультипликатор * ATR), идти короткий.

  4. Если ADX >= 25 и +DI > -DI, рынок быстрый.

  5. Если ADX >= 25 и +DI < -DI, рынок медвежий.

  6. Положение выхода после столбцов exit_length с момента входа.

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

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

  2. Использование ATR и ADX обеспечивает адаптивность.

  3. Принудительный выход добавляет стабильности.

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

  1. ADX может часто генерировать ложные сигналы.

  2. Плохие параметры ATR и ADX приводят к плохой работе.

  3. Не в состоянии эффективно защитить от черных лебедей.

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

  1. Оптимизировать параметры ATR и ADX для повышения адаптивности.

  2. Добавьте стоп-лосс для ограничения потерь.

  3. Добавьте фильтры, чтобы избежать ложных сигналов.

Заключение

Стратегия сочетает в себе индикаторы и механизмы для адаптации к рыночным условиям. Но ошибки могут произойти из-за ограничений показателей. Будущие оптимизации параметров и контроля рисков.


/*backtest
start: 2023-11-03 00:00:00
end: 2023-12-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Adaptive Price Channel Strategy", overlay=true)

length = input(20, title="Length")
exit_length = input(10, title="Exit After X Periods")
atr_multiplier = input(3.2, title="ATR Multiplier")

startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date")
endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date")

hh = ta.highest(high, length)
ll = ta.lowest(low, length)
atr = ta.atr(length)

// calculate +DI and -DI
upMove = high - high[1]
downMove = low[1] - low
plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0)
minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0)
plusDI = ta.rma(plusDM, length) / atr * 100
minusDI = ta.rma(minusDM, length) / atr * 100

// calculate ADX
dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100
adx = ta.rma(dx, length)

var int barSinceEntry = na

if (not na(close[length]) )
    if (adx < 25) // Sideways market
        if (close > hh - atr_multiplier * atr)
            strategy.entry("PChLE", strategy.long, comment="PChLE")
            barSinceEntry := 0
        else if (close < ll + atr_multiplier * atr)
            strategy.entry("PChSE", strategy.short, comment="PChSE")
            barSinceEntry := 0
    else if (adx >= 25 and plusDI > minusDI) // Bullish market
        if (close > hh - atr_multiplier * atr)
            strategy.entry("PChLE", strategy.long, comment="PChLE")
            barSinceEntry := 0
    else if (adx >= 25 and plusDI < minusDI) // Bearish market
        if (close < ll + atr_multiplier * atr)
            strategy.entry("PChSE", strategy.short, comment="PChSE")
            barSinceEntry := 0

if (na(barSinceEntry))
    barSinceEntry := barSinceEntry[1] + 1
else if (barSinceEntry >= exit_length)
    strategy.close("PChLE")
    strategy.close("PChSE")
    barSinceEntry := na

plot(hh, title="Highest High", color=color.green, linewidth=2)
plot(ll, title="Lowest Low", color=color.red, linewidth=2)



Больше