Estrategia de punto cruzado abierto cerrado

El autor:¿ Qué pasa?, Fecha: 2023-12-13 15:51:13
Las etiquetas:

img

Resumen general

La estrategia de punto cruzado cerrado abierto es una estrategia de negociación cuantitativa basada en cruces de promedios móviles. Determina las tendencias de precios calculando cruces entre líneas de promedio móviles rápidas y lentas y genera señales de compra y venta en los puntos de cruce. Esta estrategia utiliza el promedio móvil Hull como la línea rápida y el filtro Super Smoother como la línea lenta. Esta combinación incorpora tanto la suavidad como la capacidad de determinación de tendencias de los promedios móviles y puede identificar eficazmente los movimientos de precios para producir señales comerciales relativamente confiables.

Principio de la estrategia

Las fórmulas para calcular la estrategia de punto transversal abierto cerrado son: Línea rápida (MA del casco): WMA(2 * WMA(precio, n/2) - WMA(precio, n), SQRT(n)) Línea lenta (filtro súper suave): filtro triple de precios

Donde WMA es la media móvil ponderada, SQRT es la raíz cuadrada, y el filtro contiene un término de retraso de primer orden y dos términos de retraso de segundo orden.

La estrategia juzga la relación entre las líneas rápidas y lentas calculando sus valores. El cruce hacia arriba de la línea rápida es la señal de compra
El cruce hacia abajo de la línea rápida es la señal de venta

Análisis de ventajas

La estrategia de punto cruzado cerrado abierto combina las ventajas de los juicios de promedios móviles duales y el comercio de puntos. Puede capturar con precisión los puntos de inflexión de la tendencia para entradas y salidas oportunas. En comparación con las estrategias de promedios móviles individuales, tiene las siguientes ventajas:

  1. La combinación de dos medias móviles elimina las señales falsas. La línea rápida determina la dirección/fuerza de la tendencia, la línea lenta filtra las oscilaciones para que las señales sean más confiables.
  2. El filtro Super Smoother tiene excelentes capacidades de ajuste de datos para extraer eficazmente las tendencias de precios.
  3. Hull MA tiene una alta sensibilidad a los cambios de precios y puede detectar las reversiones a tiempo.

Análisis de riesgos

La estrategia de punto cruzado cerrado abierto también conlleva ciertos riesgos:

  1. Puede ampliar el intervalo entre los MAs para reducir las señales falsas.
  2. Los intervalos excesivamente amplios entre las MAs pueden perder algunas oportunidades.
  3. Esta estrategia es más adecuada para productos con tendencias más claras, no es recomendable para productos altamente volátiles.

Direcciones de optimización

La estrategia de punto transversal abierto cerrado puede optimizarse en las siguientes dimensiones:

  1. Ajuste de los parámetros de MA para adaptarlos a los productos de diferentes períodos y rangos de volatilidad.
  2. Añadir indicadores o filtros suplementarios para determinar la calidad de la tendencia para reducir los golpes de herradura.
  3. Optimizar el dimensionamiento de las posiciones mediante la incorporación de indicadores de fuerza de tendencia.

Conclusión

La estrategia de punto cruzado cerrado abierto hereda las ventajas de las estrategias de promedios móviles mientras expande el uso de juicios de promedios móviles duales y modelos de negociación de puntos para formar un esquema de negociación cuantitativa más avanzado y confiable. Tiene ventajas únicas en el comercio de tiempos que merecen pruebas en vivo y exploración de aplicaciones.


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



Más.