Stratégie commerciale de rupture du canal de Donchian

Auteur:ChaoZhang est là., Date: 2023-11-08 12:31:56 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de trading de rupture de canal Donchian juge les tendances actuelles des prix en calculant le canal des prix les plus élevés et les plus bas sur une certaine période et en effectuant des transactions longues et courtes en fonction des ruptures de canal.

La logique de la stratégie

Cette stratégie construit un canal en calculant le prix le plus élevé pcmax et le prix le plus bas pcmin au cours des dernières périodes historiques.

Le niveau d'écoulement est calculé en fonction de la température de l'eau.

Il est possible d'utiliser les données de référence pour les tests de détection de la pollution atmosphérique.

où %Dev est par défaut 13.

Un signal long est généré lorsque le prix franchit le rail supérieur. Un signal court est généré lorsque le prix franchit le rail inférieur.

La logique spécifique pour générer des signaux de trading est la suivante:

  1. pour déterminer si le rail supérieur est cassé

  2. bounddn = basse < yl pour déterminer si le rail inférieur est cassé

  3. upsign = sma(bounddn, 2) == 1 utilise sma de bounddn pour déterminer la rupture persistante du rail inférieur

  4. dnsign = sma(boundup, 2) == 1 utilise sma de boundup pour déterminer la rupture persistante du rail supérieur

  5. sortie = dnsign rupture du rail supérieur génère un signal de sortie

  6. sortiedn = rupture de signalisation supérieure du rail inférieur génère un signal de sortie

  7. si la rupture de la signalisation supérieure du rail inférieur génère un signal long

  8. si la rupture de la ligne supérieure génère un court-circuit

La stratégie fixe également les heures de début et de fin des opérations afin d'éviter les positions overnight inutiles.

Les avantages de la stratégie

  1. Utilise le canal Donchian pour déterminer les tendances, de bons résultats de backtest

  2. Il a des signaux longs et courts, permet le commerce bidirectionnel

  3. Utilise la SMA pour filtrer les signaux et éviter les mauvaises transactions

  4. L'exposition au risque de défaillance est calculée sur la base de l'exposition au risque.

  5. Définir les heures de début et de fin de négociation pour éviter les risques du jour au lendemain

Risques liés à la stratégie

  1. Sensible à l'historique et aux paramètres %Dev, nécessite une optimisation pour différents produits

  2. Peut générer de faux signaux sur les marchés à fourchette

  3. Ne prend pas en compte la gestion des ordres, peut avoir une incidence sur la rentabilité des transactions en direct

  4. Ne tient pas compte de la dimension de la position, des risques liés à la surdimension de la position

  5. Ne prend pas en compte la gestion de l'argent, a besoin d'un capital commercial raisonnable

Idées d'amélioration

  1. Optimiser les paramètres d'historique et de pourcentageDev pour différents produits

  2. Ajouter des filtres pour éviter les faux signaux sur les marchés variés

  3. Ajouter un module de dimensionnement de la position pour contrôler la taille de la position unique

  4. Ajouter un module de gestion de fonds pour limiter la taille totale de la position

  5. Ajouter la gestion des ordres pour une exécution optimale des ordres

Conclusion

La stratégie de rupture de canal Donchian utilise des ruptures de canal pour déterminer les tendances et les signaux de trading, avec de bons résultats de backtest et la capacité de trader à la fois long et court. Cependant, des risques existent en ce qui concerne l'optimisation des paramètres, les filtres, la taille des positions, la gestion de l'argent, la gestion des ordres, etc. Des améliorations appropriées dans ces domaines sont nécessaires avant une négociation en direct stable.


/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

////////////////////////////////////////////////////////////
//  Copyright by AlexInc v1.0 02/07/2018  @aav_1980
// PriceChannel strategy
// If you find this script helpful, you can also help me by sending donation to 
// BTC 16d9vgFvCmXpLf8FiKY6zsy6pauaCyFnzS
// LTC LQ5emyqNRjdRMqHPHEqREgryUJqmvYhffM
////////////////////////////////////////////////////////////
//@version=3
strategy("AlexInc PriceChannel Str", overlay=false)
history = input(20)
percentDev = input(13)
capital = input(100)

needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usestoploss = input(true, defval = true, title = "Stop Loss")
stoplossmult = input(3.8, defval = 3.8, minval = 1, maxval = 10, title = "Stop loss multiplicator")


fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

bodymin = min( open, close)
bodymax = max(open, close)

pcmax = highest(bodymax, history)
pcmin = lowest(bodymin, history)

yh = ((pcmax - pcmin) / 100 * (100 - percentDev)) + pcmin
yl = ((pcmax - pcmin) / 100 * percentDev) + pcmin

plot(pcmax)
plot(pcmin)
plot(yh)
plot(yl)

//1
bounddn = low < yl ? 1 : 0
boundup = high > yh ? 1 : 0
upsign = sma(bounddn, 2) == 1
dnsign = sma(boundup, 2) == 1
//2
//upsign = crossover(bodymin, yl)
//dnsign = crossunder(bodymax , yh)


exitup = dnsign
exitdn = upsign

lot = strategy.equity / close * capital / 100


xATR = atr(history)
nLoss = usestoploss ? stoplossmult * xATR : na

stop_level_long = 0.0
stop_level_long := nz(stop_level_long[1])

stop_level_short = 0.0
stop_level_short := nz(stop_level_short[1])

pos = strategy.position_size
if pos >0 and pos[1] <= 0 //crossover(pos, 0.5)
    stop_level_long = strategy.position_avg_price - nLoss
if pos < 0 and pos[1] >= 0 //crossunder(pos, -0.5)
    stop_level_short = strategy.position_avg_price + nLoss
if pos == 0    
    stop_level_long = bodymin - nLoss
    stop_level_short = bodymax + nLoss

//plot(bodymax + nLoss, color=red)
//plot(bodymin - nLoss, color=red)
plot(stop_level_long, color=red)
plot(stop_level_short, color=red)

if upsign
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dnsign
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)

if true
    strategy.close_all()


//if strategy.position_size != 0
//    strategy.exit("Exit Long", from_entry = "Long", stop = stop_level_long)
//    strategy.exit("Exit Short", from_entry = "Short", stop = stop_level_short)

Plus de