Indicadores: Centro de Gravedad J. F. Ehlers

 

Centro de Gravedad J. F. Ehlers:

El centro de gravedad es el oscilador desarrollado por John Ehlers y presentado en la revista "Acciones y Materias Primas" (Mayo, 2002).

Fig.1 Indicador Centro de Gravedad

Autor: Nikolay Kositsin

 
¡Es útil! ...Me gustaría saber los criterios para el cambio de color.
 

Hola,

Este oscilador es una gran, pero tengo problemas con él.

El final de la línea de señal, que se calcula por la última vela no se muestra, por lo que siempre muestra rojo en el momento actual. Cuando reinicio el oscilador muestra buenos valores por un momento con el final de la línea de señal, pero luego cambia de nuevo a rojo, (incluso si tiene que mostrar verde).

¿Qué debo hacer para eliminar este problema?

He intentado volver a depurarlo pero no ha servido de nada.

Saludos,

InfiniteDesign

 
En su opinión este indicador que funciona con mehor y símbolo y timeframe.
Cuáles son los mejores valores para los parámetros de este indicador?
 

Muchísimas gracias por este magnífico indicador.

La versión anterior me pareció tan interesante y útil como la nueva, o incluso más.

¿Podrías por favor portar el antiguo a mq5 también? Te lo agradecería mucho.


¡¡Saludos, y gracias de antemano !!

 
Este indicador no es determinista. Pregunte dos veces por los mismos puntos de datos, a horas distintas, y obtendrá respuestas diferentes. La desviación es mayor cerca de la hora actual. La inconsistencia puede ser tan grande como 3,7 x 10^-04.
 
InfiniteDesign:

Hola,

Este oscilador es una gran, pero tengo problemas con él.

El final de la línea de señal, que se calcula por la última vela no se muestra, por lo que siempre muestra rojo en el momento actual. Cuando reinicio el oscilador muestra buenos valores por un momento con el final de la línea de señal, pero luego cambia de nuevo a rojo, (incluso si tiene que mostrar verde).

¿Qué debo hacer para eliminar este problema?

He intentado volver a depurarlo pero no ha servido de nada.

Saludos,

InfiniteDesign

Tengo el mismo problema...
 

He intentado crear una Señal a partir de este indicador, pero no he podido...

¿Alguna ayuda?


//+------------------------------------------------------------------+
//|COG.mqh |
//|Bruno Pio
//| http://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Bruno Pio"
#property link      "http://www.mql5.com"
#property version   "1.00"
#include "..\ExpertSignal.mqh"   // CExpertSignal está en el archivo ExpertSignal
#property tester_indicator "CenterOfGravity.ex5"
// descripción del asistente inicio
//+------------------------------------------------------------------+
//| Descripción de la clase|
//| Título=Señales del centro de gravedad|
//| Type=SignalAdvanced|
//| Nombre=Mi_COG|
//| ShortName=CG|
//| Class=COG|
//| Página=No es necesario|
//| Parámetro=Periodo_,int,10,Indicador periodo de promediación |
//| Parameter=SmoothPeriod,int,3,Periodo de suavizado de la línea de señal |
//| Parameter=MA_Method_,ENUM_MA_METHOD,MODE_EMA,Signal Method |
//| Parameter=PrecioAplicado,int,1,Precio constante ||
//+------------------------------------------------------------------+
// descripción del asistente fin
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class COG : public CExpertSignal
  {
private:
CiCustom             m_COG;               // El indicador como objeto
//--- Parámetros configurables del módulo
   int               m_Period_;           // Periodo medio del indicador
   int               m_SmoothPeriod;      // Periodo de suavizado de la línea de señal 
   ENUM_MA_METHOD    m_MA_Method_;        // Método de promediado de la línea de señal
   int               m_AppliedPrice;      // Precio constante
public:
                     COG(void);
                    ~COG(void);
//--- Comprobación de la exactitud de los datos de entrada
   bool              ValidationSettings();
//--- Creación de indicadores y series temporales para el módulo de señales
   bool              InitIndicators(CIndicators *indicators);
//--- Acceso a los datos del indicador
   double            CG(const int index)                 const { return(m_COG.GetData(0,index)); }
   double            Signal(const int index)             const { return(m_COG.GetData(1,index)); }   
//--- Comprobación de las condiciones de compra y venta
   virtual int       LongCondition();
   virtual int       ShortCondition();
//--- Métodos para fijar
   void              Period_(int value)               { m_Period_=value;        }
   void              SmoothPeriod(int value)          { m_SmoothPeriod=value;   }
   void              MA_Method_(ENUM_MA_METHOD value) { m_MA_Method_=value;     }
   void              AppliedPrice(int value)          { m_AppliedPrice=value;   }
protected:
   //--- Crear indicador
   bool              CreateCOG(CIndicators *indicators);



  };
