Indicateurs: Centre de gravité Ehlers - Centre de gravité J. F. Ehlers

 

Centre de gravité Ehlers - Centre de gravité J. F. Ehlers:

Le centre de gravité est un oscillateur mis au point par John Ehlers et présenté dans le numéro de mai 2002 de Stocks & Commodities.

Centre de gravité Ehlers - Centre de gravité J. F. Ehlers

Author: Nikolay Kositsin

 
C'est utile ! ...J'aimerais connaître les critères de changement de couleur.
 

Bonjour,

Cet oscillateur est très bien, mais j'ai des problèmes avec lui.

La fin de la ligne de signal, qui est calculée par la dernière bougie n'est pas affichée, donc il affiche toujours du rouge à l'heure actuelle. Lorsque je réinitialise l'oscillateur, il affiche de bonnes valeurs pendant un moment avec la fin de la ligne de signal, mais il repasse ensuite au rouge, (même s'il doit afficher le vert).

Que dois-je faire pour éliminer ce problème ?

J'ai essayé de le redéboguer mais cela n'a pas aidé.

Salutations,

InfiniteDesign

 
A son avis cet indicateur qui fonctionne avec mehor et symbole et timeframe.
Quelles sont les meilleures valeurs pour les paramètres de cet indicateur ?
 

Merci beaucoup pour cet excellent indicateur.

J'ai trouvé la version précédente aussi intéressante et utile que la nouvelle, voire même plus...

Pourriez-vous, s'il vous plaît, porter l'ancienne version sur mq5 également ? J'apprécierais grandement que cela soit fait.


Merci d'avance !

 
Cet indicateur n'est pas déterministe. Demandez les mêmes points de données deux fois, à des moments différents, et vous obtiendrez des réponses différentes. La dérive est plus importante lorsque l'on se rapproche de l'heure actuelle. L'incohérence peut atteindre 3,7 x 10^-04.
 
InfiniteDesign:

Bonjour,

Cet oscillateur est très bien, mais j'ai des problèmes avec lui.

La fin de la ligne de signal, qui est calculée par la dernière bougie n'est pas affichée, donc il affiche toujours du rouge à l'heure actuelle. Lorsque je réinitialise l'oscillateur, il affiche de bonnes valeurs pendant un moment avec la fin de la ligne de signal, mais il repasse ensuite au rouge, (même s'il doit afficher le vert).

Que dois-je faire pour éliminer ce problème ?

J'ai essayé de le redéboguer mais cela n'a pas aidé.

Salutations,

InfiniteDesign

J'ai le même problème...
 

J'ai essayé de créer un signal à partir de cet indicateur, mais je n'y suis pas parvenu...

Une aide ?


//+------------------------------------------------------------------+
//|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 se trouve dans le fichier ExpertSignal
#property tester_indicator "CenterOfGravity.ex5"
// description de l'assistant début
//+------------------------------------------------------------------+
//| Description de la classe|
//| Titre=Signaux du centre de gravité|
//| Type=SignalAdvanced|
//| Nom=Mon_COG|
//| Nom court=CG|
//| Classe=COG|
//| Page=Non nécessaire|
//| Paramètre=Période_,int,10,Période de calcul de la moyenne de l'indicateur.
//| Paramètre=SmoothPeriod,int,3,Période de lissage de la ligne de signal |
//| Paramètre=MA_Method_,ENUM_MA_METHOD,MODE_EMA,Méthode de signal |
//| Paramètre=PrixAppliqué,int,1,Constante de prix |
//+------------------------------------------------------------------+
// description de l'assistant end
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
class COG : public CExpertSignal
  {
private:
CiCustom             m_COG;               // L'indicateur en tant qu'objet
//--- Paramètres configurables du module
   int               m_Period_;           // Période de calcul de la moyenne de l'indicateur
   int               m_SmoothPeriod;      // Période de lissage de la ligne de signal 
   ENUM_MA_METHOD    m_MA_Method_;        // Méthode de calcul de la moyenne de la ligne de signal
   int               m_AppliedPrice;      // Constante de prix
public:
                     COG(void);
                    ~COG(void);
//--- Vérification de l'exactitude des données d'entrée
   bool              ValidationSettings();
//--- Création d'indicateurs et de séries temporelles pour le module de signaux
   bool              InitIndicators(CIndicators *indicators);
//--- Accès aux données de l'indicateur
   double            CG(const int index)                 const { return(m_COG.GetData(0,index)); }
   double            Signal(const int index)             const { return(m_COG.GetData(1,index)); }   
//--- Vérification des conditions d'achat et de vente
   virtual int       LongCondition();
   virtual int       ShortCondition();
//--- Méthodes de paramétrage
   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:
   //--- Création d'un indicateur
   bool              CreateCOG(CIndicators *indicators);



  };
