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

 
Pouvez-vous me dire où se trouve l'erreur ? Les valeurs des éléments du tableau Koef[] sont calculées, chaque élément se voit attribuer une valeur. Pourquoi Buffer1[] n'est-il pas affecté ?

#property copyright "Copyright 2016, T"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_level1 0.8
#property indicator_level2 -0.8
#property indicator_levelcolor Black
#property indicator_color1 Blue
#property indicator_minimum -1
#property indicator_width1 2
#property indicator_style1 0
#property indicator_maximum 1

double Buffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//--- indicator buffers mapping
  SetIndexBuffer(0, Buffer1);
  SetIndexStyle(0, DRAW_LINE);
  return(0);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
   {
   int n=25;                                                            // количество элементов в массиве(для периода H1 n=25, тк i<n)
   int m=24;                                                            // количество массивов(для периода H1 m=24, тк p=0, p<m)
   int w=18;                                                            // количество заков после запятой
  
   double Price_CloseX[][24];                                           // Массив цен закрытия 1 пары  
   double Price_CloseY[][24];                                           // Массив цен закрытия 2 пары
   double dx[][24];                                                     // Отклонение от среднего значения для пары 1 dx
   double dy[][24];                                                     // Отклонение от среднего значения для пары 2 dy
   double dx2[][24];                                                    // Квадрат отклонения ср.значения dx2
   double dy2[][24];                                                    // Квадрат отклонения ср.значения dy2
   double dxdy[][24];                                                   // Произведение dx и dy
  
   double sum_x[][24];
   double sum_y[][24];
  
   double Mx[][24];                                                         // Массив среднего значения цен закрытия пары 1 Mx
   double My[][24];                                                         // Массив среднего значения цен закрытия пары 2 My
  
   double Edx2[][24];                                                       // Сумма квадратов отклонений Edx2
   double Edy2[][24];                                                       // Сумма квадратов отклонений Edy2
   double Edxdy[][24];                                                      // Сумма произведений отклонений Edxdy
  
   double Koef[];
  
   ArrayResize(Price_CloseX, n);
   ArrayResize(Price_CloseY, n);
   ArrayResize(dx, n);
   ArrayResize(dy, n);  
   ArrayResize(dx2, n);
   ArrayResize(dy2, n);
   ArrayResize(dxdy, n);
   ArrayResize(sum_x, n);
   ArrayResize(sum_y, n);
   ArrayResize(Mx, n);
   ArrayResize(My, n);
   ArrayResize(Edx2, n);
   ArrayResize(Edy2, n);
   ArrayResize(Edxdy, n);
   ArrayResize(Koef, n);
  
   string sym_x="EURUSD";
   string sym_y="GBPUSD";
  
   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);
        
         }
      }
      
    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];
        
         }        
      }
  
   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);
                
         }
       }
  
   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];
        
         }
      }
    
   for(int i=1; i<n; i++)                                                                  
      {
      for(int p=0; p<m; p++)
         {
         dx2[i][p]=(dx[i][p]*dx[i][p])*1000000;
         dy2[i][p]=(dy[i][p]*dy[i][p])*1000000;
        
         }
      }
    
   for(int i=1; i<n; i++)                                                                  
      {
      for(int p=0; p<m; p++)
         {
         dxdy[i][p]=(dx[i][p]*dy[i][p])*1000000;
        
         }
      }  
                         
   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]);
         }
      }
  

      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];
         Alert("Коэффициент корреляции Пирсона между ", sym_x, " и ", sym_y, " равен ", DoubleToString(Koef[p], w));
         Alert("Значение буфера ", p, " равно ", Buffer1[p]);
         }
   return(0);
   }
 
Timur1988:
Pouvez-vous me dire où se trouve l'erreur ? Les valeurs des éléments du tableau Koef[] sont calculées, chaque élément se voit attribuer une valeur. Pourquoi Buffer1[] n'est-il pas assigné ?

Essayer de supprimerAlert de la dernière boucle
 
Renat Akhtyamov:
Essayez de retirer l'alerte du dernier cycle
n'a pas aidé(
 
Timur1988:
n'a pas aidé(

Bien, ils sont inutiles là. Vous feriez mieux d'utiliser Print(...) au lieu d'alertes, et de regarder l'impression dans l'onglet "Experts".

Vous avez la même valeur Edxdy[n-1][p] qui est assignée. Si dans les boucles précédentes vous avez une boucle dans une boucle et que l'indice "n" change, dans la dernière il ne change pas. Dernier n-1=24.

Edxdy[n-1][p]

Essayez-le avec audace - est-ce que ça va marcher ? //L'indicateur doit dessiner une ligne noire horizontale. Cependant, il ne sera pas visible sur un fond noir. Changez la couleur de l'arrière-plan, ou mieux la ligne.

