Количественная стратегия следования за трендом


Дата создания: 2024-02-01 11:42:22 Последнее изменение: 2024-02-01 11:42:22
Копировать: 0 Количество просмотров: 524
1
Подписаться
1617
Подписчики

Количественная стратегия следования за трендом

Обзор

Эта стратегия использует несколько индикаторов, таких как Брин-банды, RSI, ADX, MACD, чтобы судить о тенденциях рынка, имея более сильную способность распознавать тенденции. Когда индикаторный сигнал одновременно бычий, принимается стратегия отслеживания; когда индикаторный сигнал одновременно медвежий, остановка позиции.

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

  • Использование бриндовых поясов для определения того, находится ли цена вблизи верхней или нижней полосы бриндовых поясов, в качестве основы для определения того, формируется ли тенденция
  • В сочетании с RSI, чтобы определить, находится ли он в зоне перепродажи, чтобы избежать ложного прорыва
  • Используйте ADX для определения силы тренда, сигнализируя только при сильной тенденции
  • Использование MACD для определения согласованности краткосрочных и долгосрочных тенденций
  • Объединение в течение дня, только в определенное время торговли

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

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

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

В частности, преимущества:

  1. Полоса Брин позволяет определить степень колебания цен и их слабость.
  2. RSI избегает покупки в зоне перекупа и продажи в зоне перепродажи
  3. ADX оценивает интенсивность тренда, следуя только сильным тенденциям
  4. MACD оценивает долгосрочную консистенцию
  5. Ограничьте время торговли, чтобы избежать риска ночного торгового дня

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

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

Основные риски, связанные с этой стратегией:

  1. Внезапные события приводят к сбоям показателей
  2. В результате землетрясения появилось множество ложных сигналов.

В отношении риска 1, из-за зависимости от нескольких показателей, можно в некоторой степени избежать неэффективности одного показателя, но все же необходимо усовершенствовать механизм управления рисками.

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

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

Основными направлениями оптимизации стратегии являются:

  1. Добавление механизмов для устранения убытков, таких как убытки от перемещения, убытки от времени, убытки от прорыва, чтобы избежать чрезмерного оттягивания
  2. Оптимизация параметров, корректировка комбинации параметров индикатора, поиск оптимальных параметров
  3. Добавление условий фильтрации, таких как переходное фильтрация, чтобы избежать небольших ложных прорывов
  4. Повышение точности сигнала в сочетании с дополнительными показателями, такими как KDJ, OBV и т. д.
  5. Автоматическая оптимизация параметров с использованием методов машинного обучения

Продолжая оптимизировать, мы постоянно повышаем эффективность параметров стратегии и снижаем вероятность ложных сигналов.

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

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

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

Исходный код стратегии
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 5h
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/
// © abilash.s.90


dIMinusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementMinus = 0.0
    dIMinus = 0.0
    trueRange = 0.0
    directionalMovementMinus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementMinus := nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementMinus := nz(smoothedDirectionalMovementMinus[1]) - (nz(smoothedDirectionalMovementMinus[1])/adxLen) + directionalMovementMinus
    
    dIMinus := smoothedDirectionalMovementMinus / smoothedTrueRange * 100
    
    dIMinus

dIPlusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementPlus = 0.0
    dIPlus =  0.0
    trueRange = 0.0
    directionalMovementPlus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementPlus := high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementPlus := nz(smoothedDirectionalMovementPlus[1]) - (nz(smoothedDirectionalMovementPlus[1])/adxLen) + directionalMovementPlus
    
    dIPlus := smoothedDirectionalMovementPlus / smoothedTrueRange * 100
    
    dIPlus
    
    
Adx(adxLen) =>
    dIPlus =  0.0
    dIMinus = 0.0
    dX = 0.0
    aDX = 0.0
    dIPlus := dIPlusCalc(adxLen)
    dIMinus := dIMinusCalc(adxLen)
    dX := abs(dIPlus-dIMinus) / (dIPlus+dIMinus)*100
    aDX := sma(dX, adxLen)
    
    aDX
    
BarInSession(sess) => time(timeframe.period, sess) != 0


//@version=4
strategy("Bollinger Band + RSI + ADX + MACD", overlay=true)

//Session

session = input(title="Trading Session", type=input.session, defval="0930-1500")

sessionColor = BarInSession(session) ? color.green : na

bgcolor(color=sessionColor, transp=95)

// Bollinger Bands
src = input(high, title="Bollinger Band Source", type=input.source)
length = input(3, minval=1, type=input.integer, title="Bollinger Band Length")
mult = input(4.989, minval=0.001, maxval=50, step=0.001, type=input.float, title="Bollinger Band Std Dev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev


plot(upper, title="Bollinger Band Upper", color=color.red)
plot(lower, title="Bollinger Band Lower", color=color.green)

// RSI
rsiSrc = input(close, title="RSI Source", type=input.source)
rsiLength = input(16, minval=1, type=input.integer, title="RSI Length")
rsiComparator = input(39.2, title="RSI Comparator", type=input.float, step=0.1)

rsi = rsi(rsiSrc, rsiLength)

// ADX
adxLength = input(14, minval=1, type=input.integer, title="ADX Length")
adxComparator = input(14, minval=1, type=input.integer, title="ADX Comparator")

adx = Adx(adxLength)

// Heikinashi

haClose = security(heikinashi(syminfo.ticker), timeframe.period, close)
haOpen = security(heikinashi(syminfo.ticker), timeframe.period, open)

nextHaOpen = (haOpen + haClose) / 2

//MACD

macdCalcTypeProcessed = input(title="MACD Source", type=input.source, defval=high)
fast = input(12, title="MACD Fast")
slow = input(20, title="MACD Slow")
signalLen = input(15, title="MACD Signal")

fastMA = ema(macdCalcTypeProcessed, fast)
slowMA = ema(macdCalcTypeProcessed, slow)
macd = fastMA - slowMA
signal = sma(macd, signalLen)



longCondition() =>
    (low < lower) and (rsi[0] > rsiComparator) and (adx > adxComparator) and (close > nextHaOpen) and BarInSession(session) and macd > signal

stop = (close - max((low - (low * 0.0022)), (close - (close * 0.0032)))) / syminfo.mintick
target = (max(upper, (close + (close * 0.0075))) - close) / syminfo.mintick


strategy.entry("SX,LE", strategy.long, when=longCondition(), comment="SX,LE")
strategy.close_all(when=(not BarInSession(session)))
strategy.exit("LX", from_entry="SX,LE", profit=target, loss=stop)