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

 
Andrey F. Zelinsky:

Pour corriger cette erreur, vous devez comprendre votre formule - ce que vous comptez, pourquoi et comment.

Ce n'est qu'alors que vous pourrez élaborer votre algorithme et éliminer l ' erreur.

En utilisant la méthode de l'intuition et en ne comprenant pas votre formule, vous éliminerez les erreurs, mais vous ferez un mauvais calcul.

p.s. Expliquez en détail ce que vous calculez -- commentez votre code en détail -- et alors nous comprendrons comment vous allez corriger l'erreur.


Nous avons besoin d'un indicateur basé sur les valeurs du coefficient de corrélation de Pearson par les prix de clôture. Nous prenons un tableau de 24 barres (dans mon cas c'est la variable n), en commençant par la première barre - pour 2 devises. Calculer la corrélation pour 24 barres - obtenir la valeur sur la première barre. Calculez ensuite la corrélation pour 24 mesures, mais en commençant par la deuxième mesure et ainsi de suite.
1. J'ai pris un tableau bidimensionnel de prix de clôture (i éléments et p dimensions).
for(int i=1; i<n; i++)
      {
      for(int p=0; p<m; p++)
         {
         Price_CloseX[i][p]=iClose(sym_x, PERIOD_H1, i+p);
         Price_CloseY[i][p]=iClose(sym_y, PERIOD_H1, i+p);
        
         }
      }
2. je calcule maintenant la somme des prix de clôture dans chaque tableau
for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
        
         }        
      }

3. Prix de clôture moyen sur 24 barres(n-1) dans chaque tableau

for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {      
         Mx[i][p]=sum_x[p+1][m-1]/(n-1);  
         My[i][p]=sum_y[p+1][m-1]/(n-1);
                
         }
       }

4. l'écart par rapport au prix moyen dans chaque tableau

for(int i=1; i<n; i++)
      {
      for(int p=0; p<m; p++)
         {
         dx[i][p]=Price_CloseX[i][p]-Mx[i][p];
         dy[i][p]=Price_CloseY[i][p]-My[i][p];
         }
      }

5. Le carré de l'écart par rapport au prix de clôture moyen

for(int i=1; i<n; i++)                                                                  
      {
      for(int p=0; p<m; p++)
         {
         dx2[i][p]=(dx[i][p]*dx[i][p]);
         dy2[i][p]=(dy[i][p]*dy[i][p]);
        
         }
      }

6. Le produit des écarts, c'est-à-dire que chaque élément du tableau de la devise 1 est multiplié par un élément similaire dans la devise 2,
Par exemple, la valeur de dx[1][0] (devise 1) est multipliée par dy[1][0] (devise 2) ; dx[3][4]*dy[3][4], etc.

for(int i=1; i<n; i++)                                                                  
      {
      for(int p=0; p<m; p++)
         {
         dxdy[i][p]=(dx[i][p]*dy[i][p]);
        
         }
      }  

7. Calculer la somme des carrés des écarts et la somme du produit des écarts.

for(int i=1; i<n; i++)                                                                  
      {
      for(int p=0; p<m; p++)
         {
         Edx2[i][p]=(Edx2[i-1][p]+dx2[i][p]);                                        
         Edy2[i][p]=(Edy2[i-1][p]+dy2[i][p]);
         Edxdy[i][p]=(Edxdy[i-1][p]+dxdy[i][p]);
         }
      }

8. Eh bien, en fait le coefficient de corrélation et le substituer dans le tampon

for(int p=0; p<m; p++)
         {
         Koef[p]=Edxdy[n-1][p]/sqrt(Edx2[n-1][p]*Edy2[n-1][p]);
         Buffer1[p]=Koef[p];
         }

