Stratégie dynamique de soutien et de résistance à la CCI

Auteur:ChaoZhang est là., Date: 2024-01-22 16h37:46
Les étiquettes:

img

Résumé

Cette stratégie utilise les points pivots de l'indicateur CCI pour calculer les niveaux de soutien et de résistance dynamiques et combine le jugement de tendance pour trouver des signaux d'achat et de vente.

Principe de stratégie

L'indicateur CCI peut montrer si le marché est trop faible ou trop fort. Les deux extrêmes de 80 et -80 peuvent être utilisés pour déterminer si le marché est entré dans un état de surachat ou de survente. Cette stratégie utilise cette caractéristique du CCI. En calculant les points de pivot des 50 barres gauche et droite, les points de pivot supérieurs et inférieurs sont obtenus.

Un signal d'achat est généré lorsque la fermeture est supérieure à l'ouverture et inférieure au niveau supérieur de support. Un signal de vente est généré lorsque la fermeture est inférieure à l'ouverture et supérieure au niveau inférieur de résistance. Afin de filtrer les signaux de négociation par rapport à la direction de la tendance principale, la stratégie combine également les indicateurs EMA et de pente pour déterminer la direction de la tendance principale actuelle. Les transactions d'entrée longue sont effectuées uniquement lorsque la tendance est déterminée comme haussière. Les transactions d'entrée courte sont effectuées uniquement lorsque la tendance est déterminée comme baissière.

Le stop loss et le take profit sont calculés dynamiquement sur la base de l'indicateur ATR, ce qui rend le contrôle des risques de cette stratégie plus raisonnable.

Analyse des avantages

  1. En outre, la Commission considère que la mesure n'est pas compatible avec le marché intérieur et ne saurait être considérée comme compatible avec le marché intérieur.
  2. La combinaison avec le jugement de tendance évite les transactions contre tendance et réduit les pertes.
  3. Les paramètres de stop loss et de prise de profit dynamiques rendent le contrôle des risques plus judicieux.
  4. Les paramètres personnalisables tels que la longueur du CCI, la taille du tampon, etc., s'adaptent à un plus grand nombre d'environnements de marché.

Analyse des risques

  1. L'indicateur CCI a tendance à générer de faux signaux, ce qui nécessite le filtrage du jugement de tendance.
  2. Les réversions ne sont pas toujours couronnées de succès, avec une certaine probabilité de risque de perte.
  3. Des paramètres mal réglés peuvent entraîner une survente ou des opportunités manquées.

Des méthodes telles que l'optimisation des paramètres, l'ajustement de la plage de stop loss, etc. peuvent aider à réduire les risques.

Directions d'optimisation

  1. Optimiser la taille du coussin pour s'adapter à des marchés à différents niveaux de volatilité.
  2. Optimiser les paramètres de la période ATR pour un stop loss dynamique et un profit plus précis.
  3. Testez différents paramètres de la CCI.
  4. Testez les effets d'autres types d'indicateurs de jugement de tendance.

Conclusion

Cette stratégie intègre la capacité de dépistage long/short du CCI et la confirmation du filtre du jugement de tendance, possédant une certaine valeur pratique. Le stop loss dynamique et le take profit rendent également le risque contrôlable lors de l'application de la stratégie dans le trading réel.


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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © AliSignals


//@version=5
strategy("CCI based support and resistance strategy", overlay=true  )


cci_length = input.int(50, "cci length")
right_pivot = input.int(50, "right pivot")
left_pivot = input.int(50, "left pivot")
buffer = input.float(10.0, "buffer")
trend_matter = input.bool(true, "trend matter?")
showmid = input.bool ( false , "show mid?")
trend_type = input.string("cross","trend type" ,options = ["cross","slope"])
slowma_l = input.int(100, "slow ma length")
fastma_l = input.int(50, "fast ma length")
slope_l = input.int(5,  "slope's length for trend detection")
ksl = input.float(1.1)
ktp = input.float(2.2)
restf = input.timeframe(title="Time Frame of Last Period for Calculating max" , defval="D")



// Calculating Upper and Lower CCI
cci = ta.cci(hlc3,cci_length)

uppercci = 0.0
lowercci = 0.0

uppercci := fixnan(ta.pivothigh(cci, left_pivot, right_pivot)) - buffer
lowercci := fixnan(ta.pivotlow (cci, left_pivot, right_pivot)) + buffer
midccci  = math.avg(uppercci,lowercci)


// Support and Resistance based on CCI
res = uppercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
sup = lowercci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)
mid =  midccci*(0.015*ta.dev(hlc3,cci_length))+ ta.sma(hlc3,cci_length)



// Calculating trend
t_cross  = 0
t_cross := ta.ema(close,fastma_l) > ta.ema(close,slowma_l) ? 1 : ta.ema(close,fastma_l) < ta.ema(close,slowma_l) ? -1 : t_cross[1] 

t_slope  = 0
t_slope := ta.ema(close,slowma_l) > ta.ema(close,slowma_l)[slope_l] ? 1 : ta.ema(close,slowma_l) < ta.ema(close,slowma_l)[slope_l]  ? -1 : t_slope[1] 

t  = 0
t := trend_type == "cross" ? t_cross : trend_type == "slope" ? t_slope : na

colort =  trend_matter == false ? color.rgb(201, 251, 0) : t == 1 ? color.rgb(14, 243, 132) :  t == -1 ? color.rgb(255, 34, 34) : na
bull_t = trend_matter == false or t ==  1
bear_t = trend_matter == false or t == -1

plot(res, color = colort)
plot(sup, color = colort)
plot(showmid == true ? mid : na)


// Long and Short enter condition
buy  = bull_t == 1 and ta.lowest (2) < sup and close > open and close > sup
sell = bear_t == 1 and ta.highest(2) > res and close < open and close < res

plotshape( buy , color=color.rgb(6, 255, 23) , location = location.belowbar, style = shape.triangleup  , size = size.normal)
plotshape( sell, color=color.rgb(234, 4, 4) ,  location = location.abovebar, style = shape.triangledown, size = size.normal)





atr = ta.atr(100)



CLOSE=request.security(syminfo.tickerid, restf, close)
max = 0.0
max := CLOSE == CLOSE[1] ? math.max(max[1], atr) : atr
act_atr = 0.0
act_atr := CLOSE == CLOSE[1] ? act_atr[1] : max[1]

atr1 =  math.max(act_atr, atr) 

dis_sl = atr1 * ksl
dis_tp = atr1 * ktp


var float longsl  = open[1] - dis_sl
var float shortsl = open[1] + dis_sl
var float longtp =   open[1] + dis_tp
var float shorttp =  open[1] - dis_tp


longCondition = buy
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = sell
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


longsl  := strategy.position_size > 0  ? longsl[1]  : close - dis_sl
shortsl := strategy.position_size < 0 ? shortsl[1] : close + dis_sl
longtp  := strategy.position_size > 0  ? longtp[1]  : close + dis_tp
shorttp := strategy.position_size < 0 ? shorttp[1] : close - dis_tp




if strategy.position_size > 0 
    strategy.exit(id="My Long close Id", from_entry ="My Long Entry Id" , stop=longsl, limit=longtp)
if strategy.position_size < 0 
    strategy.exit(id="My Short close Id", from_entry ="My Short Entry Id" , stop=shortsl, limit=shorttp)



Plus de