Esta estrategia genera señales comerciales basadas en el cruce entre los precios abiertos y altos. Va largo cuando el precio abierto cruza por encima del precio alto y va corto cuando el precio abierto cruza por debajo del precio alto. Los promedios móviles se pueden usar para suavizar los datos de precios y reducir las operaciones ruidosas.
Determine si se utiliza una resolución alternativa basada en el parámetro de entrada useRes. Si está habilitado, establezca la resolución con stratRes.
Decidir si utilizar la media móvil (useMA) en función del parámetro de entrada. Si está habilitado, seleccione el tipo MA con baseType y establezca la duración del período con baseLen.
Obtener datos de la serie de precios abiertos y cerrados. Aplicar el MA seleccionado con parámetros configurados si useMA está habilitado.
Compare el precio abierto actual x con la serie abierta openSeries. Si x es mayor que openSeries, establezca trendState a largo, de lo contrario a corto.
Generar señal larga longCond cuando el precio abierto cruza por encima de la serie de MA abierta. Generar señal corta shortCond cuando el precio abierto cruza por debajo de la serie de MA abierta.
Introduzca posiciones largas o cortas basadas en señales largas y cortas.
Utiliza dos series de precios diferentes, abierta y alta, evitando las limitaciones de una sola serie.
Las técnicas de MA filtran el ruido a corto plazo y se centran en la tendencia principal.
Configuración flexible de los tipos y parámetros de la autorización para obtener un efecto óptimo.
Opcional para controlar el riesgo y obtener ganancias.
Gran margen de optimización para ajustar los parámetros de diferentes productos y entornos de mercado.
Una sola fuente de señal conduce a señales escasas y operaciones potencialmente perdidas.
El retraso de la MA puede resultar en oportunidades perdidas a corto plazo.
La configuración incorrecta de stop loss podría llevar a una salida prematura o un exceso de pérdida.
La mala afinación de los parámetros podría causar intercambios ficticios excesivos que afectan la actuación en vivo.
La optimización de parámetros es un reto para diferentes productos y entornos.
Añadir más indicadores o modelos de ML para enriquecer las fuentes de señal. Ajustar los tipos y parámetros MA. Establecer la parada de pérdida cuidadosamente con un poco de amortiguador para capturar más ganancias. Repetir las pruebas y optimizar los parámetros.
Incorporar indicadores adicionales como bandas de Bollinger, KD, etc. para ampliar las fuentes de señal.
Aplicar modelos de aprendizaje automático para la generación de señales.
Optimice los parámetros de MA para encontrar las mejores configuraciones.
Equilibrar los niveles de stop loss entre el riesgo y la captura de beneficios.
Añadir métodos de optimización de parámetros para encontrar automáticamente la configuración óptima.
Desarrollar plantillas de parámetros especializadas para diferentes productos.
Construir marcos de backtesting cuantitativos para iteraciones rápidas de estrategias.
Esta estrategia genera señales basadas en cruces abiertos y altos y utiliza MA para filtrar el ruido. Ofrece flexibilidad a través de parámetros configurables. La estrategia tiene ventajas, pero también algunos problemas como señales escasas y retraso. Se pueden hacer mejoras adicionales a través de más indicadores, modelos de aprendizaje automático, etc. Se necesita una amplia afinación y optimización de parámetros para el mejor rendimiento en diferentes productos y entornos de mercado.
/*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 ===