Dynamische Backtest-Strategie mit mehreren Zeitrahmen


Erstellungsdatum: 2023-11-21 17:07:17 zuletzt geändert: 2023-11-21 17:07:17
Kopie: 1 Klicks: 455
1
konzentrieren Sie sich auf
1237
Anhänger

Dynamische Backtest-Strategie mit mehreren Zeitrahmen

Überblick

Die Strategie nutzt eine dynamische Rückführung in mehrere Zeitrahmen, um die Preisentwicklung zu bestimmen und einen risikoarmen Kurs zu erzielen, indem Höchst- und Tiefstpreise in verschiedenen Zeitrahmen verglichen werden.

Strategieprinzip

Die Strategie erhält die höchsten und niedrigsten Preise für verschiedene Zeitspannen durch den Aufruf der benutzerdefinierten Funktion f_get_htfHighLow. Insbesondere wird die Security-Funktion aufgerufen, um die höchsten und niedrigsten Preise für verschiedene Zeitspannen zu erhalten.

Wenn der Offset z. B. 0 ist, erhalten Sie den höchsten und niedrigsten Preis der aktuellen K-Linie. Wenn der Offset 1 ist, erhalten Sie den höchsten und niedrigsten Preis der vorherigen K-Linie.

Wenn der höchste Preis steigt und der niedrigste Preis steigt, wird er als bullish beurteilt. Wenn der höchste Preis fällt und der niedrigste Preis fällt, wird er als bearish beurteilt.

Strategische Vorteile

  1. Mehrzeit-Analysen zur Verbesserung der Genauigkeit
  2. Dynamische Rücklaufmechanismen zur Vermeidung von Repainting
  3. Flexibilität bei der Einstellung verschiedener Parameterkombinationen und der Anpassung an Marktveränderungen
  4. Nur bei klaren Trends zu handeln, um Risiken zu kontrollieren

Strategisches Risiko

  1. Es besteht die Gefahr von Fehleinschätzungen bei mehreren Zeitrahmen.
  2. Die falsche Einstellung der Rücklaufparameter kann zu Repainting führen
  3. Es könnte zu hohe Handelsfrequenz geben, was zu höheren Transaktionskosten und einem Risiko für Ausrutscher führt.

Die Lösung:

  1. Optimierung der Zeitzyklusparameter zur Verbesserung der Genauigkeit der Beurteilung
  2. Strenge Tests der Rückwärtsparameter und Vermeidung von Repainting
  3. Anpassung der Anlagebedingungen und Kontrolle der Häufigkeit des Handels

Richtung der Strategieoptimierung

  1. Die Entwicklung von AI-basierten Trends durch die Einführung von Machine Learning Modulen
  2. Dynamische Positionsanpassung in Verbindung mit Aktienpreisfluktuation
  3. Einschließung von Stop Loss Mechanismen zur wirksamen Kontrolle von Verlustrisiken

Zusammenfassen

Die Strategie, die eine klare Gesamtkonzeption aufweist und die Entwicklung der Aktienkurse mit einer dynamischen Rückführung in mehrere Zeitrahmen beurteilt, um menschliche Beurteilungsfehler zu minimieren, ist eine typische programmatische Handelsstrategie. Durch die Optimierung der Parameter und die Funktionserweiterung können die Strategie-Stabilität und die Gewinnspanne weiter verbessert werden.

Strategiequellcode
/*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")