我如何在MQL5中获得Open,Low,High,Close参数? - 页 9

 
Renat Akhtyamov:

我已经习惯了四合板,它更紧凑,更容易阅读

;)

我的紧凑的例子是在头版......这基本上是一切开始的地方 ))))

 
Igor Makanu:

嗯,我想你有不想构建成字节的位子......基本上没有更多的选择了!))))

如果这个线程是在版主的注视下,就需要做一些事情......我把宏拆开来做零件。

Artem,它到底有没有用?

2019.07.30 19:42:16.639 tst_iXXX_Copy (EURUSD,H1) 开始测试#1...

2019.07.30 19:42:40.199 tst_iXXX_Copy (EURUSD,H1) CopyClose : loops=500000000 , ms=23422

2019.07.30 19:42:40.199 tst_iXXX_Copy (EURUSD,H1) 开始测试#2...

2019.07.30 19:43:26.953 tst_iXXX_Copy (EURUSD,H1) iClose : loops=500000000 , ms=46609

2019.07.30 19:43:26.953 tst_iXXX_Copy (EURUSD,H1) 开始测试#3...

2019.07.30 19:44:12.274 tst_iXXX_Copy (EURUSD,H1) Close[i] : loops=500000000 , ms=45156

2019.07.30 19:44:12.274 tst_iXXX_Copy (EURUSD,H1) 开始测试 #4...

2019.07.30 19:44:42.080 tst_iXXX_Copy (EURUSD,H1) CopyRates : loops=500000000 , ms=29656

2019.07.30 19:44:42.080 tst_iXXX_Copy (EURUSD,H1) 结束脚本

是的,这很有效。

2019.07.31 00:38:01.936 Start test № 1...
2019.07.31 00:38:31.097 CopyClose : loops=500000000 , ms=29015
2019.07.31 00:38:31.097 Start test № 2...
2019.07.31 00:41:25.095 iClose : loops=500000000 , ms=173875
2019.07.31 00:41:25.095 Start test № 3...
2019.07.31 00:44:29.777 Close[i] : loops=500000000 , ms=184547
2019.07.31 00:44:29.777 Start test № 4...
2019.07.31 00:45:01.074 CopyRates : loops=500000000 , ms=31172
2019.07.31 00:45:01.074 End script

一句话。

  • 29秒 CopyClose()
  • 173秒iClose()
  • 184秒 关闭[]
  • 31秒 CopyRates()

怎么了?为什么我有超过六倍的差异?

深圳在D1上运行

 
Artyom Trishkin:

怎么了?为什么我有超过六倍的差异?


伊戈尔-马卡努

嗯,我想你有不想构建成字节的位子......基本上没有更多的选择了!))))

)))

 

Igor Makanu:

嗯,我想你有不想构建成字节的位子......基本上没有更多的选择了!))))

)))

在H1上做了一个测试,没有明显的区别。

2019.07.31 00:55:30.290 Start test № 1...
2019.07.31 00:55:58.234 CopyClose : loops=500000000 , ms=27812
2019.07.31 00:55:58.234 Start test № 2...
2019.07.31 00:58:59.095 iClose : loops=500000000 , ms=180734
2019.07.31 00:58:59.095 Start test № 3...
2019.07.31 01:02:06.834 Close[i] : loops=500000000 , ms=187610
2019.07.31 01:02:06.834 Start test № 4...
2019.07.31 01:02:38.365 CopyRates : loops=500000000 , ms=31406
2019.07.31 01:02:38.365 End script

而比特和字节与之无关?

 
Artyom Trishkin:

而比特和字节与之无关?

我不会告诉你,你的电脑一定很笨,是吗?

我已经测试过几次,罗曼也测试过--结果是相当的。

对于这个测试,硬盘的速度不应该是关键的,剩下的就不多了:操作系统,而硬件=内存+CPU,某处有慢的东西。

当然,在一些 "内部世界 "酷睿i3有一个选项,我有一个酷睿™i3-4170

 
Igor Makanu:

我不会告诉你,你的电脑一定很笨,是吗?

我已经测试过几次,罗曼也测试过--结果是相当的

