来自一个 "傻瓜 "的问题 - 页 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按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个元素的深度,也是值得怀疑的。

如果第一种变体的速度更快,是绝对收益还是完全取决于遇到的分形的总数(例如,小TF上的分形多得多)?

 

在这里https://www.mql5.com/ru/forum/3775/page59#comment_94865,我问了一个问题,就是把许多类似缓冲区的声明、链接、初始化和其他动作放到一个循环中,以便减少代码,提高可读性和可管理性。我收到了一个带例子的答案(类、结构),并理解了它。

现在根据同样的原则,我试图夯实#属性类型的多重分配。

#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
[...]

并至少遇到了两个问题。

1.对于全局级别的禁止,也就是说,最早的使用不早于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]
}
编译器对'#'发誓(如预期):'#属性'--意外的标记
你能告诉我这个想法在原则上是否可行,如何可行?
 

你能告诉我如何声明一个二维数组的数组吗?

类似这样的事情。

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

你能告诉我是否可以声明一个二维数组的数组?

可以声明一个字段为数组的结构,编译器甚至跳过结构中的动态数 组。

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

你能告诉我如何声明一个二维数组的数组吗?

类似这样的事情。

#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。也是一个有趣的补充。更加熟悉。))
 

但是,你如何用#属性来做这一切呢?- 我想知道...

不知道?

 
x100intraday:

但是,你如何用# 属性来做这一切呢?- 我想知道...

不知道?

解密