Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 17

 
Können Sie mir sagen, wo der Fehler liegt? Die Werte der Array-Elemente Koef[] werden berechnet, jedem Element wird ein Wert zugewiesen. Warum wird Buffer1[] nicht zugewiesen?

#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:
Können Sie mir sagen, wo der Fehler liegt? Die Werte der Array-Elemente Koef[] werden berechnet, jedem Element wird ein Wert zugewiesen. Warum wird Buffer1[] nicht zugewiesen?

Versuchen Sie,den Alert aus der letzten Schleife zu entfernen
 
Renat Akhtyamov:
Versuchen Sie, den Alert aus dem letzten Zyklus zu entfernen
hat nicht geholfen(
 
Timur1988:
hat nicht geholfen(

Gut, dort sind sie nutzlos. Verwenden Sie besser Print(...) anstelle von Alerts, und sehen Sie sich den Ausdruck auf der Registerkarte "Experts" an

Sie haben denselben Wert Edxdy[n-1][p] zugewiesen bekommen. Wenn Sie in den vorherigen Schleifen eine Schleife innerhalb einer Schleife haben und sich der Index "n" ändert, tut er das in der letzten Schleife nicht. Zuletzt n-1=24.

Edxdy[n-1][p]

Trauen Sie sich - wird es klappen? //Indikator sollte eine horizontale schwarze Linie zeichnen. Auf einem schwarzen Hintergrund ist sie jedoch nicht sichtbar. Ändern Sie die Farbe des Hintergrunds, oder besser die Linie.

Buffer1[p]=4;

Wenn es zugewiesen wird, sollten Sie daran denken, was hier geschrieben steht: Edxdy[24][p]

Hehe, oder vielleicht ist alles schon vergeben und gezeichnet, aber es geht darum, eine schwarze Linie auf einem schwarzen Hintergrund zu zeichnen?

Hier werden die Farbe, der Typ und die Dicke der Linie festgelegt:

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

Gut, dort sind sie nutzlos. Verwenden Sie besser Print(...) anstelle von Alerts, und sehen Sie sich den Ausdruck auf der Registerkarte "Experts" an

Sie haben denselben Wert Edxdy[n-1][p] zugewiesen bekommen. Wenn Sie in den vorherigen Schleifen eine Schleife innerhalb einer Schleife haben und sich der Index "n" ändert, tut er das in der letzten Schleife nicht. Zuletzt n-1=24.

Edxdy[n-1][p]

Probieren Sie es aus - wird es klappen? //Indikator sollte eine horizontale schwarze Linie zeichnen. Auf einem schwarzen Hintergrund ist sie jedoch nicht sichtbar. Ändern Sie die Farbe des Hintergrunds, oder besser die Linie.

Buffer1[p]=4;

Wenn es zugewiesen wird, sollten Sie daran denken, was hier geschrieben steht: Edxdy[24][p]

Hehe, oder vielleicht ist alles schon vergeben und gezeichnet, aber es geht darum, eine schwarze Linie auf einem schwarzen Hintergrund zu zeichnen?

Hier können Sie die Farbe, die Art und die Dicke der Linie sehen:

SetIndexStyle(0, DRAW_LINE, 0, 1, Green);
Edxdy[n-1][p] - hier habe ich die Summe der Produkte dx und dy geschrieben. Dieser Wert wird benötigt, um den Pearson'schen Korrelationskoeffizienten Koef für ein Array zu berechnen, das aus n-1 Elementen der p-ten Dimension besteht. In diesem Fall habe ich beschlossen, die Korrelation für 24 Balken zu berechnen, beginnend mit dem ersten Balken. Das Ergebnis im Vergleich zu ähnlichen Berechnung der Pearson-Korrelationskoeffizient, der ein einfaches Skript berechnet (wurde nur eindimensionale Array), sowie die Website "Online-Währungspaar Korrelationsrechner". Alle Werte sind identisch. Ich glaube, dass es einen Fehler in der Deklaration des Arrays Buffer1[] gibt. Ich habe ein Skript mit ähnlichem Code erstellt, plus Array-Deklaration über ArrayResize(Buffer1, n). Im Skriptcode Buffer1[p]=Koef[p] - werden die Werte korrekt zugewiesen. Es gibt keinen Indikator in dem Code(((.
 
Timur1988:
Edxdy[n-1][p] - hier habe ich die Summe des Produkts von dx und dy geschrieben. Dieser Wert wird benötigt, um den Pearson-Korrelationskoeffizienten Koef für eine aus n-1 Elementen der p-ten Dimension bestehende Matrix zu berechnen. In diesem Fall habe ich beschlossen, die Korrelation für 24 Balken zu berechnen, beginnend mit dem ersten Balken. Das Ergebnis im Vergleich zu ähnlichen Berechnung der Pearson-Korrelationskoeffizient, der ein einfaches Skript berechnet (wurde nur eindimensionale Array), sowie die Website "Online-Währungspaar Korrelationsrechner". Alle Werte sind identisch. Ich glaube, dass es einen Fehler in der Deklaration des Arrays Buffer1[] gibt. Ich habe ein Skript mit ähnlichem Code erstellt, plus Array-Deklaration über ArrayResize(Buffer1, n). Im Skriptcode Buffer1[p]=Koef[p] - werden die Werte korrekt zugewiesen. Nicht im Code des Indikators(((.
Haben Sie meinen Beitrag gelesen?
 
Renat Akhtyamov:
Haben Sie meinen Beitrag gelesen?
Ja, ich danke Ihnen!
SetIndexStyle(0,DRAW_LINE,0,1,Green); - Werte setzen, aber immer noch keine Linie zeichnen.
 
Timur1988:
Ja, ich danke Ihnen!
SetIndexStyle(0,DRAW_LINE,0,1,Green); - Werte setzen, aber immer noch keine Linie zeichnen.
Versuchen Sie auch, die Begrenzer#propertyindicator_minimum-1,#propertyindicator_maximum1 zu entfernen, vielleicht werden dahinter Pufferwerte gezeichnet.
 
Vitalie Postolache:
Versuchen Sie auch, die Begrenzer#propertyindicator_minimum-1,#propertyindicator_maximum1 zu entfernen, vielleicht werden die Pufferwerte dahinter gezeichnet.
Danke! Entfernte #Eigenschaft strict - half)
 
Timur1988:
Ich danke Ihnen! Entfernte #Eigenschaft strict - half)
Das ist nicht sehr gut. Haben Sie beim Kompilieren möglicherweise Warnungen erhalten? In solchen Fällen müssen Sie die Ursachen der Warnungen beseitigen, nicht #property strict
Grund der Beschwerde: