Esta estrategia se basa en el promedio móvil del espectro, generando señales comerciales a través de la cruz de oro y la cruz de la muerte de los promedios móviles rápidos y lentos.
Esta estrategia utiliza una función de promedio móvil variante que puede generar 12 tipos diferentes de promedios móviles. El principio básico es calcular dos líneas de promedio móvil, la línea rápida (Close MA) y la línea lenta (Open MA). Cuando la línea rápida cruza por encima de la línea lenta, se genera una señal de compra. Cuando la línea rápida cruza por debajo de la línea lenta, se genera una señal de venta.
La lógica clave es generar dos líneas de promedio móvil a través de la función variante:closeSeries = variant(basisType, close, basisLen, offsetSigma, offsetALMA)
yopenSeries = variant(basisType, open, basisLen, offsetSigma, offsetALMA)
. La función de variante encapsula métodos de cálculo para 12 tipos diferentes de promedios móviles. Los usuarios pueden seleccionar libremente el tipo a través del parámetro baseType. Esto implementa la combinación de promedios móviles de espectro.
La lógica básica para generar señales de trading es:longCond = xlong
yshortCond = xshort
Eso significa que cuando la línea rápida cruza por encima de la línea lenta, se toma una posición larga, y cuando la línea rápida cruza por debajo de la línea lenta, se toma una posición corta.
La mayor ventaja de esta estrategia es que puede combinar libremente una variedad de diferentes tipos de promedios móviles. Es indefinido qué tipos de promedios móviles son más adecuados para diferentes mercados y plazos. Esta estrategia proporciona una poderosa personalización. Los usuarios pueden determinar la combinación óptima de parámetros a través de pruebas repetidas, formulando así la mejor solución para el mercado específico.
El mayor riesgo con esta estrategia es que el promedio móvil del espectro en sí tiene un cierto grado de retraso.
Las principales direcciones de optimización para esta estrategia incluyen:
Al optimizar en estas direcciones anteriores, el rendimiento comercial en vivo de la estrategia se puede mejorar continuamente.
Esta estrategia de negociación implementa una alta flexibilidad basada en la media móvil del espectro. Proporciona una poderosa personalización para que los usuarios elijan y combinen libremente diferentes tipos de medias móviles. La lógica de la estrategia es simple y clara, fácil de usar, y también ofrece un amplio espacio de optimización. A través de la optimización de parámetros y el control de riesgos, esta estrategia puede adaptarse a diferentes entornos de mercado y obtener rendimientos constantes. Es una estrategia de seguimiento de tendencias eficiente y flexible.
/*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