Problème avec l'indicateur ZigZag - page 2

 
J'ai oublié de mettre en évidence les valeurs de l'indicateur, le minimum correspond mais le maximum ne correspond pas comme j'ai essayé de le montrer dans le 2ème graphique...
 
aed71:

Le graphique ci-dessous montre la valeur minimale (la valeur du curseur, la valeur de la fenêtre de données et la sortie sont les mêmes).

Le graphique ci-dessous indique 6 ticks plus tard la partie la plus haute du graphique. La fenêtre de données et les points du curseur sont les mêmes, mais la sortie n'est pas la même et, de plus, elle renvoie à la fois la valeur basse et la valeur haute.

2ème

J'ai vérifié que iCustom() charge correctement l'indicateur. La valeur basse est la même mais pas la valeur haute. Cela pourrait-il être lié à l'indicateur ZigZag ?

Je ne comprends vraiment pas ce que je fais de mal.


Je ne vois qu'une seule valeur provenant de votre indicateur ZigZag.

Cette valeur, qu'est-ce que c'est ?

 
aed71:

Le graphique ci-dessous montre la valeur minimale (la valeur du curseur, la valeur de la fenêtre de données et la sortie sont les mêmes).

Le graphique ci-dessous indique 6 ticks plus tard la partie la plus haute du graphique. La fenêtre de données et les points du curseur sont les mêmes, mais la sortie n'est pas la même et, de plus, elle renvoie à la fois la valeur basse et la valeur haute.

2ème

J'ai vérifié que iCustom() charge correctement l'indicateur. La valeur basse est la même mais pas la valeur haute. Cela pourrait-il être lié à l'indicateur ZigZag ?

Je ne comprends vraiment pas ce que je fais de mal.

Vous utilisez le ZigZag de manière incorrecte dans votre exemple iCustom. Le ZigZag standard de MetQuotes a TROIS (pas deux) tampons (Modes ou Line Index dans iCustom)

  1. Mode = 0 : Maintient les points de zigzag haut et bas.
  2. Mode = 1 : Points hauts mais pas nécessairement seulement les points ZigZag (car il contient aussi les points de repeint).
  3. Mode = 2 : Points bas mais pas nécessairement seulement des points ZigZag (car il contient aussi des points de repeint).

Vous devrez comparer le premier tampon (Mode 0) avec les deux autres tampons afin de décider s'il s'agit d'un point haut ou d'un point bas (par exemple, si les tampons 1 et 3 ont la même valeur, il s'agit d'un point bas de ZigZag, et si les tampons 1 et 2 ont la même valeur, il s'agit d'un point haut).

De plus, afin de mieux comprendre le fonctionnement d'un ZigZag et la façon dont il se repeint, je vous suggère de jouer avec mon indicateur ZigZagZug. Cependant, dans votre code, utilisez le ZigZag de MetaQuotes, car il est plus rapide. Ma version fait plus de traitement à cause des fonctions supplémentaires et est donc plus lente.

PS ! Si le tampon 1 (Mode = 0) a une valeur de 0.0, mais que les autres tampons ont des valeurs non nulles, alors il s'agit d'anciens points de repeint et NON de points ZigZag.

Dans votre code, vous utilisez le tampon Mode 0 comme valeur basse et le tampon Mode 1 comme valeur haute. C'est totalement incorrect.

 
FMIC:

Vous utilisez le ZigZag de manière incorrecte dans votre exemple iCustom. Le ZigZag standard de MetQuotes a TROIS (et non deux) tampons (Modes ou Line Index dans iCustom).

  1. Mode = 0 : Maintient les points de zigzag haut et bas.
  2. Mode = 1 : Points hauts mais pas nécessairement seulement les points ZigZag (car il contient aussi les points de repeint).
  3. Mode = 2 : Points bas mais pas nécessairement seulement des points ZigZag (car il contient aussi des points de repeint).

Vous devrez comparer le premier tampon (Mode 0) avec les deux autres tampons afin de décider s'il s'agit d'un point haut ou d'un point bas (par exemple, si les tampons 1 et 3 ont la même valeur, il s'agit d'un point bas de ZigZag, et si les tampons 1 et 2 ont la même valeur, il s'agit d'un point haut).

De plus, afin de mieux comprendre le fonctionnement d'un ZigZag et la façon dont il se repeint, je vous suggère de jouer avec mon indicateur ZigZagZug. Cependant, dans votre code, utilisez le ZigZag de MetaQuotes, car il est plus rapide. Ma version fait plus de traitement à cause des fonctions supplémentaires et est donc plus lente.

PS ! Si le tampon 1 (Mode = 0) a une valeur de 0.0, mais que les autres tampons ont des valeurs non nulles, alors il s'agit d'anciens points de repeint et NON de points ZigZag.

Dans votre code, vous utilisez le tampon Mode 0 comme valeur basse et le tampon Mode 1 comme valeur haute. C'est totalement incorrect.


