Problème avec l'indicateur ZigZag

 

Bonjour,

J'essaie de développer un expert qui creuse les données historiques (pic et bas) pour être utilisé pour mon expert principal. J'ai décidé d'utiliser l'indicateur zigzag car il est simple et trouve facilement les hauts et les bas.

Mon problème est que, lorsque j'appelle le ZigZag.ex4 en utilisant la fonction iCustom(), je ne peux pas obtenir les valeurs correctes de haut et bas. Afin d'éviter de repeindre, j'ai utilisé l'indice 20 de l'indicateur iCustom() comme protection de base pour le repeuplement.

Il y a deux tampons dans le code ZigZag (en utilisant la version métaquotes https://www.mql5.com/en/code/7796 ). Je pourrais prendre les valeurs hautes et basses opposées mais cela n'a pas trop d'importance pour le moment.

Certaines des valeurs correspondent au code, d'autres non, et dans le journal, je peux voir les deux valeurs, haute et basse, dans la même colonne, ce qui n'est pas possible.

ZigZag

Mon code est ci-dessous :

//+------------------------------------------------------------------+
//|                                                 ZigZagDigger_02  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
/* 

*/

#include <stderror.mqh>
#include <stdlib.mqh>
    
int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

int init()
  {
   ArrayInitialize(Zig_high,0);
   ArrayInitialize(Zig_low,0);
   return(0);
 } 
   
int deinit()
{ 
   return(0);
}

void start()
  {
  
   static datetime tmp;
  

   //  On every tick
   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop
         
   
  }

Je me demande si j'utilise mal l'indicateur zig zag ou si j'ai fait une erreur dans le code ? Je n'ai pas pu trouver le problème donc je vous demande gentiment de m'aider à identifier mon problème.

Merci

 
aed71:

Bonjour,

J'essaie de développer un expert qui creuse les données historiques (pic et bas) pour être utilisé pour mon expert principal. J'ai décidé d'utiliser l'indicateur zigzag car il est simple et trouve facilement les hauts et les bas.

Mon problème est que, lorsque j'appelle le ZigZag.ex4 en utilisant la fonction iCustom(), je ne peux pas obtenir les valeurs correctes de haut et bas. Afin d'éviter de repeindre, j'ai utilisé l'indice 20 de l'indicateur iCustom() comme protection de base pour le repeuplement.

Il y a deux tampons dans le code ZigZag (en utilisant la version métaquotes https://www.mql5.com/en/code/7796 ). Je pourrais prendre les valeurs hautes et basses opposées mais cela n'a pas trop d'importance pour le moment.

Certaines des valeurs correspondent au code, d'autres non, et dans le journal, je peux voir les deux valeurs, haute et basse, dans la même colonne, ce qui n'est pas possible.

Mon code est ci-dessous :

Je me demande si j'utilise mal l'indicateur zig zag ou si j'ai fait une erreur dans le code ? Je n'ai pas pu trouver le problème donc je vous demande gentiment de m'aider à identifier mon problème.

Merci

Pouvez-vous dire en lisant le code MACD Sample comment fonctionne cet EA ?

Il me semble que vous n'avez jamais essayé ....

Ce que vous avez écrit est comme si je faisais quelque chose ..... sans savoir ce qui se passe Pouvez-vous me dire ce que j'ai fait ?

Chaque boucle de tic, quelle est votre boucle de tic ?

Ceci ?

   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop

Oui, alors où est la boucle ?

non alors explique ligne par ligne ce que signifie ton code...

 
aed71: Je me demande si j'utilise mal l'indicateur zig zag ou si j'ai fait une erreur dans le code ?
  1. Si vous aviez cherché dans le forum, vous auriez trouvé votre réponse.
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZag ne remplit pas chaque élément de la mémoire tampon (il utilise DRAW_SECTION.) Faites votre appel dans une boucle jusqu'à ce que vous trouviez le décalage qui a une valeur non nulle.
 
WHRoeder:
  1. Si vous aviez cherché dans le forum, vous auriez trouvé votre réponse.
  2. ZigZag ne remplit pas tous les éléments du tampon (il utilise DRAW_SECTION.) Faites votre appel en boucle jusqu'à ce que vous trouviez le décalage qui a une valeur non nulle.


Oui, je sais qu'il ne remplit pas tous les éléments du tampon. Je veux placer toutes les données dans un tableau, y compris les zéros (s'il n'y a pas de valeur haute et basse) et aussi les valeurs haute et basse. La raison pour cela est que je voudrais avoir un autre processus dans deinit() pour calculer la différence de tick entre le haut et le bas en utilisant les tableaux. Je veux dire, par exemple, combien de ticks se sont écoulés entre deux sommets et la différence entre le haut et le bas. Mais je ne peux pas encore arriver à ce stade.

Pourquoi renvoie-t-il à la fois le haut et le bas en même temps comme je l'ai imaginé dans l'image (la partie du journal avec la marque ? ?? à côté ?) Et ces valeurs ne correspondent à aucun haut ou bas... C'est mon principal problème...

Merci

 
deVries:

Pouvez-vous dire en lisant le code MACD Sample comment fonctionne cet EA ?

Il me semble que vous n'avez jamais essayé ....

Ce que vous avez écrit est comme si je faisais quelque chose ..... sans savoir ce qui se passe Pouvez-vous me dire ce que j'ai fait ?

Chaque boucle de tic, quelle est votre boucle de tic ?

Ceci ?

Oui, alors où est la boucle ?

non alors explique ligne par ligne ce que signifie ton code...

Je ne pense pas avoir de problème avec la boucle, la boucle fonctionne et imprime les résultats. Elle vérifie la période (15M dans mon cas) et calcule les valeurs de zigzag et les imprime. Veuillez vérifier dans le rectangle vert comment elle fonctionne toutes les 15 minutes. La fonction Start() elle-même est une boucle, n'est-ce pas ?

Tous les 15M

 
aed71:

Je ne pense pas que j'ai un problème avec la boucle, la boucle fonctionne et imprime les résultats. Elle vérifie le délai (15M dans mon cas) et calcule les valeurs zigzag et imprime. Veuillez vérifier dans le rectangle vert comment elle fonctionne toutes les 15 minutes. La fonction Start() elle-même est une boucle, n'est-ce pas ?



Vous avez raison, la fonction Start() elle-même est une boucle.

Mais où commence cette boucle et où se termine la fonction Start() ?

c'est quelque part ailleurs ...

les messages que vous avez imprimés ne sont pas répétés à chaque tick ....

Alors qu'est-ce que vous faites ...... ??

Essayez d'expliquer les lignes de votre code ..... autant que vous le pouvez

 
deVries:


Vous avez raison, la fonction Start() elle-même est une boucle.

mais où commence cette boucle et où se termine la fonction Start() ? ?

c'est quelque part ailleurs ...

Les messages que vous avez imprimés ne sont pas répétés à chaque tick ....

Alors qu'est-ce que vous faites ...... ??

Essayez d'expliquer les lignes de votre code ..... autant que vous le pouvez.


Mes excuses si je n'ai pas pu expliquer correctement.

Cet expert est destiné à être utilisé pour un backtest et mon but est de trouver les plus hauts et les plus bas historiques dans le graphique 15M. Je vais ensuite retraiter les données des hauts et des bas pour calculer la phase et l'amplitude du graphique.

Ce que j'ai fait ; j'ai utilisé deux tableaux pour stocker les valeurs hautes et basses et un compteur pour compter les ticks. La taille du tableau est de 1000, ce qui est plus que suffisant puisque je le fais tourner pendant 2 jours maximum (1440/15=96 ticks par jour).

int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

Dans la fonction init(), je remplis les tableaux avec zéro.

dans la fonction start() je vérifie si un nouveau tick s'est déclenché avec le code suivant

 if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];

   // the code here runs every 15M.

   }

Ainsi la fonction start() a une boucle continue jusqu'à ce que le backtest (2 jours) soit finalisé.

Mon principal problème est d'appeler le ZigZag, je pense. Ci-dessous, j'appelle l'indicateur zigzag. Normalement, s'il y a un haut ou un bas, il devrait retourner une valeur non nulle. Mais dans mon cas, il renvoie parfois le haut et le bas avec la même valeur, ce qui est impossible.


  double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

  Zig_high[cnt]=zh;
  Zig_low[cnt]=zl;
  cnt=cnt+1;

Peut-être que je n'ai pas compris les tableaux utilisés dans l'indicateur original Metaquotes zigzag (voir ci-dessous). Je crois comprendre qu'ils sont utilisés pour stocker les valeurs hautes et basses.

//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

Merci

 

Prenez le temps de lire et d'apprendre

Ceci pourrait vous aider aussi un peu

Explication détaillée d'iCustom

 
Je joins également mon code...
Dossiers :
 
Qu'est-ce que l'affichage de la fenêtre de données ?
 
deVries:
Qu'est-ce que la fenêtre de données affiche ?

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).

1er

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ème2è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.

Raison: