Indicadores: Centro de Gravidade por J. F. Ehlers

 

Centro de Gravidade por J. F. Ehlers:

O oscilador Centro de Gravidade foi desenvolvido por John Ehlers e apresentado na revista "Stocks & Commodities" (Maio, 2002).

Fig.1 Indicador Centro de Gravidade

Autor: Nikolay Kositsin

 
É útil! ...Gostaria de saber os critérios para a mudança de cor.
 

Olá,

Esse oscilador é ótimo, mas tenho problemas com ele.

O final da linha de sinal, que é calculado pelo último candle, não é exibido, portanto, ele sempre mostra a cor vermelha no momento atual. Quando eu reinicio o oscilador, ele mostra bons valores por um momento com o fim da linha de sinal, mas depois volta para o vermelho (mesmo que tenha que mostrar verde).

O que devo fazer para eliminar esse problema?

Tentei refazer a depuração, mas não adiantou.

Saudações,

InfiniteDesign

 
Em sua opinião, esse indicador funciona com mehor , símbolo e período de tempo.
Quais são os melhores valores para os parâmetros desse indicador?
 

Muito obrigado por esse excelente indicador.

Achei a versão anterior tão interessante e útil quanto a nova, ou de fato ainda mais.

Você poderia portar o antigo para o mq5 também? Ficaria muito grato se isso pudesse ser feito.


Abraços e obrigado desde já!

 
Esse indicador não é determinístico. Solicite os mesmos pontos de dados duas vezes, em momentos diferentes, e você obterá respostas diferentes. O desvio é maior perto da hora atual. A inconsistência pode ser tão grande quanto 3,7 x 10^-04.
 
InfiniteDesign:

Olá,

Esse oscilador é ótimo, mas tenho problemas com ele.

O final da linha de sinal, que é calculado pelo último candle, não é exibido, portanto, ele sempre mostra a cor vermelha no momento atual. Quando eu reinicio o oscilador, ele mostra bons valores por um momento com o fim da linha de sinal, mas depois volta para o vermelho (mesmo que tenha que mostrar verde).

O que devo fazer para eliminar esse problema?

Tentei refazer a depuração, mas não adiantou.

Saudações,

InfiniteDesign

Estou com o mesmo problema...
 

Tentei criar um sinal a partir desse indicador, mas não consegui...

Alguma ajuda?


//+------------------------------------------------------------------+
//|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á no arquivo ExpertSignal
#property tester_indicator "CenterOfGravity.ex5"
// início da descrição do assistente
//+------------------------------------------------------------------+
//| Descrição da classe|
//| Título=Sinais do centro de gravidade|
//| Type=SignalAdvanced|
//| Name=My_COG|
//| ShortName=CG|
//| Class=COG|
//| Página=Não é necessário|
//| Parâmetro=Period_,int,10,Período de cálculo da média do indicador
//| Parâmetro=SmoothPeriod,int,3,Período de suavização da linha de sinal
//| Parâmetro=MA_Method_,ENUM_MA_METHOD,MODE_EMA,Signal Method
//| Parâmetro=AppliedPrice,int,1,Constante de preço
//+------------------------------------------------------------------+
// descrição do assistente fim
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class COG : public CExpertSignal
  {
private:
CiCustom             m_COG;               // O indicador como um objeto
//--- Parâmetros configuráveis do módulo
   int               m_Period_;           // Período de cálculo da média do indicador
   int               m_SmoothPeriod;      // Período de regularização da linha de sinal 
   ENUM_MA_METHOD    m_MA_Method_;        // Método de cálculo da média da linha de sinal
   int               m_AppliedPrice;      // Constante de preço
public:
                     COG(void);
                    ~COG(void);
//--- Verificação da exatidão dos dados de entrada
   bool              ValidationSettings();
//--- Criação de indicadores e séries temporais para o módulo de sinais
   bool              InitIndicators(CIndicators *indicators);
//--- Acesso aos dados do 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)); }   
//--- Verificação das condições de compra e venda
   virtual int       LongCondition();
   virtual int       ShortCondition();
//--- Métodos de configuração
   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:
   //--- Criação de indicador
   bool              CreateCOG(CIndicators *indicators);



  };
