Esta estrategia calcula el indicador promedio PB y las bandas de Bollinger para determinar la relación de cruz dorada y cruz muerta entre el indicador PB y los rieles superior e inferior de las bandas de Bollinger.
El indicador de PB medio combina la estabilidad del sistema de promedios móviles y la sensibilidad del indicador de PB. Utiliza la diferencia entre promedios móviles rápidos y lentos de diferentes ciclos para expresar las tendencias de cambio de precios para determinar las tendencias largas y cortas.
La estrategia también utiliza el indicador de la banda de Bollinger para identificar las condiciones de sobrecompra y sobreventa del precio de las acciones. El indicador de la banda de Bollinger consta de tres curvas: tren medio, tren superior y tren inferior. El tren medio es el promedio móvil de n días; los carriles superior e inferior se calculan en función del tren medio y la volatilidad histórica. Cuando el precio de las acciones está cerca del tren superior, está en la zona de sobrecompra; cuando está cerca del tren inferior, está en la zona de sobreventa, y el área alrededor del tren medio es un rango de precios razonable para la acción.
En resumen, esta estrategia utiliza inteligentemente el indicador PB medio para determinar la tendencia alcista o bajista de los precios de las acciones, y las bandas de Bollinger como indicador auxiliar para determinar las condiciones de sobrecompra y sobreventa, para encontrar señales comerciales de la relación entre los dos indicadores.
Las principales ventajas de esta estrategia son las siguientes:
Los principales riesgos de esta estrategia son:
Para abordar los riesgos anteriores, se pueden utilizar métodos como la optimización de la configuración de parámetros, el estricto stop loss, teniendo en cuenta los factores macro, la monitorización manual para mitigar el riesgo.
Las direcciones de optimización para esta estrategia incluyen:
El rendimiento general de esta estrategia es bastante satisfactorio. Con el indicador PB medio como su núcleo y las bandas de Bollinger para ayudar a determinar las señales comerciales, tiene una lógica simple, alta sensibilidad y resultados de backtest decentes. Al continuar optimizando los ajustes de parámetros, agregar otros indicadores de asistencia, implementar un stop loss estricto, etc., la rentabilidad y estabilidad de la estrategia se pueden mejorar aún más.
/*backtest start: 2024-01-09 00:00:00 end: 2024-01-16 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("BandPass EOS", overlay=false, initial_capital = 1000) src = input(close, "Source", input.source) Period1 = input(41, "Fast Period", input.integer) Period2 = input(54, "Slow Period", input.integer) showBG = input(false, "Show crosses on background?", input.bool) UseReversalStop = input(true, "Use additional triggers?", input.bool) //Super Passband Filter a1 = 0.0 a2 = 0.0 PB = 0.0 RMS = 0.0 if bar_index > Period1 a1 := 5 / Period1 a2 := 5 / Period2 PB := (a1 - a2) * src + (a2 * (1 - a1) - a1 * (1 - a2)) * src[1] + (1 - a1 + 1 - a2) * nz(PB[1]) - (1 - a1) * (1 - a2) * nz(PB[2]) for i = 0 to 49 by 1 RMS := RMS + PB[i] * PB[i] RMS RMS := sqrt(RMS / 40) RMS z = 0 buy = PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z) sell = PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z) signal = buy ? 1 : sell ? -1 : 0 bg = buy ? color.green : sell ? color.red : color.white bg := showBG ? bg : na upperFill = PB>RMS ? color.lime : na lowerFill = PB<-RMS ? color.red : na p1 = plot(PB,"PB",color.red) p2 = plot(RMS,"+RMS",color.blue) p3 = plot(-RMS,"-RMS",color.blue) bgcolor(bg) fill(p1,p2,upperFill) fill(p1,p3,lowerFill) hline(0) //PERIOD testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true lcolor = PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z) scolor = PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z) c1 = (PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z)) c2 = (PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z)) plot (c1 ? PB : na, style = plot.style_circles, color = color.red, linewidth = 3) plot (c2 ? PB : na, style = plot.style_circles, color = color.green, linewidth = 3) if (PB > PB [5] and crossover(PB, -RMS) or PB > PB [5] and crossover (PB, RMS) or PB > PB [5] and crossover (PB, z)) strategy.entry("long", strategy.long, when = testPeriod()) if (PB < PB [5] and crossunder(PB, RMS) or PB < PB [5] and crossunder (PB, -RMS) or PB < PB [5] and crossunder (PB, z)) strategy.entry("short", strategy.short, when = testPeriod())