新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 19

 
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];
         }

__________________________________________________________________________________________
正如上面所写,错误是数组超限。计算相关系数的相同代码的脚本考虑这个系数

 
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。

如果我们不能理解--把这句话扔在这里,我们会想

 
Renat Akhtyamov:

int i和int p只需要声明一次--在init()之前。

"通往编程地狱的道路是由全局变量 铺就的"。S. McConnell。
 
Alexey Kozitsyn:
"通往编程地狱的道路是由全局变量 铺就的"。S. McConnell。
有时没有它们会更困难,但在有关指标的情况下却不是这样。
 
Artyom Trishkin:
有时没有它们会更困难,但在有关指标的情况下却不是这样。
我同意,有时你根本就离不开它们。但在这种情况下不是。
 
Alexey Kozitsyn:
我同意,有时你根本就离不开它们。但在这种情况下不是。

在这种情况下,所写的代码比必要和足够的多。

顺便说一下,你也可以在每个变量前写上类型,即使变量的名字是一样的....,但这不是正确的代码结构。

 
Renat Akhtyamov:
在这种情况下,编写的代码比需要的多。
确保你不会在页面上耗尽空间...
 
Renat Akhtyamov:

顺便说一下,你也可以在每个变量前写上类型,即使变量的名字是一样的....,但这不是正确的代码结构。

实际上,我是这样做的,你可能不应该被建议,但也许你会在遇到一些问题时重新考虑你的决定。
 
Alexey Kozitsyn:
实际上我是这样做的,可能不应该建议你这样做,但也许当你遇到一些问题时,你会重新考虑你的决定。
for(int i=1; int i<int n; int i++)                                                                  
...
对吗?不客气。
 
Renat Akhtyamov:

在这种情况下,你写的代码超过了必要和足够的范围。

顺便说一下,你也可以在每个变量前写上type,即使变量的名字是一样的....,但这不是正确的代码结构。

每个变量都有自己的范围。甚至在大括号内--在该范围内声明的变量的不同范围--在大括号内。因此,举例来说,如果我知道它们不会重叠,而且使用 "i "这样的变量名就足够了,而且是习惯性的,那么我为什么要在程序的不同地方创建不同名字的循环索引变量呢?