Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 589

 
Alexey Viktorov:

1. J'ai dit vérifier, pas remplacer. iFractals renvoie 0 s'il n'y a pas de fractale. Je ne l'utilise pas régulièrement et, naturellement, je n'encombre pas les restes non desséchés de ma mémoire avec de telles futilités.

2. La fonction, bien qu'horriblement écrite, fonctionne toujours correctement.

3. La dernière valeur est affichée dans Commentaire. Remplacez-le par.

et voir combien de fois il s'imprime

Beaucoup, mais jamais faux. Comme si la condition était toujours remplie. Mais il devrait être faux.

 
Ghabo:

Beaucoup, mais jamais faux. C'est comme si la condition était toujours remplie. Mais il devrait être faux, dans la capture d'écran, la situation contredit la condition, mais vrai.


Dans la capture d'écran, la première fractale et la seconde sont marquées. Mais selon la condition, la fonction cherche plus loin jusqu'à ce qu'elle trouve celle qui se trouve en dessous de la première. Et la quatrième fractale est plus basse que la première... C'est ce que dit la condition.

Si la condition est complétée par

      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1)
         return(true);
          else break;
        }

L'impression sera également fausse.

 
Alexey Viktorov:

La première fractale et la deuxième fractale sont marquées dans la capture d'écran. Mais selon la condition, la fonction cherche plus loin jusqu'à ce qu'elle trouve celle qui se trouve en dessous de la première. Et la quatrième fractale est plus basse que la première... C'est ce que dit la condition.

Si la condition est ajoutée

L'impression sera également fausse.

Inversion de la condition
 if(fr2>fr1) return(true);
        else break;

Imprime faux, mais la condition est remplie.

aqa1

 

Le deuxième cycle renvoie toujours le prix de la fractale trouvée dans le premier cycle.

   for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        return(NormalizeDouble(fr2, d));
        //if(fr2>fr1) return(true);
        //else break;
        }
     }
 
Ghabo:

Le deuxième cycle renvoie toujours le prix de la fractale trouvée dans le premier cycle.

Vous semblez avoir un problème avec la logique.

Essayez de décrire l'ordre de recherche avec des mots simples. Demandez-vous si vous avez tout écrit correctement. Et ensuite faire une fonction de recherche qui renverra le prix de la fractale trouvée par son numéro de série. Dès que vous l'avez fait, et qu'elle renvoie le prix correct pour la fractale que vous avez spécifiée par son numéro de séquence, commencez à faire de la logique pour trouver le prix de la fractale suivante (vous aurez déjà une fonction qui renvoie son prix à ce moment-là). Et il ne reste plus qu'à comparer ces prix.

Et tu fais un tas de tout en même temps.

 

Peut-être ai-je mal compris comment cela fonctionne ?

Je trouve d'abord une fractale, la première au-dessus de la MA - (marquée #1 dans la capture d'écran),

int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=EMPTY_VALUE) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }

Je regarde à partir de là, plus loin dans l'histoire, la première fractale (marquée #2 dans la capture d'écran). Si la fractale n°2 est supérieure à la fractale n°1, je renvoie vrai.

      for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        if(fr2>fr1) return(true);
        else break;
        }
     }

Est-ce que tout est correct ?

aq11

 
Artyom Trishkin:

retournera le prix de la fractale trouvée par son numéro de séquence.

Pas par numéro, je recherche par condition que la fractale est au-dessus de la MA, le numéro ordinal peut être quelconque. Le prix de cette fractale dans la première boucle est écrit dans la variable "fr1" correctement.

Le problème se situe dans la deuxième boucle, si je comprends bien, bien sûr. La raison pour laquelle le prix de la fractale numéro 2 n'est pas trouvé n'est pas claire.

 
Ghabo:

Pas par numéro, je recherche par condition que la fractale est au-dessus de la MA, le numéro ordinal peut être quelconque. Le prix de cette fractale dans le premier cycle est écrit dans la variable "fr1" correctement.

Le problème se situe dans la deuxième boucle, si je comprends bien, bien sûr. Je ne comprends pas pourquoi on ne peut pas trouver le prix de la fractale numéro 2.

Je dois te répéter toute la logique. Y a-t-il quelque chose à quoi vous pouvez penser par vous-même ?

