
La stratégie de suivi de la tendance de la boîte noire est une stratégie de suivi de la tendance développée sur la base du principe du canal de la boîte noire décrit dans l’article Black Box Trend Following Lifting the Veil . Cette stratégie utilise le canal de la boîte noire pour déterminer la tendance des prix et créer des positions en hausse ou en baisse en fonction de la hausse ou de la baisse des prix.
La stratégie est basée sur l’indicateur de la chaîne de Dony pour déterminer la direction de la tendance. La chaîne de Dony est composée d’une chaîne à cycle plus long et d’une chaîne à cycle plus court.
Plus précisément, la longueur des canaux à périodes plus longues est de 50 jours ou 20 jours, et la longueur des canaux à périodes plus courtes est de 50 jours, 20 jours ou 10 jours. Si le prix est égal au prix le plus élevé en 50 jours, un ordre est ouvert; si le prix est égal au prix le plus bas en 50 jours, un ordre est ouvert.
De cette façon, par une combinaison de deux canaux de donjon de différentes périodes, il est possible de déterminer la direction de la position au début de la tendance et de l’arrêter à la fin de la tendance.
Les principaux avantages de cette stratégie sont les suivants:
La capacité de capture des tendances est élevée. Le début et la fin de la tendance peuvent être déterminés en brisant le canal de la glande thyroïde, ce qui permet de suivre efficacement la tendance.
Le contrôle des risques est en place. Le stop mobile est utilisé pour contrôler les pertes individuelles.
Adaptation des paramètres est flexible. La combinaison de cycles des canaux peut être librement choisie pour s’adapter à différentes variétés et environnements de marché.
Une logique de transaction simple et claire.
La stratégie présente également les risques suivants:
L’incapacité à s’adapter à une situation de choc. Lorsque la tendance n’est pas évidente, il y aura plusieurs ajustements mineurs, entraînant des pertes de stop loss.
Risque d’échec de la rupture. Après la rupture du canal, le prix peut être recalqué à nouveau, ce qui entraîne un arrêt.
Le risque de sélection des cycles. Si les cycles de passage sont mal définis, cela entraînera un trading in noise.
Risque de baisse du ratio Sharp. Si vous augmentez votre position sans modifier votre stop loss, vous risquez de baisse du ratio Sharp.
La réponse:
Cette stratégie peut être optimisée dans les directions suivantes:
Augmentation des conditions de filtrage pour éviter les whipsaws.
Optimiser la composition et le contrôle des positions sur le cycle de la chaîne, améliorer le ratio de profit et de perte. Un mécanisme d’arrêt des pertes adaptatif peut être introduit.
Essayez d’optimiser le point de rupture pour trouver la meilleure combinaison de paramètres.
Ajout d’algorithmes d’apprentissage automatique pour optimiser et ajuster dynamiquement les paramètres.
La stratégie de suivi des tendances de Don Quichotte est une stratégie de suivi des tendances très pratique. Elle permet de déterminer le début et la fin de la tendance des prix par deux voies, d’adopter une méthode de trading de suivi des tendances et de contrôler efficacement les pertes individuelles. La stratégie est flexible et facile à mettre en œuvre.
/*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,
pyramiding=0, initial_capital=1000,
commission_type=strategy.commission.cash_per_order,
commission_value=2, slippage=2)
// =============================================================================
// VARIABLES
// =============================================================================
donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50')
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 = false)
// =============================================================================
// 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 VERTICAL COLOR BAR
// =============================================================================
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 DONCHIAN 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='Close in end')
// =============================================================================
// END
// =============================================================================