Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 19
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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 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. Durchschnittlicher Schlusskurs über 24 Balken (n-1) in jedem Feld
{
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 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 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 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 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
{
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
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;
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
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.
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.
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.
In diesem Fall wird mehr Code geschrieben als nötig.
Sie können übrigens auch type vor jede Variable schreiben, auch wenn der Variablenname derselbe.... ist, aber das ist nicht der richtige Codeaufbau.
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.
...
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.