Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 19
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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 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 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 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 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 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 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 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
{
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
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[];
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
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.
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.
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.
En este caso, se escribe más código del necesario.
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 sí, probablemente no se le debería aconsejar que lo haga, pero quizás reconsidere su decisión cuando se encuentre con algunos problemas.
...
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.