Indicatori: Centro di gravità di Ehlers - Centro di gravità J. F. Ehlers

 

Centro di gravità di Ehlers - Centro di gravità J. F. Ehlers:

Il Centro di gravità è un oscillatore sviluppato da John Ehlers e pubblicato nel numero di maggio 2002 di Stocks & Commodities.

Centro di gravità di Ehlers - Centro di gravità J. F. Ehlers

Author: Nikolay Kositsin

 
È utile! ... Vorrei conoscere i criteri per il cambio di colore.
 

Salve,

Questo oscillatore è ottimo, ma ho dei problemi con esso.

La fine della linea del segnale, che è calcolata dall'ultima candela, non viene mostrata, quindi mostra sempre il rosso al momento attuale. Quando resetto l'oscillatore, per un momento mostra valori buoni con la fine della linea del segnale, ma poi torna al rosso (anche se deve mostrare il verde).

Cosa devo fare per eliminare questo problema?

Ho provato a rifare il debug ma non è servito.

Saluti,

InfiniteDesign

 
Secondo lui questo indicatore funziona con mehor , simbolo e timeframe.
Quali sono i valori migliori per i parametri di questo indicatore?
 

Grazie mille per questo grande indicatore.

Ho trovato la versione precedente altrettanto interessante e utile di quella nuova, se non addirittura di più...

Potreste per favore portare il vecchio indicatore anche su mq5? Apprezzerei molto se si potesse fare.


Salute e grazie in anticipo!!!

 
Questo indicatore non è deterministico. Se si chiedono gli stessi dati due volte, in momenti diversi, si otterranno risposte diverse. La deriva è maggiore se ci si avvicina all'ora corrente. L'incongruenza può arrivare a 3,7 x 10^-04.
 
InfiniteDesign:

Salve,

Questo oscillatore è ottimo, ma ho dei problemi con esso.

La fine della linea del segnale, che è calcolata dall'ultima candela, non viene mostrata, quindi mostra sempre il rosso al momento attuale. Quando resetto l'oscillatore, per un momento mostra valori buoni con la fine della linea del segnale, ma poi torna al rosso (anche se deve mostrare il verde).

Cosa devo fare per eliminare questo problema?

Ho provato a rifare il debug ma non è servito.

Saluti,

InfiniteDesign

Ho lo stesso problema...
 

Ho provato a creare un segnale da questo indicatore, ma non ci sono riuscito...

Qualche aiuto?


//+------------------------------------------------------------------+
//|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 si trova nel file ExpertSignal
#property tester_indicator "CenterOfGravity.ex5"
// avvio della descrizione della procedura guidata
//+------------------------------------------------------------------+
//| Descrizione della classe|
//| Titolo=Segnali del centro di gravità|
//| Tipo=SegnaleAvanzato|
//| Nome=Mio_COG|
//| Nome breve=CG|
//| Classe=COG|
//| Pagina=Non necessario|
//| Parametro=Periodo_,int,10,Periodo di mediazione dell'indicatore.
//| Parametro=SmoothPeriod,int,3,Periodo di lisciatura della linea del segnale |
//| Parametro=MA_Method_,ENUM_MA_METHOD,MODE_EMA,Signal Method |
//| Parametro=Prezzo applicato,int,1,Prezzo costante |
//+------------------------------------------------------------------+
// descrizione della procedura guidata fine
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class COG : public CExpertSignal
  {
private:
CiCustom             m_COG;               // L'indicatore come oggetto
//--- Parametri configurabili del modulo
   int               m_Period_;           // Periodo di mediazione dell'indicatore
   int               m_SmoothPeriod;      // Periodo di lisciatura della linea del segnale 
   ENUM_MA_METHOD    m_MA_Method_;        // Metodo di mediazione della linea del segnale
   int               m_AppliedPrice;      // Costante di prezzo
public:
                     COG(void);
                    ~COG(void);
//--- Verifica della correttezza dei dati in ingresso
   bool              ValidationSettings();
//--- Creazione di indicatori e serie temporali per il modulo dei segnali
   bool              InitIndicators(CIndicators *indicators);
//--- Accesso ai dati dell'indicatore
   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 delle condizioni di acquisto e vendita
   virtual int       LongCondition();
   virtual int       ShortCondition();
//--- Metodi per impostare
   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:
   //--- Creazione dell'indicatore
   bool              CreateCOG(CIndicators *indicators);



  };
