Die Pulling-Strategie ist eine Trend-Folge-Strategie, die auf Donchian-Kanälen basiert. Sie verwendet schnelle und langsame Donchian-Kanäle, um die Trendrichtung zu identifizieren und Pullbacks einzugehen. Die Vorteile dieser Strategie sind, dass sie Trends automatisch verfolgen und Verluste rechtzeitig reduzieren kann, wenn sich der Trend ändert.
Die Strategie definiert zunächst den schnellen Kanalzeitraum als 20 Bar und den langsamen Kanalzeitraum als 50 Bar. Der schnelle Kanal wird verwendet, um den Stop-Loss-Preis festzulegen, während der langsame Kanal verwendet wird, um die Trendrichtung und den Eintrittszeitpunkt zu bestimmen.
Zunächst werden der höchste Höchststand und das niedrigste Tiefstand des schnellen Kanals berechnet und der Mittelpunkt als Stop-Loss-Linie genommen.
Wenn der Preis durch die Spitze des langsamen Kanals bricht, gehen Sie lang. Wenn der Preis durch die Unterseite des langsamen Kanals bricht, gehen Sie kurz. Nachdem Sie die Position eingegeben haben, setzen Sie den Stop-Loss an der Mitte des schnellen Kanals.
Der langsame Kanal bestimmt also die Haupttrendrichtung, während der schnelle Kanal kleinere Ausbrüche innerhalb eines kleinen Bereichs verfolgt, um den Stop-Loss-Punkt zu bestimmen.
Die Doppelkanalstruktur kann Trends automatisch verfolgen und Verluste schnell reduzieren, wenn sich Trends umkehren.
Eintritt bei Pullbacks, mit einem gewissen Trendfilterungseffekt. Nur Eintritte, wenn der Preis durch die Kanalgrenzen bricht, können einige falsche Ausbrüche ohne echten Trend filtern.
Die enge Stop-Loss-Distanz kann einen einzelnen Verlust kontrollieren.
Größere Abzüge: Trendfolgende Strategien können relativ große Abzüge haben, was eine psychologische Vorbereitung erfordert.
Der Fast-Channel-Periode ist kurz, so dass der Stop-Loss ist nah, anfällig für gestoppt werden.
Zu viele Trades. Die Doppelkanalstruktur kann zu übermäßigen Einträgen führen, die eine angemessene Positionsgröße erfordern.
Wir können Volatilität usw. in den Einstiegsbedingungen hinzufügen, um Ausbrüche ohne ausreichende Trendstärke zu filtern.
Wir können die optimalen Kanalparameterkombinationen systematisch finden.
Kombination mehrerer Zeitrahmen: Feststellung des wichtigsten Trends in höheren Zeitrahmen und Handel in niedrigeren Zeitrahmen.
Dynamische Stop-Loss-Distanz, die dynamisch anhand der Marktvolatilität angepasst wird.
Die Pulling-Strategie ist eine Standard-Trend-Folge-Strategie insgesamt. Sie verwendet Preiskanäle, um die Trendrichtung zu bestimmen und setzt Stop-Loss, um Risiken zu kontrollieren. Die Strategie hat einige Vorteile, aber auch die Probleme von Drawdown und Stop-Loss, die zu nahe sind. Wir können sie optimieren, indem wir die Kanalparameter anpassen, Filter hinzufügen usw. Aber wir sollten beachten, dass Trend-Folge-Strategien eine starke Psychologie erfordern, um Drawdowns zu ertragen.
/*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)