English Русский 中文 Deutsch 日本語 Português
Desarrollando el Oscilador de Promedio de Pivote (PMO): un nuevo indicador para la Media Móvil Acumulativa

Desarrollando el Oscilador de Promedio de Pivote (PMO): un nuevo indicador para la Media Móvil Acumulativa

MetaTrader 5Trading | 7 noviembre 2019, 10:40
1 843 0
Marco Calabrese
Marco Calabrese

Contenido


Introducción: ¿para qué otro oscilador?

Los osciladores son una subclase de indicadores que fluctúan por encima y por debajo de una cierta línea central o dentro de unos niveles predefinidos. Son ampliamente usados en el análisis técnico como generadores de eventos comerciales, por ejemplo, al cruzar una línea central o superar un cierto umbral. Los osciladores más populares son MACD, RSI y CCI, cada uno con características particulares, como la anticipación de virajes al detectar cierta tasa de cambio de precio (también conocido como  momentum) o la búsqueda de la tendencia principal.

En general, los osciladores cuya fórmula calcula la divergencia de precios entre dos instantes muestran un comportamiento anticipado del precio (digamos RSI, CCI), mientras que los osciladores basados ​​en medias, muestran un comportamiento retardado. Para citar un ejemplo relevante, podemos considerar que MACD muestra características de anticipación y retardo, ya que se calcula sobre la diferencia entre dos promedios. El trazo de dicha diferencia se representa en forma de histograma, lo que hace que los cruces y divergencias respecto a la línea central sean fáciles de detectar.

No obstante, existen ventajas y desventajas a la hora de usar cada oscilador, dado que pueden darse condiciones de mercado que aumentan el número de señales falsas (especialmente para los osciladores principales) o divergencias rápidas que pueden sesgar la mayor parte de la proporción riesgo/recompensa (como sucede frecuentemente con los osciladores retardados). Como regla general, resulta más prudente para el tráder analizar varios osciladores al mismo tiempo, solo para obtener confirmaciones lo más independientes posible de una señal comercial.

En este artículo, el Pivot Mean Oscillator se muestra como un intento de incluir en el amplio panorama de los osciladores algunas nuevas características surgidas directamente del uso de la Media Móvil Acumulativa (CMA).


Aspectos de la CMA

En estadística, la media móvil (MA), también conocida como MA simple, supone un cálculo que promedia los últimos datos n de una serie temporal. Cuando aparece un nuevo valor, el más antiguo es eliminado de acuerdo con la política "primero en entrar, primero en salir" (FIFO, en inglés). Los niveles de la MA son útiles en cuanto a los ajustes financieros, dado que pueden ser interpretados como apoyo en un mercado en descenso, o como resistencia en un mercado al alza.

A nivel conceptual, la MA funciona en un búfer de memoria fija, descartando datos (y, por consiguiente, trozos de información) anteriores al último dato disponible. Si, de manera ideal, permitimos que dicho búfer se expanda hasta el infinito para poder considerar en el cálculo todos los datos hasta el punto de referencia actual, tendremos la CMA.

Por fortuna, en el uso práctico no necesitamos asignar memoria infinita para almacenar cada dato individual. En la práctica, la CMA se puede calcular con pocas variables (dependiendo de si se usa su formulación recursiva, para más detalles, mire la siguiente figura). 

Recuadro 1

Recuadro 1: Dos formulaciones de la CMA.


El segundo aspecto interesante de la fórmula de la CMA es la presencia de un contador que aumenta en una unidad cada vez. Esto significa que el próximo valor de la CMA estará parcialmente compuesto por un elemento totalmente predecible, y será complementado con otra información que puede usarse para fines predictivos. Por ejemplo, en condiciones de mercado lateral, el precio solerá derivar hacia el valor de la CMA.   

La CMA es el ingrediente básico del PMO presentado en adelante.


Definición de PM & PMO

El PMO se construye sobre el índice de normalización que conocemos por Promedio de Pivote o Pivot Mean (PM) que se calcula como la fracción entre el último dato y la CMA.

El PM ofrece una rápida comprensión numérica de la distancia del precio respecto a la CMA. Esto significa que el PM puede considerarse una medida del spread. Por ejemplo, un valor de PM de 1.0035 sencillamente significa que el valor actual es 0.35% superior a la CMA, mientras que un PM igual a 1 significaría que el valor actual coincide perfectamente con la CMA.

