Estrategias de negociación de medias móviles con un amplio espectro turbulento

El autor:¿ Qué pasa?, Fecha: 2024-01-25 14:19:27
Las etiquetas:

震荡型广谱移动平均线交易策略

Resumen

La estrategia se basa en una media móvil de espectro amplio, que forma una señal de negociación a través de una horquilla de oro de una media móvil rápida. La media móvil de espectro amplio cubre una variedad de tipos, desde medias móviles simples hasta medias móviles oscilantes, y puede ajustarse libremente mediante parámetros, con una gran adaptabilidad.

Principios estratégicos

La estrategia utiliza una función de media móvil variable para generar 12 tipos diferentes de medias móviles. El principio básico es calcular dos medias móviles (Close MA) y Slow MA (Open MA), que generan señales de compra cuando la línea rápida atraviesa la línea lenta y de venta cuando la línea rápida atraviesa la línea lenta.

La lógica clave es generar dos medias móviles con la función de variante:closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)yopenSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA)La función variante envuelve 12 métodos de cálculo de medias de diferentes tipos, que se pueden elegir libremente a través del parámetro basisType.

La lógica básica para generar señales de transacción es:longCond = xlongyshortCond = xshortEn otras palabras, el uso de líneas lentas en las líneas rápidas hace más y el uso de líneas lentas en las líneas rápidas hace menos.

Las reglas de entrada de la estrategia son hacer más cuando se cumplen las condiciones del longCond o del shortCond. Las reglas de stop loss o stop-loss son cuando el precio se mueve hasta un número predeterminado de puntos de stop loss o stop-loss.

Análisis de ventajas

La mayor ventaja de esta estrategia es que se puede combinar libremente varios tipos diferentes de medias móviles. Con diferentes ciclos de mercado, no se sabe cuál es el más adecuado, la estrategia ofrece una gran capacidad de personalización. Los usuarios pueden determinar la mejor combinación de parámetros mediante pruebas repetidas para desarrollar el mejor plan para un mercado específico.

Otra ventaja es que la lógica de la política es simple y clara, pero ofrece funciones poderosas. Es fácil para los usuarios entender y usar la política. Al mismo tiempo, los ricos parámetros de entrada también ofrecen suficiente espacio para la optimización de los usuarios avanzados.

Análisis de riesgos

El mayor riesgo de esta estrategia es que la media móvil del espectro amplio en sí misma tenga un cierto retraso. Puede causar grandes pérdidas cuando se producen rupturas de precios inusuales. Además, si los parámetros se eligen incorrectamente, también puede causar una frecuencia de negociación demasiado alta o generar señales excedentarias.

Para reducir el riesgo, se recomienda combinar con otros indicadores para juzgar la eficacia de la señal y evitar que se produzcan falsos avances. Además, la optimización de parámetros y la reevaluación también son necesarias, y se requiere una prueba repetida para encontrar la mejor combinación de parámetros. En el mercado real, el tamaño de la posición debe reducirse adecuadamente para controlar las pérdidas individuales.

Dirección de optimización

La estrategia tiene las siguientes direcciones de optimización principales:

  1. Prueba más tipos de combinaciones de medias móviles para encontrar la mejor combinación
  2. Añadir filtros para evitar señales falsas, como las que se combinan con indicadores de volumen de transacción.
  3. Optimiza los parámetros de longitud de la media móvil para encontrar los parámetros óptimos
  4. Optimización del tamaño de las posiciones y parámetros de stop loss
  5. Prueba diferentes variedades y ciclos

Con la optimización de las direcciones anteriores, se puede mejorar continuamente el rendimiento de la estrategia en el mercado real.

Resumen

La estrategia de negociación se basa en la media móvil de espectro amplio y ofrece una gran flexibilidad. Ofrece una gran capacidad de personalización, con la libertad de elegir y combinar diferentes tipos de media. La lógica de la estrategia es simple, clara y fácil de usar, pero también ofrece un amplio margen de optimización.


/*backtest
start: 2023-01-18 00:00:00
end: 2024-01-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//

strategy(title="Long/Short", shorttitle="Banana Maker", overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_every_tick=false)



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

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

// === BASE FUNCTIONS ===
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 = 0.0
    sma_1 = sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[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
    v11 = sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // © 2013  John F. Ehlers
    a1 = exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * 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* NEEDS REFINEMENT- backtesting this shows repaint. need new wrapper
reso(exp, use, res) =>
    security_1 = 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 ===

// alt resulution 
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=0, style=plot.style_line, transp=1)
openP = plot(openSeriesAlt, title="Open Series", color=trendColour, linewidth=0, style=plot.style_line, transp=1)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//

//
// === ALERT conditions

xlong = crossover(closeSeriesAlt, openSeriesAlt)
xshort = 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. needs work in study mode. the banana maker is the study script. 
// Create alert for cross, shunt back 1 if source is not 'open', this should prevent repaint issue.
//shunt = RSIsrc == open ? 0 : 1
//shunt = 0
//c_alert = (buy[shunt]==1 or sell[shunt]==1)
//alertcondition(c_alert, title="QQECROSS Alert", message="QQECROSS Alert")
// show only when alert condition is met and bar closed.
//plotshape(c_alert,title= "Alert Indicator Closed", location=location.bottom, color=sell[shunt]==1?red:green, transp=0, style=shape.circle)

//Repaint city, study mode will help but wont trigger the alerts


// === STRATEGY ===
// stop loss
slPoints = input(defval=0, title="Initial Stop Loss Points (zero to disable)", minval=0)
tpPoints = input(defval=0, title="Initial Target Profit Points (zero for disable)", minval=0)
// Include bar limiting algorithm
ebar = input(defval=1000, 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 contenido