Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 19

 
Andrey F. Zelinsky:

Para corrigir este erro, você precisa entender sua fórmula - o que, por que e como você está contando.

E só então você será capaz de elaborar seu algoritmo e eliminar o erro.

Pelo método "gut feeling" e não compreender sua fórmula - você eliminará o erro, mas fará um cálculo errado.

p.s. Explique em detalhes o que você está calculando -- comente seu código em detalhes -- e então entenderemos como você irá corrigir o erro.


Precisamos de um indicador que se baseie nos valores do coeficiente de correlação Pearson por preços próximos. Tomamos um conjunto de 24 barras (no meu caso é variável n), a partir da primeira barra - para 2 moedas. Calcule a correlação para 24 barras - obtenha valor na primeira barra. Em seguida, calcular a correlação para 24 barras, mas a partir da segunda barra e assim por diante.
1. Tomei uma matriz bidimensional de preços de fechamento (i elementos e p dimensões).
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. eu agora calculo a soma dos preços de fechamento em 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. Preço médio de fechamento acima de 24 barras(n-1) em 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. O desvio do preço médio em 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. O quadrado do desvio em relação ao preço médio de fechamento

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. O produto dos desvios, ou seja, cada elemento da matriz de moedas 1 é multiplicado por um elemento similar na moeda 2,
por exemplo, o valor de dx[1][0](moeda 1) é multiplicado por dy[1][0](moeda 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 a soma dos quadrados dos desvios e a soma do produto dos desvios

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. Bem, na verdade, o coeficiente de correlação e substituí-lo no 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 foi escrito acima, o erro é uma matriz ultrapassada. O roteiro com o mesmo código para o cálculo do coeficiente de correlação considera este coeficiente

 
Timur1988:
Quando #property strict foi escrito, o compilador gerou erros em cada loop for() dizendo que as variáveis devem ser do tipo, então eu tive que escrever int i e int p em cada loop. Depois disso, o compilador não gerou erros, mas a linha não foi construída. Quando removi o #property strict, o compilador não exigia declarar o tipo em cada laço, e a linha foi construída.

int i e int p só precisam ser declaradas uma vez - antes do init()

você pode escrever tal linha antes de duplicar o tampão1[];

int i,p;

no código int remover

#propriedade estrita deve ser devolvida

então executar a compilação novamente

depois verificar se há erros

então, no caso de excesso de matriz, veja em qual linha de código (o número é de interesse e a própria linha). Antes, era a linha número 90 em seu código.

O erro significa que se você tiver 24 valores na matriz, e solicitar o 24º índice, então . é um erro. Tente descobrir. A numeração do índice começa em zero, ou seja, no seu caso 0,1,...23.

Se não conseguirmos entender - jogue esta linha aqui, vamos pensar

 
Renat Akhtyamov:

int i e int p só precisam ser declaradas uma vez - antes do init()

"O caminho para a programação do inferno está pavimentado com variáveis globais". S. McConnell.
 
Alexey Kozitsyn:
"O caminho para a programação do inferno está pavimentado com variáveis globais". S. McConnell.
Às vezes é mais difícil sem eles, mas não no caso do indicador em questão.
 
Artyom Trishkin:
Às vezes é mais difícil sem eles, mas não no caso do indicador em questão.
Concordo, às vezes não se pode passar sem eles. Mas não neste caso.
 
Alexey Kozitsyn:
Concordo, às vezes não se pode passar sem eles. Mas não neste caso.

Neste caso, mais código é escrito do que é necessário e suficiente.

A propósito, você também pode escrever tipo antes de cada variável, mesmo que o nome da variável seja o mesmo...., mas não é a construção de código correta.

 
Renat Akhtyamov:
Neste caso, mais código é escrito do que o necessário.
Certifique-se de não ficar sem espaço na página...
 
Renat Akhtyamov:

A propósito, você também pode escrever tipo antes de cada variável, mesmo que o nome da variável seja o mesmo...., mas esta não é a construção de código correta.

Na verdade, eu faço isso, você provavelmente não deveria ser aconselhado, mas talvez reconsidere sua decisão quando encontrar alguns problemas.
 
Alexey Kozitsyn:
Na verdade, eu faço, você provavelmente não deveria ser aconselhado a fazê-lo, mas talvez você reconsidere sua decisão quando encontrar alguns problemas.
for(int i=1; int i<int n; int i++)                                                                  
...
Certo???? Seja bem-vindo.
 
Renat Akhtyamov:

Neste caso, você escreveu mais código do que o necessário e o suficiente.

A propósito, você também pode escrever tipo antes de cada variável, mesmo que o nome da variável seja o mesmo...., mas esta não é a construção de código correta.

Cada variável tem seu próprio escopo. Mesmo dentro dos suportes encaracolados existe um escopo diferente para a variável declarada nesse escopo - dentro dos suportes encaracolados. Então, por exemplo, por que eu deveria criar variáveis de índice de loop com nomes diferentes em lugares diferentes de um programa se eu sei que elas não se sobrepõem e é suficiente, e costumeiro, usar um nome de variável como "i"?