Offene Schließungskreuzpunktstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-13
Tags:

img

Übersicht

Die Open Close Cross Point Strategie ist eine quantitative Handelsstrategie, die auf gleitenden Durchschnittskreuzungen basiert. Sie bestimmt Preistrends, indem sie Kreuzungen zwischen schnellen und langsamen gleitenden Durchschnittslinien berechnet und Kauf- und Verkaufssignale an den Kreuzungsstellen erzeugt. Diese Strategie verwendet den Hull Moving Average als schnelle Linie und den Super Smoother Filter als langsame Linie. Diese Kombination beinhaltet sowohl die Glattigkeit als auch die Trendbestimmungsfähigkeit von gleitenden Durchschnitten und kann Preisbewegungen effektiv identifizieren, um relativ zuverlässige Handelssignale zu erzeugen.

Strategieprinzip

Die Formeln für die Berechnung der offenen Schließungskreuzpunktstrategie sind: Schnellverbindung (Hull MA): WMA(2 * WMA(Preis, n/2) - WMA(Preis, n), SQRT(n)) Langsame Linie (Super Smoother Filter): Preis dreifacher Filter

Wo WMA der gewichtete gleitende Durchschnitt, SQRT die Quadratwurzel ist, und der Filter enthält einen Begriff der Verzögerung der ersten Ordnung und zwei Begriffe der Verzögerung der zweiten Ordnung.

Die Strategie beurteilt die Beziehung zwischen den schnellen und langsamen Linien durch Berechnung ihrer Werte. Aufwärts-Kreuzung der schnellen Linie ist Kaufsignal
Nach unten Kreuzung der schnellen Linie ist Verkauf Signal

Analyse der Vorteile

Die offene Schließ-Kreuzpunktstrategie kombiniert die Vorteile von doppelten gleitenden Durchschnittsurteilen und Punkthandel. Sie kann Trendwendepunkte für zeitnahe Ein- und Ausstiege genau erfassen. Im Vergleich zu einzelnen gleitenden Durchschnittsstrategien hat sie folgende Vorteile:

  1. Eine Kombination aus zwei gleitenden Durchschnitten eliminiert falsche Signale.
  2. Der Super Smoother-Filter verfügt über hervorragende Fähigkeiten zur Datenanpassung, um Preistrends effektiv zu extrahieren.
  3. Die Hull MA ist sehr empfindlich gegenüber Preisänderungen und ist in der Lage, Preisschwankungen rechtzeitig zu erkennen.

Risikoanalyse

Die offene Schließungskreuzpunktstrategie birgt auch gewisse Risiken:

  1. Es können mehr Whipsaw-Signale auftreten, um falsche Signale zu reduzieren.
  2. Zu große Abstände zwischen MAs können einige Chancen verpassen.
  3. Diese Strategie eignet sich besser für Produkte mit klareren Trends und ist für hochflüchtige Produkte nicht ratsam.

Optimierungsrichtlinien

Die Strategie des offenen nahen Querschnittspunktes kann in den folgenden Dimensionen optimiert werden:

  1. Anpassung der MA-Parameter an Produkte unterschiedlicher Perioden und Volatilitätsbereiche.
  2. Hinzufügen zusätzlicher Indikatoren oder Filter zur Bestimmung der Trendqualität zur Verringerung von Whipsaws.
  3. Optimierung der Positionsgröße durch Einbeziehung von Trendstärkenindikatoren.

Schlussfolgerung

Die offene Schließpunktstrategie erbt die Vorteile der gleitenden Durchschnittsstrategien und erweitert gleichzeitig die Verwendung von doppelten gleitenden Durchschnittsurteilen und Punkthandelsmodellen, um ein fortschrittlicheres und zuverlässigeres quantitatives Handelsschema zu bilden. Sie hat einzigartige Vorteile beim Timing-Trading, die Live-Tests und Anwendungsforschung verdienen. Dieser Artikel analysiert gründlich die Prinzipien, Stärken und Schwächen dieser Strategie und bietet Optimierungsideen zur Referenz. Es wird angenommen, dass diese Strategie mit kontinuierlichen Verbesserungen des Modells und der Parameter zu einem gewaltigen Marktzeitlichen Werkzeug werden wird.


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

//@version=5
//

strategy(title='Open Close Cross Strategy ', shorttitle='sacinvesting', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes = input(defval=true, title='Use Alternate Resolution?')
intRes = input(defval=3, title='Multiplier for Alernate Resolution')
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes, '###M') : timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes, '###W') : timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes, '###D') : timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') : '60'
basisType = input.string(defval='SMMA', title='MA Type: ', options=['SMA', 'EMA', 'DEMA', 'TEMA', 'WMA', 'VWMA', 'SMMA', 'HullMA', 'LSMA', 'ALMA', 'SSMA', 'TMA'])
basisLen = input.int(defval=8, title='MA Period', minval=1)
offsetSigma = input.int(defval=6, title='Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA = input.float(defval=0.85, title='Offset for ALMA', minval=0, step=0.01)
scolor = input(false, title='Show coloured Bars to indicate Trend?')
delayOffset = input.int(defval=0, title='Delay Open/Close MA (Forces Non-Repainting)', minval=0, step=1)
tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH', 'NONE'])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #00FF00FF
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = ta.sma(src, len)  // Simple
    v2 = ta.ema(src, len)  // Exponential
    v3 = 2 * v2 - ta.ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len)  // Triple Exponential
    v5 = ta.wma(src, len)  // Weighted
    v6 = ta.vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = ta.sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))  // Hull
    v9 = ta.linreg(src, len, offSig)  // Least Squares
    v10 = ta.alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = ta.sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // ©️ 2013 John F. Ehlers
    a1 = math.exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    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 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1

// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = request.security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp

// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// Get Alternate resolution Series if selected.
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title='Bar Colours')
closeP = plot(closeSeriesAlt, title='Close Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
openP = plot(openSeriesAlt, title='Open Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//
//
// === ALERT conditions
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open
// === /ALERT conditions.

// === STRATEGY ===
// stop loss
slPoints = input.int(defval=0, title='Initial Stop Loss Points (zero to disable)', minval=0)
tpPoints = input.int(defval=0, title='Initial Target Profit Points (zero for disable)', minval=0)
// Include bar limiting algorithm
ebar = input.int(defval=10000, title='Number of Bars for Back Testing', minval=0)
dummy = input(false, title='- SET to ZERO for Daily or Longer Timeframes')
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != 'NONE'
    strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT')
    strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG')
    strategy.close('long', when=shortCond == true and tradeType == 'LONG')
    strategy.close('short', when=longCond == true and tradeType == 'SHORT')
    strategy.exit('XL', from_entry='long', profit=TP, loss=SL)
    strategy.exit('XS', from_entry='short', profit=TP, loss=SL)

// === /STRATEGY ===
// eof



Mehr