实时的提基 - 页 17

 
Yuriy Zaytsev:

你确定这一点吗?


4秒 ???? 不可能!你真的认为处理器被冻结了4秒或内存被释放了4秒? 你在开玩笑吗?

更有可能是磁盘上的写队列问题。

磁盘的速度比内存和处理器慢。

然后flush(),在C语言中有这样一个命令,可能你知道,它是在方便和舒适的时候执行的,可以在一些延迟的情况下执行,更多的是与磁盘加载有关。

这就是当缓冲区需要重置到磁盘时的调用。

嗯,我不太确定,因为我没有在MT中实验性地检查过。但这是一种标准--在日志中,有写到磁盘的时间,如果事件的时间,导致写到日志的时间,更重要,这不是符合逻辑的吗?

而如果我们假设,日志被写入磁盘的时间,如果磁盘被加载,无论如何你的物理记录会有一个延迟,而这个时间将是发送命令写入缓冲区。

也就是说,刷新并不改变缓冲区--它只是在有延迟的情况下稍稍重置一下。

wp.正确地指出,你需要写时间,因为在任何情况下,只有在写到日志时形成终端本身的时间,没有任何意义的定向。

 
Aleksey Mavrin:

嗯,我不太确定,因为我没有在MT中进行实验检查。但这是一种标准--如果更重要的是事件的时间,导致记录到逻辑上的事件,为什么要在日志中记录到磁盘的时间?

而如果我们假设,日志被写入磁盘的时间,如果磁盘被加载,无论如何你的物理记录会有一个延迟,而这个时间将是发送命令写入缓冲区。

也就是说,刷新并不改变缓冲区--它只是在有延迟的情况下稍稍重置一下。

s.s.正确地指出,你必须写下时间,因为在任何情况下,只有在写到日志时形成终端本身的时间,没有任何意义的定向。


我假设--时间是在写到磁盘之前插入的,然后一切都配合起来。

让我们试着一步一步地描述这个场景--使其更加清晰。


1-刻度线来了(点击onTick)--应该被打印出来

2-而且OnTick打印了一份日志--它被成功保存了

3-这个刻度线也到达了OnTick--它也应该被打印出来。

驱动程序把它的数据磁头放在了别的地方--),正在写自己的数据。

5-这是当metatrader试图向磁盘发送东西的时候

但是磁盘上的Windows操作系统忙得不可开交--操作系统告诉metatrader对不起MQ我有更重要的事情要做--等等

6-4秒过去了。

7- 然后Windows在4秒后-清除了驱动器的队列-并对MetaTrader说-亲爱的交易终端-你想写东西到磁盘吗?- 好了,写吧!

8-metatrader写到磁盘时有4秒的延迟,并在日志中记录时间,不是它想写数据到磁盘的时间 - 而是它实际写的时间。

这就是4秒的由来。



---

任何其他情况,如终端将本地 时间放入缓冲区--但写入时间延迟了4秒--这样的情况都不工作。

否则的话,时间就会重合了!

 
Aleksey Mavrin:

嗯,我不太确定,因为我没有在MT中 进行实验检查。但这是一种标准--为什么在日志中记录到磁盘的时间,如果更重要的是事件的时间,这导致记录到日志中,这是合乎逻辑的,对吗?

而如果我们假设,日志被写入磁盘的时间,如果磁盘被加载,无论如何你的物理记录会有一个延迟,而这个时间会被发送命令写入写缓冲区。

也就是说,刷新并不改变缓冲区--它只是在有延迟的情况下稍稍重置一下。

s.s.正确地指出,你必须写出时间,因为在任何情况下,只有终端自己在写到日志时产生的时间,才有必要关注一下。

如果你不检查,那就不要胡说八道。

你甚至知道我们在这个话题中谈论的是什么吗?

给我看测试,否则就离开这里。

 
Aleksey Mavrin:

嗯,我不太确定,因为我没有在MT中进行实验检查。但这是一种标准--如果更重要的是事件的时间,导致记录到逻辑上的事件,为什么要在日志中记录到磁盘的时间

而如果我们假设,日志被写入磁盘的时间,如果磁盘被加载,无论如何你的物理记录会有一个延迟,而这个时间会被发送命令写入写缓冲区。

也就是说,刷新并不改变缓冲区--它只是在有延迟的情况下稍稍重置一下。

s.s.正确地指出,你必须写下时间,因为在任何情况下,只有形成终端本身的时间,当写到日志,指导没有意义。

只是在我们的情况下,我们得到了 写到磁盘的时间!

但时间可以在GetTickDescription过程中安排,我在上面给作者写了这个问题。

如果他把它放在那里,我们就不会在4秒钟内讨论可能的延迟原因。在日志中,最有可能的是,OnBock和OnTick的本地时间是一样的,但到磁盘的时间会有4秒的差异。

//+------------------------------------------------------------------+ 
//| возвращает строковое описание тика                               | 
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick)
{
..
..
Sergey Chalyshev:

如果你没有检查过,那就别管它了。

你知道这个主题是关于什么的吗?

给我看看测试结果,否则就 我滚出去。

不要对我这么苛刻。

 

有可能改进这种嘀嗒声的捕捉,将其设置为一周或两周,也许能捕捉到日志中的记录日期与事件发生日期相差无几的时刻。

当然,可以通过定期加载磁盘来加速这一过程,以便进行录音。

另一个问题,最重要的问题.为什么要在这个研究上浪费时间:-)))有什么实际好处。