//+------------------------------------------------------------------+
//| Constructeur|
//+------------------------------------------------------------------+
COG::COG(void) :           m_Period_(10),                // Période de calcul de la moyenne de l'indicateur
                           m_SmoothPeriod(3),            // Période de lissage de la ligne de signal 
                           m_MA_Method_(MODE_EMA),       // Méthode de calcul de la moyenne de la ligne de signal
                           m_AppliedPrice(1)             // Constante de prix
  {
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
COG::~COG()
  {
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Vérifie les paramètres d'entrée et renvoie true si tout est OK |
//+------------------------------------------------------------------+
bool COG:: ValidationSettings()
  {
   //--- Appeler la méthode de la classe de base
   if(!CExpertSignal::ValidationSettings())  return(false);
   //--- Périodes de contrôle, nombre de barres pour le calcul du MA >=1
   if(m_Period_<1)
     {
      PrintFormat("Incorrect value set for one of the period! Period_=%d",
                  m_Period_);
      return false;
     }
//--- Périodes de contrôle, nombre de barres pour le calcul du MA >=1
   if(m_SmoothPeriod<1)
     {
      PrintFormat("Incorrect value set for one of the period! m_SmoothPeriod=%d",
                  m_SmoothPeriod);
      return false;
     }
//--- Le type de lissage Fast MA doit être l'une des quatre valeurs de l'énumération
   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 doit être valide
   if(m_AppliedPrice<1 || m_AppliedPrice>11) 
     {
      PrintFormat("Invalid type of Price!");
      return false;
     }
//--- Toutes les vérifications sont terminées, tout va bien
   return true;
  }
//+------------------------------------------------------------------+
//| Crée des indicateurs|
//| Entrée : un pointeur vers une collection d'indicateurs.
//| Sortie : true si succès, sinon false |
//+------------------------------------------------------------------+
bool COG::InitIndicators(CIndicators *indicators)
  {
//--- Contrôle standard de la collection d'indicateurs pour NULL
   if(indicators==NULL) return(false);
//--- Initialisation des indicateurs et des séries temporelles dans les filtres supplémentaires
   if(!CExpertSignal::InitIndicators(indicators)) return(false);
//--- Création de nos indicateurs
   if(!CreateCOG(indicators))                  return(false);   
//--- Cette partie a été atteinte, la fonction a donc réussi, renvoyer vrai
   return(true);
  }
//+------------------------------------------------------------------+
//| Crée l'indicateur "COG".|
//+------------------------------------------------------------------+
bool COG::CreateCOG(CIndicators *indicators)
  {
//--- Vérification du pointeur
   if(indicators==NULL) return(false);
//--- Ajout d'un objet à la collection
   if(!indicators.Add(GetPointer(m_COG)))
     {
      printf(__FUNCTION__+": Error adding an object of the COG");
      return(false);
     }
//--- Paramètres de réglage du 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_;                 // Période
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SmoothPeriod;            // Période de lissage de la ligne de signal
   parameters[3].type=TYPE_INT;
   parameters[3].integer_value=m_MA_Method_;              // Méthode de calcul de la moyenne de la ligne de signal
   parameters[4].type=TYPE_INT;
   parameters[4].integer_value=m_AppliedPrice;            // Constante de prix
//--- Initialisation de l'objet 
   if(!m_COG.Create(m_symbol.Name(),0,IND_CUSTOM,5,parameters))
     {
      printf(__FUNCTION__+": Error initializing the object of the COG");
      return(false);
     }
//--- Nombre de tampons
   if(!m_COG.NumBuffers(2)) return(false);
//--- Cette partie a été atteinte, la fonction a donc réussi, renvoyer vrai
   return(true);
  }
//+------------------------------------------------------------------+
//| Renvoie la force du signal d'achat|
//+------------------------------------------------------------------+
int COG::LongCondition()
  {
   int signal=0;
//--- Pour le fonctionnement avec des ticks idx=0, pour le fonctionnement avec des barres formées idx=1
   int idx=StartIndex();
//--- Valeurs des COG à la dernière barre formée
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valeurs des COG à l'avant-dernière barre formée
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---Si CG > Signal && CG-1 < Signal-1
   if((last_fast_value>last_slow_value) && (prev_fast_value<prev_slow_value))
     {
      signal=100; // Il y a un signal d'achat
     }
//--- Retourner la valeur du signal
   return(signal);
  }
//+------------------------------------------------------------------+
//| Renvoie la force du signal de vente|
//+------------------------------------------------------------------+
int COG::ShortCondition()
  {
   int signal=0;
//--- Pour le fonctionnement avec des ticks idx=0, pour le fonctionnement avec des barres formées idx=1
   int idx=StartIndex();
//--- Valeurs des COG à la dernière barre formée
   double last_fast_value=CG(idx);
   double last_slow_value=Signal(idx);
//--- Valeurs des COG à l'avant-dernière barre formée
   double prev_fast_value=CG(idx+1);
   double prev_slow_value=Signal(idx+1);   
//---Si CG < Signal && CG-1 > Signal-1
   if((last_fast_value<last_slow_value) && (prev_fast_value>prev_slow_value))
     {
      signal=100; // Il y a un signal de vente
     }
//--- Retourner la valeur du signal
   return(signal);
  }
 
chose intéressante... il faut décider de l'algorithme dans des conditions de combat
 

L'indicateur est compilé sans erreur :

et il fonctionne -

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

Il faut juste utiliser le fichier smoothalgorithms.mqh - voir post


Indicators: T3Taotra_HTF
Indicators: T3Taotra_HTF
  • 2016.06.30
  • www.mql5.com
T3Taotra_HTF: Author: Nikolay Kositsin...
 
Bruno Pio #:
J'ai exactement le même problème...
J'ai reçu tellement de choses précieuses de la part de la communauté que je souhaite lui rendre la pareille.

C'est un indicateur génial (surtout si l'on tient compte des tendances à plus long terme). Je vous envoie la version améliorée, dont la fin n'est plus simplement rouge, et qui s'actualise correctement sur le graphique en temps réel.

Utilisez lebouton CODE (Alt-S) pour insérer du code.

Un modérateur a corrigé la mise en forme cette fois-ci. Veuillez formater correctement le code à l'avenir ; les messages contenant du code mal formaté risquent d'être supprimés.

/*
 * Le fichier SmoothAlgorithms.mqh doit être placé 
 * dans terminal_data_folder\MQL5\Include
 */
//+------------------------------------------------------------------+
//|                                            Centre de gravité.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright « Copyright © 2007, MetaQuotes Software Corp. »
#property link      "http://www.metaquotes.net"
//---- version de l'indicateur
#property version   "1.00"
//---- Affichage de l'indicateur dans une fenêtre distincte
#property indicator_separate_window
//---- Trois tampons sont utilisés pour le calcul et le tracé de l'indicateur
#property indicator_buffers 3
//---- deux graphiques sont utilisés
#property indicator_plots   2
//+----------------------------------------------+
//|  Paramètres de tracé des indicateurs                |
//+----------------------------------------------+
//---- Affichage de l'indicateur 1 sous la forme d'une ligne tricolore
#property indicator_type1 DRAW_COLOR_LINE
//---- utilisé pour les couleurs de ligne tricolores
#property indicator_color1 Gray,Lime,Red
//---- La ligne de l'indicateur 1 est une courbe continue
#property indicator_style1  STYLE_SOLID
//---- l'épaisseur du trait de l'indicateur 1 est égale à 1
#property indicator_width1  1
//---- affichage de l'étiquette de l'indicateur 1
#property indicator_label1  "Center of Gravity"
//+----------------------------------------------+
//|  Paramètres de tracé des indicateurs                |
//+----------------------------------------------+
//---- Affichage de l'indicateur 2 sous forme de ligne
#property indicator_type2   DRAW_LINE
//---- La couleur bleue est utilisée pour la ligne d'indicateur
#property indicator_color2  Blue
//---- La ligne de l'indicateur 2 est une courbe continue
#property indicator_style2  STYLE_SOLID
//---- L'épaisseur de la ligne de l'indicateur 2 est égale à 1
#property indicator_width2  1
//---- affichage de l'étiquette 2 de la ligne d'indicateur
#property indicator_label2  "Signal Line"
//---- le style de la ligne est une courbe en points et tirets
#property indicator_style2 STYLE_DASHDOTDOT
//+-----------------------------------+
//|  Paramètres d'entrée des indicateurs      |
//+-----------------------------------+
enum Applied_price_ //Type de constante
  {
   PRICE_CLOSE_ = 1,     //PRICE_CLOSE
   PRICE_OPEN_,          //COÛT D'OUVERTURE
   PRICE_HIGH_,          //PRICE_HIGH
   PRICE_LOW_,           //PRICE_LOW
   PRICE_MEDIAN_,        //PRIX_MÉDIAN
   PRICE_TYPICAL_,       //PRIX_TYPE
   PRICE_WEIGHTED_,      //POIDS DU PRIX
   PRICE_SIMPLE_,//PRICE_SIMPLE_
   PRICE_QUARTER_,       //PRIX_TRIMESTRIEL_
   PRICE_TRENDFOLLOW0_,  //PRICE_TRENDFOLLOW0_
   PRICE_TRENDFOLLOW1_   //PRICE_TRENDFOLLOW1_
  };
input int Period_=10;                          // Période de lissage de l'indicateur
input int SmoothPeriod=3;                      // Période de lissage de la ligne de signal
input ENUM_MA_METHOD MA_Method_=MODE_SMA;      // Méthode de moyennage des lignes de signal
input Applied_price_ AppliedPrice=PRICE_CLOSE_;// Constante de prix
/* , utilisé pour le calcul de l'indicateur ( 1-COURS DE CLÔTURE, 2-COURS D'OUVERTURE, 3-COURS HAUT, 4-LOW, 
  5-MEDIAN, 6-TYPICAL, 7-WEIGHTED, 8-SIMPLE, 9-QUARTER, 10-TRENDFOLLOW, 11-0,5 * TRENDFOLLOW.) */
//+-----------------------------------+
//---- Déclaration de tableaux dynamiques qui, par la suite,
//---- sera utilisé comme tampons indicateurs
double Ext1Buffer[];
double Ext2Buffer[];
double ColorExt2Buffer[];
//---- Déclaration des variables entières pour le début du calcul des données
int StartBar;
//+------------------------------------------------------------------+
//| Description de la fonction iPriceSeries                                |
//| Description de la classe Moving_Average                                 | 
//+------------------------------------------------------------------+ 
#include <SmoothAlgorithms.mqh> 
//+------------------------------------------------------------------+
//| Fonction d'initialisation d'un indicateur personnalisé                         |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- initialisation des constantes
   StartBar=Period_;
//---- Définir le tableau dynamique MAMABuffer comme tampon d'indicateurs
   SetIndexBuffer(0,Ext1Buffer,INDICATOR_DATA);
//---- Création d'une étiquette à afficher dans DataWindow
   PlotIndexSetString(0,PLOT_LABEL,"Center of Gravity");
//---- décalage du début du tracé de l'indicateur
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartBar);
//---- Conversion d'un tableau dynamique en tampon d'index de couleurs  
   SetIndexBuffer(1,ColorExt2Buffer,INDICATOR_COLOR_INDEX);
