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

 
Andrey F. Zelinsky:

Para corregir este error, hay que entender la fórmula: qué, por qué y cómo se cuenta.

Y sólo entonces podrá elaborar su algoritmo y eliminar el error.

Con el método de la "corazonada" y sin entender su fórmula, eliminará el error, pero hará un cálculo erróneo.

p.s. Explique detalladamente lo que está calculando -- comente su código detalladamente -- y entonces entenderemos cómo va a solucionar el error.


Necesitamos un indicador que se base en los valores del coeficiente de correlación de Pearson por precios de cierre. Tomamos una matriz de 24 barras (en mi caso es la variable n), empezando por la primera barra - para 2 monedas. Calcule la correlación para 24 barras - obtenga el valor en la primera barra. A continuación, calcule la correlación para 24 barras, pero a partir de la segunda barra y así sucesivamente.
1. Tomé una matriz bidimensional de precios de cierre (i elementos y p dimensiones).
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. Ahora calculo la suma de los precios de cierre en cada matriz
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. Precio medio de cierre en 24 barras(n-1) en cada matriz

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. la desviación del precio medio en cada matriz

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. El cuadrado de la desviación del precio medio de cierre

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. El producto de las desviaciones, es decir, cada elemento de la matriz de la moneda 1 se multiplica por el mismo elemento de la moneda 2,
Por ejemplo, el valor de dx[1][0] (moneda 1) se multiplica por dy[1][0] (moneda 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. Calcular la suma de los cuadrados de las desviaciones y la suma del producto de las desviaciones

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. Bueno, en realidad el coeficiente de correlación y sustituirlo en el buffer

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];
         }

__________________________________________________________________________________________
Como se ha escrito anteriormente, el error es un desbordamiento de la matriz. El script con el mismo código para calcular el coeficiente de correlación considera este coeficiente

 
Timur1988:
Cuando se escribió #property strict, el compilador generaba errores en cada bucle for() diciendo que las variables debían ser de tipo, por lo que tenía que escribir int i e int p en cada bucle. Después de eso el compilador no generó errores, pero la línea no se construyó. Cuando eliminé #property strict, el compilador no requirió declarar el tipo en cada bucle, y la línea se construyó.

int i e int p sólo deben declararse una vez - antes de init()

puedes escribir una línea de este tipo antes del doble Buffer1[];

int i,p;

en el código int eliminar

#la propiedad estricta debe ser devuelta

luego ejecutar la compilación de nuevo

a continuación, compruebe si hay errores

entonces, en caso de desbordamiento del array, mira en qué línea de código (interesa el número y la línea en sí). Antes era la línea número 90 de su código.

El error significa que si tienes 24 valores en el array, y solicitas el índice 24, entonces . es un error. Trata de entenderlo. La numeración del índice comienza en cero, es decir, en su caso 0,1,...23.

Si no podemos entender - tirar esta línea aquí, vamos a pensar

 
Renat Akhtyamov:

int i e int p sólo deben declararse una vez - antes de init()

"El camino al infierno de la programación está pavimentado con variables globales". S. McConnell.
 
Alexey Kozitsyn:
"El camino al infierno de la programación está pavimentado con variables globales". S. McConnell.
A veces es más difícil sin ellos, pero no en el caso del indicador en cuestión.
 
Artyom Trishkin:
A veces es más difícil sin ellos, pero no en el caso del indicador en cuestión.
Estoy de acuerdo, a veces no se puede prescindir de ellos en absoluto. Pero no en este caso.
 
Alexey Kozitsyn:
Estoy de acuerdo, a veces no se puede prescindir de ellos en absoluto. Pero no en este caso.

En este caso, se escribe más código del necesario y suficiente.

Por cierto, también se puede escribir el tipo antes de cada variable aunque el nombre de la variable sea el mismo...., pero no es la construcción de código correcta.

 
Renat Akhtyamov:
En este caso, se escribe más código del necesario.
Asegúrate de no quedarte sin espacio en la página...
 
Renat Akhtyamov:

Por cierto, también se puede escribir el tipo antes de cada variable, incluso si el nombre de la variable es el mismo...., pero esto no es la construcción de código correcta.

En realidad, lo hago, probablemente no debería ser aconsejado, pero tal vez reconsidere su decisión cuando se encuentre con algunos problemas.
 
Alexey Kozitsyn:
En realidad sí, probablemente no se le debería aconsejar que lo haga, pero quizás reconsidere su decisión cuando se encuentre con algunos problemas.
for(int i=1; int i<int n; int i++)                                                                  
...
¿No es cierto? De nada.
 
Renat Akhtyamov:

En este caso has escrito más código del necesario y suficiente.

Por cierto, también se puede escribir el tipo antes de cada variable, incluso si el nombre de la variable es el mismo...., pero esto no es la construcción de código correcta.

Cada variable tiene su propio alcance. Incluso dentro de las llaves - un ámbito diferente para una variable declarada en ese ámbito - dentro de las llaves. Así, por ejemplo, ¿por qué debería crear variables de índice de bucle con nombres diferentes en distintos lugares de un programa si sé que no se solapan y es suficiente, y habitual, utilizar un nombre de variable como "i"?