---

目前很清楚的是,点子首先出现在OnTick中,然后才出现在OnBuk中,好的是,OnBuk不仅被调用的是点子,而且还被调用的是市场上交易量的变化,换句话说,有人开了一个订单,关闭或删除,交易量发生了变化。 这对市场来说是相当重要的信息。

当然,在股票/期货市场上的交易决策的逻辑,正是在OnBuk,而不是在OnTick。

 
Sergey Chalyshev:

如果你没有检查,那就别管它了。

你知道这个主题是关于什么的吗?

给我看看测试结果,否则就他妈的给我滚出去。

你才唠叨呢,老二,16页还没想过在打印 前给事件计时,写上他们测量的速度,专家,该死)。

你如此自豪地指出来的,他们说,我没有检查,你甚至没有真正理解我在说什么,我打赌。但你不太可能理解它。

而事实上,这个时间并不完全是记录到磁盘的时间,它被检查了。

 
Sergey Chalyshev:

如果你没有检查,那就别管它了。

你知道这个主题是关于什么的吗?

给我看看测试结果,否则就给我滚出去。

这样吧,聪明的家伙,至少给我看一个可靠的方法来检验你的意思,我就保释,承认我不明白,否则就承认你自己不明白,道歉,或者保释自己出去。

也就是--至少有一个100%可靠的方法可以通过实验验证终端到底是什么时候写到日志的,即主选项。

1. 终端在队列中收到打印 命令的时间。

2. 打印命令开始的时间。

3. 缓冲区内打印的终止时间)。

这个变体可能是确切的时间。

4. 打印执行到磁盘的时间。

 
Aleksey Mavrin:

这样吧,聪明人,你至少给我看一个可靠的方法来检查你的意思,我就保释,承认我没有理解,否则就承认你自己不理解,道歉,或者保释自己。

也就是--至少有一个100%可靠的方法可以通过实验验证终端到底是什么时候写到日志的,即主选项。

1. 终端在队列中收到打印命令的时间。

2. 打印命令开始的时间。

3. 缓冲区内打印的终止时间)。

这个变体可能是确切的时间。

4. 打印到磁盘的执行时间。

那么,这有什么意义呢?

等待你的代码...

 
prostotrader:

那么是什么情况呢?

等待你的代码...

你在等待什么代码?我向你保证过什么吗?价格是多少来着)。

你也像你的朋友一样,没有理解我在说什么。
 

在辩论进行的同时,我做了另一个实验。

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
ulong st_time, func_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  is_book = MarketBookAdd(Symbol());
  st_time = GetMicrosecondCount();
  func_time = GetMicrosecondCount();
  Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol());
}
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if(Symbol() == symbol)
  {
    func_time = GetMicrosecondCount();
    Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
  }
}
void OnTick()
{
  func_time = GetMicrosecondCount();
  Print(__FUNCTION__, "; Time: ", MathAbs((func_time - st_time)/1000), " ms");
}
//+------------------------------------------------------------------+

我的意思是,在初始化过程中,我以一微秒为单位计时。

在每次打印之前,我都会再次钻研时间。

理想情况下,它应该是这样的

2020.02.04 21:28:01.316	Ticks_test_2 (GOLD-3.20,M1)	OnTick; Time: 1395 ms
2020.02.04 21:28:01.316	Ticks_test_2 (GOLD-3.20,M1)	OnBookEvent; Time: 1395 ms

但很多时候,结果是这样的(对数曝光)。

2020.02.04 21:28:11.133 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 11212 ms
2020.02.04 21:28:11.139 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 11218 ms

2020.02.04 21:28:15.603 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 15682 ms
2020.02.04 21:28:15.609 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 15688 ms

2020.02.04 21:28:29.521 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 29599 ms
2020.02.04 21:28:29.790 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 29868 ms
2020.02.04 21:28:29.790 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 29868 ms

2020.02.04 21:28:33.109 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 33188 ms
2020.02.04 21:28:33.115 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 33194 ms

2020.02.04 21:28:40.800 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 40878 ms
2020.02.04 21:28:40.807 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 40885 ms

2020.02.04 21:28:41.891 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 41969 ms
2020.02.04 21:28:41.896 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 41974 ms

2020.02.04 21:28:52.984 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 53063 ms
2020.02.04 21:28:52.991 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 53070 ms

2020.02.04 21:28:54.457 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 54536 ms
2020.02.04 21:28:55.276 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 55355 ms

2020.02.04 21:29:10.643 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 70722 ms
2020.02.04 21:29:10.650 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 70729 ms

2020.02.04 21:29:14.674 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 74752 ms
2020.02.04 21:29:14.681 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 74759 ms

2020.02.04 21:29:25.306 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 85384 ms
2020.02.04 21:29:25.313 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 85390 ms

2020.02.04 21:29:30.468 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 90546 ms
2020.02.04 21:29:30.481 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 90559 ms

2020.02.04 21:29:30.866 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 90944 ms
2020.02.04 21:29:30.874 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 90951 ms

2020.02.04 21:29:36.680 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 96758 ms
2020.02.04 21:29:36.688 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 96766 ms

2020.02.04 21:29:37.891 Ticks_test_2 (GOLD-3.20,M1)     OnTick; Time: 97968 ms
2020.02.04 21:29:37.910 Ticks_test_2 (GOLD-3.20,M1)     OnBookEvent; Time: 97987 ms

因此,在调用打印时,当地时间 被写入打印。

但它不适合4秒...