__________________________________________________________________________________________
Comme écrit ci-dessus, l'erreur est un dépassement de tableau. Le script avec le même code pour calculer le coefficient de corrélation considère ce coefficient

 
Timur1988:
Lorsque #property strict a été écrit, le compilateur a généré des erreurs dans chaque boucle for() disant que les variables doivent être de type, donc j'ai dû écrire int i et int p dans chaque boucle. Après cela, le compilateur n'a pas généré d'erreurs, mais la ligne ne s'est pas construite. Lorsque j'ai supprimé #property strict, le compilateur n'a pas eu besoin de déclarer le type dans chaque boucle, et la ligne a été construite.

int i et int p ne doivent être déclarés qu'une seule fois - avant init()

vous pouvez écrire une telle ligne avant le double Buffer1[] ;

int i,p;

dans le code int, supprimez

#propriété stricte doit être retournée

puis relancez la compilation

puis vérifiez les erreurs

puis, en cas de dépassement de tableau, regarder dans quelle ligne de code (le numéro est intéressant ainsi que la ligne elle-même). Plus tôt, c'était la ligne 90 de votre code.

L'erreur signifie que si vous avez 24 valeurs dans le tableau, et que vous demandez le 24ème index, alors . c'est une erreur. Essayez de comprendre. La numérotation des indices commence à zéro, c'est-à-dire dans votre cas 0,1,...23.

Si nous ne pouvons pas comprendre - jeter cette ligne ici, nous penserons

 
Renat Akhtyamov:

int i et int p ne doivent être déclarés qu'une seule fois - avant init()

"La route vers l'enfer de la programmation est pavée de variables globales". S. McConnell.
 
Alexey Kozitsyn:
"La route vers l'enfer de la programmation est pavée de variables globales". S. McConnell.
Parfois, c'est plus difficile sans eux, mais pas dans le cas de l'indicateur en question.
 
Artyom Trishkin:
Parfois, c'est plus difficile sans eux, mais pas dans le cas de l'indicateur en question.
Je suis d'accord, parfois on ne peut pas du tout s'en passer. Mais pas dans ce cas.
 
Alexey Kozitsyn:
Je suis d'accord, parfois on ne peut pas du tout s'en passer. Mais pas dans ce cas.

Dans ce cas, on écrit plus de code que ce qui est nécessaire et suffisant.

A propos, vous pouvez aussi écrire type devant chaque variable même si le nom de la variable est le même...., mais ce n'est pas la bonne construction de code.

 
Renat Akhtyamov:
Dans ce cas, on écrit plus de code que nécessaire.
Assurez-vous que vous ne manquez pas d'espace sur la page...
 
Renat Akhtyamov:

A propos, vous pouvez aussi écrire type devant chaque variable, même si le nom de la variable est le même...., mais ce n'est pas la bonne construction de code.

En fait, je le fais, vous ne devriez probablement pas être conseillé, mais peut-être reconsidérerez-vous votre décision lorsque vous rencontrerez certains problèmes.
 
Alexey Kozitsyn:
En fait, je le fais, on ne devrait probablement pas vous conseiller de le faire, mais peut-être reconsidérerez-vous votre décision lorsque vous rencontrerez certains problèmes.
for(int i=1; int i<int n; int i++)                                                                  
...
N'est-ce pas ? Vous êtes les bienvenus.
 
Renat Akhtyamov:

Dans ce cas, vous avez écrit plus de code que nécessaire et suffisant.

A propos, vous pouvez aussi écrire type devant chaque variable, même si le nom de la variable est le même...., mais ce n'est pas la bonne construction de code.

Chaque variable a sa propre portée. Même à l'intérieur des accolades, il existe une portée différente pour la variable déclarée dans cette portée - à l'intérieur des accolades. Ainsi, par exemple, pourquoi devrais-je créer des variables d'index de boucle avec des noms différents à différents endroits d'un programme si je sais qu'elles ne se chevauchent pas et qu'il est suffisant, et habituel, d'utiliser un nom de variable tel que "i" ?
Raison: