La stratégie de pulling est une stratégie de suivi de tendance basée sur les canaux de Donchian. Elle utilise des canaux de Donchian rapides et lents pour identifier la direction de la tendance et entrer dans les retraits. Les avantages de cette stratégie sont qu'elle peut suivre les tendances automatiquement et réduire les pertes à temps lorsque la tendance change. Mais elle comporte également les risques de retrait et de stop loss trop proches.
La stratégie définit d'abord la période de canal rapide comme 20 barres, et la période de canal lent comme 50 barres.
Tout d'abord, le plus haut et le plus bas des canaux rapides sont calculés, et le point médian est pris comme la ligne de stop loss.
Lorsque le prix franchit le haut du canal lent, allez long. Lorsque le prix franchit le bas du canal lent, allez court. Après avoir entré dans la position, définissez le stop loss au milieu du canal rapide.
Ainsi, le canal lent détermine la direction de la tendance majeure, tandis que le canal rapide suit les ruptures mineures dans une petite plage pour déterminer le point de stop loss.
La structure à double canal peut suivre automatiquement les tendances et réduire rapidement les pertes lorsque les tendances s'inversent.
En prenant des entrées seulement lorsque le prix franchit les limites du canal, vous pouvez filtrer certaines fausses ruptures sans tendance réelle.
Le risque contrôlable. La distance de stop loss proche peut contrôler une seule perte.
Les stratégies qui suivent la tendance peuvent avoir des retombées relativement importantes, ce qui nécessite une préparation psychologique.
Le stop loss est trop proche. La période du canal rapide est courte, donc le stop loss est proche, susceptible d'être arrêté.
La structure à double canal peut générer des entrées excessives, ce qui nécessite un dimensionnement raisonnable des positions.
Nous pouvons ajouter de la volatilité, etc. dans les conditions d'entrée pour filtrer les écarts sans assez de force de tendance.
Optimiser les paramètres de la période du canal. Nous pouvons trouver les combinaisons optimales de paramètres du canal de manière systématique.
Combiner plusieurs délais: déterminer la tendance majeure sur les délais les plus longs et négocier sur les délais les plus courts.
Distances d'arrêt dynamiques, ajustées dynamiquement en fonction de la volatilité du marché.
La stratégie de pulling est une stratégie de suivi de tendance standard. Elle utilise les canaux de prix pour déterminer la direction de la tendance et définit un stop loss pour contrôler les risques. La stratégie présente certains avantages mais aussi les problèmes de retrait et de stop loss trop proches. Nous pouvons l'optimiser en ajustant les paramètres du canal, en ajoutant des filtres, etc. Mais nous devons noter que les stratégies de suivi de tendance nécessitent une forte psychologie pour supporter les retraitements.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2020 //@version=4 strategy("Noro's RiskTurtle Strategy", shorttitle = "RiskTurtle str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") risk = input(2, minval = 0.1, maxval = 99, title = "Risk size, %") fast = input(20, minval = 1, title = "Fast channel (for stop-loss)") slow = input(50, minval = 1, title = "Slow channel (for entries)") showof = input(true, defval = true, title = "Show offset") showll = input(true, defval = true, title = "Show lines") showdd = input(true, defval = true, title = "Show label (drawdown)") showbg = input(true, defval = true, title = "Show background") fromyear = input(1900, defval = 1900, 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") //Donchian price channel fast hf = highest(high, fast) lf = lowest(low, fast) center = (hf + lf) / 2 //Donchian price chennal slow hs = highest(high, slow) ls = lowest(low, slow) //Lines colorpc = showll ? color.blue : na colorsl = showll ? color.red : na offset = showof ? 1 : 0 plot(hs, offset = offset, color = colorpc, title = "Slow channel high") plot(ls, offset = offset, color = colorpc, title = "Slow channel low") plot(center, offset = offset, color = colorsl, title = "Fast channel stop-loss") //Background size = strategy.position_size colorbg = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na bgcolor(colorbg, transp = 70) //Var loss = 0.0 maxloss = 0.0 equity = 0.0 truetime = true //Lot size risksize = -1 * risk risklong = ((center / hs) - 1) * 100 coeflong = abs(risksize / risklong) lotlong = (strategy.equity / close) * coeflong riskshort = ((center / ls) - 1) * 100 coefshort = abs(risksize / riskshort) lotshort = (strategy.equity / close) * coefshort //Orders strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and hs > 0 and truetime) strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and ls > 0 and truetime) strategy.exit("LongExit", "Long", stop = center, when = needlong and strategy.position_size > 0) strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all() strategy.cancel("Long") strategy.cancel("Short") if showdd //Drawdown max = 0.0 max := max(strategy.equity, nz(max[1])) dd = (strategy.equity / max - 1) * 100 min = 100.0 min := min(dd, nz(min[1])) //Max loss size equity := strategy.position_size == 0 ? strategy.equity : equity[1] loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0 maxloss := min(nz(maxloss[1]), loss) //Label min := round(min * 100) / 100 maxloss := round(maxloss * 100) / 100 labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%" var label la = na label.delete(la) tc = min > -100 ? color.white : color.red osx = timenow + round(change(time)*10) osy = highest(100) // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)