La idea central de esta estrategia es combinar el indicador de doble empuje con una línea de promedio móvil básica para implementar el seguimiento de tendencias y la inversión de tendencias.
La estrategia se basa principalmente en tres indicadores personalizados:
Indicador de doble impulso (tendencia): Cálcula la relación entre el precio y el canal sobrecomprado / sobrevendido para determinar las tendencias alcistas y bajistas, devolviendo 1, 0, -1 tres estados.
Canal sobrecomprado/sobrevendido (Tsl): Calcula los rieles superior e inferior con referencia a ATR. La ruptura del rieles superior se considera sobrecomprada y la ruptura del rieles inferior se considera sobrevendida.
Línea de media móvil básica (MA): Calcula la media móvil simple de 20 períodos del precio de cierre.
Específicamente, la estrategia juzga si el precio está en estado alcista, lateral o bajista de acuerdo con el valor del indicador de doble empuje. Cuando el indicador de doble empuje es 1, significa un estado alcista; cuando el indicador de doble empuje es -1, significa un estado bajista. En este punto, si el precio está en la misma dirección que el indicador, se adopta una estrategia de tendencia, yendo largo o corto en el punto correcto. Si el precio está en la dirección opuesta del indicador, como el indicador que muestra alcista mientras el precio rompe el carril inferior, se adopta una estrategia de inversión yendo corto para capturar ganancias.
Además, la ruptura del precio en la línea media móvil también sirve como una señal auxiliar para guiar la dirección de la negociación.
Las estrategias específicas de negociación a largo plazo son las siguientes:
Indicador de doble empuje > 0, el precio sube para romper el carril superior, que pertenece a la tendencia de seguir, ir largo.
Indicador de doble empuje < 0, el precio cae para romper a través del rieles inferiores, que pertenece a la inversión de tendencia, ir corto.
Precio de cierre > Precio de apertura > Nivel de pivote, considerado como romper el pivote para ir largo, ir largo.
El precio de cierre se rompe a través de la barrera superior, y el precio de cierre > Línea de media móvil, ir largo.
Las estrategias de negociación a corto plazo son las siguientes:
Indicador de doble empuje < 0, el precio cae para romper a través del rieles inferiores, que pertenece a la tendencia siguiente, ir corto.
Indicador de doble empuje > 0, el precio sube para romper el carril superior, que pertenece a la inversión de tendencia, ir largo.
Precio de apertura > Precio de cierre < Nivel de eje, considerado como romper el eje para pasar a corto, pasar a corto.
El precio de cierre se rompe a través de la línea inferior, y el precio de cierre < línea media móvil, se corta.
La estrategia de salida es simple al detener la pérdida cuando el precio vuelve a romper el canal de sobrecompra / sobreventa.
La estrategia tiene las siguientes ventajas:
El indicador de doble empuje puede determinar con precisión la tendencia del mercado y es el indicador central de la estrategia.
El canal sobrecomprado/sobrevendido combinado con el indicador puede descubrir posibles oportunidades de reversión.
La línea de la media móvil básica puede servir como una señal de filtrado auxiliar para evitar falsos brotes.
El punto de pivote combinado con el indicador de doble empuje forman puntos de negociación de alta probabilidad.
Tiene capacidades tanto de seguimiento de tendencias como de inversión de operaciones para obtener más oportunidades de ganancia.
El canal stop loss sobrecomprado/sobrevendido es simple y claro, lo que es beneficioso para el control del riesgo.
La estrategia también presenta los siguientes riesgos:
El indicador de doble empuje puede emitir señales erróneas y debe filtrarse con otros indicadores.
El comercio de ruptura es propenso a quedar atrapado, por lo que se requiere un estricto stop loss.
El establecimiento incorrecto de la media móvil de período puede perder tendencias o generar señales falsas.
Los puntos de pivote necesitan backtesting para verificar la confiabilidad de la probabilidad.
El canal sobrecomprado/sobrevendido necesita la optimización de los parámetros para adaptarse a diferentes productos.
El desajuste de los parámetros de los indicadores puede dar lugar a operaciones frecuentes.
Para hacer frente a estos riesgos, se pueden adoptar las siguientes medidas:
Combine otros indicadores como K-line, volumen para verificar las señales de indicadores de doble empuje.
Sigue estrictamente la estrategia de stop loss de canal sobrecomprado/sobrevendido para obtener una stop loss rápida.
Prueba diferentes parámetros de período de media móvil para encontrar el óptimo.
Prueba de la probabilidad de la estrategia del punto de pivote.
Optimizar los parámetros para encontrar la combinación óptima para cada producto.
Ajustar los parámetros del indicador para mantener el funcionamiento del sistema en general sin problemas.
La estrategia también puede optimizarse en los siguientes aspectos:
Aumentar los algoritmos de aprendizaje automático para entrenar el indicador de doble empuje con grandes volúmenes de datos.
Añadir canales adaptativos para ajustar automáticamente los parámetros del canal basados en la volatilidad del mercado.
Utilice el aprendizaje profundo para extraer indicadores más variables para optimizar las estrategias de entrada y salida.
Añadir algoritmos avanzados de stop loss que pueden rastrear las tendencias para el stop loss, evitando ser detenidos por las reversiones.
Realizar pruebas de optimización y combinación de parámetros para mejorar la estabilidad general de la estrategia.
Añadir módulos de gestión de riesgos para un control de riesgos más científico.
La estrategia combina el seguimiento de tendencias y la reversión de tendencias orgánicamente al juzgar la estructura del mercado con el indicador de doble empuje y generar señales comerciales con canales y líneas de promedio móvil. Tiene las ventajas de una buena efectividad del indicador, abundantes oportunidades de negociación y una clara stop loss. Al mismo tiempo, también tiene ciertos riesgos que necesitan una mayor optimización para mejorar la estabilidad. En general, la estrategia integra completamente las ideas del comercio de tendencias y el comercio de reversión, y vale la pena seguir investigando y aplicando.
/*backtest start: 2023-08-25 00:00:00 end: 2023-09-24 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © amysojexson //@version=3 strategy(title="Pivots strategy", overlay=true) // Input settings // Create a pull-down menu for the pivot type pivotType = input(title="Pivot Type", options=["Daily", "Intraday", "Weekly"], defval="Daily") // Make toggles for pivot level options plotPP = input(title="Plot PP", type=bool, defval=true) plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true) plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true) plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true) plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true) // Configure session options sessRange = input(title="Trading Session", defval="0800-1600") showSess = input(title="Highlight Session?", type=bool, defval=false) // Enable or disable pivot labels showLabels = input(title="Show Labels?", type=bool, defval=false) // Step 2. Calculate indicator values // Create a function to fetch daily and weekly data GetData(res, data) => security(syminfo.tickerid, res, data[1], lookahead=barmerge.lookahead_on) // Fetch daily and weekly price data dailyHigh = GetData("D", high) dailyLow = GetData("D", low) dailyClose = GetData("D", close) weeklyHigh = GetData("W", high) weeklyLow = GetData("W", low) weeklyClose = GetData("W", close) // Determine session pivot data // First see how the price bar relates to // the session time range inSession = not na(time(timeframe.period, sessRange)[1]) sessStart = inSession and not inSession[1] sessEnd = not inSession and inSession[1] // Determine session price data sessHigh = 0.0 sessLow = 0.0 sessClose = 0.0 sessHigh := sessStart ? high : inSession ? max(high, sessHigh[1]) : na sessLow := sessStart ? low : inSession ? min(low, sessLow[1]) : na sessClose := sessEnd ? close[1] : na // Compute high, low, close from previous intra-day session highPrevSess = 0.0 lowPrevSess = 0.0 closePrevSess = 0.0 highPrevSess := sessEnd ? fixnan(sessHigh) : highPrevSess[1] lowPrevSess := sessEnd ? fixnan(sessLow) : lowPrevSess[1] closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1] // Now figure out which kind of price data // to use for the pivot calculation theHigh = if (pivotType == "Daily") dailyHigh else if (pivotType == "Intraday") highPrevSess else weeklyHigh theLow = if (pivotType == "Daily") dailyLow else if (pivotType == "Intraday") lowPrevSess else weeklyLow theClose = if (pivotType == "Daily") dailyClose else if (pivotType == "Intraday") closePrevSess else weeklyClose // Finally calculate the pivot levels pp = (theHigh + theLow + theClose) / 3 bc= (theHigh + theLow)/2 tc= (pp-bc)+pp r1 = pp+(.382*(theHigh-theLow)) s1 = pp-(.382*(theHigh-theLow)) r2 = pp +(.618*(theHigh-theLow)) s2 = pp -(.618*(theHigh-theLow)) r3 = pp +(1*(theHigh-theLow)) s3 = pp -(1*(theHigh-theLow)) // Step 3. Output indicator data // Plot the various pivot levels plot(series=plotS3R3 ? r3 : na, title="R3", style=circles, linewidth=1, color=#0023FF) plot(series=plotS2R2 ? r2 : na, title="R2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS1R1 ? r1 : na, title="R1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotTCBC ? tc : na, title="TC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotPP ? pp : na, title="PP", style=circles, linewidth=1, color=#000000) plot(series=plotTCBC ? bc : na, title="BC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotS1R1 ? s1 : na, title="S1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotS2R2 ? s2 : na, title="S2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS3R3 ? s3 : na, title="S3", style=circles, linewidth=1, color=#0023FF) // Display the pivot names on the chart, if applicable newPivots = (showLabels == false) ? false : (pivotType == "Intraday") ? sessEnd : (pivotType == "Daily") ? dayofmonth != dayofmonth[1] : dayofweek == monday and dayofmonth != dayofmonth[1] plotchar(series=newPivots and plotS3R3 ? r3 : na, char='', text="R3", offset=1, location=location.absolute, color=#0023FF, title="R3 label") plotchar(series=newPivots and plotS2R2 ? r2 : na, char='', text="R2", offset=1, location=location.absolute, color=#1E90FF, title="R2 label") plotchar(series=newPivots and plotS1R1 ? r1 : na, char='', text="R1", offset=1, location=location.absolute, color=#09E0F3, title="R1 label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="TC", offset=1, location=location.absolute, color=#FF00D1, title="TC label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="BC", offset=1, location=location.absolute, color=#FF00D1, title="BC label") plotchar(series=newPivots and plotS1R1 ? s1 : na, char='', text="S1", offset=1, location=location.absolute, color=#09E0F3, title="S1 label") plotchar(series=newPivots and plotS2R2 ? s2 : na, char='', text="S2", offset=1, location=location.absolute, color=#1E90FF, title="S2 label") plotchar(series=newPivots and plotS3R3 ? s3 : na, char='', text="S3", offset=1, location=location.absolute, color=#0023FF, title="S3 label") // Highlight the intra-day price data session on the chart bgcolor(color=showSess and inSession and (pivotType == "Intraday") ? orange : na, transp=95) // Step 4. Create indicator alerts alertcondition(condition=cross(close, s3), title="Pivot S3 Cross", message="Prices crossed Pivot S3 level") alertcondition(condition=cross(close, s2), title="Pivot S2 Cross", message="Prices crossed Pivot S2 level") alertcondition(condition=cross(close, s1), title="Pivot S1 Cross", message="Prices crossed Pivot S1 level") alertcondition(condition=cross(close, tc), title="Pivot TC Cross", message="Prices crossed Pivot TC level") alertcondition(condition=cross(close, pp), title="Pivot PP Cross", message="Prices crossed the main Pivot Point level") alertcondition(condition=cross(close, bc), title="Pivot BC Cross", message="Prices crossed Pivot BC level") alertcondition(condition=cross(close, r1), title="Pivot R1 Cross", message="Prices crossed Pivot R1 level") alertcondition(condition=cross(close, r2), title="Pivot R2 Cross", message="Prices crossed Pivot R2 level") alertcondition(condition=cross(close, r3), title="Pivot R3 Cross", message="Prices crossed Pivot R3 level") MA = sma(close, 20) plot(MA, color=red) Factor = input(2, type=float) Pd = input(10, minval=1,maxval = 100) Up = hl2-(Factor*atr(Pd)) Dn = hl2+(Factor*atr(Pd)) TrendUp = 0.0 TrendUp := close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown = 0.0 TrendDown := close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn Trend = 0.0 Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) Tsl = Trend==1? TrendUp: TrendDown plot(Tsl, color=blue) if close>open if open<pp if close>pp if close>MA strategy.entry("long", true) if close<open if open>pp if close<pp if close<MA strategy.entry("short", false) strategy.close("long", when = open<Tsl) strategy.close("short", when = open>Tsl)