Estrategia de negociación de media móvil arco iris

El autor:¿ Qué pasa?, Fecha: 2023-09-28 11:01:59
Las etiquetas:

Resumen general

Esta estrategia identifica la dirección de la tendencia a través de un sistema de promedio móvil arco iris con 7 promedios móviles, y filtra señales falsas con el indicador RSI para lograr una entrada de bajo riesgo.

Estrategia lógica

La estrategia genera señales comerciales a través de los siguientes pasos:

  1. Construye el sistema de promedios móviles del arco iris. Contiene 7 promedios móviles. El primer promedio móvil tiene un período de 12 y toma el precio de cierre como datos de origen. Los otros 6 promedios móviles tienen períodos progresivamente decrecientes de 3, con el promedio móvil anterior como fuente.

  2. Determine la dirección de la tendencia. Si el primer promedio móvil está en la parte superior del arco iris, defínelo como tendencia alcista. Si está en la parte inferior, defínelo como tendencia bajista. Si está en el medio, defínelo como consolidación.

  3. Generar señales. Cuando la tendencia cambia de tendencia al alza a tendencia a la baja, se genera una señal de venta. Cuando la tendencia cambia de tendencia a la baja, se genera una señal de compra. Cuando la tendencia cambia de consolidación a tendencia alza o a la baja, cierre la posición existente.

  4. El primer RSI debe estar entre la zona de sobrecompra y la zona de sobreventa para evitar una falsa ruptura. El segundo RSI debe estar fuera de la zona media para garantizar un fuerte impulso.

Ventajas

Las ventajas de esta estrategia incluyen:

  1. El sistema de media móvil arco iris identifica con precisión la dirección de la tendencia.

  2. El mecanismo de filtro RSI doble evita efectivamente señales falsas de ruptura y quedar atrapados.

  3. La combinación de indicadores de tendencia y reversión permite una entrada oportuna en la reversión de tendencia, evitando al mismo tiempo perseguir el impulso.

  4. El cierre activo de posiciones durante la consolidación evita el riesgo de mercados de rango.

  5. La estrategia ofrece un gran espacio de optimización de parámetros, que puede ajustarse a diferentes productos y plazos para lograr mejores resultados.

Los riesgos

Los principales riesgos de esta estrategia:

  1. La inversión de tendencia no clara puede generar señales falsas y causar pérdidas.

  2. La apertura y el cierre frecuentes durante una consolidación larga aumentan los costos y el deslizamiento.

  3. El retraso en la reversión aumenta las pérdidas después de la señal inicial.

  4. La configuración incorrecta de los parámetros puede filtrar las señales correctas o causar retraso en la señal.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Optimización de los parámetros de la media móvil, incluida la duración del período, la relación del período, el tipo de MA, etc., para que el juicio de la tendencia sea más preciso.

  2. Optimización del parámetro RSI, incluido el período, los niveles de sobrecompra / sobreventa, la zona neutral, etc., para hacer que la filtración sea más precisa.

  3. Optimización del plazo, para encontrar el plazo óptimo.

  4. Optimización de productos, para ajustar parámetros y reglas para adaptarse mejor a diferentes productos.

  5. Agregar stop loss y take profit para controlar el riesgo y el tamaño de las ganancias.

Conclusión

La estrategia de negociación de la media móvil arco iris combina la determinación de tendencias y el filtrado de señales para capturar las señales de reversión de manera efectiva. Con un juicio preciso y riesgos controlables, esta estrategia puede volverse muy práctica después de ajustar los parámetros y refinar la lógica. En general, vale la pena una investigación y aplicación en profundidad.


/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//╔════════════════════════════════════════════════════════════════════════════╗
//║Rainbow Backtesting base on "Rainbow Moving Average" Strategy as below:     ║
//║1.Rainbow Moving Average setup                                              ║
//║- Source: source of 1st MA                                                  ║
//║- Type: SMA/EMA                                                             ║
//║- Period: period of 1st MA                                                  ║
//║- Displacement: period of 2nd MA to 7th MA with source is previous MA       ║
//║2.Trend Define                                                              ║
//║- Up Trend: Main MA moving at the top of Rainbow                            ║
//║- Down Trend: Main MA moving at the bottom of Rainbow                       ║
//║- Sideway: Main MA moving between the top and the bottom of Rainbow         ║
//║3.Signal                                                                    ║
//║- Buy Signal: When Rainbow change to Up Trend.                              ║
//║- Sell Signal: When Rainbow change to Down Trend.                           ║
//║- Exit: When Rainbow change to Sideway.                                     ║
//║4.RSI Filter                                                                ║
//║- "Enable": Only signals have 1st RSI moving between Overbought and Oversold║
//║and 2nd RSI moving outside Middle Channel are accepted.                     ║
//║- The filter may help trader avoid bull trap, bear trap and choppy market.  ║
//╚════════════════════════════════════════════════════════════════════════════╝

