MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 18

 
Artyom Trishkin:
それはあまり良くないですね。おそらくコンパイル時に警告が出たのでしょうか?このような場合は、#property strict ではなく、警告の原因を取り除く必要があります。
property strictを書いたとき、コンパイラはfor()の各ループで変数に型を持たせなければならないというエラーを出したので、各ループでint iとint pを書かなければならなかったのです。その後、コンパイラはエラーを出さなくなったが、その行はビルドされなかった。property strictを削除したら、コンパイラが各サイクルで型宣言をする必要がなくなり、その行がビルドされるようになりました。
 

残高を増やしたのに、本当の口座が ある端末が見つからない。

 
Timur1988:
property strictを綴ると、コンパイラはfor()ループごとに変数には型が必要だというエラーを発生させるので、ループごとにint iとint pを綴らなければなりませんでした。その後、コンパイラはエラーを出さなくなったが、その行はビルドされなかった。このとき、#property strictを削除すると、コンパイラは各ループで型宣言をする必要がなくなり、その行がビルドされるようになりました。

ロジックの暗黙のエラーを利用した典型的なケース。コンパイラが「厳しく」なってから、自己欺瞞が徐々に消えていく。

同じループがたくさんあるのが不思議だったのですが?

また、チャート上でインジケータを 実行する際に「out ofarray」というエラーが発生しても、何ら気にしないのはなぜでしょうか?

例えば、ここ。

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

残高を増やしたのに、本当の口座が ある端末が見つからない。

端末は同じで、実際のアカウントで 再ログインする必要があります。方法:「ファイル」-「取引口座に接続」-表示されるウィンドウで口座番号、パスワード、サーバーを指定します。これらのデータはすべてDCから提供されたもので、何か質問があったときのためです。
 
Timur1988:
property strictを綴ると、コンパイラはfor()ループのたびに変数には型が必要だとエラーを出すので、ループのたびにint iとint pを綴らなければなりませんでした。その後、コンパイラはエラーを出さなくなったが、その行はビルドされなかった。property strictを削除したら、コンパイラが各サイクルで型宣言をする必要がなくなり、その行がビルドされるようになりました。

答えはとても簡単で、些細な配列の オーバーランが発生し、このエラーのためにインジケータが動作しなくなるのです。

    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);

このエラーは実行時に見ることができます。インジケータを起動し、ターミナル - Experts タブでログファイルを確認してください。

 
Vitalie Postolache:

これは、暗黙の論理エラーを利用した典型的なケースです ...

配列を オーバーライドすることは、論理的に重大な誤りであり、このような誤りを「暗黙の」と呼ぶことはできません。
 
Vitalie Postolache:

ロジックの暗黙のエラーを利用した典型的なケース。コンパイラが「厳しく」なってから、自己欺瞞が徐々に消えていく。

なぜ、こんなに同じループがあるのだろうと、ずっと不思議に思っていました。

また、チャート上でインジケータを 実行する際に「out ofarray」というエラーが発生しても、何ら気にしないのはなぜでしょうか?

例えば、ここ。

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


各ディメンジョンの終値の合計を計算するには?
同じサイクルでも、私はプログラミングやアルゴリズムの知識が乏しいため、数式での代入に必要な配列の 要素を必要な次元から選択する以上のことを思いつきませんでした。
 
Andrey F. Zelinsky:

答えはとても簡単で、些細な配列の オーバーランが発生し、このエラーのためにインジケータが動作しなくなるのです。

    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);

このエラーは実行段階で見ることができます。インジケータを起動し、ターミナルタブでログファイルを見てください - Experts:

このエラーを修正する方法を教えていただけませんか?
 
Timur1988:
では、各次元の終値の合計はどのように計算するのでしょうか?
同じサイクルに関しては、プログラミングやアルゴリズムの知識が乏しいため、数式に代入するために必要な配列の その要素を目的の次元から選択する以上のことは思いつかなかった。

例えば、こんな風に。

     for(int i=1; i<n; i++)

      {    
      for(int p=1; 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];
         }         
      }
 
Timur1988:
このエラーを修正する方法を教えてください。

この誤りを正すには、何を、なぜ、どのようにカウントしているかという、計算式を理解する必要があります。

そうして初めて、アルゴリズムを練り上げ、誤差を なくすことができるのです。

計算式を理解せず、直感で計算すると、誤差はなくなるが、間違った計算をすることになる。

p.s. 何を計算しているのか詳しく説明し、コードを詳しくコメントし、そうすれば、エラーを修正する方法を理解できるでしょう。