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
Cuáles son los mejores valores para los parámetros de este indicador?
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
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); }
Tengo el mismo problema...
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.
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); } //+------------------------------------------------------------------+
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso


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).
Autor: Nikolay Kositsin