//---- décalage du début du tracé de l'indicateur
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,StartBar+1);

//---- Définir le tableau dynamique FAMABuffer comme tableau d'indicateurs
   SetIndexBuffer(2,Ext2Buffer,INDICATOR_DATA);
//---- Création d'une étiquette à afficher dans DataWindow
   PlotIndexSetString(2,PLOT_LABEL,"Signal Line");
//---- décalage du début du tracé de l'indicateur
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,StartBar+1);

//---- Initialisation des variables pour le nom abrégé de l'indicateur
   string shortname;
   StringConcatenate(shortname,"Center of Gravity(",Period_,")");
//---- Création d'un nom destiné à s'afficher dans une sous-fenêtre distincte et dans une info-bulle
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//---- Définir la précision d'affichage des valeurs de l'indicateur
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//----
  }
//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisé                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // nombre de barres dans l'historique à l'instant actuel
                const int prev_calculated,// nombre de barres calculé lors de l'appel précédent
                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[])
  {
//---- Vérification que le nombre de barres est suffisant pour le calcul
   if(rates_total<StartBar) return(0);

//---- Déclaration de variables à virgule flottante 
   double price_,sma,lwma;
//---- Déclaration de variables de type entier
   int first1,first2,first3,bar;

//---- Initialisation de l'indicateur dans le bloc OnCalculate()
   if(prev_calculated>rates_total || prev_calculated<=0)// Vérification du premier lancement du calcul d'un indicateur
     {
      first1=0; // nombre de départ pour le calcul de toutes les mesures de la première boucle
      first2=Period_+1; // nombre de départ pour le calcul de toutes les barres des lignes de signal
      first3=Period_+SmoothPeriod+3; // nombre de départ pour le calcul de toutes les barres de la boucle de coloration
     }
   else // nombre de départ pour le calcul des nouvelles barres
     {
      first1=prev_calculated-1;
      first3=first1;
     }

//---- CORRECTION (complémentaire) : le paramètre « begin » d'un appel de la série MASeries via une ligne de signal (jelvonal) est toujours
//---- Il faut que ce soit le même seuil de fiabilité « CONSTANT » (Period_+1) – tel qu’il était à l’origine
//---- Le compteur pointait par erreur vers la variable « first1 », qui change constamment (c'est-à-dire vers l'index de bougie actuel)
//---- Ce qui a été défini, et qui correspondait à chaque tick en temps réel à la bougie traitée, a semé la confusion dans le
//---- La logique de la classe « simító » de Belsó concernant la question « jusqu’à quand les données sont-elles fiables ? » – c’est pour cette raison qu’elle était instable/défectueuse
//---- la valeur actuelle de la ligne de référence, qui n'est donc « corrigée » qu'après un changement de TF (recalcul complet).
   first2=Period_+1;

//---- Déclaration des variables de la classe Moving_Average
   static CMoving_Average MA,LWMA,SIGN;

//---- Cycle principal de calcul de la ligne médiane du canal
   for(bar=first1; bar<rates_total; bar++)
     {
      //---- Appel de la fonction PriceSeries pour récupérer la « série » de cours d'entrée
      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);
     }

//---- Boucle principale de coloration de la ligne de signal
   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);
  }
//+------------------------------------------------------------------+