错误、漏洞、问题 - 页 1850

 
这是一个错误吗?
struct STRUCT
{
  int a;
  
  STRUCT() {} // Если закомментировать, ошибка пропадает
};

void OnStart()
{
  STRUCT Struct = {1}; // cannot be initialized with initializer list
}
 

在使用造型器时 出现了一个错误?

让我们假设我们是用标签写的。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
   input int x=0;
   #define  TWO_DIM (10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+

没有错误。

然后我们使用造型器,我们得到

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int x=0;
#define  TWO_DIM(10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+
'10000' - unexpected in macro formal parameter list     bug.mq5 7       17
'[' - invalid index value       bug.mq5 13      25

即,打字员擦除TWO_DIM(10000) 之间的空格。

 
编译错误
template <typename T>
struct STRUCT
{
  template <typename T1>  
  STRUCT( T1 Value ) {} // 'STRUCT<int><int>' - declaration without type

};

void OnStart()
{
  STRUCT<int> Struct(0); // 'STRUCT<int>' - cannot to apply function template
}
 
一个小小的提示。绕过赋值运算符
template <typename T>
struct STRUCT_COPY
{
  T Value;
  
  STRUCT_COPY( const T& tValue)
  {
    this = (STRUCT_COPY)tValue;
  }  
};

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  STRUCT Struct;  
  Struct.i = 1;  
  PRINT(Struct.i);
  
  STRUCT StructCopy1 = Struct;
  PRINT(StructCopy1.i);
  
  // Обходим void STRUCT::operator=(const STRUCT&)
  STRUCT_COPY<STRUCT> StructCopy2(Struct);
  PRINT(StructCopy2.Value.i);  
}

结果

Struct.i = 1
StructCopy1.i = 5
StructCopy2.Value.i = 1
 

什么是正确的方式?

struct STRUCT
{
  template <typename T>
  void operator []( int ) {}
};

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
 
另一个问题 - 我知道,在MT5中,第一次复制缓冲区CopyClose 的时间取决于。

1.如果之前你根本没有收到某个股票的报价,没有打开图表等。(取决于ping、网速、硬盘、Bases/Broker/history/ticker/cache/文件的准备情况)

2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 0  время= 8355581
2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 1  время= 1083

2. 如果之前已经收到了报价,然后终端被重新加载,只要没有打开过这个股票的图表(准备文件Bases/Broker/History/Ticker/Cache/)。

2017.04.11 11:29:14.672 время копирования буфера (EURUSD,M1)    проход = 0  время= 599396
2017.04.11 11:29:14.734 время копирования буфера (EURUSD,M1)    проход = 1  время= 259
/////////////////////////////
2017.04.12 19:32:46.489 время копирования буфера (FULT,M5)      проход = 0  время= 98167
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 1  время= 155
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 2  время= 14

时间比P.1少10-15倍


用于比较МТ4的访问时间,根据第2点,即在终端复位后

2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 2  время= 276
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 1  время= 434
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 0  время= 2260
2017.04.12 19:30:38.816 время копирования буфера EURUSD,M1: initialized
2017.04.12 19:30:38.666 время копирования буфера EURUSD,M1 inputs: Pair=USDCAD;

也就是说,MT4终端重启后的时间要少几个数量级。

这一次,我检查了Windows上的所有内容,没有发现SSD!这让我很高兴。

如果我得到引号,终端没有重启,数据被访问了

2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 0  время= 89
2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 1  время= 42

我没有理解错吧,加载缓存后,终端在进一步请求时需要的时间大大减少(从第二个请求开始)?

我们能否以某种方式减少终端重启后第一次调用的时间,使其与MT4一样?

代码是在https://www.mql5.com/ru/forum/1111/page1870#comment_4856899

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:
我还有一个问题 - 我知道在MT5上,同一个CopyClose缓冲区的第一次复制时间取决于。

你有一个非常肮脏的测试方法,因为根本就没有环境和播放方法的描述。

未说明。

  • 窗口中的条形限制
  • 终端数据库中的实际数据量
  • 到底是哪台服务器,数据库在磁盘上吗? 所有数据必须保证在磁盘上。
  • 测试的平台和比特率(在葡萄酒下? 需要详细说明)。
  • 开窗

没有这一点,结论是没有根据的。


