Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 17

 
¿Puede decirme dónde está el error? Se calculan los valores de los elementos del array Koef[], a cada elemento se le asigna un valor. ¿Por qué no se asigna Buffer1[]?

#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:
¿Puede decirme dónde está el error? Se calculan los valores de los elementos del array Koef[], a cada elemento se le asigna un valor. ¿Por qué no se asigna Buffer1[]?

Intenta eliminarla alerta del último bucle
 
Renat Akhtyamov:
Intenta eliminar la alerta del último ciclo
no ayudó(
 
Timur1988:
no ayudó(

Bien, son inútiles allí. Será mejor que utilices Print(...) en lugar de las alertas, y mires la impresión en la pestaña "Expertos"

Tienes el mismo valor Edxdy[n-1][p] asignado. Si en los bucles anteriores tienes un bucle dentro de otro bucle y el índice "n" cambia, en el último no lo hace. El último n-1=24.

Edxdy[n-1][p]

Inténtelo con valentía: ¿le asignará? //el indicador debe dibujar una línea negra horizontal. Sin embargo, no será visible sobre un fondo negro. Cambia el color del fondo, o mejor la línea.

Buffer1[p]=4;

Si se va a asignar, debe pensar - lo que está escrito aquí: Edxdy[24][p]

Je, tal vez todo está asignado y dibujado, pero se trata de dibujar una línea negra sobre un fondo negro?

Aquí se especifica el color, el tipo y el grosor de la línea:

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

Bien, son inútiles allí. Será mejor que utilices Print(...) en lugar de las alertas, y mires la impresión en la pestaña "Expertos"

Tienes el mismo valor Edxdy[n-1][p] asignado. Si en los bucles anteriores tienes un bucle dentro de otro y el índice "n" cambia, en el último no lo hace. El último n-1=24.

Edxdy[n-1][p]

Inténtalo con audacia: ¿se asignará? //el indicador debe dibujar una línea negra horizontal. Sin embargo, no será visible sobre un fondo negro. Cambia el color del fondo, o mejor la línea.

Buffer1[p]=4;

Si se va a asignar, debe pensar - lo que está escrito aquí: Edxdy[24][p]

Je, tal vez todo está asignado y dibujado, pero se trata de dibujar una línea negra sobre un fondo negro?

Aquí puede ver el color, el tipo y el grosor de la línea:

SetIndexStyle(0, DRAW_LINE, 0, 1, Green);
Edxdy[n-1][p] - aquí he escrito la suma del producto dx y dy. Este valor es necesario para calcular el coeficiente de correlación de Pearson Koef para una matriz formada por n-1 elementos de la dimensión p-ésima. En este caso, he decidido calcular la correlación para 24 barras, empezando por la primera. El resultado comparado con el cálculo similar del coeficiente de correlación de Pearson, que calcula un simple script (se tomó sólo matriz unidimensional), así como el sitio "calculadora de correlación de pares de divisas en línea". Todos los valores son iguales. Creo que hay un error en la declaración del array Buffer1[]. He creado un script con un código similar, además de la declaración del array mediante ArrayResize(Buffer1, n). En el código del script Buffer1[p]=Koef[p] - los valores se asignan correctamente. No hay ningún indicador en el código(((.
 
Timur1988:
Edxdy[n-1][p] - aquí he escrito la suma del producto de dx y dy. Este valor es necesario para calcular el coeficiente de correlación de Pearson Koef para una matriz formada por n-1 elementos de la dimensión p-ésima. En este caso, he decidido calcular la correlación para 24 barras, empezando por la primera. El resultado comparado con el cálculo similar del coeficiente de correlación de Pearson, que calcula un simple script (se tomó sólo matriz unidimensional), así como el sitio "calculadora de correlación de pares de divisas en línea". Todos los valores son iguales. Creo que hay un error en la declaración del array Buffer1[]. He creado un script con un código similar, además de la declaración del array mediante ArrayResize(Buffer1, n). En el código del script Buffer1[p]=Koef[p] - los valores se asignan correctamente. No en el código del indicador(((.
¿Has leído mi post?
 
Renat Akhtyamov:
¿Has leído mi post?
Sí, gracias.
SetIndexStyle(0,DRAW_LINE,0,1,Green); - pone valores, pero sigue sin dibujar una línea.
 
Timur1988:
Sí, gracias.
SetIndexStyle(0,DRAW_LINE,0,1,Green); - pone valores, pero sigue sin dibujar la línea.
Intente también eliminar los limitadores#propiedadindicador_mínimo-1,#propiedadindicador_máximo1, quizás los valores del buffer se dibujan detrás de ellos.
 
Vitalie Postolache:
Prueba también a eliminar los limitadores#propiedadindicador_mínimo-1,#propiedadindicador_máximo1, quizás los valores del buffer se dibujen detrás de ellos.
Gracias. Se ha eliminado la #propiedad estricta - ha ayudado)
 
Timur1988:
Gracias. Se ha eliminado la #propiedad estricta - ha ayudado)
Eso no es muy bueno. ¿Probablemente te aparezcan advertencias en tiempo de compilación? En estos casos hay que deshacerse de las causas de las advertencias, no de la #propiedadestricta