//+------------------------------------------------------------------+
//| Costruttore|
//+------------------------------------------------------------------+
COG::COG(void) :           m_Period_(10),                // Periodo di mediazione dell'indicatore
                           m_SmoothPeriod(3),            // Periodo di lisciatura della linea del segnale 
                           m_MA_Method_(MODE_EMA),       // Metodo di mediazione della linea del segnale
                           m_AppliedPrice(1)             // Costante di prezzo
  {
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
COG::~COG()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Controlla i parametri di input e restituisce true se tutto è OK |
//+------------------------------------------------------------------+
bool COG:: ValidationSettings()
  {
   //--- Chiamare il metodo della classe base
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- Controllo dei periodi, numero di barre per il calcolo della MA >=1
   if(m_Period_<1)
     {
      PrintFormat("Incorrect value set for one of the period! Period_=%d",
                  m_Period_);
      return false;
     }
//--- Controllo dei periodi, numero di barre per il calcolo della MA >=1
   if(m_SmoothPeriod<1)
     {
      PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d",
                  m_SmoothPeriod);
      return false;
     }
//--- Il tipo di lisciatura veloce MA deve essere uno dei quattro valori dell'enumerazione
   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 essere valido
   if(m_AppliedPrice<1 || m_AppliedPrice>11) 
     {
      PrintFormat("Invalid type of Price!");
      return false;
     }
//--- Tutti i controlli sono stati completati, tutto è ok
   return true;
  }
//+------------------------------------------------------------------+
//| Crea indicatori|
//| Ingresso: un puntatore a una collezione di indicatori |
//| Uscita: true se ha successo, altrimenti false |
//+------------------------------------------------------------------+
bool COG::InitIndicators(CIndicators *indicators)
  {
//--- Controllo standard della collezione di indicatori per NULL
   if(indicators==NULL) return(false);
//--- Inizializzazione degli indicatori e delle serie temporali nei filtri aggiuntivi
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Creazione degli indicatori
   if(!CreateCOG(indicators))                  return(false);   
//--- Raggiunta questa parte, la funzione ha avuto successo, restituire true
   return(true);
  }
//+------------------------------------------------------------------+
//| Crea l'indicatore "COG|
//+------------------------------------------------------------------+
bool COG::CreateCOG(CIndicators *indicators)
  {
//--- Controllo del puntatore
   if(indicators==NULL) return(false);
//--- Aggiunta di un oggetto alla collezione
   if(!indicators.Add(GetPointer(m_COG)))
     {
      printf(__FUNCTION__+": Error adding an object of the COG");
      return(false);
     }
//--- Impostazione dei parametri 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_;                 // Periodo
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SmoothPeriod;            // Periodo di lisciatura della linea del segnale
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_MA_Method_;              // Metodo di mediazione della linea del segnale
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=m_AppliedPrice;            // Costante di prezzo
//--- Inizializzazione dell'oggetto 
   if(!m_COG.Create(m_symbol.Name(),0,IND_CUSTOM,5,parameters))
     {
      printf(__FUNCTION__+": Error initializing the object of the COG");
      return(false);
     }
//--- Numero di buffer
   if(!m_COG.NumBuffers(2)) return(false);
//--- Raggiunta questa parte, la funzione ha avuto successo, restituire true
   return(true);
  }
//+------------------------------------------------------------------+
//| Restituisce l'intensità del segnale di acquisto|
//+------------------------------------------------------------------+
int COG::LongCondition()
  {
   int signal=0;
//--- Per operazioni con tick idx=0, per operazioni con barre formate idx=1
   int idx=StartIndex();
//--- Valori delle COG all'ultima barra formata
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valori delle COG nella penultima barra formata
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---Se CG > Segnale && CG-1 < Segnale-1
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // C'è un segnale di acquisto
     }
//--- Restituzione del valore del segnale
   return(signal);
  }
//+------------------------------------------------------------------+
//| Restituisce la forza del segnale di vendita|
//+------------------------------------------------------------------+
int COG::ShortCondition()
  {
   int signal=0;
//--- Per operazioni con tick idx=0, per operazioni con barre formate idx=1
   int idx=StartIndex();
//--- Valori delle COG all'ultima barra formata
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valori delle COG nella penultima barra formata
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---Se CG < Segnale && CG-1 > Segnale-1
   if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value))
     {
      signal=100; // C'è un segnale di vendita
     }
