Стратегия количественного отслеживания тенденций

Автор:Чао Чжан, Дата: 2024-02-01 11:42:22
Тэги:

img

Обзор

Эта стратегия использует множество индикаторов, таких как полосы Боллинджера, 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)


Больше