Stratégie quantitative de suivi des tendances

Auteur:ChaoZhang est là., Date: 2024-02-01 11:42:22 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie adopte plusieurs indicateurs tels que les bandes de Bollinger, RSI, ADX, MACD pour juger des tendances du marché et a une forte capacité d'identification des tendances.

Principe de stratégie

  • Utilisez les bandes de Bollinger pour juger si le prix est proche de la voie supérieure ou inférieure pour déterminer si une tendance est formée
  • Combiner avec l'indicateur RSI pour éviter les zones de surachat et de survente afin d'éviter les fausses ruptures
  • Utilisez ADX pour déterminer la force de la tendance et ne signale que lorsque la force de la tendance est forte
  • Adopter le MACD pour juger de la cohérence des tendances à court et à long terme
  • Limiter les séances de négociation pour éviter les risques du jour au lendemain

Grâce au jugement combiné de plusieurs indicateurs, il peut identifier avec précision les tendances des prix et les suivre en temps opportun lorsque la tendance se produit pour obtenir des rendements excédentaires.

Analyse des avantages

Le principal avantage de cette stratégie est que l'évaluation combinée des indicateurs est plus complète et précise, ce qui permet d'identifier efficacement les tendances des prix et d'éviter les faux signaux causés par des indicateurs uniques.

Les avantages sont les suivants:

  1. Les bandes de Bollinger peuvent déterminer la plage et la force des fluctuations de prix
  2. RSI évite d'acheter dans les zones de surachat et de vendre dans les zones de survente
  3. ADX détermine la force de la tendance, ne suit que les tendances fortes
  4. Le MACD évalue la cohérence des taux à court et à long terme
  5. Limite des séances de négociation pour éviter les risques du jour au lendemain

Grâce au jugement de la combinaison des indicateurs, il peut maximiser réduire les faux signaux et améliorer la stabilité de la stratégie.

Analyse des risques

Les principaux risques de cette stratégie proviennent de:

  1. Événements de marché ayant entraîné une défaillance de l'indicateur
  2. Signaux erronés fréquents sur les marchés à fourchette

Pour le risque 1, le recours à plusieurs indicateurs peut atténuer dans une certaine mesure le problème de l'échec d'un seul indicateur, mais les mécanismes de gestion des risques doivent encore être améliorés.

Pour le risque 2, les paramètres peuvent être ajustés de manière appropriée en fonction d'une plage de négociation étroite et réduire la fréquence des négociations afin d'atténuer les risques.

Directions d'optimisation

Les principaux aspects optimisables de cette stratégie sont les suivants:

  1. Ajoutez des mécanismes de stop loss tels que le stop loss de trailing, le stop loss de time, le stop loss de breakout, etc. pour éviter de revenir trop loin.
  2. Optimiser les paramètres, ajuster les paramètres d'indicateur combinaison pour trouver l'optimum
  3. Ajouter des filtres tels que le filtre de volume pour éviter les fausses ruptures en faible volume
  4. Incorporer plus d'indicateurs comme KDJ, OBV pour améliorer la précision du signal
  5. Adopter des méthodes d'apprentissage automatique pour optimiser automatiquement les paramètres

Par l'optimisation continue, améliorer continuellement la robustesse des paramètres et réduire les probabilités de faux signaux.

Résumé

Dans l'ensemble, cette stratégie a une capacité relativement forte à identifier les signaux de tendance grâce à des jugements de combinaison d'indicateurs qui peuvent identifier efficacement les tendances des prix.

Mais elle comporte également certains risques, la gestion des risques et l'optimisation des paramètres doivent être continuellement améliorées pour des opérations stables à long terme.


/*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)


Plus de