Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 17

 
Puoi dirmi dov'è l'errore? I valori degli elementi dell'array Koef[] sono calcolati, ad ogni elemento viene assegnato un valore. Perché Buffer1[] non è assegnato?

#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:
Puoi dirmi dov'è l'errore? I valori degli elementi dell'array Koef[] sono calcolati, ad ogni elemento viene assegnato un valore. Perché Buffer1[] non è assegnato?

Prova a rimuovereAlert dall'ultimo ciclo
 
Renat Akhtyamov:
Prova a rimuovere l'allarme dell'ultimo ciclo
non ha aiutato(
 
Timur1988:
non ha aiutato(

Bene, lì sono inutili. È meglio usare Print(...) invece di avvisi, e guardare la stampa nella scheda "Esperti".

Avete lo stesso valore Edxdy[n-1][p] assegnato. Se nei cicli precedenti avete un ciclo dentro un ciclo e l'indice "n" cambia, nell'ultimo non cambia. Ultimo n-1=24.

Edxdy[n-1][p]

Prova con coraggio - assegnerà? //l'indicatore dovrebbe disegnare una linea nera orizzontale. Tuttavia, non sarà visibile su uno sfondo nero. Cambia il colore dello sfondo, o meglio la linea.

Buffer1[p]=4;

Se sarà assegnato, si dovrebbe pensare - ciò che è scritto qui: Edxdy[24][p]

Heh, forse tutto è assegnato e disegnato, ma si tratta di disegnare una linea nera su uno sfondo nero?

Qui si specifica il colore, il tipo e lo spessore della linea:

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

Bene, lì sono inutili. È meglio usare Print(...) invece di avvisi, e guardare la stampa nella scheda "Esperti".

Avete lo stesso valore Edxdy[n-1][p] assegnato. Se nei cicli precedenti avete un ciclo dentro un ciclo e l'indice "n" cambia, nell'ultimo non cambia. Ultimo n-1=24.

Edxdy[n-1][p]

Prova con coraggio - assegnerà? //l'indicatore dovrebbe disegnare una linea nera orizzontale. Tuttavia, non sarà visibile su uno sfondo nero. Cambia il colore dello sfondo, o meglio la linea.

Buffer1[p]=4;

Se sarà assegnato, si dovrebbe pensare - ciò che è scritto qui: Edxdy[24][p]

Hehe, o forse tutto è assegnato e disegnato, ma si tratta di disegnare una linea nera su uno sfondo nero?

Qui potete vedere il colore, il tipo e lo spessore della linea:

SetIndexStyle(0, DRAW_LINE, 0, 1, Green);
Edxdy[n-1][p] - qui ho scritto la somma del prodotto dx e dy. Questo valore è necessario per calcolare il coefficiente di correlazione di Pearson Koef per una matrice composta da n-1 elementi della dimensione p-esima. In questo caso, ho deciso di calcolare la correlazione per 24 barre, partendo dalla prima barra. Il risultato rispetto al calcolo simile del coefficiente di correlazione di Pearson, che calcola un semplice script (è stato preso solo una matrice unidimensionale), così come il sito "calcolatore di correlazione online di coppia di valute". Tutti i valori sono gli stessi. Credo che ci sia un errore nella dichiarazione dell'array Buffer1[]. Ho creato uno script con un codice simile, più la dichiarazione dell'array tramite ArrayResize(Buffer1, n). Nel codice dello script Buffer1[p]=Koef[p] - i valori sono assegnati correttamente. Non c'è nessun indicatore nel codice((((.
 
Timur1988:
Edxdy[n-1][p] - qui ho scritto la somma del prodotto di dx e dy. Questo valore è necessario per calcolare il coefficiente di correlazione di Pearson Koef per una matrice composta da n-1 elementi della dimensione p-esima. In questo caso, ho deciso di calcolare la correlazione per 24 barre, partendo dalla prima barra. Il risultato rispetto al calcolo simile del coefficiente di correlazione di Pearson, che calcola un semplice script (è stato preso solo una matrice unidimensionale), così come il sito "calcolatore di correlazione online di coppia di valute". Tutti i valori sono gli stessi. Credo che ci sia un errore nella dichiarazione dell'array Buffer1[]. Ho creato uno script con un codice simile, più la dichiarazione dell'array tramite ArrayResize(Buffer1, n). Nel codice dello script Buffer1[p]=Koef[p] - i valori sono assegnati correttamente. Non nel codice dell'indicatore((((.
Ha letto il mio post?
 
Renat Akhtyamov:
Hai letto il mio post?
Sì, grazie!
SetIndexStyle(0,DRAW_LINE,0,1,Green); - mette dei valori, ma non disegna ancora una linea.
 
Timur1988:
Sì, grazie!
SetIndexStyle(0,DRAW_LINE,0,1,Green); - mette i valori, ma ancora non disegna la linea.
Prova anche a rimuovere i limitatori#propertyindicator_minimum-1,#propertyindicator_maximum1, forse i valori del buffer sono disegnati dietro di loro.
 
Vitalie Postolache:
Prova anche a rimuovere i limitatori#propertyindicator_minimum-1,#propertyindicator_maximum1, forse i valori del buffer sono disegnati dietro di loro.
Grazie! Rimosso #property strict - ha aiutato)
 
Timur1988:
Grazie! Rimosso #property strict - ha aiutato)
Non è molto buono. Probabilmente hai ricevuto degli avvertimenti in fase di compilazione? È necessario sbarazzarsi delle cause degli avvertimenti in questi casi, non della #proprietà rigorosa