[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 29

 
hoz:

Pouvez-vous me dire comment tirer des valeurs d'un indicateur en zig-zag ? Comment cela est-il mis en œuvre en général ? C'est-à-dire si je veux prendre un certain extremum, et pas seulement le dernier.

Par exemple, je veux maintenant attacher ce zigzag à mon conseiller expert :

Je comprends que je dois utiliser la fonctioniCustom car elle est habituellement utilisée pour adresser un indicateur personnalisé, mais la question est de savoir comment connecter les nœuds...

Le tampon recherche la valeur NEUTRE(EMPTY_VALUE) selon le principe :

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
et l'accès au tampon de l'indicateur via iCustom().
 
TarasBY:

Le tampon recherche une valeur EMPTY_VALUE selon le principe :

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

et le tampon de l'indicateur est accessible via iCustom().


C'est logique. Mais il sera recherché de cette manière jusqu'à ce que nous tombions sur une valeur non vide. Et si, par exemple, je, et, en fait, je veux non pas la dernière valeur non vide, c'est-à-dire non pas le dernier extremum, mais un autre... Par exemple, ici dans la capture d'écran :

 
hoz:


C'est logique. Mais de cette façon, la recherche se fera jusqu'à ce que nous tombions sur une valeur non vide. Et si, par exemple, je, et, en fait, je veux non pas la dernière valeur non vide, c'est-à-dire non pas le dernier extremum, mais un autre... Par exemple, ici dans la capture d'écran :

Il faut introduire le compteur d'extrema dans la boucle et rompre la boucle par le nombre d'extremum (valeur non vide dans une rangée).
 
TarasBY:
Introduisez un compteur d'extremum dans la boucle et au nombre d'extremum (valeur non vide dans une rangée), interrompez la boucle.

Je l'ai. Merci. Il s'agit maintenant de mettre tout cela en pratique. Je comprends l'essentiel, mais mon esprit est plein de filtres qui me font bouillir le cerveau...
 
hoz:

Je l'ai. Merci. Nous devons maintenant l'appliquer dans la pratique. J'ai l'idée, mais il y a tellement de filtres dans mon esprit que mon cerveau est en ébullition...

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Si vous avez besoin du numéro de barre du pic, changez le type de fonction en int et au lieu de return(ind) ; écrivez return(i) ;

Notez également que si vous utilisez i dans votre code, en particulier dans les recherches (comme dans le tutoriel), changez i dans cette fonction par n'importe quelle autre variable, par exemple k.

Et assurez-vous de configurer iCustom dans la fonction de votre indicateur.

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


Si vous avez besoin du numéro de barre du pic, changez le type de fonction en int et au lieu de return(ind) ; écrivez return(i) ;

Notez également que si vous utilisez i dans votre code, en particulier dans les recherches (comme dans le tutoriel), changez i dans cette fonction par n'importe quelle autre variable, par exemple k.

Et assurez-vous de configurer iCustom dans la fonction de votre indicateur.

Nikolaï, c'est intéressant, bien sûr, vous avez écrit la condition. Je le regarde et je pense...

if(ind!=0) n--;

else

if(ind!=0) return(ind);

Il s'avère que si le tampon de l'indicateur personnalisé a retourné la valeur zéro, alors n--, et si letampon de l'indicateur personnalisé a retourné la valeur zéro, alors ... nous retournons la valeur du tampon indicateur.

Mais les conditions sont les mêmes. Et là et ainsi si ce n'est pas zéro...

 
hoz:

Nikolaï, c'est intéressant, bien sûr, vous avez la condition écrite. En le regardant, je pense...

Il s'avère que si le tampon de l'indicateur personnalisé renvoie une valeur de zéro, alors n--, et si letampon de l'indicateur personnalisé renvoie une valeur de zéro, alors ... nous retournons la valeur du tampon indicateur.

Mais les conditions sont les mêmes. Et là et ainsi si ce n'est pas zéro...

Les bretelles sont tombées en essayant d'insérer le code correctement :

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

Si n>1 {

si le tampon n'est pas vide, alors soustraire 1 de n

} dans l'autre sens.

si le tampon n'est pas vide, retourner sa valeur

}

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


ou comme ceci, qui est plus succinct. Je suis obsédé par la vitesse et la beauté du code, ne vous gênez pas pour moi ;)
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


ou comme ceci, qui est plus succinct. Je suis obsédé par la vitesse et la beauté du code, ne vous en déplaise).


En général, tout va bien dans les deux sens. J'ai juste l'habitude d'écrire le code un peu différemment, il est plus facile à lire de cette façon alors que le vôtre est différent. La première parenthèse dans chacun de vos codes ne bouge pas. Je l'ai mis dans mon EDITOR et tout est à sa place comme ça :

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


En fait, tout va bien dans les deux sens. J'ai juste l'habitude d'écrire du code d'une manière différente : il est plus facile à lire de cette manière, alors que votre code est différent. La première parenthèse dans chacun de vos codes ne bouge pas. Je l'ai mis dans l'éditeur et tout est à sa place dans ce formulaire :


quand le code dépasse 1000 lignes, on commence à écrire de manière compacte).

Dans MT4 aussi, les performances se dégradent, notamment lors des tests. La version laconique est plus rapide.