Puesto que el cálculo del PM se puede repetir para cada punto de los datos, esto implica que cada serie temporal se puede convertir en una señal de PM. Finalmente, podemos definir el PMO como la diferencia entre las dos MA aplicadas a las señales de PM. A corto plazo, el PMO ofrece una medida de la divergencia entre dos spreads , por consiguiente, resulta útil observar su aplicación a la configuración de trading.

Las dos medias del PMO pueden calcularse tanto con la misma señal de PM, como en dos diferentes. En el presente artículo, analizaremos las MAs simples aplicadas a las señales de PM obtenidas a partir de la información de cierre y de precio, respectivamente.

Recuadro 2

Recuadro 2: fórmulas de PM y PMO.


Si bien hay similitudes, la formulación del PMO mostrada aquí resulta diferente a la de MACD en un par de aspectos. El MACD se aplica generalmente a las señales de precio, mientras que las señales subyacentes del PMO son las de PM. Además, mientras que en MACD se tienen en cuenta las MAs exponenciales, aquí nos concentramos en las MAs simples, dejando las variantes más complejas del PMO para el futuro trabajo sobre este tema.


Diseño Básico y Código

El PMO requiere poca información de entrada derivada directamente de su formulación: 

  • Hora de inicio: la fecha y la hora de referencia a partir de la cual comienza el indicador
  • Longitud de MA para una señal de cierre de PM: un número entero que representa el número de puntos de datos del búfer para promediar en la señal PM derivada de los precios close
  • Longitud de MA para una señal de apertura de PM: un número entero que representa el número de puntos de datos del búfer para promediar en la señal PM derivada de los precios open

//--- input parameters
input datetime startingTime;
input int      MA_close=3;
input int      MA_open=21;

En total, usamos tres búferes:

  • uno para el PMO (el búfer del indicador representado)
  • otros dos para las señales PM subyacentes

//--- indicator buffers
double   PMOBuffer[];
double   closeBuffer[];
double   openBuffer[];  

En cuanto a las variables globales, necesitaremos un contador y dos variables para guardar las sumas de los precios de cierre y apertura que permitan el cálculo del PMO. También añadiremos un par de variables de soporte de otro tipo para monitorear el primer índice usado en todos los búferes desde el momento de inicio de la entrada.

//----global vars---
int counter=1;
double sum_close=0;
double sum_open=0;
bool first_val_checked;
int first_valid_index;

Para ofrecer soporte al cálculo de los dos promedios del PMO, necesitaremos implementar una función que implemente una MA. El único obstáculo que debemos evitar es el caso en el que el cálculo se realiza al comienzo de los búferes en las proximidades del tiempo de inicio. En ese caso, no habrá suficientes elementos disponibles para el cálculo. No obstante, gracias a la definición del PM, podemos suponer que los valores anteriores a los tiempos de inicio se establecen como uno, lo cual permite calcular la MA sin ningún retardo. Por consiguiente, la función de soporte se convierte en la siguiente:

double simpleMA(const int pos, const int avg_positions, const double &data[],int arr_tail_pos){
   double _local_sum = 0;
   for(int i=pos+avg_positions-1; i >= pos;i--){
      if(i > arr_tail_pos){
         _local_sum += 1;  // when requested data exceed buffer limit set trailing 1s
      }else{
         _local_sum += data[i];
      }
           
   }
   return _local_sum/avg_positions; 
}

Con todo ello listo, finalmente podemos echar un vistazo al núcleo del programa:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(PMOBuffer,true);
   ArraySetAsSeries(closeBuffer,true);
   ArraySetAsSeries(openBuffer,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(time,true);
   
   
   
//--- return value of prev_calculated for next call
   int total = rates_total - prev_calculated;
   double _tmp_sum_close,_tmp_sum_open;
    if(total > 0){
     
      for(int i=total-1;i>=0;i--){  
         if(time[i] >= startingTime){
            if(first_val_checked == false){
               first_val_checked = true;
               first_valid_index = i;
            }
            
            sum_close += close[i];
            sum_open += open[i];
            
            closeBuffer[i] = close[i] *counter / sum_close;
            openBuffer[i] = open[i]*counter / sum_open;
            
            PMOBuffer[i] = simpleMA(i,MA_close,closeBuffer,first_valid_index)-simpleMA(i,MA_open,openBuffer,first_valid_index);
 
            counter++;         
         }   
         else{
            PMOBuffer[i] = 0;
         }    
         
       
      }
 
   }else{
      _tmp_sum_close = sum_close +close[0];
      _tmp_sum_open = sum_open + open[0];
      closeBuffer[0] = close[0] *counter / _tmp_sum_close;
     
      openBuffer[0] = open[0] *counter / _tmp_sum_open;
  
      PMOBuffer[0] = simpleMA(0,MA_close,closeBuffer,first_valid_index)-simpleMA(0,MA_open,openBuffer,first_valid_index);
   }
   return(rates_total);
  }