例如,看看欧元兑美元M1- MT5有超过600万条(如果在图表的无限模式),但MT4有多少?实际数据库中的几万个M1条?
 
Renat Fatkhullin:

你的测试方法非常混乱,因为根本没有对环境和播放方法的描述。

未说明。

  • 窗口中的条数限制

  • 终端数据库的实际数据量
  • 服务器到底是什么,基数是在磁盘上吗? 所有的数据必须保证在磁盘上。
  • 测试的平台和比特率(在葡萄酒下? 需要详细说明)。
  • 开放窗口的可用性

没有这一点,结论是没有根据的。


我的帖子中的大部分问题都被问到了,没问题,我现在就把所有的数据给你。

首先是对

какой точно сервер, находятся ли базы на диске? все данные обязаны быть гарантированно на диске.

在MQ-demo服务器上,数据被加载,正如我们在上一篇文章中谈到的第2点和第3点。关于第1点,一切都很清楚,没有任何问题--正如它所写的--数据被加载,在指定的路径上形成缓存。

лимиты баров в окне

MT4

MT5

фактические объемы данных в базах терминалов

MT4

MT5

платформа и битность тестирования (под вайном? нужно указывать детально)

win XP 32bit,MT的所有版本均为最新版本。

наличие открытых окон

MT4 - 打开1个图表,用另一个符号检查

MT5 - 打开1个图表,用另一个符号检查

重复,重新加载终端,将脚本发送到图表上,选择其他符号,在重新加载终端之前,已经加载了该符号的数据。

MT4

2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 2  время= 36
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 1  время= 282
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 0  время= 1871
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: initialized
2017.04.12 21:18:31.405 время копирования буфера EURUSD,M1 inputs: Pair=GBPUSD; 

MT5

2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 0  время= 303951
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 1  время= 29
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 2  время= 25
 

这是我的测试,更详细,更准确。

条件描述
MetaTrader 4 build 1065
MetaTrader 5 x64 build 1580
硬件和操作系统
Windows 10 Pro x64, Intel Xeon E5-2690 v3 @ 2.60GHz, RAM: 32 Gb, SSD Disk
贸易服务器
MetaQuotes-Demo
MetaQuotes-Demo
设置中的图表限制条
10 000
10 000
历史设置中的限制条 10 000 000
没有限制
欧元兑美元的实际条数,M1
338.2万
653.8万
核实的符号和周期
欧元兑美元,M1
欧元兑美元,M1
开放式图表
GBPUSD,只有M1,脚本也被扔在上面
只有英镑兑美元,M1,同样的脚本被扔在上面。
结果是冷的,在终端开始后
#0 pass, 1000 records in 680 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

#0 pass, 1000 records in 113497 msc
#1 pass, 1000 records in 3 msc
#2 pass, 1000 records in 3 msc

结果是温暖的,第一次运行后立即进行第二次运行
#0 pass, 1000 records in 13 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc
#0 pass, 1000 records in 14 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

测试文件附在后面,所有的时间都是以微秒为单位(不是毫秒,1毫秒=1000微秒)。

现在是结论。

  1. 唯一的区别是图表缓存的初始化速度 - MT4为0.6毫秒,MT5为113毫秒

    这里没有问题--提升总是要花费资源的。
    特别是当使用概念上不同的架构时:MT5有更复杂的缓存(cache\*.hc文件是由原始的*.hcc建立的),以便于扩展+强制与服务器数据完全同步控制(二进制*.hcc块)。

  2. 重复的请求显示出相同的速度--每次数据复制2-3微秒。

    在这两个终端的实施中没有出现任何故障,一切都工作得很快。
附加的文件:
 

谢谢你的答复。

总的来说,结果就像我在帖子中显示的那样。

我一直在用一个普通的测试。

然而,MT4和MT5之间的结果几乎相差200倍(由于-必须控制与服务器数据的完全同步??和ping?).

我在这里发帖之前已经习惯了,这可能是终端的一个特点。我甚至可以忍受它,但在某些时候是很困难的。例如,由于MT中没有市场扫描器,我写了一个小脚本,将符号添加到市场观察中,但价格只能通过CopyClose获得,在符号被添加到观察中之前,它们不能通过SymbolInfoDouble或MqlTick获得,所以 用很大的赌注运行时 这个脚本会 "无限 "长。这只是一个例子。