//--- Restituzione del valore del segnale
   return(signal);
  }
 
Interessante... occorre determinare l'algoritmo in condizioni di combattimento.
 

L'indicatore viene compilato senza errori:

e funziona -

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

Basta usare il file smoothalgorithms.mqh fisso - guarda il post


Indicators: T3Taotra_HTF
Indicators: T3Taotra_HTF
  • 2016.06.30
  • www.mql5.com
T3Taotra_HTF: Author: Nikolay Kositsin...
 
Bruno Pio #:
Ho lo stesso problema...
Ho ricevuto così tante cose preziose dalla community che vorrei ricambiare in qualche modo.

Questo è un indicatore fantastico (se si considerano anche i trend di più ampio respiro). Vi invio la versione migliorata, in cui la parte finale non è più solo rossa e si aggiorna correttamente sul grafico in tempo reale.

Utilizza ilpulsante CODICE (Alt-S) quando inserisci il codice.

Questa volta un moderatore ha corretto la formattazione. In futuro, formattate correttamente il codice; i post con codice formattato in modo errato potrebbero essere rimossi.

/*
 * Il file SmoothAlgorithms.mqh deve essere inserito 
 * nella cartella 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"
//---- versione dell'indicatore
#property version   "1.00"
//---- disegno dell'indicatore in una finestra separata
#property indicator_separate_window
//---- Per il calcolo e la visualizzazione dell'indicatore vengono utilizzati tre buffer
#property indicator_buffers 3
//---- vengono utilizzati due grafici
#property indicator_plots   2
//+----------------------------------------------+
//|  Parametri di disegno degli indicatori                |
//+----------------------------------------------+
//---- disegno dell'indicatore 1 come linea tricolore
#property indicator_type1 DRAW_COLOR_LINE
//---- utilizzato come colori per una linea a tre colori
#property indicator_color1 Gray,Lime,Red
//---- la linea dell'indicatore 1 è una curva continua
#property indicator_style1  STYLE_SOLID
//---- lo spessore della linea dell'indicatore 1 è pari a 1
#property indicator_width1  1
//---- visualizzazione dell'etichetta dell'indicatore 1
#property indicator_label1  "Center of Gravity"
//+----------------------------------------------+
//|  Parametri di disegno degli indicatori                |
//+----------------------------------------------+
//---- disegnare l'indicatore 2 come una linea
#property indicator_type2   DRAW_LINE
//---- Il blu è il colore utilizzato per la linea indicatrice
#property indicator_color2  Blue
//---- la linea dell'indicatore 2 è una curva continua
#property indicator_style2  STYLE_SOLID
//---- lo spessore della linea dell'indicatore 2 è pari a 1
#property indicator_width2  1
//---- visualizzazione dell'etichetta della linea indicatrice 2
#property indicator_label2  "Signal Line"
//---- lo stile della linea è una curva a punti e trattini
#property indicator_style2 STYLE_DASHDOTDOT
//+-----------------------------------+
//|  Parametri di input degli indicatori      |
//+-----------------------------------+
enum Applied_price_ //Tipo di costante
  {
   PRICE_CLOSE_ = 1,     //PREZZO_DI_CHIUSURA
   PRICE_OPEN_,          //PREZZO_DI_APERTURA
   PRICE_HIGH_,          //PREZZO_MASSIMO
   PRICE_LOW_,           //PREZZO_MINIMO
   PRICE_MEDIAN_,        //PREZZO MEDIO
   PRICE_TYPICAL_,       //PREZZO_INDICATIVO
   PRICE_WEIGHTED_,      //PREZZO_PONDERATO
   PRICE_SIMPLE_,//PRICE_SIMPLE_
   PRICE_QUARTER_,       //PREZZO_TRIMESTRALE_
   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_
   PRICE_TRENDFOLLOW1_   //PRICE_TRENDFOLLOW1_
  };
input int Period_=10;                          // Periodo di media dell'indicatore
input int SmoothPeriod=3;                      // Periodo di livellamento della linea di segnale
input ENUM_MA_METHOD MA_Method_=MODE_SMA;      // Metodo di media delle linee di segnale
input Applied_price_ AppliedPrice=PRICE_CLOSE_;// Prezzo costante
/* , utilizzato per il calcolo dell'indicatore (1-CHIUSURA, 2-APERTURA, 3-MASSIMO, 4-LOW, 
  5-MEDIAN, 6-TYPICAL, 7-WEIGHTED, 8-SIMPLE, 9-QUARTER, 10-TRENDFOLLOW, 11-0,5 * TRENDFOLLOW.) */