//+------------------------------------------------------------------+


Experimentos con EURUSD

Aquí ofrecemos algunos resultados y comentarios sobre los experimentos realizados al ejecutar el PMO en el gráfico EURUSD. Se discutirán dos temas principales:

  1. Aspectos comerciales relacionados con el uso del PMO
  2. Análisis del valor del PMO

Aspectos comerciales

Como muestra la figura, hay un gran parecido entre PMO y RSI: las dos señales prácticamente coinciden. En cualquier caso, también existen algunas diferencias. En las proximidades de las mayores subidas del 12 de septiembre de 2019 (en conjunción con algunos comunicados oficiales del Banco Centrl Europeo), los lectores atentos podrán observar una "M" de Merril pattern en el PMO con el hombro izquierdo por encima del derecho, justo lo contrario de lo que sucede con la señal RSI y el precio subyacente de EURUSD. Esto se debe al hecho de que el incremento del precio sucedido el 12 de septiembre en la CMA ha sido superior al observado al día siguiente. Esta información podría haber resultado útil para adoptar una posición corta después del segundo pico.

El parecido con RSI nos permite considerar los virajes alrededor de los picos y valles como condiciones de sobrecompra y sobreventa y, por consiguiente, como una señal temprana para la estrategia comercial de uno. Aunque el PMO no está limitado (como sucede con RSI), el cruce directo de la línea central cero puede considerarse una confirmación más de la tendencia. Como ya mencionamos en la introducción, el uso combinado de múltiples señales al mismo tiempo puede considerarse una buena práctica para el éxito comercial.


Fig. 1

Fig. 1: Similitudes entre PMO(3,21) y RSI(14).


Ahora podemos diseñar un conjunto muy básico y simplificado de reglas SI - ENTONCES para comerciar con el PMO, dejando estrategias más complejas para el futuro desarrollo de expertos basados ​​en el mismo.

  • SI viraje positivo por debajo de la línea central cero ENTONCES alerta temprana COMPRAR
  • SI viraje negativo por encima de la línea central cero ENTONCES alerta temprana VENDER
  • SI cruce hacia arriba de la línea central cero ENTONCES se recomienda COMPRAR
  • SI cruce hacia abajo de la línea central cero ENTONCES se recomienda VENDER

La respuesta rápida a las condiciones cambiantes del mercado es un factor clave para comerciar con éxito: cuando se usa una MA, cuanto más suave sea la señal, mayor será el retardo. Cuando usamos el PMO (m,n), m representa el retardo del oscilador mientras que n se relaciona con el retardo al cruzar la línea central. Claro que la respuesta más rápida con el PMO se alcanza con PMO (1,1), lo que significa que calcularemos la diferencia entre los dos PM sin ningún promedio. Un buen compromiso sería usar PMO (1, n) con n pequeño (por ejemplo, 5) lo que garantizaría una respuesta más rápida, así como cruces por el cero no demasiado retardados.


Análisis de los valores de PMO

Ahora nos resultará útil echar un vistazo a la distribución de los valores de PMO alrededor de la línea central cero. El PMO (como se define en este artículo) no está limitado como RSI, por lo que podría resultar interesante analizar la probabilidad de que un valor de PM esté por encima o por debajo de ciertos umbrales.

La próxima figura representa los resultados obtenidos al ejecutar un PMO (3,21) en el gráfico EURUSD con un marco temporal H1 que abarca los primeros 8 meses de 2019. Los valores de PMO se centran alrededor del cero según una distribución en forma de campana. El ligero sesgo a la izquierda seguramente se deba al exceso de condiciones cortas acumuladas por EURUSD en los últimos meses. No obstante, el predominio de simetrías en torno al cero permite deducir que existe un equilibrio general entre los movimientos cortos y los largos.


Fig. 2

Fig. 2: Distribución de los valores de PMO(3,21) representando una curva en forma de campana. Vamos a imaginar un modelo estadístico cuasi-gaussiano que pueda ser útil con fines predictivos.