Regardez ici https://www.mql5.com/en/forum/149492/page2#912747 les barres extérieures sont un problème pour l'ancien code Zigzag.

La ligne jaune donne une meilleure idée de la façon dont le zigzag doit s'afficher.

 
deVries:


Regardez ici https://www.mql5.com/en/forum/149492/page2#912747 les barres extérieures sont un problème pour l'ancien code Zigzag.

La ligne jaune donne une meilleure idée de la façon dont le zigzag doit s'afficher.


Les barres extérieures n'ont rien à voir avec le dilemme actuel de "aed71". Son utilisation du Zigzag est tout simplement incorrecte.

S'il vous plaît, ne vous écartez pas du problème actuel car vous ne feriez qu'embrouiller la situation.

En outre, j'ai également donné un lien vers mon code ZigZagZug qui n'a pas ce problème.

 
FMIC:

Vous utilisez le ZigZag de manière incorrecte dans votre exemple iCustom. Le ZigZag standard de MetQuotes a TROIS (et non deux) tampons (Modes ou Line Index dans iCustom).

  1. Mode = 0 : Maintient les points de zigzag haut et bas.
  2. Mode = 1 : Points hauts mais pas nécessairement seulement les points ZigZag (car il contient aussi les points de repeint).
  3. Mode = 2 : Points bas mais pas nécessairement seulement des points ZigZag (car il contient aussi des points de repeint).

Vous devrez comparer le premier tampon (Mode 0) avec les deux autres tampons afin de décider s'il s'agit d'un point haut ou d'un point bas (par exemple, si les tampons 1 et 3 ont la même valeur, il s'agit d'un point bas de ZigZag, et si les tampons 1 et 2 ont la même valeur, il s'agit d'un point haut).

De plus, afin de mieux comprendre le fonctionnement d'un ZigZag et la façon dont il se repeint, je vous suggère de jouer avec mon indicateur ZigZagZug. Cependant, dans votre code, utilisez le ZigZag de MetaQuotes, car il est plus rapide. Ma version fait plus de traitement à cause des fonctions supplémentaires et est donc plus lente.

PS ! Si le tampon 1 (Mode = 0) a une valeur de 0, mais que les autres tampons ont des valeurs, alors ce sont d'anciens points de repeint.


Super, merci pour ces conseils importants ! Maintenant je comprends pourquoi ça ne marche pas...

Je pense que le code original de Metaquotes ZigZag n'est pas correct puisqu'il n'a que 2 tampons. Je pensais donc que l'un d'eux devrait être haut et l'autre bas...

En fait, le titre ne correspond pas non plus, je l'ai vu récemment. Quelqu'un devrait le vérifier !

Je me réfère au code ici https://www.mql5.com/en/code/7796

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer[shift]=val;
      //--- high
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0; 
              } 
           }
        }
      ExtMapBuffer2[shift]=val;
     }

   // final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         res=ExtMapBuffer2[shift];
         if(res!=0.0) ExtMapBuffer[shift]=res;
        }
     }
  }
 
aed71:


Super, merci pour ces conseils importants ! Maintenant je comprends pourquoi ça ne marche pas...

Je pense que le code original de Metaquotes ZigZag n'est pas correct puisqu'il n'a que deux tampons. Je pensais donc que l'un d'eux devrait être haut et l'autre bas...

En fait, j'ai vu récemment que le titre ne correspondait pas non plus. Quelqu'un devrait le vérifier !

Je me réfère au code ici https://www.mql5.com/en/code/7796


N'utilisez pas ce code ! C'est de l'ancien !

Utilisez le code qui est actuellement poussé par les LiveUpdates. Utilisez la version 600+ actuelle ou au moins la version 509.

PS ! NB ! De même, utilisez simplement "ZigZag" dans le nom et non "ZigZag.ex4" dans l'iCustom.

 
FMIC:


N'utilisez pas ce code ! C'est de l'ancien !

Utilisez le code qui est actuellement poussé par les LiveUpdates. Utilisez la version 600+ actuelle ou au moins la version 509.

PS ! NB ! De même, utilisez simplement "ZigZag" dans le nom et non "ZigZag.ex4" dans l'iCustom.


Salut FMIC,

Merci pour ces conseils. J'ajoutais ex4 à la fin du fichier pour ne pas oublier de le compiler. Malheureusement mon nouveau build 610 ZigZag a été remplacé par l'ancien.

J'ai décidé d'utiliser le vôtre, puisque le temps n'est pas un problème pour moi. Je rencontre quelques problèmes ici aussi, j'apprécierais que vous puissiez me guider.

J'ai utilisé le même code que celui indiqué ci-dessus, j'ai juste changé le nom du fichier avec votre version. J'utilise les paramètres 6,5,3 ; c'est la seule différence avec vos paramètres par défaut.

