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.
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:
pour déterminer si le rail supérieur est cassé
bounddn = basse < yl pour déterminer si le rail inférieur est cassé
upsign = sma(bounddn, 2) == 1 utilise sma de bounddn pour déterminer la rupture persistante du rail inférieur
dnsign = sma(boundup, 2) == 1 utilise sma de boundup pour déterminer la rupture persistante du rail supérieur
sortie = dnsign rupture du rail supérieur génère un signal de sortie
sortiedn = rupture de signalisation supérieure du rail inférieur génère un signal de sortie
si la rupture de la signalisation supérieure du rail inférieur génère un signal long
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.
Utilise le canal Donchian pour déterminer les tendances, de bons résultats de backtest
Il a des signaux longs et courts, permet le commerce bidirectionnel
Utilise la SMA pour filtrer les signaux et éviter les mauvaises transactions
L'exposition au risque de défaillance est calculée sur la base de l'exposition au risque.
Définir les heures de début et de fin de négociation pour éviter les risques du jour au lendemain
Sensible à l'historique et aux paramètres %Dev, nécessite une optimisation pour différents produits
Peut générer de faux signaux sur les marchés à fourchette
Ne prend pas en compte la gestion des ordres, peut avoir une incidence sur la rentabilité des transactions en direct
Ne tient pas compte de la dimension de la position, des risques liés à la surdimension de la position
Ne prend pas en compte la gestion de l'argent, a besoin d'un capital commercial raisonnable
Optimiser les paramètres d'historique et de pourcentageDev pour différents produits
Ajouter des filtres pour éviter les faux signaux sur les marchés variés
Ajouter un module de dimensionnement de la position pour contrôler la taille de la position unique
Ajouter un module de gestion de fonds pour limiter la taille totale de la position
Ajouter la gestion des ordres pour une exécution optimale des ordres
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)