//+------------------------------------------------------------------+
//| Construtor|
//+------------------------------------------------------------------+
COG::COG(void) :           m_Period_(10),                // Período de cálculo da média do indicador
                           m_SmoothPeriod(3),            // Período de regularização da linha de sinal 
                           m_MA_Method_(MODE_EMA),       // Método de cálculo da média da linha de sinal
                           m_AppliedPrice(1)             // Constante de preço
  {
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
COG::~COG()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Verifica os parâmetros de entrada e retorna true se tudo estiver OK.
//+------------------------------------------------------------------+
bool COG:: ValidationSettings()
  {
   //--- Chame o método da classe base
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- Períodos de verificação, número de barras para o cálculo da MA >=1
   if(m_Period_<1)
     {
      PrintFormat("Incorrect value set for one of the period! Period_=%d",
                  m_Period_);
      return false;
     }
//--- Períodos de verificação, número de barras para o cálculo da MA >=1
   if(m_SmoothPeriod<1)
     {
      PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d",
                  m_SmoothPeriod);
      return false;
     }
//--- O tipo de suavização Fast MA deve ser um dos quatro valores da enumeração
   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 deve ser válido
   if(m_AppliedPrice<1 || m_AppliedPrice>11) 
     {
      PrintFormat("Invalid type of Price!");
      return false;
     }
//--- Todas as verificações foram concluídas, tudo está ok
   return true;
  }
//+------------------------------------------------------------------+
//| Cria indicadores|
//| Entrada: um ponteiro para uma coleção de indicadores
//| Saída: verdadeiro se for bem-sucedido, caso contrário, falso
//+------------------------------------------------------------------+
bool COG::InitIndicators(CIndicators *indicators)
  {
//--- Verificação padrão da coleção de indicadores para NULL
   if(indicators==NULL) return(false);
//--- Inicialização de indicadores e séries temporais em filtros adicionais
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Criando nossos indicadores
   if(!CreateCOG(indicators))                  return(false);   
//--- Chegou a essa parte, então a função foi bem-sucedida, retorne true
   return(true);
  }
//+------------------------------------------------------------------+
//| Cria o indicador "COG".|
//+------------------------------------------------------------------+
bool COG::CreateCOG(CIndicators *indicators)
  {
//--- Verificando o ponteiro
   if(indicators==NULL) return(false);
//--- Adicionando um objeto à coleção
   if(!indicators.Add(GetPointer(m_COG)))
     {
      printf(__FUNCTION__+": Error adding an object of the COG");
      return(false);
     }
//--- Configuração dos parâmetros do 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;            // Período de regularização da linha de sinal
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_MA_Method_;              // Método de cálculo da média da linha de sinal
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=m_AppliedPrice;            // Constante de preço
//--- Inicialização do 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);
//--- Chegou a essa parte, então a função foi bem-sucedida, retorne true
   return(true);
  }
//+------------------------------------------------------------------+
//| Retorna a intensidade do sinal de compra|
//+------------------------------------------------------------------+
int COG::LongCondition()
  {
   int signal=0;
//--- Para operação com ticks idx=0, para operação com barras formadas idx=1
   int idx=StartIndex();
//--- Valores de COGs na última barra formada
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valores de COGs na penúltima barra formada
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---Se CG > Sinal && CG-1 < Sinal-1
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // Há um sinal para comprar
     }
//--- Retorna o valor do sinal
   return(signal);
  }
//+------------------------------------------------------------------+
//| Retorna a intensidade do sinal de venda|
//+------------------------------------------------------------------+
int COG::ShortCondition()
  {
   int signal=0;
//--- Para operação com ticks idx=0, para operação com barras formadas idx=1
   int idx=StartIndex();
//--- Valores de COGs na última barra formada
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valores de COGs na penúltima barra formada
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---Se CG < Sinal && CG-1 > Sinal-1
   if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value))
     {
      signal=100; // Há um sinal para vender
     }
//--- Retorna o valor do sinal
   return(signal);
  }
 
interessante... é preciso determinar o algoritmo em condições de combate
 

