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

 
Andrey F. Zelinsky:

Um diesen Fehler zu korrigieren, müssen Sie Ihre Formel verstehen - was, warum und wie Sie zählen.

Und nur dann können Sie Ihren Algorithmus ausarbeiten und den Fehler außerhalb des Feldes beseitigen.

Mit der "Bauchgefühl"-Methode und ohne die Formel zu verstehen, können Sie zwar Fehler ausschließen, aber Sie werden eine falsche Berechnung vornehmen.

p.s. Erläutern Sie im Detail, was Sie berechnen - kommentieren Sie Ihren Code im Detail - und dann werden wir verstehen, wie Sie den Fehler beheben werden.


Wir benötigen einen Indikator, der auf den Werten des Pearson-Korrelationskoeffizienten bei den Schlusskursen basiert. Wir nehmen ein Array von 24 Balken (in meinem Fall ist es die Variable n), beginnend mit dem ersten Balken - für 2 Währungen. Berechnen Sie die Korrelation für 24 Balken - erhalten Sie den Wert für den ersten Balken. Berechnen Sie dann die Korrelation für 24 Takte, aber beginnend mit dem zweiten Takt und so weiter.
1. Ich habe ein zweidimensionales Array von Schlusskursen genommen (i Elemente und p Dimensionen).
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. ich berechne nun die Summe der Schlusskurse in jedem Feld
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. Durchschnittlicher Schlusskurs über 24 Balken (n-1) in jedem Feld

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. die Abweichung vom Durchschnittspreis in jeder Gruppe

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. Das Quadrat der Abweichung vom durchschnittlichen Schlusskurs

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. Das Produkt der Abweichungen, d.h. jedes Element im Array Währung 1 wird mit dem gleichen Element in Währung 2 multipliziert,
z. B. wird der Wert von dx[1][0] (Währung 1) mit dy[1][0] (Währung 2) multipliziert; dx[3][4]*dy[3][4], usw.

for(int i=1; i<n; i++)                                                                  
      {
      for(int p=0; p<m; p++)
         {
         dxdy[i][p]=(dx[i][p]*dy[i][p]);
        
         }
      }  

7. Berechnen Sie die Summe der Quadrate der Abweichungen und die Summe des Produkts der Abweichungen

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. Nun, eigentlich der Korrelationskoeffizient und ersetzen Sie es in den Puffer

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

__________________________________________________________________________________________
Wie oben geschrieben, ist der Fehler ein Array-Überlauf. Das Skript mit demselben Code zur Berechnung des Korrelationskoeffizienten berücksichtigt diesen Koeffizienten

 
Timur1988:
Als #property strict geschrieben wurde, erzeugte der Compiler in jeder for()-Schleife Fehler, die besagten, dass Variablen vom Typ sein müssen, so dass ich in jeder Schleife int i und int p schreiben musste. Danach hat der Compiler keine Fehler mehr erzeugt, aber die Zeile wurde nicht gebaut. Als ich #property strict entfernte, brauchte der Compiler den Typ nicht in jeder Schleife zu deklarieren, und die Zeile wurde erstellt.

int i und int p müssen nur einmal deklariert werden - vor init()

können Sie eine solche Zeile vor double Buffer1[] schreiben;

int i,p;

im int-Code entfernen

#Eigenschaft strict muss zurückgegeben werden

und führen Sie die Kompilierung erneut durch

dann auf Fehler prüfen

dann, im Falle eines Array-Überlaufs, in welcher Code-Zeile nachsehen (die Nummer ist von Interesse und die Zeile selbst). Vorhin war es die Zeile Nummer 90 in Ihrem Code.

Der Fehler bedeutet, dass, wenn Sie 24 Werte im Array haben und Sie den 24. Es ist ein Fehler. Versuchen Sie, es herauszufinden. Die Indexnummerierung beginnt bei Null, d.h. in Ihrem Fall 0,1,...23.

Wenn wir nicht verstehen können - werfen Sie diese Zeile hier, werden wir denken

 
Renat Akhtyamov:

int i und int p müssen nur einmal deklariert werden - vor init()

"Der Weg zur Programmierhölle ist mit globalen Variablen gepflastert". S. McConnell.
 
Alexey Kozitsyn:
"Der Weg zur Programmierhölle ist mit globalen Variablen gepflastert". S. McConnell.
Manchmal ist es schwieriger, ohne sie auszukommen, aber nicht im Fall des fraglichen Indikators.
 
Artyom Trishkin:
Manchmal ist es schwieriger, ohne sie auszukommen, aber nicht im Fall des fraglichen Indikators.
Ich stimme zu, manchmal kann man gar nicht ohne sie auskommen. Aber nicht in diesem Fall.
 
Alexey Kozitsyn:
Ich stimme zu, manchmal kann man gar nicht ohne sie auskommen. Aber nicht in diesem Fall.

In diesem Fall wird mehr Code geschrieben als notwendig und ausreichend ist.

Übrigens kann man auch vor jede Variable den Typ schreiben, auch wenn der Variablenname derselbe ist: ...., aber das ist nicht die richtige Codekonstruktion.

 
Renat Akhtyamov:
In diesem Fall wird mehr Code geschrieben als nötig.
Achten Sie darauf, dass Sie nicht zu wenig Platz auf der Seite haben...
 
Renat Akhtyamov:

Sie können übrigens auch type vor jede Variable schreiben, auch wenn der Variablenname derselbe.... ist, aber das ist nicht der richtige Codeaufbau.

In der Tat, ich tue es, Sie sollten wahrscheinlich nicht beraten werden, aber vielleicht werden Sie Ihre Entscheidung überdenken, wenn Sie auf einige Probleme stoßen.
 
Alexey Kozitsyn:
Das tue ich auch, aber man sollte Ihnen wahrscheinlich nicht dazu raten, aber vielleicht überdenken Sie Ihre Entscheidung noch einmal, wenn Sie auf Probleme stoßen.
for(int i=1; int i<int n; int i++)                                                                  
...
Oder? Bitte sehr.
 
Renat Akhtyamov:

In diesem Fall haben Sie mehr Code als nötig und ausreichend geschrieben.

Sie können übrigens auch type vor jede Variable schreiben, auch wenn der Variablenname derselbe.... ist, aber das ist nicht der richtige Codeaufbau.

Jede Variable hat ihren eigenen Geltungsbereich. Selbst innerhalb geschweifter Klammern gibt es einen anderen Geltungsbereich für die in diesem Bereich deklarierte Variable - innerhalb der geschweiften Klammern. Warum sollte ich also zum Beispiel an verschiedenen Stellen eines Programms Schleifenindexvariablen mit unterschiedlichen Namen anlegen, wenn ich weiß, dass sie sich nicht überschneiden und es ausreichend und üblich ist, einen Variablennamen wie "i" zu verwenden?