Offene-Hoch-Kreuzung über die Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-10-18
Tags:

img

Übersicht

Diese Strategie erzeugt Handelssignale, die auf dem Crossover zwischen offenen und hohen Preisen basieren. Es geht lang, wenn der offene Preis über den hohen Preis überschreitet, und kurz, wenn der offene Preis unter den hohen Preis überschreitet.

Strategie Logik

  1. Bestimmen Sie, ob eine alternative Auflösung basierend auf dem Eingabeparameter useRes verwendet werden soll. Wenn aktiviert, setzen Sie die Auflösung mit stratRes.

  2. Entscheiden Sie, ob Sie den gleitenden Durchschnitt (useMA) auf der Grundlage des Eingabeparameters verwenden möchten.

  3. Erhalten Sie die Daten der offenen (offenen) und geschlossenen (schließenden) Preiserie.

  4. Vergleichen Sie den aktuellen offenen Preis x mit der offenen Reihe openSeries. Wenn x größer ist als openSeries, setzen Sie TrendState auf lang, andernfalls auf kurz.

  5. Erstellen Sie ein langes Signal longCond, wenn der offene Preis oberhalb der offenen MA-Serie überschreitet.

  6. Lange oder kurze Positionen basierend auf langen und kurzen Signalen eingeben.

Vorteile

  1. Verwendet zwei unterschiedliche Preisreihen, offen und hoch, wobei die Einschränkungen einzelner Reihen vermieden werden.

  2. MA-Techniken filtern kurzfristige Geräusche aus und konzentrieren sich auf den wichtigsten Trend.

  3. Flexible Konfiguration von Zulassungsarten und -parametern für eine optimale Wirkung.

  4. Optionale Verzögerung von Verlusten, um Risiken zu kontrollieren und Gewinne zu erzielen.

  5. Hohe Optimierungsmöglichkeiten für die Anpassung von Parametern für verschiedene Produkte und Marktumgebungen.

Risiken

  1. Eine einzige Signalquelle führt zu knappen Signalen und möglicherweise verpassten Trades.

  2. Eine Verzögerung der MA kann dazu führen, dass kurzfristige Möglichkeiten verpasst werden.

  3. Eine unsachgemäße Stop-Loss-Konfiguration könnte zu einem vorzeitigen Ausstieg oder zu einem übermäßigen Verlust führen.

  4. Eine schlechte Einstellung der Parameter könnte zu übermäßigen fiktiven Trades führen, die die Live-Ausführung beeinträchtigen.

  5. Parameteroptimierung ist für verschiedene Produkte und Umgebungen eine Herausforderung.

  6. Fügen Sie mehr Indikatoren oder ML-Modelle hinzu, um die Signalquellen zu bereichern. Feinabstimmen MA-Typen und Parameter. Setzen Sie Stop-Loss sorgfältig mit etwas Puffer, um mehr Gewinn zu erzielen. Gründlich backtest und optimieren Parameter.

Optimierungsrichtlinien

  1. Zusätzliche Indikatoren wie Bollinger-Bänder, KD usw. werden eingesetzt, um die Signalquellen zu erweitern.

  2. Anwendung von Modellen des maschinellen Lernens für die Signalgenerierung.

  3. Optimieren Sie die MA-Parameter, um die besten Konfigurationen zu finden.

  4. Balance-Stop-Loss-Level zwischen Risiko und Gewinngewinn.

  5. Fügen Sie Parameteroptimierungsmethoden hinzu, um automatisch optimale Einstellungen zu finden.

  6. Entwicklung spezieller Parametervorlagen für verschiedene Produkte.

  7. Bauen Sie quantitative Backtesting-Rahmen für schnelle Strategie-Iterationen.

Zusammenfassung

Diese Strategie erzeugt Signale basierend auf offenen High-Crossovers und verwendet MAs zum Filtern von Rauschen. Sie bietet Flexibilität durch konfigurierbare Parameter. Die Strategie hat Vorteile, aber auch einige Probleme wie spärliche Signale und Verzögerungen. Weitere Verbesserungen können durch mehr Indikatoren, maschinelle Lernmodelle usw. erzielt werden.


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

//@version=2

//strategy(title = "Open Close Cross Strategy", shorttitle = "OCC Strategy", overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

// Revision:        1
// Author:          @JayRogers
//
// Description:
//  - Strategy based around Open-Close Crossovers.
// Setup:
//  - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
//    tends to yield the best results, regardless of which MA option you may choose (if any)
//  - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
//    green and red.
//  - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
//  - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
//  - Positions get taken automagically following a crossover - which is why it's better to set the resolution
//    of the script greater than that of your chart, so that the trades get taken sooner rather than later.
//  - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
//    will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
//    can handle.

// === INPUTS ===
useRes      = input(defval = true, title = "Use Alternate Resolution? ( recommended )")
stratRes    = input(defval = "120", title = "Set Resolution ( should not be lower than chart )")
useMA       = input(defval = true, title = "Use MA? ( otherwise use simple Open/Close data )")
basisType   = input(defval = "DEMA", title = "MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )")
basisLen    = input(defval = 14, title = "MA Period", minval = 1)
offsetSigma = input(defval = 6, title = "Offset for LSMA / Sigma for ALMA", minval = 0)
offsetALMA  = input(defval = 0.85, title = "Offset for ALMA", minval = 0, step = 0.01)
useStop     = input(defval = true, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v5 = wma(src, len)                                                  // Weighted
    v6 = vwma(src, len)                                                 // Volume Weighted
    v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, offSig)                                       // Least Squares
    v10 = alma(src, len, offALMA, offSig)                               // Arnaud Legoux
    type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 : type=="SMMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : v1
// security wrapper for repeat calls
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp) : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
//closeSeries = useMA ? reso(variant(basisType, close, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(close, useRes, stratRes)
openSeries  = useMA ? reso(variant(basisType, open, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(open, useRes, stratRes)
x = openSeries[1]
trendState  = x > openSeries ? true : x < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color = x > openSeries ? #006600 : #990000, title = "Bar Colours")
// channel outline
closePlot   = plot(x, title = "Close Line", color = #009900, linewidth = 2, style = line, transp = 90)
openPlot    = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = line, transp = 90)
// channel fill
closePlotU  = plot(trendState ? x : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? openSeries : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : x, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : openSeries, transp = 100, editable = false)
fill(openPlotU, closePlotU, title = "Up Trend Fill", color = #009900, transp = 40)
fill(openPlotD, closePlotD, title = "Down Trend Fill", color = #CC0000, transp = 40)
// === /PLOTTING ===

// === STRATEGY ===
// conditions
longCond    = crossover(openSeries, x)
shortCond   = crossunder(openSeries, x)
// entries and base exit
strategy.entry("long", true, when = longCond)
strategy.entry("short", false, when = shortCond)
// if we're using the trailing stop
//if (useStop)
//    strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
//    strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)
// not sure needed, but just incase..
//strategy.exit("XL", from_entry = "long", when = shortCond)
//strategy.exit("XS", from_entry = "short", when = longCond)
// === /STRATEGY ===

Mehr