//@version=4
strategy("Rainbow Strategy Backtesting",overlay=false)
//++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++ Rainbow Moving Average +++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++
rainbow_tt="=== Rainbow Moving Average ==="
ma1_source=input(hlc3,title="Source",type=input.source, inline="set1", group=rainbow_tt)
rb_type=input("SMA",title="Type",options=["SMA","EMA"], inline="set1", group=rainbow_tt)
ma1_len=input(12,title="Period", inline="set2", group=rainbow_tt)
dis_len=input(3,title="Displacement", inline="set2", group=rainbow_tt,minval=2)
trend_tt="=== Trend Color ==="
up_col=input(color.new(color.blue,0),title="Up",inline="Color",group=trend_tt)
dn_col=input(color.new(color.red,0),title="Down",inline="Color",group=trend_tt)
sw_col=input(color.new(color.yellow,0),title="No",inline="Color",group=trend_tt)
//1st
ma1=rb_type=="SMA"?sma(ma1_source,ma1_len):ema(ma1_source,ma1_len)
//2nd
ma2=rb_type=="SMA"?sma(ma1,dis_len):ema(ma1,dis_len)
//3rd
ma3=rb_type=="SMA"?sma(ma2,dis_len):ema(ma2,dis_len)
//4
ma4=rb_type=="SMA"?sma(ma3,dis_len):ema(ma3,dis_len)
//5
ma5=rb_type=="SMA"?sma(ma4,dis_len):ema(ma4,dis_len)
//6
ma6=rb_type=="SMA"?sma(ma5,dis_len):ema(ma5,dis_len)
//7
ma7=rb_type=="SMA"?sma(ma6,dis_len):ema(ma6,dis_len)
//MinMax
rb_max=max(ma1,ma2,ma3,ma4,ma5,ma6,ma7)
rb_min=min(ma1,ma2,ma3,ma4,ma5,ma6,ma7)
dir_col=
       ma1==rb_max?up_col:
       ma1==rb_min?dn_col:
       sw_col
dir_style=shape.circle
plotshape(dir_col[1]==dir_col?0:na,title="Trend",style=dir_style,color=dir_col,location=location.absolute)
//++++++++++++++++++++++++++++++++++++++
//+++++++++++++ RSI Filter +++++++++++++
//++++++++++++++++++++++++++++++++++++++
rsi_tt="=== RSI Filter ==="
rsi_filter=input("Enable",title="Filter",options=["Enable","Disable"],inline="set",group=rsi_tt)
over_tt="Over Filter"
rsi_len_1=input(12,title="Period",inline="set",group=over_tt)
rsi_ovb=input(65,title="Overbought",inline="set",group=over_tt)
rsi_ovs=input(35,title="Oversold",inline="set",group=over_tt)
rsi_1=rsi(close,rsi_len_1)
mid_tt="Middle Filter"
rsi_len_2=input(9,title="Period",inline="set",group=mid_tt)
rsi_mid_top=input(56,title="Upper",inline="set",group=mid_tt)
rsi_mid_bot=input(44,title="Lower",inline="set",group=mid_tt)
rsi_2=rsi(close,rsi_len_2)
//Status
var rsi_status="None"
if (rsi_1>rsi_ovs and rsi_1<rsi_ovb) and (rsi_2[1]<rsi_mid_bot or rsi_2[1]>rsi_mid_top)
    rsi_status:="Normal"
else
    rsi_status:="None"
//Signal
BuySignal= 
       rsi_filter=="Disable"?
       dir_col[1]!=up_col
       and
       dir_col[0]==up_col
       :
       dir_col[1]!=up_col
       and
       dir_col[0]==up_col
       and
       rsi_status=="Normal"
       
SellSignal= 
       rsi_filter=="Disable"?
       dir_col[1]!=dn_col
       and
       dir_col[0]==dn_col
       :
       dir_col[1]!=dn_col
       and
       dir_col[0]==dn_col
       and
       rsi_status=="Normal"
       
exit=
       (dir_col[1]!=sw_col
       and
       dir_col[0]==sw_col)
buycol =
       BuySignal?
       up_col: na

sellcol =
       SellSignal?
       dn_col: na

exitcol =
       exit?
       sw_col: na

buy_style=shape.arrowup
sell_style=shape.arrowdown
exit_style=shape.square
plotshape(BuySignal?0:na,title="Buy",text="Buy",style=buy_style,color=buycol,location=location.absolute)
plotshape(SellSignal?0:na,title="Sell",text="Sell",style=sell_style,color=sellcol,location=location.absolute)
plotshape(exit?0:na,title="Exit",text="Exit",style=exit_style,color=exitcol,location=location.absolute)

filter=
       rsi_filter=="Enable"?
       dir_col[1]!=dir_col 
       and BuySignal==false 
       and SellSignal==false 
       and exit==false:
       na
filter_style=shape.xcross
filtercol=
       filter?
       dir_col:na
plotshape(filter?0:na,title="Filter",text="Filter",style=filter_style,color=filtercol,location=location.absolute)

//+++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++ Backtesting ++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++
strategy.entry("Long", strategy.long, when=BuySignal)
strategy.close("Long", when=exit or filter)
strategy.entry("Short", strategy.short, when=SellSignal)
strategy.close("Short", when=exit or filter)
//EOF

Más.