//+------------------------------------------------------------------+
//| Constructor|
//+------------------------------------------------------------------+
COG::COG(void) :           m_Period_(10),                // Periodo medio del indicador
                           m_SmoothPeriod(3),            // Periodo de suavizado de la línea de señal 
                           m_MA_Method_(MODE_EMA),       // Método de promediado de la línea de señal
                           m_AppliedPrice(1)             // Precio constante
  {
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
COG::~COG()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Comprueba los parámetros de entrada y devuelve true si todo está bien ||
//+------------------------------------------------------------------+
bool COG:: ValidationSettings()
  {
   //--- Llamar al método de la clase base
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- Comprobar periodos, número de barras para el cálculo de la MA >=1
   if(m_Period_<1)
     {
      PrintFormat("Incorrect value set for one of the period! Period_=%d",
                  m_Period_);
      return false;
     }
//--- Comprobar periodos, número de barras para el cálculo de la MA >=1
   if(m_SmoothPeriod<1)
     {
      PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d",
                  m_SmoothPeriod);
      return false;
     }
//--- El tipo de suavizado MA rápido debe ser uno de los cuatro valores de la enumeración
   if(m_MA_Method_!=MODE_SMA && m_MA_Method_!=MODE_EMA && m_MA_Method_!=MODE_SMMA && m_MA_Method_!=MODE_LWMA)
     {
      PrintFormat("Invalid type of smoothing of the fast MA!");
      return false;
     }
//--- m_AppliedPrice debe ser válido
   if(m_AppliedPrice<1 || m_AppliedPrice>11) 
     {
      PrintFormat("Invalid type of Price!");
      return false;
     }
//--- Todas las comprobaciones se han completado, todo está bien
   return true;
  }
//+------------------------------------------------------------------+
//| Crea indicadores|
//| Entrada: un puntero a una colección de indicadores.
//| Salida: true si tiene éxito, en caso contrario false |
//+------------------------------------------------------------------+
bool COG::InitIndicators(CIndicators *indicators)
  {
//--- Comprobación estándar de la colección de indicadores para NULL
   if(indicators==NULL) return(false);
//--- Inicialización de indicadores y series temporales en filtros adicionales
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Crear nuestros indicadores
   if(!CreateCOG(indicators))                  return(false);   
//--- Llegó a esta parte, por lo que la función tuvo éxito, devuelva true
   return(true);
  }
//+------------------------------------------------------------------+
//| Crea el indicador "COG"|
//+------------------------------------------------------------------+
bool COG::CreateCOG(CIndicators *indicators)
  {
//--- Comprobación del puntero
   if(indicators==NULL) return(false);
//--- Añadir un objeto a la colección
   if(!indicators.Add(GetPointer(m_COG)))
     {
      printf(__FUNCTION__+": Error adding an object of the COG");
      return(false);
     }
//--- Parametrización del COG
   MqlParam parameters[5];
//---
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="CenterOfGravity.ex5";
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_Period_;                 // Período
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SmoothPeriod;            // Periodo de suavizado de la línea de señal
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_MA_Method_;              // Método de promediado de la línea de señal
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=m_AppliedPrice;            // Precio constante
//--- Inicialización del objeto 
   if(!m_COG.Create(m_symbol.Name(),0,IND_CUSTOM,5,parameters))
     {
      printf(__FUNCTION__+": Error initializing the object of the COG");
      return(false);
     }
//--- Número de buffers
   if(!m_COG.NumBuffers(2)) return(false);
//--- Llegó a esta parte, por lo que la función tuvo éxito, devuelva true
   return(true);
  }
//+------------------------------------------------------------------+
//| Devuelve la fuerza de la señal de compra|
//+------------------------------------------------------------------+
int COG::LongCondition()
  {
   int signal=0;
//--- Para operación con ticks idx=0, para operación con barras formadas idx=1
   int idx=StartIndex();
//--- Valores de COGs en la última barra formada
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valores de COGs en la penúltima barra formada
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---Si CG > Señal && CG-1 < Señal-1
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // Hay una señal de compra
     }
//--- Devuelve el valor de la señal
   return(signal);
  }
//+------------------------------------------------------------------+
//| Devuelve la fuerza de la señal de venta|
//+------------------------------------------------------------------+
int COG::ShortCondition()
  {
   int signal=0;
//--- Para operación con ticks idx=0, para operación con barras formadas idx=1
   int idx=StartIndex();
//--- Valores de COGs en la última barra formada
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valores de COGs en la penúltima barra formada
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---If CG < Señal && CG-1 > Señal-1
   if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value))
     {
      signal=100; // Hay una señal de venta
     }
