Multi-Zeitrahmen-Dynamische Backtesting-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-21 17:07:17
Tags:

img

Übersicht

Diese Strategie verwendet einen Mechanismus für dynamisches Backtesting in mehreren Zeitrahmen, um die Preisentwicklung zu ermitteln, indem die höchsten und niedrigsten Preise in verschiedenen Zeiträumen verglichen werden, wodurch eine risikoarme Arbitrage erzielt wird.

Strategie Logik

Die Strategie holt den höchsten Preis (nhigh) und den niedrigsten Preis (nlow) in verschiedenen Zeitrahmen ab, indem sie die benutzerdefinierte Funktion f_get_htfHighLow aufruft.

Zum Beispiel erhält ein Offset von 0 die höchsten und niedrigsten Preise der aktuellen Bar ab, während ein Offset von 1 diese Preise aus der vorherigen Bar abruft.

Wenn sowohl die höchsten als auch die niedrigsten Preise steigen, wird ein Aufwärtstrend identifiziert. Wenn beide Preise fallen, wird ein Bärentrend beobachtet.

Vorteile

  1. Erhöhte Genauigkeit durch mehrere Zeitrahmenanalysen
  2. Vermeidet das Nachmachen durch dynamisches Backtesting
  3. Flexible Parameter zur Berücksichtigung von Marktveränderungen
  4. Verringertes Risiko bei Positionen mit nur deutlichen Trends

Risiken

  1. Fehlbeurteilungen in mehreren Zeitrahmen
  2. Ummalung aus unsachgemäßen Backtestparametern
  3. Hohe Kosten und Verschleiß durch übermäßige Transaktionen

Lösungen:

  1. Optimierung der Zeiträume für die Genauigkeit
  2. Strenge Prüfparameter zur Verhinderung der Neubemalung
  3. Moderate Einstiegsbedingungen zur Frequenzkontrolle

Möglichkeiten zur Verbesserung

  1. Hinzufügen von ML, um KI für Trends zu nutzen
  2. Einbeziehung von Volatilitätsfiltern für die dynamische Positionsgrößerung
  3. Einführung von Stops zur wirksamen Begrenzung von Verlusten

Schlussfolgerung

Die Strategielogik ist klar, wobei dynamisches Backtesting für mehrere Zeitrahmen verwendet wird, um Trends zu bestimmen und menschliche Verzerrungen zu minimieren.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("HTF High/Low Repaint Strategy", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)

i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true

resolution = input("3M", type=input.resolution)
HTFMultiplier = input(22, minval=1, step=1)
offset = input(0, minval=0, step=1)
lookahead = input(true)
gaps = false

f_secureSecurity_on_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_on)
f_secureSecurity_on_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)
f_secureSecurity_off_on(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_on)
f_secureSecurity_off_off(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_off, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)=>
    derivedResolution = resolution == ""?f_multiple_resolution(HTFMultiplier):resolution
    nhigh_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_on = f_secureSecurity_on_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_on_off = f_secureSecurity_on_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_on = f_secureSecurity_off_on(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, high, offset) 
    nlow_off_off = f_secureSecurity_off_off(syminfo.tickerid, derivedResolution, low, offset)
    
    nhigh = lookahead and gaps ? nhigh_on_on :
             lookahead and not gaps ? nhigh_on_off :
             not lookahead and gaps ? nhigh_off_on :
             not lookahead and not gaps ? nhigh_off_off : na
    nlow = lookahead and gaps ? nlow_on_on :
             lookahead and not gaps ? nlow_on_off :
             not lookahead and gaps ? nlow_off_on :
             not lookahead and not gaps ? nlow_off_off : na
    [nhigh, nlow]
    
[nhigh, nlow] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset)
[nhighlast, nlowlast] = f_get_htfHighLow(resolution, HTFMultiplier, lookahead, gaps, offset+1)
plot(nhigh , title="HTF High",style=plot.style_circles, color=color.green, linewidth=1) 
plot(nlow , title="HTF Low",style=plot.style_circles, color=color.red, linewidth=1)

buyCondition = nhigh > nhighlast and nlow > nlowlast
sellCondition = nhigh < nhighlast and nlow < nlowlast

strategy.entry("Buy", strategy.long, when= buyCondition and inDateRange, oca_name="oca_buy")
strategy.entry("Sell", strategy.short, when= sellCondition and inDateRange, oca_name="oca_sell")


Mehr