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
#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);
}
你能告诉我错误在哪里吗?计算数组元素Koef[]的值,每个元素都被分配一个值。为什么没有分配Buffer1[]?
试着从最后一个周期中删除警报
没有帮助(
很好,他们在那里是没有用的。你最好使用Print(...)而不是Alerts,看看 "专家 "标签上的打印结果。
你有相同的值Edxdy[n-1][p]被分配。如果在以前的循环中,你有一个循环中的循环,而且 "n "的索引发生了变化,在最后一个循环中,它没有变化。最后n-1=24。
大胆尝试--会分配吗?//指示器应该画一条水平黑线。然而,它在黑色背景上将不可见。改变背景的颜色,或者更好地改变线条。
如果它将被分配,你应该考虑--这里写的是什么:Edxdy[24][p]
嘿嘿,也可能一切都分配好了,也画好了,但就是要在黑色背景上画一条黑线?
这里指定了线条的颜色、类型和厚度。
很好,他们在那里是没有用的。你最好使用Print(...)而不是Alerts,看看 "专家 "标签上的打印结果。
你有相同的值Edxdy[n-1][p]被分配。如果在以前的循环中,你有一个循环中的循环,而且 "n "的索引发生了变化,在最后一个循环中,它没有变化。最后n-1=24。
大胆尝试--会分配吗?//指示器应该画一条水平黑线。然而,它在黑色背景上将不可见。改变背景的颜色,或者更好地改变线条。
如果它将被分配,你应该考虑--这里写的是什么:Edxdy[24][p]
嘿嘿,也可能一切都分配好了,也画好了,但就是要在黑色背景上画一条黑线?
在这里你可以看到线条的颜色、类型和厚度。
Edxdy[n-1][p] - 这里我写了dx和dy的乘积之和。这个值需要用来计算由第p维的n-1个元素组成的数组的皮尔逊相关系数Koef。在这种情况下,我决定从第一条开始,计算24条的相关性。结果与类似的皮尔逊相关系数的计算相比,它的计算是一个简单的脚本(只采取了一维数组),以及网站 "在线货币对相关计算器"。所有的值都是一样的。我认为,数组Buffer1[]的声明有误。我用类似的代码创建了一个脚本,加上通过ArrayResize(Buffer1, n)的数组声明。在脚本代码中Buffer1[p]=Koef[p]--数值被正确分配。在指标代码中没有(((.
你看了我的帖子吗?
SetIndexStyle(0,DRAW_LINE,0,1,Green); - 放入数值,但仍然没有画线。
是的,谢谢你!
SetIndexStyle(0,DRAW_LINE,0,1,Green); - 放入数值,但仍然不能画线。
也可以尝试去掉#propertyindicator_minimum-1,#propertyindicator_maximum1 限制器,也许缓冲区的值是在它们后面画的。
谢谢你!删除了#属性严格 - 有帮助)