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

 
エラーの発生箇所を教えてください。配列要素 Koef[] の値が計算され、各要素に値が割り当てられる。Buffer1[]が代入されないのはなぜですか?

#property copyright "Copyright 2016, T"
#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);
   }
 
Timur1988:
エラーの発生箇所を教えてください。配列要素 Koef[] の値が計算され、各要素に値が割り当てられる。Buffer1[]が代入されないのはなぜですか?

最後のループからAlertを 削除してみる
 
Renat Akhtyamov:
最終サイクルのAlertを削除してみてください
は役に立たなかった(
 
Timur1988:
は役に立たなかった(

よかった、そこそこ使えるんだ。アラートの代わりにPrint(...)を使って、"Experts "タブでプリントアウトを見た方が良いですよ

同じ値Edxdy[n-1][p]が代入されていますね。以前のループではループの中にループがあり、「n」インデックスが変化しても、最後のループでは変化しない。最後のn-1=24。

Edxdy[n-1][p]

思い切ってやってみる - 割り当てられるか?//インジケータは水平な黒い線を 描きます。ただし、黒い背景の場合は表示されません。背景の色を変えるか、線を良くする。

Buffer1[p]=4;

もし割り当てられるなら、ここに書かれていることを考えなければなりません: Edxdy[24][p]

へえ、全部割り当てられて描かれているのかもしれませんが、黒い背景に黒い線を描くということですか?

ここでは、線の色、種類、太さを指定します。

SetIndexStyle(0, DRAW_LINE, 0, 1, Green);
 
Renat Akhtyamov:

よかった、そこそこ使えるんだ。アラートの代わりにPrint(...)を使って、"Experts "タブでプリントアウトを見た方が良いですよ

同じ値Edxdy[n-1][p]が代入されていますね。以前のループではループの中にループがあり、「n」インデックスが変化しても、最後のループでは変化しない。最後のn-1=24。

Edxdy[n-1][p]

思い切ってやってみる - 割り当てられるか?//インジケータは水平な黒い線を 描きます。ただし、黒い背景の場合は表示されません。背景の色を変えるか、線を良くする。

Buffer1[p]=4;

もし割り当てられるなら、ここに書かれていることを考えなければなりません: Edxdy[24][p]

へえ、全部割り当てられて描かれているのかもしれませんが、黒い背景に黒い線を描くということですか?

ここでは、線の色、種類、太さを確認することができます。

SetIndexStyle(0, DRAW_LINE, 0, 1, Green);
Edxdy[n-1][p] - ここでは、積dxとdyの和を書きました。この値は、p番目の次元のn-1個の要素からなる配列のピアソンの相関係数Koefを計算するために必要である。今回は、1本目のバーから24本分の相関を計算することにしました。結果は、簡単なスクリプトで計算するピアソンの相関係数(一次元配列のみ撮影)、およびサイト「オンライン通貨ペア相関計算機」と同様の計算と比較しました。数値はすべて同じです。配列Buffer1[]の宣言に間違いがあると思われます。同様のコードに加え、ArrayResize(Buffer1, n)による配列宣言を加えたスクリプトを作成しました。スクリプトコードでは Buffer1[p]=Koef[p] - 値は正しく代入されています。コードにインジケータがない((.
 
Timur1988:
Edxdy[n-1][p] - ここでは、dxとdyの積の和を書きました。この値は、p番目の次元のn-1個の要素からなる配列のピアソン相関係数Koefを計算するために必要である。今回は、1本目のバーから24本分の相関を計算することにしました。結果は、簡単なスクリプトで計算するピアソンの相関係数(一次元配列のみ撮影)、およびサイト「オンライン通貨ペア相関計算機」と同様の計算と比較しました。数値はすべて同じです。配列Buffer1[]の宣言に間違いがあると思われます。同様のコードに加え、ArrayResize(Buffer1, n)による配列宣言を加えたスクリプトを作成しました。スクリプトコードでは Buffer1[p]=Koef[p] - 値は正しく代入されています。インジケータコードにはない((.
私の投稿を読んだことがありますか?
 
Renat Akhtyamov:
私の投稿を読みましたか?
はい、ありがとうございます
SetIndexStyle(0,DRAW_LINE,0,1,Green); - 値を入れましたが、まだ線が描けません
 
Timur1988:
はい、ありがとうございます
SetIndexStyle(0,DRAW_LINE,0,1,Green); - 値を入れましたが、まだ線は描画 されません。
また、#propertyindicator_minimum-1,#propertyindicator_maximum1の リミッターを解除してみてください。おそらくバッファの値がそれらの後ろに描画されているのでしょう。
 
Vitalie Postolache:
また、#propertyindicator_minimum-1,#propertyindicator_maximum1 のリミッターを解除してみてください。おそらくバッファの値がそれらの後ろに描画されているのでしょう。
ありがとうございます。プロパティの厳密性を削除 - 助かりました)
 
Timur1988:
ありがとうございました。プロパティの厳密性を削除 - 助かりました)
それはあまり良くないですね。おそらくコンパイル時に警告が出たのでしょうか?このような場合は、#property strict ではなく、警告の原因を取り除く必要があります。