Open-Bracket-Hochpreis-Cross-Trading-Strategie


Erstellungsdatum: 2023-10-18 11:22:57 zuletzt geändert: 2023-10-18 11:22:57
Kopie: 1 Klicks: 633
1
konzentrieren Sie sich auf
1617
Anhänger

Open-Bracket-Hochpreis-Cross-Trading-Strategie

Überblick

Die Strategie basiert auf der Überschneidung von Start- und Hochpreisen, um die Handelssignale zu beurteilen. Wenn der Start-Preis hoch ist, wird mehr getan, wenn der Start-Preis hoch ist, und wenn der Start-Preis niedriger ist, wird leer gemacht. Die Verwendung von Moving Averages kann die Preisdaten ausgleichen, um den Handel zu reduzieren.

Strategieprinzip

  1. Entscheiden Sie nach den Eingabeparametern, ob die Alternativ-Zyklus-Auflösung ((useRes)) verwendet wird. Wenn sie verwendet wird, wird die Periode nach stratRes festgelegt.

  2. Entscheiden Sie, ob ein Moving Average verwendet wird, basierend auf den Eingabeparametern ((useMA) . Wenn dies der Fall ist, wählen Sie den Moving Average-Typ basierend auf BasisType aus und legen Sie die Dauer der Periode fest.

  3. Erhalten Sie eine Reihe von Daten zum Öffnen und Schließen. Wenn Sie einen Moving Average verwenden, verwenden Sie die gewünschten Moving Average-Typen und die glatte Verarbeitung der Parameter.

  4. Vergleichen Sie den aktuellen Startpreis x mit dem Startpreis der OpenSeries. Wenn x größer ist als die OpenSeries, ist der Trendstatus trendState mehrköpfig, andernfalls ist er leer.

  5. Ein LongCond-Signal wird erzeugt, wenn der Kurs über dem Moving Average geht, und ein ShortCond-Signal wird erzeugt, wenn der Kurs unter dem Moving Average geht.

  6. Eintritt in die Mehrkopf- oder Leerkopf-Position gemäß dem Mehrkopf- oder Leerkopfsignal. Wenn die Stop-Loss-Verfolgung aktiviert ist, setzen Sie den Stop-Loss-Punkt und die Abweichungsdistanz ein.

Strategische Vorteile

  1. Die Einschränkung einer einzigen Datenreihe wird dadurch vermieden, dass die Handelssignale mit zwei verschiedenen Serien von Auf- und Hochpreisen beurteilt werden.

  2. Der Einsatz von Moving Average-Technologien filtert kurzfristige Marktgeräusche aus und schließt die wichtigsten Trends ein.

  3. Flexible Konfiguration der Moving Average-Typen, um die Parameter für optimale Effekte anzupassen.

  4. Die Option, den Stop-Loss-Tracking zu verwenden, um Risiken zu kontrollieren und Gewinne zu sichern.

  5. Strategieoptimierungsmöglichkeiten sind vorhanden, wobei die Parameter für verschiedene Sorten und Marktbedingungen angepasst werden können.

Strategisches Risiko

  1. Die Signalquelle ist ein einziger Handel, die Signalquelle ist selten und es ist leicht, das Signal zu verlieren.

  2. Der Moving Average hat Probleme mit der Verzögerung und könnte kurzfristige Chancen verpassen.

  3. Unzureichende Einstellungen für die Verfolgung von Stop Losses können zu früh oder zu stark Stop Losses verursachen.

  4. Die falsche Einstellung der Parameter kann dazu führen, dass die virtuellen Transaktionen zu häufig sind und die Wirksamkeit der Festplatte beeinträchtigen.

  5. Bei verschiedenen Sorten und Marktumgebungen müssen die Parameter angepasst werden, wodurch die Optimierung schwierig wird.

  6. Die Signalquelle kann durch Hinzufügen von anderen Indikatoren oder die Einführung von Machine-Learning-Modellen angereichert werden. Die Art der Moving Average und die Parameter können angepasst werden, um eine optimale Glättung zu erzielen. Die Stop-Loss-Punkte können sorgfältig eingestellt und entsprechend gelockert werden, um mehr Profit zu erzielen.

Richtung der Strategieoptimierung

  1. Die Erhöhung der Beurteilung durch andere technische Indikatoren wie Brinband, KD usw. bereichert das Handelssignal.

  2. Die Applikation von Machine Learning Modellen zur Signalverarbeitung und -entscheidung.

  3. Optimierung der Moving Average-Parameter, um die optimale Kombination zu finden.

  4. Optimierung der Verfolgung von Stop-Loss-Parametern und Ausgleich von Stop-Loss-Margen und Gewinngewinnung.

  5. Hinzugefügt wurde die Optimierung der Parameter, um automatisch die optimalen Parameter zu finden.

  6. Entwicklung von exklusiven Parameter-Templates für verschiedene Sorten.

  7. Entwicklung eines Quantifizierungs-Rückmeldungs-Frameworks und schneller iterativer Strategien.

Zusammenfassen

Die Strategie basiert auf der Überschneidung von Auf- und Hochpreisen, um Handelssignale zu beurteilen. Sie filtert Geräusche durch die Verwendung von Moving Average-Technologie. Die Parameter können flexibel konfiguriert werden, um verschiedene Effekte zu erzielen.

Strategiequellcode
/*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 ===