对于这个测试,硬盘的速度不应该是关键的,剩下的就不多了:操作系统,而硬件=内存+CPU,某处有滞后的东西。

当然,在一些 "内部世界 "酷睿i3有一个选项,我有一个酷睿™i3-4170

我有一个挂在第二个符号上的测试EA,其中定时器中的事件控制是不变的。我们可以假设它以某种方式影响了它。而且只在 CopyXXX功能上。目前没有理由把它从图表中删除--它的存在对我目前的事务比这个测试更重要。

 
Artyom Trishkin:

在H1上做了一个测试,没有明显的差别。

开发者曾经说过,5中新的iXXX函数只是CopyXXX函数的一个包装。

因此,预计在单次查询中不会出现差异。

 
Renat Akhtyamov:
在功能速度上有什么定论--哪个更快?
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int Count=5000000; // кол-во проходов
//---
void OnStart(void)
  {
   Print("Bench_1: ",Bench_1(Count)," msc");
   Print("Bench_2: ",Bench_2(Count)," msc");
  }
//+------------------------------------------------------------------+
//| Bench_1                                                                 |
//+------------------------------------------------------------------+
ulong Bench_1(const int _count)
  {
   const ulong  StartTime=GetMicrosecondCount();
//---
   for(int i=0; i<Count;i++)
     {
      datetime time  = iTime(Symbol(),Period(),0);
      double   open  = iOpen(Symbol(),Period(),0);
      double   high  = iHigh(Symbol(),Period(),0);
      double   low   = iLow(Symbol(),Period(),0);
      double   close = iClose(NULL,PERIOD_CURRENT,0);
      long     volume= iVolume(Symbol(),0,0);
     }
//---
   return(GetMicrosecondCount() - StartTime);
  }
//+------------------------------------------------------------------+
//| Bench_2                                                                 |
//+------------------------------------------------------------------+
ulong Bench_2(const int _count)
  {
   datetime  time[];
   double    open[];   // Open (цены открытия бара)
   double    high[];   // High (цены максимума бара)
   double    low[];    // Open (цены минимума бара)
   double    close[];    // Open (цены минимума бара)
   long      volume[]; // Close (цены закрытия бара)

   const ulong  StartTime=GetMicrosecondCount();
//---
   for(int i=0; i<Count;i++)
     {
      CopyTime(Symbol(),Period(),1,1,time);
      CopyOpen(Symbol(),Period(),1,1,open);
      CopyHigh(Symbol(),Period(),1,1,high);
      CopyLow(Symbol(),Period(),1,1,low);
      CopyClose(Symbol(),Period(),1,1,close);
      CopyTickVolume(Symbol(),Period(),1,1,volume);
//---
      datetime _time  = time[0];
      double   _open  = open[0];
      double   _high  = high[0];
      double   _low   = low[0];
      double   _close = close[0];
      long     _volume= volume[0];
     
}
//---
   return(GetMicrosecondCount() - StartTime);
  }
//+------------------------------------------------------------------+
剧本的作者不记得是谁了
 
Igor Makanu:

他们的工作是一样的,我认为实验是为了实验......。这是最后一次5亿次的测试调用,是的,你可以看到区别,唯一剩下的就是要弄清楚一分钟有多少个刻度(~60),一小时有多少个刻度(~3600),一天有多少个刻度(~86400),以及这23秒将运行5亿次调用...。

5 787天=23秒的利润?如果我们在每个tick 上使用最快的函数,)))))。

我认为,使用方便的东西,不要听任何人的。

我忘记了测试和优化,伊戈尔。这就是需要速度的地方。

 
Andrey Khatimlianskii:

我忘记了测试和优化的问题,伊戈尔。这就是需要速度的地方。

是的,嗯...只是这里没有一群认真讨论这个话题的人,所以我完全没有想到这一切是为了什么))))。

你是对的!- 但我们需要一个方便使用的CopyOpen()函数...如果我们把CopyOpen()的调用 包在额外的函数中,那么性能的提高就会消失。

ZZY:我认为,一般来说,它就像其他地方一样--你用汇编编写,你会得到很长的开发时间,而不是说最终的性能会比你用15分钟编写的C++高--你应该检查一下。