O indicador é compilado sem nenhum erro:

e funciona -

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

Só é necessário usar o arquivo smoothalgorithms.mqh fixo - veja a postagem


Indicators: T3Taotra_HTF
Indicators: T3Taotra_HTF
  • 2016.06.30
  • www.mql5.com
T3Taotra_HTF: Author: Nikolay Kositsin...
 
Bruno Pio #:
Tenho o mesmo problema...
Recebi tantas coisas valiosas da comunidade que quero retribuir de alguma forma.

Este é um indicador brilhante (se você também levar em conta as tendências de maior escala). Estou enviando a versão aprimorada, cujo final não é mais apenas vermelho e que é atualizada corretamente no gráfico em tempo real.

Use obotão CÓDIGO (Alt-S) ao inserir código.

Desta vez, um moderador corrigiu a formatação. Por favor, formate o código corretamente no futuro; postagens com código formatado incorretamente podem ser removidas.

/*
 * O arquivo SmoothAlgorithms.mqh deve ser colocado 
 * em terminal_data_folder\MQL5\Include
 */
//+------------------------------------------------------------------+
//|                                            Centro de Gravidade.mq4 |
//|                      Direitos autorais © 2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//---- versão do indicador
#property version   "1.00"
//---- desenhando o indicador em uma janela separada
#property indicator_separate_window
//---- são utilizados três buffers para o cálculo e o desenho do indicador
#property indicator_buffers 3
//---- são utilizados dois gráficos
#property indicator_plots   2
//+----------------------------------------------+
//|  Parâmetros de desenho do indicador                |
//+----------------------------------------------+
//---- desenhar o indicador 1 como uma linha de três cores
#property indicator_type1 DRAW_COLOR_LINE
//---- usado como cores de linha em três tons
#property indicator_color1 Gray,Lime,Red
//---- a linha do indicador 1 é uma curva contínua
#property indicator_style1  STYLE_SOLID
//---- a espessura da linha do indicador 1 é igual a 1
#property indicator_width1  1
//---- exibição do rótulo do indicador 1
#property indicator_label1  "Center of Gravity"
//+----------------------------------------------+
//|  Parâmetros de desenho do indicador                |
//+----------------------------------------------+
//---- desenhar o indicador 2 como uma linha
#property indicator_type2   DRAW_LINE
//---- a cor azul é usada como cor da linha indicadora
#property indicator_color2  Blue
//---- a linha do indicador 2 é uma curva contínua
#property indicator_style2  STYLE_SOLID
//---- a espessura da linha do indicador 2 é igual a 1
#property indicator_width2  1
//---- exibição do rótulo da linha do indicador 2
#property indicator_label2  "Signal Line"
//---- o estilo da linha é uma curva pontilhada
#property indicator_style2 STYLE_DASHDOTDOT
//+-----------------------------------+
//|  Parâmetros de entrada dos indicadores      |
//+-----------------------------------+
enum Applied_price_ //Tipo de constante
  {
   PRICE_CLOSE_ = 1,     //PREÇO_DE_FECHAMENTO
   PRICE_OPEN_,          //PREÇO_DE_ABERTURA
   PRICE_HIGH_,          //PREÇO_MÁXIMO
   PRICE_LOW_,           //PREÇO_MÍNIMO
   PRICE_MEDIAN_,        //PREÇO_MEDIANO
   PRICE_TYPICAL_,       //PREÇO_TÍPICO
   PRICE_WEIGHTED_,      //PREÇO_PONDERADO
   PRICE_SIMPLE_,//PRICE_SIMPLE_
   PRICE_QUARTER_,       //PREÇO_TRIMESTRAL_
   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_
   PRICE_TRENDFOLLOW1_   //PRICE_TRENDFOLLOW1_
  };