//--- Devuelve el valor de la señal
   return(signal);
  }
 
cosa interesante... hay que determinar el algoritmo en condiciones de combate
 

El indicador se compila sin errores:

y funciona -

------------------

Sólo tiene que utilizar el archivo smoothalgorithms.mqh fijo - mira el post


Indicators: T3Taotra_HTF
Indicators: T3Taotra_HTF
  • 2016.06.30
  • www.mql5.com
T3Taotra_HTF: Author: Nikolay Kositsin...
 
Bruno Pio #:
Tengo el mismo problema...
He recibido tantas cosas valiosas de la comunidad que quiero aportar algo a cambio.

Este es un indicador genial (si también se tienen en cuenta las tendencias alcistas). Te envío la versión mejorada, en la que el extremo ya no es solo rojo y se actualiza correctamente en el gráfico en tiempo real.

Utiliza elbotón «CÓDIGO» (Alt-S) al insertar código.

Esta vez, un moderador ha corregido el formato. Por favor, formatea el código correctamente en el futuro; las publicaciones con código mal formateado pueden ser eliminadas.

/*
 * El archivo SmoothAlgorithms.mqh debe colocarse 
 * en terminal_data_folder\MQL5\Include
 */
//+------------------------------------------------------------------+
//|                                            Center of Gravity.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright «Copyright © 2007, MetaQuotes Software Corp.»
#property link      "http://www.metaquotes.net"
//---- versión del indicador
#property version   "1.00"
//---- Dibujar el indicador en una ventana independiente
#property indicator_separate_window
//---- Se utilizan tres búferes para el cálculo y el trazado del indicador
#property indicator_buffers 3
//---- Se utilizan dos gráficos
#property indicator_plots   2
//+----------------------------------------------+
//|  Parámetros de dibujo del indicador                |
//+----------------------------------------------+
//---- Dibujar el indicador 1 como una línea de tres colores
#property indicator_type1 DRAW_COLOR_LINE
//---- se utiliza como colores de línea tricolor
#property indicator_color1 Gray,Lime,Red
//---- La línea del indicador 1 es una curva continua
#property indicator_style1  STYLE_SOLID
//---- El grosor de la línea del indicador 1 es igual a 1
#property indicator_width1  1
//---- visualización de la etiqueta del indicador 1
#property indicator_label1  "Center of Gravity"
//+----------------------------------------------+
//|  Parámetros de dibujo del indicador                |
//+----------------------------------------------+
//---- Dibujar el indicador 2 como una línea
#property indicator_type2   DRAW_LINE
//---- Se utiliza el color azul como color de la línea indicadora
#property indicator_color2  Blue
//---- La línea del indicador 2 es una curva continua
#property indicator_style2  STYLE_SOLID
//---- El grosor de la línea del indicador 2 es igual a 1
#property indicator_width2  1
//---- visualización de la etiqueta de la línea indicadora 2
#property indicator_label2  "Signal Line"
//---- el estilo de la línea es una curva de puntos y rayas
#property indicator_style2 STYLE_DASHDOTDOT
//+-----------------------------------+
//|  Parámetros de entrada de los indicadores      |
//+-----------------------------------+
enum Applied_price_ //Tipo de constante
  {
   PRICE_CLOSE_ = 1,     //PRECIO_DE_CIERRE
   PRICE_OPEN_,          //PRECIO_DE_APERTURA
   PRICE_HIGH_,          //PRECIO_MÁXIMO
   PRICE_LOW_,           //PRECIO_MÍNIMO
   PRICE_MEDIAN_,        //PRECIO_MEDIANO
   PRICE_TYPICAL_,       //PRECIO_TÍPICO
   PRICE_WEIGHTED_,      //PRECIO_PONDERADO
   PRICE_SIMPLE_,//PRECIO_SIMPLE_
   PRICE_QUARTER_,       //PRECIO_TRIMESTRAL_
   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_
   PRICE_TRENDFOLLOW1_   //PRICE_TRENDFOLLOW1_
  };
input int Period_=10;                          // Período de promediado del indicador
input int SmoothPeriod=3;                      // Período de suavizado de la línea de señal
input ENUM_MA_METHOD MA_Method_=MODE_SMA;      // Método de promediado de la línea de señal
input Applied_price_ AppliedPrice=PRICE_CLOSE_;// Precio constante
/* , utilizado para el cálculo del indicador (1-CIERRE, 2-APERTURA, 3-MÁXIMO, 4-MÍNIMO, 
  5-MEDIA, 6-TÍPICO, 7-PONDERADO, 8-SIMPLE, 9-TRIMESTRAL, 10-SEGUIR TENDENCIA, 11-0,5 * SEGUIR TENDENCIA.) */