1. Dans la première boucle, on trouve la fractale au-dessus de la MA. Le numéro de la barre est écrit dans la variable num_bar (barre n°11 sur la capture d'écran).

2. Dans la deuxième boucle, nous commençons à chercher la deuxième fractale qui satisfait à la condition. Nous commençons à chercher à partir de num_bar... c'est-à-dire à partir de la barre n°11 car nf est égal à zéro.

3. La fractale est trouvée. La valeur est égale à la valeur précédente. La condition ne sera pas remplie car la condition contient > puis < mais pas égal. Si on met ==, le même charabia se produira, mais de l'autre côté.

Probablement, nous devrions chercher la deuxième fractale de la prochaine barre num_bar+1 ou même +2.

 
Alexey Viktorov:

Toute la logique doit vous être répétée. Y a-t-il quelque chose à quoi vous pouvez penser par vous-même ?

1. Dans le premier cycle, nous trouvons une fractale au-dessus de la MA. Le numéro de la barre est écrit dans la variable num_bar (barre n°11 sur la capture d'écran).

2. Dans la deuxième boucle, commencez à chercher la deuxième fractale qui satisfait à la condition. Nous commençons à chercher à partir de la barre numérique... c'est-à-dire de la barre n°11 car nf est égal à zéro.

3. La fractale est trouvée. La valeur est égale à la valeur précédente. La condition ne sera pas remplie, car dans la condition > puis < mais pas égale. Si nous mettons ==, les mêmes bêtises se produiront mais de l'autre côté.

Probablement, nous devrions chercher la deuxième fractale de la prochaine barre num_bar+1 ou même +2.

En général, l'action dans les deux premiers paragraphes, je l'ai exprimée).

Pour "num_bar+1" merci.

Je n'arrive pas à trouver le minimum.

La condition n'est pas remplie, la flèche est posée, remplie n'est pas posée.

La condition est la suivante : si la distance entre le minimum de la bougie traversée par la MA et le minimumde la iLowest est supérieure ou égale à 100, je mets la flèche.

   if(limit>60)limit=60;
   for(int i=limit; i>0; i--)
     {
      M11=iMA(NULL,0,period,shift_,method,price,i+1);
      if(open[i+1]>M11 && close[i+1]<M11){time_1=time[i+1];}

      indexS1=iBarShift(NULL,PERIOD_CURRENT,time_1,false);

      if(open[i+1]<M11 && close[i+1]>M11){time_2=time[i+1];}

      indexS2=iBarShift(NULL,PERIOD_CURRENT,time_2,false);

      //
      double val=0;
      //--- расчет минимального значения цены на indexS1 последовательных барах 
      //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
      int val_index=iLowest(NULL,0,MODE_LOW,indexS1,i+indexS2);
      if(val_index!=-1) val=Low[val_index];
      else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());

      if(low[indexS1]-val>=100*Point)
        {
        BufferPointDn1[i]=high[i];
        }
      //
     }

De B à A, je trouve le minimum de C.

A-C=100 pips au point B, devrait mettre la flèche.

Pourquoi ne le fait-elle pas ?

low1

 
Ghabo:

En général, les actions dans les deux premiers paragraphes, je l'ai dit)

Je me trompe un peu sur le deuxième point. Vous n'avez pas défini où nous commençons à chercher et quand nous obtiendrons quelle valeur. Et c'est ce qui vous fait penser que vous devriez chercher un peu plus loin.

Ghabo:

Le minimum ne peut être trouvé.

La condition n'est pas remplie, la flèche est posée, la condition n'est pas remplie.

La condition est que si la distance entre le minimum de la bougie qui a croisé la MA et le minimum de la iLowest est supérieure ou égale à 100 entre les croisements de prix et la MA, je mets la flèche.

De B à A, je trouve le minimum de C.

A-C=100 pips au point B, devrait mettre la flèche.

Pourquoi ne le met-il pas ?

Il y a quelque chose dans ce code dont il est difficile de saisir la logique.

Au minimum, nous devons savoir où et comment les variables indexS1 et indexS2 sont définies et si elles sont réinitialisées à chaque tick.

Et que se passera-t-il si le croisement de МА est pris dans une brèche ?


Et une dernière question : savez-vous utiliser le débogueur ?

Raison: