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).
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.
__________________________________________________________________________________________ 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
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.
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.
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?
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.