//+-----------------------------------+
//---- Declaración de matrices dinámicas que, además,
//---- se utilizarán como búferes indicadores
double Ext1Buffer[];
double Ext2Buffer[];
double ColorExt2Buffer[];
//---- Declaración de las variables enteras para el inicio del cálculo de los datos
int StartBar;
//+------------------------------------------------------------------+
//| Descripción de la función iPriceSeries                                |
//| Descripción de la clase Moving_Average                                 | 
//+------------------------------------------------------------------+ 
#include <SmoothAlgorithms.mqh> 
//+------------------------------------------------------------------+
//| Función de inicialización de un indicador personalizado                         |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- inicialización de constantes
   StartBar=Period_;
//---- Establecer la matriz dinámica MAMABuffer como búfer indicador
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
//---- Creación de una etiqueta para mostrar en DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity");
//---- Desplazar el inicio del dibujo del indicador
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar);
//---- Convertir un array dinámico en un búfer de índices de color  
   SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX);
//---- Desplazar el inicio del dibujo del indicador
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1);

//---- Establecer la matriz dinámica FAMABuffer como matriz de indicadores
   SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA);
//---- Creación de una etiqueta para mostrar en DataWindow
   PlotIndexSetString(2,PLOT_LABEL,"Signal Line");
//---- Desplazar el inicio del dibujo del indicador
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1);

//---- Inicializaciones de la variable para el nombre abreviado del indicador
   string shortname;
   StringConcatenate(shortname,"Center of Gravity(",Period_,")");
//---- Creación de un nombre para mostrarlo en una subventana independiente y en una información sobre herramientas
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- establecer la precisión en la visualización de los valores del indicador
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----
  }
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizado                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // número de barras del historial en el tick actual
                const int prev_calculated,// número de compases calculado en la llamada anterior
                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[])
  {
//---- comprobación de que el número de barras sea suficiente para el cálculo
   if(rates_total<StartBar) return(0);

//---- Declaración de variables de punto flotante 
   double price_,sma,lwma;
//---- Declaración de variables enteras
   int first1,first2,first3,bar;

//---- Inicialización del indicador en el bloque OnCalculate()
   if(prev_calculated>rates_total || prev_calculated<=0)// comprobación del primer inicio del cálculo de un indicador
     {
      first1=0; // número inicial para el cálculo de todos los compases del primer bucle
      first2=Period_+1; // número inicial para el cálculo de todas las barras de las líneas de señal
      first3=Period_+SmoothPeriod+3; // Número inicial para el cálculo de todas las barras del bucle de coloración
     }
   else // número inicial para el cálculo de las nuevas barras
     {
      first1=prev_calculated-1;
      first3=first1;
     }

//---- CORRECCIÓN (adicional): el parámetro «begin» de la llamada a la serie MASeries de jelvonal (línea de señal) siempre
//---- Debe ser el mismo umbral de fiabilidad «FIXO» (Period_+1) — el original sigue vigente
//---- En el ticknél se hacía referencia erróneamente al «first1», que cambia constantemente (es decir, al índice de bujía actual)
//---- Se estableció que, en cada tick en vivo, coincidía con la vela procesada, lo que confundió el
//---- La clase «simító» de Belsó se basaba en la lógica de «hasta qué punto se puede confiar en los datos»; por eso era inestable o defectuosa.
//---- El valor actual de la línea de referencia y, por ello, «se ha corregido» solo tras un cambio de TF (recalculación completa).
   first2=Period_+1;

//---- Declaración de las variables de la clase Moving_Average
   static CMoving_Average MA,LWMA,SIGN;

//---- Ciclo principal de cálculo de la línea central del canal
   for(bar=first1; bar<rates_total; bar++)
     {
      //---- Llamada a la función PriceSeries para obtener la «serie» de precios de entrada
      price_=PriceSeries(AppliedPrice,bar,open,low,high,close);

      sma=MA.MASeries(0,prev_calculated,rates_total,Period_,MODE_SMA,price_,bar,false);
      lwma=LWMA.MASeries(0,prev_calculated,rates_total,Period_,MODE_LWMA,price_,bar,false);

      Ext1Buffer[bar]=sma*lwma/_Point;
      Ext2Buffer[bar]=SIGN.MASeries(first2,prev_calculated,rates_total,SmoothPeriod,MA_Method_,Ext1Buffer[bar],bar,false);
     }

//---- Bucle principal para colorear la línea de señal
   for(bar=first3; bar<rates_total; bar++)
     {
      ColorExt2Buffer[bar]=0;
      if(Ext1Buffer[bar]<Ext2Buffer[bar])
         ColorExt2Buffer[bar]=2;
      else ColorExt2Buffer[bar]=1;
     }
//----   
   return(rates_total);
  }
//+------------------------------------------------------------------+