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?
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
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
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:
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(((.
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.
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
#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);
}
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 dem letzten Zyklus zu entfernen
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.
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.
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:
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.
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.
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:
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?
SetIndexStyle(0,DRAW_LINE,0,1,Green); - Werte setzen, aber immer noch keine Linie zeichnen.
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 die Pufferwerte dahinter gezeichnet.
Ich danke Ihnen! Entfernte #Eigenschaft strict - half)