input int Period_=10;                          // Período de média do indicador
input int SmoothPeriod=3;                      // Período de suavização da linha de sinal
input ENUM_MA_METHOD MA_Method_=MODE_SMA;      // Método de média da linha de sinal
input Applied_price_ AppliedPrice=PRICE_CLOSE_;// Preço constante
/* , utilizado para o cálculo do indicador ( 1-FECHAMENTO, 2-ABERTURA, 3-MÁXIMO, 4-LOW, 
  5-MEDIAN, 6-TYPICAL, 7-WEIGHTED, 8-SIMPLE, 9-QUARTER, 10-TRENDFOLLOW, 11-0,5 * TRENDFOLLOW.) */
//+-----------------------------------+
//---- declaração de matrizes dinâmicas que, além disso,
//---- serão usados como buffers de indicadores
double Ext1Buffer[];
double Ext2Buffer[];
double ColorExt2Buffer[];
//---- Declaração das variáveis inteiras para o início do cálculo dos dados
int StartBar;
//+------------------------------------------------------------------+
//| Descrição da função iPriceSeries                                |
//| Descrição da classe Moving_Average                                 | 
//+------------------------------------------------------------------+ 
#include <SmoothAlgorithms.mqh> 
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado                         |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- inicialização de constantes
   StartBar=Period_;
//---- definir a matriz dinâmica MAMABuffer como buffer de indicadores
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
//---- criando um rótulo para exibir na DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity");
//---- deslocando o início do desenho do indicador
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar);
//---- transformando uma matriz dinâmica em um buffer de índice de cores  
   SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX);
//---- deslocando o início do desenho do indicador
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1);

//---- definir a matriz dinâmica FAMABuffer como matriz de indicadores
   SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA);
//---- criando um rótulo para exibir na DataWindow
   PlotIndexSetString(2,PLOT_LABEL,"Signal Line");
//---- deslocando o início do desenho do indicador
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1);

//---- inicializações da variável para o nome abreviado do indicador
   string shortname;
   StringConcatenate(shortname,"Center of Gravity(",Period_,")");
//---- criando um nome para exibição em uma subjanela separada e em uma dica de ferramenta
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- definir a precisão da exibição dos valores do indicador
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----
  }
//+------------------------------------------------------------------+
//| Função de iteração do indicador personalizado                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // número de barras no histórico no momento atual
                const int prev_calculated,// número de barras calculado na chamada 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[])
  {
//---- verificando se o número de barras é suficiente para o cálculo
   if(rates_total<StartBar) return(0);

//---- Declaração de variáveis com ponto flutuante 
   double price_,sma,lwma;
//---- Declaração de variáveis inteiras
   int first1,first2,first3,bar;

//---- Inicialização do indicador no bloco OnCalculate()
   if(prev_calculated>rates_total || prev_calculated<=0)// verificando quando o cálculo de um indicador é iniciado pela primeira vez
     {
      first1=0; // número inicial para o cálculo de todas as barras do primeiro ciclo
      first2=Period_+1; // número inicial para o cálculo de todas as barras das linhas de sinal
      first3=Period_+SmoothPeriod+3; // número inicial para o cálculo de todas as barras do loop de coloração
     }
   else // número inicial para o cálculo das novas barras
     {
      first1=prev_calculated-1;
      first3=first1;
     }

//---- CORREÇÃO (adicional): o parâmetro “begin” da chamada da MASeries da jelvonal (Linha de Sinal) sempre
//---- deve ser o mesmo limiar de confiabilidade fixo (Period_+1) — originalmente ativo
//---- o ticknél estava erroneamente apontado para o "first1", que está sempre mudando (ou seja, para o índice atual da vela)
//---- Definido, o que coincidia com o tick processado a cada tick em tempo real, confundindo o
//---- A lógica da classe "meddig megbízható az adat" da belső szimitó — por isso era instável/defeituosa
//---- o valor inicial da linha de referência e, por isso, só “melhorou” após a troca de TF (recalculo completo).
   first2=Period_+1;

//---- declaração das variáveis da classe Moving_Average
   static CMoving_Average MA,LWMA,SIGN;

//---- Ciclo principal de cálculo da linha central do canal
   for(bar=first1; bar<rates_total; bar++)
     {
      //---- Chamada da função PriceSeries para obter a “série” de preços 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);
     }

//---- Ciclo principal da coloração da linha de sinal
   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);
  }
//+------------------------------------------------------------------+