Die Open Close Cross Moving Average Trend Following Strategie ist eine Trendfolgende Strategie, die auf gleitenden Durchschnitten der offenen und geschlossenen Preise basiert. Sie bestimmt den aktuellen Markttrend durch Berechnung der gleitenden Durchschnitte der offenen und schließenden Preise; sie geht lang, wenn der gleitende Durchschnitt des Schlusskurses über dem gleitenden Durchschnitt des Eröffnungspreises überschreitet, und geht kurz, wenn der gleitende Durchschnitt des Schlusskurses unter dem gleitenden Durchschnitt des Eröffnungspreises überschreitet. Die Strategie setzt auch Trailing Stops, um Gewinne zu erzielen und Risiken effektiv zu kontrollieren.
Die Kernlogik dieser Strategie basiert auf der Beziehung zwischen den offenen und schließenden Preisen, um den aktuellen Trend zu bestimmen. Der Eröffnungspreis spiegelt die aktuelle Angebots-Nachfrage-Beziehung des Marktes und die Handelspsychologie wider, während der Schlusskurs das endgültige gehandelte Ergebnis des Tages widerspiegelt. Im Allgemeinen zeigt der Schlusskurs, wenn er höher als der Eröffnungspreis ist, an, dass der Markttrend für den Tag nach oben und die Stimmung bullischer ist. Wenn der Schlusskurs niedriger als der Eröffnungspreis ist, deutet er darauf hin, dass der Markttrend für den Tag abwärts und die Stimmung bärischer ist.
Diese Strategie nutzt diese Logik, indem sie die gleitenden Durchschnitte der offenen und schließenden Preise berechnet, um die aktuelle Trendrichtung zu beurteilen.
Wenn der gleitende Durchschnitt des Schlusskurses über dem gleitenden Durchschnitt des Eröffnungskurses liegt, kann man eine Long-Position aufnehmen.
Wenn der gleitende Durchschnitt des Schlusskurses unter dem gleitenden Durchschnitt des Eröffnungskurses fällt, geht man kurz, was darauf hindeutet, dass die bearish Stimmung steigt und eine Shortposition eingeleitet werden kann.
Schließen Sie bestehende Positionen mit einem Stop-Loss, wenn umgekehrte Signale auftreten.
Die Strategie setzt auch Trailing-Stops, um Gewinne zu erzielen. Nach dem Eintritt in eine Position berechnet sie dynamisch die Punktdifferenz zwischen dem Einstiegspreis und dem aktuellen Preis. Wenn die Preisbewegung die festgelegte Stop-Loss-Punktschwelle überschreitet, bewegt sich die Stop-Loss-Linie nach oben, um teilweise Gewinne zu erzielen.
Zusammenfassend beurteilt die Strategie Trends über die Dauer des gleitenden Durchschnitts; hält jeweils nur eine Richtungsposition; verlässt bestehende Positionen direkt mit Umkehrsignalen ohne ATR-Stopps; und verfügt über Trailing-Stop-Einstellungen, um Gewinne zu erzielen.
Diese Strategie hat folgende Hauptvorteile:
Einfache und klare RegelnDie Beurteilung des Trends auf der Grundlage einer offenen-nahen Beziehung ist leicht zu verstehen und die Parameter für sie zu optimieren.
Flexible MA-WähleEs gibt Dutzende von MA-Typen zur Auswahl und Optimierung.
Einstellbare AuflösungDie Auflösung kann auf 3-4x des Diagramms eingestellt werden, um mehr Empfindlichkeit und Aktualität der Signale zu gewährleisten.
Stopp-Verlust-MechanismusDer Trailing-Stop kontrolliert effektiv Verluste und Rückgänge pro Handel.
Anpassungsfähige AufbewahrungszeitDie Haltedauer und die Volatilität können durch Anpassung der MA-Parameter gesteuert werden.
Flexibel einstellbare Risikovergütung- Stop-Loss-Punkte und Offset-Fine-Tunes Risiko-Belohnung Präferenz.
Die wichtigsten Risiken dieser Strategie liegen in den folgenden Bereichen:
Fehlende TrendumkehrungenDie Ausgangssignale können bei Preisumkehrungen verzögern, was zu Verlusten führt.
Nicht geeignet für HochvolatilitätsbedingungenDie Erhöhung der Stop-Loss-Punkte oder die Verlängerung der MA-Periode kann hier helfen.
Verlassen auf einen einzigen Indikator. Die Entscheidung auf der Grundlage nur eines Indikator-Satzes setzt es dem Risiko des Scheiterns aus.
Risiko einer Überoptimierung. MA-Parameter und Stop-Loss-Einstellungen können leicht überladen werden. Die Leistung außerhalb der Probe kann sich verschlechtern. Bei der Parameterwahl ist Vorsicht geboten.
Die Strategie kann in folgenden Bereichen optimiert und verbessert werden:
Ergänzende IndikatorenVolatilitäts- und Dynamikindikatoren können die Robustheit und Stabilität erhöhen.
Bedingte dynamische ParameterDie Zulassungsfristen können auf der Grundlage von Trends oder seitlichen Marktregime angepasst werden, um eine bessere Anpassungsfähigkeit zu erreichen.
Dynamische Risikokontrolle. Stop-Loss-Punkte und Offsets können auf den jüngsten realisierten Volatilitätsniveaus kalibriert werden.
Erweiterte Stop Loss Logik. Fortgeschrittene Stop-Loss-Mechanismen wie ATR-Stopps können den vereinfachten Trailing-Stop ersetzen.
Die Open Close Cross Moving Average Trend Following Strategy ist eine typische Trend-Handelsstrategie, die auf einer offenen-nahen Beziehung und gleitenden Durchschnitten basiert. Ihre Vorteile wie einfache Regeln, Flexibilität und kontrollierbare Risiken kommen auch mit Nachteilen von fehlenden Umkehrungen und Whipsaws. Zu den Verbesserungsbereichen gehören mehr Indikatoren, dynamische Parameter und fortschrittliches Risikomanagement für bessere Trend-Fangen und Anpassungsfähigkeit an unterschiedliche Marktbedingungen.
/*backtest start: 2023-01-08 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title = "Open Close Cross Strategy (PineScript=v4)", shorttitle = "OCC Strategy", overlay = true ) // 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 )", type=input.resolution) 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 )", type=input.string) 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 sma_1 = sma(src, len) // Smoothed v7 = na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len 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) => security_1 = security(syminfo.tickerid, res, exp) use ? security_1 : exp // === /BASE FUNCTIONS === // === SERIES SETUP === // open/close variant__1 = variant(basisType, close, basisLen, offsetSigma, offsetALMA) reso__1 = reso(variant__1, useRes, stratRes) reso__2 = reso(close, useRes, stratRes) closeSeries = useMA ? reso__1 : reso__2 variant__2 = variant(basisType, open, basisLen, offsetSigma, offsetALMA) reso__3 = reso(variant__2, useRes, stratRes) reso__4 = reso(open, useRes, stratRes) openSeries = useMA ? reso__3 : reso__4 trendState = bool(na) trendState := closeSeries > openSeries ? true : closeSeries < openSeries ? false : trendState[1] // === /SERIES === // === PLOTTING === barcolor(color=closeSeries > openSeries ? #006600 : #990000, title="Bar Colours") // channel outline closePlot = plot(closeSeries, title="Close Line", color=#009900, linewidth=2, style=plot.style_line, transp=90) openPlot = plot(openSeries, title="Open Line", color=#CC0000, linewidth=2, style=plot.style_line, transp=90) // channel fill closePlotU = plot(trendState ? closeSeries : na, transp=100, editable=false) openPlotU = plot(trendState ? openSeries : na, transp=100, editable=false) closePlotD = plot(trendState ? na : closeSeries, 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(closeSeries, openSeries) shortCond = crossunder(closeSeries, openSeries) // entries and base exit strategy.entry("long", strategy.long, when=longCond) strategy.entry("short", strategy.short, 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 ===