在MQL5中一起学习和写作 - 页 14

 

出于好奇心,我检查了一下。结果如下

2011.04.15 15:50:34     123 (EURUSD,D1) time for 'd = a + b + c' = 84453 milliseconds, i = 10000000
2011.04.15 15:51:54     123 (EURUSD,D1) time for 'StringAdd()' = 80906 milliseconds, i = 10000000
2011.04.15 15:53:22     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 10000000
2011.04.15 15:55:11     123 (EURUSD,D1) time for 'd = a + b + c' = 83266 milliseconds, i = 10000000
2011.04.15 15:56:39     123 (EURUSD,D1) time for 'StringAdd()' = 88390 milliseconds, i = 10000000
2011.04.15 15:58:12     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000

但在我看来,这里有一些问题(我是指检查算法)......

 

Yedelkin:

事实证明,StringConcatenate 比使用加法运算的字符串绑定要慢。有什么障碍?

琴弦的特殊性。
在第一遍中,你得到了合适的缓冲区大小来存储字符串 加法和转换 的结果,也就是说,对于字符串d、(字符串)b和(字符串)c来说,没有缓冲区的重新定位。
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
mql5:
特色弦乐。
在第一遍中,你得到了正确的缓冲区大小来存储字符串的加法和转换 结果,也就是说,字符串d、(字符串)b和(字符串)c的缓冲区重新定位不会发生。

尝试了不同的比较方式--没有得到我想要的结果。我最后得到的代码是这样的。

   uint   start,stop;
   long   i,length=1000000;
   string a1[1000000]; for(i=0;i<length;i++) a1[i]="Пример";
   string a2[1000000]; for(i=0;i<length;i++) a2[i]="Пример";
   string a3[1000000]; for(i=0;i<length;i++) a3[i]="Пример";

   double b1[1000000]; ArrayInitialize(b1,1.26);
   double b2[1000000]; ArrayInitialize(b2,1.26);
   double b3[1000000]; ArrayInitialize(b3,1.26);

   double c1[1000000]; ArrayInitialize(c1,1.27);
   double c2[1000000]; ArrayInitialize(c2,1.27);
   double c3[1000000]; ArrayInitialize(c3,1.27);

   string d1[1000000]; for(i=0;i<length;i++) d1[i]=NULL;
   string d2[1000000]; for(i=0;i<length;i++) d2[i]=NULL;
   string d3[1000000]; for(i=0;i<length;i++) d3[i]=NULL;


////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      d1[i]=a1[i]+(string)b1[i]+(string)c1[i];
     }
   stop=GetTickCount();
   Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(d2[i],a2[i]);
      StringAdd(d2[i],(string)b2[i]);
      StringAdd(d2[i],(string)c2[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringConcatenate(d3[i],a3[i],b3[i],c3[i]);
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);

结果。

KL 0 DoubleToString (EURGBP,M1)      23:53:01        time for 'd = a + b + c' = 15766 milliseconds, i = 1000000
HD 0 DoubleToString (EURGBP,M1)      23:53:26        time for 'StringAdd()' = 25390 milliseconds, i = 1000000
FK 0 DoubleToString (EURGBP,M1)      23:54:03        time for 'StringConcatenate(d,a,b,c)' = 36516 milliseconds, i = 1000000
KS 0 DoubleToString (EURGBP,M1)      23:54:56        time for 'd = a + b + c' = 15781 milliseconds, i = 1000000
FL 0 DoubleToString (EURGBP,M1)      23:55:21        time for 'StringAdd()' = 25375 milliseconds, i = 1000000
OR 0 DoubleToString (EURGBP,M1)      23:55:57        time for 'StringConcatenate(d,a,b,c)' = 35828 milliseconds, i = 1000000
 
问题。OrdersTotal() 函数返回一个交易账户的有效订单总数有没有一种简单的方法来获取特定符号的有效订单数量?
 
Yedelkin:
问题。OrdersTotal() 函数返回一个交易账户的有效订单总数有没有一种简单的方法来获得某个符号的有效订单数量?
获得整个历史,并作出选择。
 
Urain:
了解整个故事并进行抽样调查。
好的。所以没有简单的方法。
 

问题。HistorySelect()和HistorySelectByPosition() 函数 请求订单的历史和交易的历史 我运行了《指南》中的解释性脚本,其交易清单是按升序排列的。是偶然的,还是函数HistorySelect()和HistorySelectByPosition()被编程为返回以升序排列的列表?

 
Yedelkin:

问题。HistorySelect()和HistorySelectByPosition() 函数 请求订单的历史和交易的历史 我运行了《指南》中的解释性脚本,其交易清单是按升序排列的。是偶然如此,还是HistorySelect()和HistorySelectByPosition() 函数 被编程为返回以升序排列的列表?

无论我做了多少次实验,结果都是一样的:返回一个以某种方式排序的列表。

有一次,我甚至想写一个请求,要求增加一个参数,确切地指定条目应该如何排序。

但后来我仔细想了想,决定不值得这样做(他们可能会自己回答这类问题等等),尽管有可能我不应该把它写下来......。

 
Interesting:

......自己分类和所有这些

只是,如果有预设的强制排序是一回事,但手动创建额外的排序是另一回事。
 
Yedelkin:
只是如果有一个预设的强制排序是一回事,但手动创建额外的排序是另一回事。

我只是在MT4中进行了手动排序(也进行了过滤),如果我没记错的话,我是按 "气泡 "排序的。

我从数据库那里得到了排序代码,所以可以澄清一下。

而且我还没有决定在MQL5中的最佳排序方式,因为我已经了解到,现在的历史查询并不与历史标签相联系(排序和内容不取决于用户在标签中做了什么)。