Une stratégie de percée solide de la CCI

Auteur:ChaoZhang est là., Date: 2023-11-15 16:52:06 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie est basée sur l'indice classique du canal des produits de base (ICC) et ne dure que longtemps. Elle entre sur le marché lorsque l'indicateur de l'ICC est à un niveau extrêmement bas (ICC <-150 ou seuil défini par l'utilisateur) et reprend de la force (c'est-à-dire ICC> ICC de la bougie précédente), avec un filtre sur la force des prix eux-mêmes (c'est-à-dire que la fermeture de la barre de signal doit être supérieure à une certaine différence - fixée à 0,25% - par rapport à l'ouverture).

La stratégie s'arrête lorsque soit le stop loss est déclenché, soit les prix dépassent la fourchette supérieure du CCI.

L'objectif est d'atteindre un pourcentage élevé de transactions rentables (bien supérieur à 50%) plutôt que de capturer la durée complète d'une tendance.

La logique de la stratégie

  1. Construire l'indicateur CCI et les bandes à l'aide de ta.sma() etta.dev() fonctions.

  2. Utilisez l'entrée pour sélectionner la date de début du backtest.

  3. Signal d'entrée: CCI traverse la bande inférieure et commence à augmenter.

  4. Exit 1: CCI dépasse la fourchette supérieure et tire profit.

  5. Sortie 2: le prix tombe en dessous du niveau stop loss, réduire les pertes.

  6. La stratégie ne dure que sur la base de la force de la CCI, avec des arrêts pour contrôler le risque.

Analyse des avantages

La stratégie présente les avantages suivants:

  1. Identifier les surachats/survendus avec CCI afin de capitaliser sur les revers.

  2. Seule la direction longue évite un risque excessif lié à de mauvaises transactions.

  3. Le filtre de force des prix assure le soutien formé avant l'entrée.

  4. Le mécanisme de stop loss limite les pertes par transaction et gère le capital.

  5. Paramètres de backtest flexibles pour régler les filtres d'entrée.

  6. Un taux de réussite élevé convient aux investisseurs axés sur la gestion des risques.

  7. Une logique claire et une mise en œuvre simple.

Analyse des risques

Il y a aussi des risques:

  1. Si l'on ne va que sur le long terme, on risque de rater les tendances à la baisse à court terme.

  2. Un mauvais réglage des paramètres CCI conduit à une défaillance.

  3. L'arrêt des pertes trop lâche ne permet pas de limiter les pertes.

  4. Une forte tendance à la hausse frappe les arrêts causant de grosses pertes.

  5. La fréquence élevée des échanges augmente les coûts de transaction.

Des solutions possibles:

  1. Optimiser les paramètres CCI pour trouver les meilleures valeurs.

  2. Ajustez le stop loss pour équilibrer le risque et le glissement.

  3. Gérer la fréquence d'entrée en tenant compte des coûts.

  4. Combinez avec les filtres de tendance et de gamme.

Des possibilités d'amélioration

Quelques façons d'améliorer la stratégie:

  1. Mettre en œuvre des arrêts dynamiques basés sur la volatilité du marché.

  2. Ajoutez des filtres comme MACD pour éviter que les stops ne soient trop larges.

  3. Incorporer le côté court lorsque la CCI surchauffe.

  4. Considérez les coûts, fixez un objectif de profit minimum.

  5. Optimisez les paramètres pour le délai.

  6. Apprentissage automatique pour le réglage automatique des paramètres.

  7. Ajouter la dimension de position pour l'allocation dynamique.

Conclusion

En résumé, cette stratégie long-only capitalise sur les niveaux de surachat/survente du CCI avec un filtre de force de prix et des arrêts de pertes. Elle offre une mise en œuvre facile, un bon contrôle des risques et un pourcentage de gain élevé.


/*backtest
start: 2022-11-08 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='CCI High Performance long only', overlay=false )
src = input(close)
length = input.int(20, title='Period', minval=1)
lossp = input.float(8, title='Stop Loss percentage', minval=0.5, step=0.5)
scart = input.float(0.25, title='Close of the signal bar higher than Open %', minval = 0)
upperline = input.int(150, title='Upper Band', minval=0, step=10)
lowline = input.int(-150, title='Low Band', maxval=0, step=10)


// construction of CCI (not on close but in totalprice) and of bands
ma = ta.sma(src, length)
cci = (src - ma) / (0.015 * ta.dev(src, length))
plot(cci, 'CCI', color=color.new(#996A15, 0))
band1 = hline(upperline, 'Upper Band', color=#C0C0C0, linestyle=hline.style_dashed)
band0 = hline(lowline, 'Lower Band', color=#C0C0C0, linestyle=hline.style_dashed)
fill(band1, band0, color=color.new(#9C6E1B, 90), title='Background')
// === INPUT BACKTEST RANGE ===
fromMonth = input.int(defval = 1,    title = "From Month",  minval = 1, maxval = 12)
fromDay   = input.int(defval = 1,    title = "From Day",    minval = 1, maxval = 31)
fromYear  = input.int(defval = 2016, title = "From Year",   minval = 1970)
thruMonth = input.int(defval = 1,    title = "Thru Month",  minval = 1, maxval = 12)
thruDay   = input.int(defval = 1,    title = "Thru Day",    minval = 1, maxval = 31)
thruYear  = input.int(defval = 2112, title = "Thru Year",   minval = 1970)
// === FUNCTION EXAMPLE limit for backtest ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)            // backtest start  window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)            // backtest finish window
window()  => time >= start and time <= finish ? true : false           // create function "within window of time"
//ENTRY CONDITIONS

// strategy: enter when CCI is under the low line and starts increasing. The filter is that the signal candle should mark a close higher than a x-percent
// (0.25%) of the open
// Exit when either when it reaches the target of a prices highest than high level of CCI or fixed stop loss (in percentage)
scart_level = open * (1+scart/100)
entryl = cci[1] < lowline[1] and cci > cci[1] and close > scart_level and window()
exit1 = cci> upperline
strategy.entry('Long', strategy.long, when=entryl)
strategy.close('Long', when=exit1, comment='target')

// money management (only stop loss)
losspel = strategy.position_avg_price * (1 - lossp / 100)
fixed_stop_long = close < losspel
strategy.close('Long', when=fixed_stop_long, comment='Stop Loss')



Plus de