Otro aspecto a considerar es la relación entre el PMO y las medias móviles calculadas directamente en las señales de precio de cierre y apertura, en lugar de en sus contrapartes de PM. Como se muestra en la figura siguiente, se ha encontrado una fuerte correlación con R cuadrado cerca de la unidad. Esto significa que trabajar en señales de PM no distorsiona las señales subyacentes. Al mismo tiempo, trabajar en señales de PM tiene la ventaja de posibilitar la comparación de resultados provenientes de diversas fuentes (por ejemplo, otras parejas de divisas), debido a la normalización operada por el cálculo de PM.

Fig. 3

Fig. 3: Correlación observada entre PMO(3,21) y su versión no normalizada. La forma casi lineal obtenida sugiere que la normalización utilizada en el PMO no ofrece una distorsión importante a la hora de interpretar las señales de precio de apertura y cierre subyacentes. 


Conclusiones y Trabajo Posterior


En este artículo, hemos presentado el Pivot Mean Oscillator (PMO) o Oscilador de Promedio de Pivote, una implementación de la Media Móvil Acumulativa (CMA) como indicador comercial para las plataformas MetaTrader, basada en el nuevo concepto de Promedio de Pivote (PM). Asimismo, hemos mostrado que el oscilador propuesto es similar a otros osciladores conocidos, tales como RSI o MACD, pero con algunas particularidades derivadas del uso de la CMA. Aún queda mucho trabajo por delante en cuanto al desarrollo adicional, por ejemplo: la implementación de variantes basadas en otros tipos de promedios o de expertos que usen la información proveniente de la distribución estadística de los valores de PMO alrededor de la línea central cero.

Animamos a los lectores a realizar sus propios experimentos usando los archivos adjuntos.


Archivos adjuntos

Archivo Descripción
 PMO.mq4  Código fuente del PMO en MQL4 usado en el presente artículo.
 PMO_logger.mq4  Código fuente del PMO en MQL4 con función de log para el análisis de datos. Hemos implementado dos entradas adicionales: data_logging (bandera true/false) y filename (string).
 PMO.mq5  Código fuente del PMO en MQL5.
 PMO_logger.mq5  Código fuente del PMO en MQL5 con función de log para el análisis de datos. Hemos implementado dos entradas adicionales: data_logging (bandera true/false) y filename (string).




Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/7265

Archivos adjuntos |
PMO.mq4 (4.32 KB)
PMO_logger.mq4 (4.93 KB)
PMO.mq5 (4.5 KB)
PMO_logger.mq5 (5.06 KB)
Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XVII): Interactividad de los objetos de la biblioteca. Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XVII): Interactividad de los objetos de la biblioteca.
Hoy vamos a finalizar de forma lógica la funcionalidad del objeto básico de todos los objetos de la biblioteca, que permitirá a cualquier objeto de la biblioteca creado sobre su base interactuar de forma activa con el usuario. Por ejemplo, podemos establecer el tamaño máximo aceptable del spread para abrir una posición y el valor del nivel de precio cuyo cruzamiento causará el envío de un evento desde el objeto de símbolo al programa sobre la señal del tamaño del spread y el cruzamiento del nivel controlado por parte del precio.
Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XVI): Eventos de la colección de símbolos. Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte XVI): Eventos de la colección de símbolos.
En este artículo, vamos a crear la clase básica para todos los objetos de la biblioteca, encargada de añadir la funcionalidad de los eventos a todos sus herederos; asimismo, crearemos una clase para monitorear los eventos de la colección de símbolos basada en la nueva clase básica. Además, modificaremos las clases de la cuenta y los eventos de la cuenta para trabajar con la nueva funcionalidad del objeto básico.
Construimos un asesor usando módulos individuales Construimos un asesor usando módulos individuales
Durante el desarrollo de indicadores, asesores y scripts, el desarrollor se ve obligado a crear constantemente fragmentos de código terminados, que no tienen relación directa con la estrategia de trading. En el artículo vamos a analizar diferentes métodos para proyectar asesores usando los bloques individuales proyectados anteriormente: trailing, filtros, horarios, etcétera. Asimismo, hemos analizado las peculiaridades de este tipo de proyectos.
Constructor de estrategias basado en las figuras técnicas de Merrill Constructor de estrategias basado en las figuras técnicas de Merrill
En el artículo anterior, analizamos un modelo de aplicación de las figuras técnicas de Merrill a diferentes datos, tales como el valor del precio en el gráfico de un instrumento de divisa y los valores de los diferentes indicadores del paquete estándar del terminal MetaTrader 5: ATR, WPR, CCI, RSI y otros. Ahora, vamos a intentar crear un constructor de estrategias basado en las ideas sobre el uso de las figuras técnicas de Merrill.