Estrategia de negociación cruzada de precios altos con paréntesis abiertos


Fecha de creación: 2023-10-18 11:22:57 Última modificación: 2023-10-18 11:22:57
Copiar: 1 Número de Visitas: 633
1
Seguir
1617
Seguidores

Estrategia de negociación cruzada de precios altos con paréntesis abiertos

Descripción general

La estrategia se basa en el cruce entre el precio de apertura y el precio alto para determinar las señales de negociación. Hacer más cuando el precio de apertura se eleva y cerrar cuando el precio de apertura se eleva. El uso de promedios móviles para suavizar los datos de precios y reducir el ruido comercial.

Principio de estrategia

  1. Determine si se usa la resolución de ciclo alternativo (useRes) según los parámetros de entrada. Si se usa, configure el ciclo según stratRes.

  2. De acuerdo con los parámetros de entrada, se decide si se usa una media móvil (useMA). Si se usa, se selecciona el tipo de media móvil de acuerdo con el tipo de base y se establece la longitud del período.

  3. Obtener una serie de datos de precios abiertos y cerrados. Si se utiliza una media móvil, aplique el tipo de media móvil y el procesamiento suave de los parámetros seleccionados.

  4. Compara el precio de apertura actual de x con el precio de apertura de la serie openSeries. Si x es mayor que openSeries, el estado de tendencia tendenciaState es de más cabeza, si no es de cabeza vacía.

  5. Cuando el precio de apertura está por encima de la media móvil de apertura, se genera una señal de longCond, y cuando el precio de apertura está por debajo de la media móvil de apertura, se genera una señal de shortCond.

  6. En función de las señales de toma de posición, se puede entrar en posiciones de más o menos cabeza. Si se ha activado el seguimiento del stop loss, se puede configurar el punto de stop loss y la distancia de desviación.

Ventajas estratégicas

  1. Utiliza dos series diferentes de precios abiertos y altos para juzgar las señales de comercio, evitando las limitaciones de una sola serie de datos.

  2. La aplicación de la tecnología de las medias móviles puede filtrar el ruido del mercado a corto plazo y bloquear las principales tendencias.

  3. Puede configurar con flexibilidad los tipos de promedios móviles y ajustar los parámetros para obtener el mejor efecto.

  4. Se puede elegir si se utiliza el seguimiento de los paros para controlar el riesgo y bloquear los beneficios.

  5. El espacio para la optimización de la estrategia es amplio, y se pueden ajustar los parámetros para diferentes variedades y entornos de mercado.

Riesgo estratégico

  1. La fuente de la señal de una sola transacción, la señal es escasa, fácil de perder.

  2. Los promedios móviles tienen problemas de retraso y pueden perder oportunidades a corto plazo.

  3. La configuración incorrecta para rastrear el stop loss puede detener el stop loss prematuramente o con un stop loss demasiado grande.

  4. La configuración incorrecta de los parámetros puede causar que las transacciones virtuales sean demasiado frecuentes y afecten a la efectividad del disco físico.

  5. Las variaciones de variedades y el entorno de mercado requieren ajustes de parámetros, lo que dificulta la optimización.

  6. Se pueden enriquecer las fuentes de señales mediante la adición de otros indicadores de juicio o la introducción de modelos de aprendizaje automático. Se pueden ajustar los tipos de medias móviles y los parámetros para obtener un efecto de suavización óptimo. Se pueden establecer cuidadosamente los puntos de parada y la tolerancia adecuada para obtener más ganancias.

Dirección de optimización de la estrategia

  1. El aumento de otros indicadores técnicos, como la banda de Brin, KD, etc., enriquece las señales de negociación.

  2. Aplicación de modelos de aprendizaje automático para el procesamiento de señales.

  3. Optimización de los parámetros de las medias móviles para encontrar la mejor combinación de parámetros.

  4. Optimizar el seguimiento de los parámetros de stop loss y equilibrar la amplitud de stop loss y la captación de ganancias.

  5. Se añade la función de optimización de parámetros para buscar automáticamente los parámetros óptimos.

  6. Desarrollo de modelos de parámetros exclusivos para diferentes variedades.

  7. Desarrollo de un marco de retroalimentación cuantitativa y estrategias de repetición rápida.

Resumir

La estrategia se basa en el cruce de precios altos y bajos para determinar las señales de negociación, y utiliza la tecnología de medias móviles para filtrar el ruido. Puede configurar los parámetros de forma flexible y lograr varios efectos. Tiene ciertas ventajas, pero también tiene algunos problemas, como poca cantidad de señales, retraso, etc.

Código Fuente de la Estrategia
/*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 ===