//+-----------------------------------+
//---- dichiarazione di array dinamici che ulteriormente
//---- saranno utilizzati come buffer indicatori
double Ext1Buffer[];
double Ext2Buffer[];
double ColorExt2Buffer[];
//---- Dichiarazione delle variabili intere per l'avvio del calcolo dei dati
int StartBar;
//+------------------------------------------------------------------+
//| Descrizione della funzione iPriceSeries                                |
//| Descrizione della classe Moving_Average                                 | 
//+------------------------------------------------------------------+ 
#include <SmoothAlgorithms.mqh> 
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzato                         |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- inizializzazione delle costanti
   StartBar=Period_;
//---- imposta l'array dinamico MAMABuffer come buffer degli indicatori
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
//---- creazione di un'etichetta da visualizzare nella DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity");
//---- spostamento del punto di inizio del tracciamento dell'indicatore
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar);
//---- Trasformazione di un array dinamico in un buffer di indici di colore  
   SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX);
//---- spostamento del punto di inizio del tracciamento dell'indicatore
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1);

//---- imposta l'array dinamico FAMABuffer come array di indicatori
   SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA);
//---- creazione di un'etichetta da visualizzare nella DataWindow
   PlotIndexSetString(2,PLOT_LABEL,"Signal Line");
//---- spostamento del punto di inizio del tracciamento dell'indicatore
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1);

//---- inizializzazioni delle variabili per il nome abbreviato dell'indicatore
   string shortname;
   StringConcatenate(shortname,"Center of Gravity(",Period_,")");
//---- creazione di un nome da visualizzare in una finestra secondaria separata e in un tooltip
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- imposta la precisione di visualizzazione dei valori dell'indicatore
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----
  }
//+------------------------------------------------------------------+
//| Funzione di iterazione dell'indicatore personalizzato                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // numero di barre nella cronologia al tick corrente
                const int prev_calculated,// numero di barre calcolato alla chiamata precedente
                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[])
  {
//---- verifica che il numero di barre sia sufficiente per il calcolo
   if(rates_total<StartBar) return(0);

//---- Dichiarazione di variabili con valore in virgola mobile 
   double price_,sma,lwma;
//---- Dichiarazione delle variabili intere
   int first1,first2,first3,bar;

//---- Inizializzazione dell'indicatore nel blocco OnCalculate()
   if(prev_calculated>rates_total || prev_calculated<=0)// verifica del primo avvio del calcolo di un indicatore
     {
      first1=0; // numero iniziale per il calcolo di tutte le battute del primo ciclo
      first2=Period_+1; // numero iniziale per il calcolo di tutte le barre delle linee di segnale
      first3=Period_+SmoothPeriod+3; // numero iniziale per il calcolo di tutte le barre del ciclo di colorazione
     }
   else // numero iniziale per il calcolo delle nuove barre
     {
      first1=prev_calculated-1;
      first3=first1;
     }

//---- CORREZIONE (aggiuntiva): il parametro "begin" della chiamata alla funzione jelvonal (Signal Line) della serie MASeries è sempre
//---- deve essere la stessa soglia di affidabilità FISSA (Period_+1) – originariamente attiva
//---- il ticknél puntava erroneamente al valore "first1" in continua evoluzione (ovvero all'indice della candela corrente)
//---- Impostato in modo che ad ogni tick effettivo corrispondesse la candela elaborata, confondendo il
//---- La logica della classe "meddig megbízható az adat" di belső simító - per questo motivo era instabile/difettosa
//---- il valore iniziale di una linea di riferimento, e per questo motivo "migliora" solo dopo un cambio di TF (ricalcolo completo).
   first2=Period_+1;

//---- dichiarazione delle variabili della classe Moving_Average
   static CMoving_Average MA,LWMA,SIGN;

//---- Ciclo principale di calcolo della linea centrale del canale
   for(bar=first1; bar<rates_total; bar++)
     {
      //---- Richiama la funzione PriceSeries per ottenere la "serie" di prezzi in ingresso
      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 principale della colorazione della linea di segnale
   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);
  }
//+------------------------------------------------------------------+