新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 19 1...121314151617181920212223242526...1953 新评论 Timur1988 2016.11.29 06:32 #181 Andrey F. Zelinsky:为了纠正这个错误,你需要了解你的公式--什么、为什么和如何计算。也只有这样,你才能算出你的算法,消除错误。通过 "直觉 "方法和不理解你的公式--你会消除错误,但你会做出错误的计算。p.s. 详细解释你正在计算的内容--详细评论你的代码--然后我们会明白你将如何解决这个错误。 我们需要一个以收盘价的皮尔逊相关系数值为基础的指标。我们取一个由24个小节组成的数组(在我的例子中,它是变量n),从第一个小节开始--为2种货币。计算24个柱子的相关性--在第一个柱子上获得数值。然后计算24个小节的相关性,但要从第二个小节开始计算,以此类推。 1.我取了一个收盘价的二维数组(i元素和p维)。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.我现在计算每个数组中的收盘价之和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.每个数组中24条(n-1)的平均收盘价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. 每个阵列中的平均价格的偏差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.与平均收盘价偏差的平方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.偏差的乘积,即货币1阵列中的每个元素都乘以货币2中的相同元素。 例如,dx[1][0](货币1)的值乘以dy[1][0](货币2);dx[3][4]*dy[3][4],等等。for(int i=1; i<n; i++) { for(int p=0; p<m; p++) { dxdy[i][p]=(dx[i][p]*dy[i][p]); } } 7.计算偏差的平方之和和偏差的乘积之和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.那么,实际上相关系数并将其代入缓冲区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]; }__________________________________________________________________________________________ 正如上面所写,错误是数组超限。计算相关系数的相同代码的脚本考虑这个系数 Any questions from newcomers 任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. Any rookie question, so Renat Akhtyamov 2016.11.29 07:44 #182 Timur1988: 在编写#property strict时,编译器在每个for()循环中都产生了错误,说变量必须是类型的,所以我不得不在每个循环中写int i和int p。此后,编译器没有产生错误,但该行没有构建。当我删除#property strict时,编译器不要求在每个循环中声明类型,这一行就被构建了。int i和int p只需要声明一次--在init()之前。你可以在双倍 Buffer1[]之前写这样一行。int i,p;在int代码中删除#属性严格必须返回然后再次运行编译然后检查是否有错误然后,在数组超限的情况下,查看哪一行的代码(数字和行本身都很重要)。早些时候,它是你的代码中的第90行。这个错误意味着,如果你在数组中有24个值,而你请求第24个索引,那么.这是一个错误。试着把它弄清楚。索引的编号从零开始,即在你的案例中是0,1,...23。如果我们不能理解--把这句话扔在这里,我们会想 [删除] 2016.11.29 09:46 #183 Renat Akhtyamov:int i和int p只需要声明一次--在init()之前。"通往编程地狱的道路是由全局变量 铺就的"。S. McConnell。 Artyom Trishkin 2016.11.29 10:08 #184 Alexey Kozitsyn:"通往编程地狱的道路是由全局变量 铺就的"。S. McConnell。 有时没有它们会更困难,但在有关指标的情况下却不是这样。 [删除] 2016.11.29 10:12 #185 Artyom Trishkin: 有时没有它们会更困难,但在有关指标的情况下却不是这样。 我同意,有时你根本就离不开它们。但在这种情况下不是。 Renat Akhtyamov 2016.11.29 10:41 #186 Alexey Kozitsyn: 我同意,有时你根本就离不开它们。但在这种情况下不是。在这种情况下,所写的代码比必要和足够的多。顺便说一下,你也可以在每个变量前写上类型,即使变量的名字是一样的....,但这不是正确的代码结构。 [删除] 2016.11.29 10:44 #187 Renat Akhtyamov: 在这种情况下,编写的代码比需要的多。 确保你不会在页面上耗尽空间... [删除] 2016.11.29 10:47 #188 Renat Akhtyamov:顺便说一下,你也可以在每个变量前写上类型,即使变量的名字是一样的....,但这不是正确的代码结构。 实际上,我是这样做的,你可能不应该被建议,但也许你会在遇到一些问题时重新考虑你的决定。 Renat Akhtyamov 2016.11.29 10:50 #189 Alexey Kozitsyn: 实际上我是这样做的,可能不应该建议你这样做,但也许当你遇到一些问题时,你会重新考虑你的决定。for(int i=1; int i<int n; int i++) ... 对吗?不客气。 Artyom Trishkin 2016.11.29 10:51 #190 Renat Akhtyamov:在这种情况下,你写的代码超过了必要和足够的范围。顺便说一下,你也可以在每个变量前写上type,即使变量的名字是一样的....,但这不是正确的代码结构。 每个变量都有自己的范围。甚至在大括号内--在该范围内声明的变量的不同范围--在大括号内。因此,举例来说,如果我知道它们不会重叠,而且使用 "i "这样的变量名就足够了,而且是习惯性的,那么我为什么要在程序的不同地方创建不同名字的循环索引变量呢? 1...121314151617181920212223242526...1953 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
为了纠正这个错误,你需要了解你的公式--什么、为什么和如何计算。
也只有这样,你才能算出你的算法,消除错误。
通过 "直觉 "方法和不理解你的公式--你会消除错误,但你会做出错误的计算。
p.s. 详细解释你正在计算的内容--详细评论你的代码--然后我们会明白你将如何解决这个错误。
我们需要一个以收盘价的皮尔逊相关系数值为基础的指标。我们取一个由24个小节组成的数组(在我的例子中,它是变量n),从第一个小节开始--为2种货币。计算24个柱子的相关性--在第一个柱子上获得数值。然后计算24个小节的相关性,但要从第二个小节开始计算,以此类推。
1.我取了一个收盘价的二维数组(i元素和p维)。
{
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.每个数组中24条(n-1)的平均收盘价
{
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. 每个阵列中的平均价格的偏差
{
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.与平均收盘价偏差的平方
{
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.偏差的乘积,即货币1阵列中的每个元素都乘以货币2中的相同元素。
例如,dx[1][0](货币1)的值乘以dy[1][0](货币2);dx[3][4]*dy[3][4],等等。
{
for(int p=0; p<m; p++)
{
dxdy[i][p]=(dx[i][p]*dy[i][p]);
}
}
7.计算偏差的平方之和和偏差的乘积之和
{
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.那么,实际上相关系数并将其代入缓冲区
{
Koef[p]=Edxdy[n-1][p]/sqrt(Edx2[n-1][p]*Edy2[n-1][p]);
Buffer1[p]=Koef[p];
}
__________________________________________________________________________________________
![](https://c.mql5.com/3/110/1__7.png)
正如上面所写,错误是数组超限。计算相关系数的相同代码的脚本考虑这个系数
在编写#property strict时,编译器在每个for()循环中都产生了错误,说变量必须是类型的,所以我不得不在每个循环中写int i和int p。此后,编译器没有产生错误,但该行没有构建。当我删除#property strict时,编译器不要求在每个循环中声明类型,这一行就被构建了。
int i和int p只需要声明一次--在init()之前。
你可以在双倍 Buffer1[]之前写这样一行。
在int代码中删除
#属性严格必须返回
然后再次运行编译
然后检查是否有错误
然后,在数组超限的情况下,查看哪一行的代码(数字和行本身都很重要)。早些时候,它是你的代码中的第90行。
这个错误意味着,如果你在数组中有24个值,而你请求第24个索引,那么.这是一个错误。试着把它弄清楚。索引的编号从零开始,即在你的案例中是0,1,...23。
如果我们不能理解--把这句话扔在这里,我们会想
int i和int p只需要声明一次--在init()之前。
"通往编程地狱的道路是由全局变量 铺就的"。S. McConnell。
有时没有它们会更困难,但在有关指标的情况下却不是这样。
我同意,有时你根本就离不开它们。但在这种情况下不是。
在这种情况下,所写的代码比必要和足够的多。
顺便说一下,你也可以在每个变量前写上类型,即使变量的名字是一样的....,但这不是正确的代码结构。
在这种情况下,编写的代码比需要的多。
顺便说一下,你也可以在每个变量前写上类型,即使变量的名字是一样的....,但这不是正确的代码结构。
实际上我是这样做的,可能不应该建议你这样做,但也许当你遇到一些问题时,你会重新考虑你的决定。
...
在这种情况下,你写的代码超过了必要和足够的范围。
顺便说一下,你也可以在每个变量前写上type,即使变量的名字是一样的....,但这不是正确的代码结构。