"ダミー "からの質問 - ページ 86

 

レナット 実践的というより、理論的な質問でしたね。

迷子にならないように、iFractalsのヘルプにある例を参考にさせていただきます。確かにそこにインジケーターがあるのですが、ここではスクリプトによるグラフィックレイアウトの計算一本に作業を簡略化してみましょう。

例えば、歴史全体(またはフラクタルがたくさんある中間の時間枠の相当部分)のトップサイドのすべてのフラクタルバーの時間を調べることを意図しているとします。FrUpBuffer[shift]!=EMPTY_VALUEでループ内のCopyTimeを 1要素の深さまで繰り返し妨害するのが良いというのは正しい理解でしょうか?

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
   {
     CopyTime(_Symbol,PERIOD_H4, shift, 1, Arr);
     Print(Arr[0]);
   }
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);

   return(true);
  }

で、CopyTime by depth of FrUpBufferで一気に履歴を食べるよりも高速に結果が得られます。

handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for(int shift=0; shift<BarsCalculated(handle); shift++)
{
   if(FrUpBuffer[shift]!=EMPTY_VALUE)
     Print(TimeUpBuffer[shift]);
}

bool FillArraysFromBuffers(double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if(CopyBuffer(ind_handle,0,0,amount,up_arrows)<0) return(false);
   else CopyTime(_Symbol,PERIOD_H4,0,amount,TimeUpBuffer);

   return(true);
  }
で、同じループで同じifでフラクタルバーの時間値を表示するだけ?

どちらも同じタスクで、実装が少し違うだけです。

直感的には、バータイムの膨大な文字列(フラクタルも空も)を配列にコピーする方が時間とコストがかかることは理解できます。一方、CopyTimeを1要素の深さまで繰り返し引っ張るのは疑問があります。

もし最初の variant の方が速いなら、それは絶対的な利益なのか、それとも遭遇するフラクタル の総数によるのか(たとえば、小さな TF ではもっとたくさんある)。

 

こちらhttps://www.mql5.com/ru/forum/3775/page59#comment_94865 同じ型の複数のバッファに対する宣言、リンク、初期化などの動作をループに入れることで、コードの削減と可読性・管理性の向上を図ることについて質問させていただきました。例題(クラス、構造)で回答してもらい、理解できた。

今度は同じ原理で、#property型の多重代入を抑制しようとしたのです。

#property indicator_label1  "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen

#property indicator_label2  "FractalDown1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
// ---
#property indicator_label3  "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrBlue

#property indicator_label4  "FractalDown2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrBlue
[...]

と、少なくとも2つの問題に遭遇しました。

1.グローバルレベルでのForは禁止、つまりOnInit()よりも早く使うことはできないが、#propertyは他の関数より先にグローバルレベルで宣言されることが知られて いる。

2.OnInit()のループ内で、インジケータにプロパティを割り当てようとした場合。

// понимаю, что сочинил бред
for (int i=0; i<NUMBER; i++)
{
  #property Property_Array[i].indicator_label (string)("Fractal"+i)
  #property Property_Array[i].indicator_type  DRAW_ARROW
  #property Property_Array[i].indicator_color clrArr[i]
}
コンパイラは '#' に悪態をつきます(予想通り):'#property' - 想定外のトークン です。
このアイデアが原理的に実現可能かどうか、またどのように実現可能なのかを教えてください。
 

2次元配列の配列の宣言方法を教えてください。

こんな感じ。

double Buffers[6][3]={ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] };
 
tol64:

2次元の配列を宣言することは可能かどうか教えてください。

フィールドを配列とした構造体の配列を宣言すると、コンパイラは構造体内の動的 配列をスキップすることさえできる。

struct arr{double arr_str[];};
arr buffers[6][3];
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
tol64:

2次元配列の配列の宣言方法を教えてください。

こんな感じ。

#define DIM1_NUMBER 6
#define DIM2_NUMBER 3

struct TBuffer
{
  string Buffer[3]; // для нагляднсти поменяем double на string
};

TBuffer Buffer_Array[DIM1_NUMBER];

string prefixArr[6]={"a","b","c","d","e","f"};

int OnInit()
  {
   for (int j=0; j<DIM1_NUMBER; j++)
   {
      for (int i=0; i<DIM2_NUMBER; i++)
      {
        string t;
   
        StringConcatenate(t,prefixArr[j],i);
        Buffer_Array[j].Buffer[i]=t;
      }
   }

   Print(Buffer_Array[0].Buffer[0],", ",
         Buffer_Array[0].Buffer[1],", ",
         Buffer_Array[0].Buffer[2],"; ",

         Buffer_Array[1].Buffer[0],", ",
         Buffer_Array[1].Buffer[1],", ",
         Buffer_Array[1].Buffer[2],"; ",

         Buffer_Array[2].Buffer[0],", ",
         Buffer_Array[2].Buffer[1],", ",
         Buffer_Array[2].Buffer[2],"; ",

         Buffer_Array[3].Buffer[0],", ",
         Buffer_Array[3].Buffer[1],", ",
         Buffer_Array[3].Buffer[2],"; ",

         Buffer_Array[4].Buffer[0],", ",
         Buffer_Array[4].Buffer[1],", ",
         Buffer_Array[4].Buffer[2],"; ",

         Buffer_Array[5].Buffer[0],", ",
         Buffer_Array[5].Buffer[1],", ",
         Buffer_Array[5].Buffer[2]
   );

   return(0);
  }
[修正しました]
 

IgorM、 x100intraday

オプションをありがとうございました。これなら大丈夫だと思うので、試してみます。

 
tol64:

IgorM、 x100intraday

オプションをありがとうございました。これならいけると思うので、試してみます。

ちなみに、「Buffer」という名称は「_」などのなぞなぞに変えると、通話が完全にクリアになります。

Buffer_Array[0]._[0]

Buffer_Array[0].¦[0]

 
Urain:

ちなみに、"Buffer "という名前は"_"などに変更することで、呼び出しは完全にクリアになります。

Urain さん、ありがとうございます。また、興味深いのは追加要素です。その方が親しみやすいからです))
 

しかし、#propertyでこれをすべて行うにはどうしたらよいのでしょうか。- どうなんだろう...。

わからない?

 
x100intraday:

しかし、#propertyで これをすべて行うにはどうしたらよいのでしょうか。- どうなんだろう...。

わからない?

デクリプト