La tendance du canal de Donchian à la suite d'une stratégie

Auteur:ChaoZhang est là., Date: 2024-01-22 à 12h30
Les étiquettes:

img

Résumé

La stratégie de suivi des tendances du canal de Donchian est une stratégie de suivi des tendances basée sur l'indicateur du canal de Donchian.

L'idée principale de cette stratégie est d'utiliser un canal de Donchian à plus longue période pour déterminer la direction de la tendance majeure et un canal de Donchian à plus courte période comme signal d'entrée et de stop-loss.

La logique de la stratégie

  1. Calculer le prix de clôture le plus élevé et le prix de clôture le plus bas sur une longue période (par exemple 50 jours) pour construire le canal de Donchian. Une rupture au-dessus de la bande supérieure indique une tendance haussière tandis qu'une rupture au-dessous de la bande inférieure indique une tendance à la baisse. Cela détermine la direction de la tendance principale.

  2. Utiliser le prix de clôture le plus élevé et le prix de clôture le plus bas sur une courte période (par exemple 20 jours) comme critères d'entrée et de stop loss.

  3. Lorsqu'on détient une position longue, si le prix tombe en dessous de la fourchette inférieure à court terme, on arrête à perte.

  4. Le stop loss est réglé à N fois ATR. Il s'ajuste automatiquement en fonction de la volatilité du marché, ce qui réduit les chances de voir un stop loss atteint.

  5. Il est possible de fermer des positions avant la fin de la session de négociation ou de maintenir des positions jusqu'à ce que le stop loss soit atteint.

La stratégie prend en compte à la fois l'identification des tendances et l'arrêt des pertes de profit. Elle peut capturer les tendances des prix tout en contrôlant les risques.

Analyse des avantages

  1. Identifie efficacement les tendances à moyen et à long terme sans être dérangé par les bruits de marché à court terme.

  2. Le mécanisme de stop loss automatique limite les pertes par transaction.

  3. L'ATR basé sur le stop loss ajuste la distance d'arrêt en fonction de la volatilité du marché, ce qui réduit la probabilité d'un stop loss.

  4. Fermeture automatique des positions lorsque la gestion des risques n'est pas possible.

  5. Une logique de stratégie simple et claire, facile à comprendre.

Analyse des risques

  1. Sur les marchés non en tendance, la stratégie peut générer plus de transactions, augmentant les coûts de négociation et les risques de perte.

  2. Bien qu'ayant un mécanisme de stop loss, les écarts de prix dans des conditions volatiles peuvent pénétrer le point de stop loss causant directement d'énormes pertes.

  3. Le calcul de l'ATR est basé uniquement sur des données historiques et ne peut pas prédire avec précision les mouvements et la volatilité futurs des prix.

  4. Les ordres de stop loss ne sont pas toujours exécutés en temps réel, mais peuvent être ignorés dans des conditions de volatilité extrême et causer des pertes.

Directions d'optimisation

  1. Ajustez les paramètres du canal Donchian pour optimiser les performances d'identification des tendances.

  2. Incorporer d'autres indicateurs tels que MACD, KDJ pour confirmer les signaux de trading et améliorer la stabilité de la stratégie.

  3. Ajoutez un stop loss pour déplacer le point de stop loss avec le prix, limitant ainsi davantage les pertes.

  4. Testez l'impact des différentes périodes de détention pour obtenir des résultats globaux optimaux.

  5. Considérez l'ajustement dynamique de la taille des positions, l'élargissement des positions dans des conditions de tendance.

Résumé

La stratégie de suivi des tendances du canal Donchian intègre l'identification des tendances et le contrôle des risques. Elle vise à générer des rendements excédentaires en identifiant les tendances tout en contrôlant les risques de queue avec des mécanismes de stop loss. Cette stratégie convient à l'identification et à la capture des tendances des prix à moyen et long terme. Avec l'optimisation des paramètres et les améliorations du mécanisme, elle peut obtenir des résultats positifs constants.


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

//@version=5
strategy(title="Donchian", overlay=true, calc_on_every_tick=true)

// =============================================================================
// VARIABLES
// =============================================================================

donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10')
permit_long  = input.bool(title = 'Permit long', defval = true)
permit_short  = input.bool(title = 'Permit short', defval = true)
risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25)
stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5)
atrLen = input.int(title="ATR Length", defval=20)
close_in_end  = input.bool(title = 'Close in end', defval = true)
permit_stop  = input.bool(title = 'Permit stop', defval = true)


// =============================================================================
// CALCULATIONS
// =============================================================================

donch_len_big = 
 donch_string == '50/20' ? 50 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 20 : 
 donch_string == '100/100' ? 100 : 
 na
donch_len_small = 
 donch_string == '50/20' ? 20 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 10 : 
 donch_string == '100/100' ? 100 : 
 na

big_maxclose = ta.highest(close, donch_len_big)
big_minclose = ta.lowest(close, donch_len_big)

small_maxclose = ta.highest(close, donch_len_small)
small_minclose = ta.lowest(close, donch_len_small)

atrValue = ta.atr(atrLen)[1]

tradeWindow  = true

// =============================================================================
// NOTOPEN QTY
// =============================================================================

risk_usd     = (risk_percent / 100) * strategy.equity
atr_currency = (atrValue * syminfo.pointvalue)
notopen_qty  = risk_usd / (stopOffset * atr_currency)

// =============================================================================
// LONG STOP
// =============================================================================

long_stop_price = 0.0
long_stop_price := 
 strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : 
 strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price:
 strategy.position_size > 0 ? long_stop_price[1] : 
 na

// =============================================================================
// SHORT STOP
// =============================================================================

short_stop_price = 0.0
short_stop_price := 
 strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : 
 strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price :
 strategy.position_size < 0 ? short_stop_price[1] : 
 na

// =============================================================================
// PLOT BG VERTICAL COLOR
// =============================================================================

cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
cross_dn =  strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
bg_color = cross_up ? color.green : cross_dn ? color.red : na
bg_color := color.new(bg_color, 70)
bgcolor(bg_color)

// =============================================================================
// PLOT HORIZONTAL LINES
// =============================================================================

s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na
s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na
s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : 
 strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na

plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black")
plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black")

plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow")
plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red")
plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia")

// =============================================================================
// ENTRY ORDERS
// =============================================================================

if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
    strategy.entry("Long", strategy.long, qty=notopen_qty)

if (strategy.position_size >= 0) and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
    strategy.entry("Short", strategy.short, qty=notopen_qty)

// =============================================================================
// EXIT ORDERS
// =============================================================================

if strategy.position_size > 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price)

if strategy.position_size < 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price)

// ==========

if strategy.position_size > 0 and close == small_minclose and not barstate.islast
    strategy.close(id="Long", comment='Donch')

if strategy.position_size < 0 and close == small_maxclose and not barstate.islast
    strategy.close(id="Short", comment='Donch')

// ==========

if close_in_end
    if not tradeWindow
        strategy.close_all(comment='In end')

// =============================================================================
// END
// =============================================================================

Plus de