Buffer1[p]=4;

Si elle sera assignée, vous devriez penser - ce qui est écrit ici : Edxdy [24] [p]

Heh, peut-être que tout est assigné et dessiné, mais il s'agit de dessiner une ligne noire sur un fond noir ?

C'est ici que sont spécifiés la couleur, le type et l'épaisseur de la ligne :

SetIndexStyle(0, DRAW_LINE, 0, 1, Green);
 
Renat Akhtyamov:

Bien, ils sont inutiles là. Vous feriez mieux d'utiliser Print(...) au lieu d'alertes, et de regarder l'impression dans l'onglet "Experts".

Vous avez la même valeur Edxdy[n-1][p] qui est assignée. Si dans les boucles précédentes vous avez une boucle dans une boucle et que l'indice "n" change, dans la dernière il ne change pas. Dernier n-1=24.

Edxdy[n-1][p]

Essayez-le avec audace - est-ce que ça va marcher ? //L'indicateur doit dessiner une ligne noire horizontale. Cependant, il ne sera pas visible sur un fond noir. Changez la couleur de l'arrière-plan, ou mieux la ligne.

Buffer1[p]=4;

Si elle sera assignée, vous devriez penser - ce qui est écrit ici : Edxdy [24] [p]

Hehe, ou peut-être que tout est attribué et dessiné, mais il s'agit de dessiner une ligne noire sur un fond noir ?

Vous pouvez voir ici la couleur, le type et l'épaisseur de la ligne :

SetIndexStyle(0, DRAW_LINE, 0, 1, Green);
Edxdy[n-1][p] - ici j'ai écrit la somme des produits dx et dy. Cette valeur est nécessaire pour calculer le coefficient de corrélation de Pearson Koef pour un tableau composé de n-1 éléments de la p-ième dimension. Dans ce cas, j'ai décidé de calculer la corrélation pour 24 barres, en commençant par la première barre. Le résultat est comparé à un calcul similaire du coefficient de corrélation de Pearson, qui calcule un script simple (il n'a été pris qu'un tableau unidimensionnel), ainsi que le site "online currency pair correlation calculator". Toutes les valeurs sont les mêmes. Je pense qu'il y a une erreur dans la déclaration du tableau Buffer1[]. J'ai créé un script avec un code similaire, plus une déclaration de tableau via ArrayResize(Buffer1, n). Dans le code de script Buffer1[p]=Koef[p] - les valeurs sont assignées correctement. Il n'y a pas d'indicateur dans le code(((.
 
Timur1988:
Edxdy[n-1][p] - ici j'ai écrit la somme du produit de dx et dy. Cette valeur est nécessaire pour calculer le coefficient de corrélation de Pearson Koef pour un tableau composé de n-1 éléments de la p-ième dimension. Dans ce cas, j'ai décidé de calculer la corrélation pour 24 barres, en commençant par la première barre. Le résultat est comparé à un calcul similaire du coefficient de corrélation de Pearson, qui calcule un script simple (il n'a été pris qu'un tableau unidimensionnel), ainsi que le site "online currency pair correlation calculator". Toutes les valeurs sont les mêmes. Je pense qu'il y a une erreur dans la déclaration du tableau Buffer1[]. J'ai créé un script avec un code similaire, plus une déclaration de tableau via ArrayResize(Buffer1, n). Dans le code de script Buffer1[p]=Koef[p] - les valeurs sont assignées correctement. Pas dans le code de l'indicateur(((.
Avez-vous lu mon message ?
 
Renat Akhtyamov:
Avez-vous lu mon message ?
Oui, merci !
SetIndexStyle(0,DRAW_LINE,0,1,Green) ; - met des valeurs, mais ne dessine toujours pas de ligne.
 
Timur1988:
Oui, merci !
SetIndexStyle(0,DRAW_LINE,0,1,Green) ; - met des valeurs, mais ne dessine toujours pas de ligne.
Essayez aussi de supprimer les limiteurs#propertyindicator_minimum-1,#propertyindicator_maximum1, peut-être que des valeurs tampons sont dessinées derrière eux.
 
Vitalie Postolache:
Essayez également de supprimer les limiteurs#propertyindicator_minimum-1,#propertyindicator_maximum1, peut-être que les valeurs du tampon sont dessinées derrière eux.
Merci ! Suppression de #property strict - aidé)
 
Timur1988:
Merci ! Suppression de #property strict - aidé)
Ce n'est pas très bon. Avez-vous probablement obtenu des avertissements au moment de la compilation ? Dans de tels cas, vous devez vous débarrasser des causes des avertissements, pas de la #propriété stricte.