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
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á!
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
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); }
Tenho o mesmo problema...
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.
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); } //+------------------------------------------------------------------+
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso


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