J'ai rencontré quelques problèmes :

Tout d'abord, l'indicateur se charge chaque fois à chaque tick pour lire les valeurs zh,zl. Et à la fin, il relâche tous les chargements (ce que vous ne pouvez pas voir sur l'image) en indiquant quelque chose comme "2014.02.22 09:35:09.171 2013.11.01 22:55 Custom indicator ZigZagZug EURUSD,M15 : removed". Veuillez vous référer au fichier journal que j'ai joint. Est-ce que cela cause des problèmes de mémoire par la suite ?

Deuxièmement, dans le journal, le compteur cnt est passé de cnt8 à cnt84, ce qui est étrange. Dans les journaux, il ne fait pas de saut. Je pense que je dois considérer les journaux comme des valeurs correctes.

La troisième et la plus critique est qu'il a trouvé deux points bas en conséquence, ce qui ne devrait pas être le cas. Dans la figure, je veux obtenir les valeurs hautes et basses des lignes grises en zigzag, mais lorsque je note toutes les valeurs hautes et basses dans le journal, elles sont exactement les mêmes avec vos points de couleur rose et cyan. Cependant, je n'ai besoin que des valeurs en zigzag. J'ai vérifié les autres tampons mais ils n'ont pas apporté les bonnes valeurs. Avez-vous des suggestions ? Ou dois-je utiliser le zigzag classique (pour le build 610) ?

Merci.

ZigZagZug

 
aed71:


Salut FMIC,

Merci pour les conseils. J'ajoutais ex4 à la fin du fichier pour ne pas oublier de le compiler. Malheureusement, mon nouveau build 610 ZigZag a été remplacé par l'ancien.

J'ai décidé d'utiliser le vôtre, puisque le temps n'est pas un problème pour moi. Je rencontre quelques problèmes ici aussi, j'apprécierais que vous puissiez me guider.

J'ai utilisé le même code que celui indiqué ci-dessus, j'ai juste changé le nom du fichier avec votre version. J'utilise les paramètres 6,5,3 ; c'est la seule différence avec vos paramètres par défaut.

Avez-vous des suggestions ? Ou dois-je opter pour le zigzag classique (pour la version 610 ?)?

Merci.

Il n'y a rien de mal à utiliser le nouveau zigzag 610. En fait, je vous encourage à l'utiliser afin qu'il soit compatible avec les futures versions. N'utilisez pas l'ancien ou même le mien.

Mon indicateur ZigZagZug utilise des paramètres supplémentaires et dans un ordre et un type différents, donc vous ne pouvez pas simplement utiliser un iCustom similaire à celui que vous utilisez actuellement. Il est complètement différent.

J'utilise également 7 buffers dans l'indicateur pour les fonctionnalités supplémentaires. Il est censé être utilisé comme un outil d'apprentissage visuel pour comprendre le ZigZag et pas vraiment pour être utilisé dans un EA.

PS ! Il est normal qu'un indicateur se charge et se décharge plusieurs fois pendant un back-test d'une EA utilisant iCustom. Tout dépend de la façon dont l'EA et l'Indicateur sont codés. Afin d'éviter cela et de rendre un EA plus rapide, je recode habituellement seulement le code essentiel dans l'EA lui-même afin de ne pas dépendre d'indicateurs externes, mais c'est une autre question qui n'est pas directement liée à votre cas. Juste une suggestion pour vos futurs EAs.

 
aed71:


Hi FMIC,

... Je veux obtenir les valeurs hautes et basses des lignes grises en zigzag mais lorsque je note toutes les valeurs hautes et basses dans le journal, elles sont exactement les mêmes avec vos points de couleur rose et cyan. Cependant, je n'ai besoin que des valeurs des zigzags. ...

Merci.


Comme nous l'avons déjà expliqué dans un précédent message, vous ne pouvez pas vous contenter d'utiliser les tampons High et Low pour obtenir les points ZigZag, car ils comprennent également des points repeints (cercles aqua et magenta sur ZigZagZug). Sur le ZigZag standard, c'est également le cas, mais vous ne les voyez pas. C'est pourquoi mon indicateur les montre pour que vous puissiez mieux le comprendre.

Vous devez comparer les tampons High et Low au premier qui contient les DEUX Low et Highs afin de filtrer UNIQUEMENT les points ZigZag.

NB ! Vous devrez comparer le premier tampon (Mode 0) avec les deux autres tampons afin de décider s'il s'agit d'un point haut ou d'un point bas (par exemple, si les tampons 1 et 3 ont la même valeur, il s'agit d'un point de zigzag bas, et si les tampons 1 et 2 ont la même valeur, il s'agit d'un point haut).

Si vous voulez, joignez votre fichier à un message, et je le corrigerai pour que vous puissiez voir comment l'utiliser correctement (joignez-le, n'utilisez pas de SRC pour ne pas allonger le message).