mql5语言的特点、微妙之处以及技巧 - 页 67

 
fxsaber:
在一个真实的例子上比较整数的细微差别

你要用Sleep(1000)来精确测量一秒钟吗?

而你不知道处理器中的定时器有15毫秒的误差?

 
斯拉瓦

你打算用Sleep(1000)来精确测量一秒钟吗?

你知道CPU中的定时器有15ms的误差吗?


你好,请你告诉我是否有办法重置定时器缓冲区以消除定时器设置 错误?

 
弗拉迪斯拉夫-安德鲁申科

你好,请你告诉我是否有办法重置定时器缓冲区以防止定时器设置 错误?

由于系统消息队列已满,发生了一个定时器设置错误。这可能有很多原因。通常情况下,队列溢出是暂时的(如果不是,你将无法在你的电脑上工作)。

使用OnTick来监控定时器。如果没有设置定时器,将其设置为OnTick

同时,我们正在努力使定时器设置独立于消息队列状态。

PS 启用系统定时器和为一个应用程序设置定时器是不相关的

 
斯拉瓦

你打算用Sleep(1000)来精确测量一秒钟吗?

不,是关于这两行整数的比较

关于交易、自动交易系统和策略测试的论坛

mql5语言的特点、微妙之处以及技巧

fxsaber, 2018.01.24 21:48

用一个真实的例子比较整数的细微差别
//  if (GetMicrosecondCount() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount() - StartTime > 1000000) // Правильно

乍一看,这两条线应该给出相同的结果。但它并没有。第一条有时会给出错误的输出。

选择有时间的例子只是为了说明问题。
斯拉瓦

而事实上,处理器中的定时器有15毫秒的误差,这一点你不知道吗?

你还在使用GetTickCount,这很奇怪。论坛上已经证明(懒得搜索),微秒级的计时器并不比毫秒级的计时器慢。同时,它也没有野性的错误。

 
fxsaber:

不,是关于这两串整数 的比较。

乍一看,这两个字符串应该给出相同的结果。但事实并非如此。第一条有时会给出错误的结果。

选择有时间的例子只是为了说明问题。

你还在使用GetTickCount,这很奇怪。论坛上已经证明(我懒得去搜索),微秒计时器并不比毫秒计时器慢。同时,它也没有野性的错误。

我的意思是Sleep(1000)。
 
Slava:

由于系统消息队列已满,发生了一个计时器错误。这可能有很多原因。队列溢出通常是暂时的(如果不是,你将无法在你的电脑上工作)。

使用OnTick来监控定时器。如果没有设置定时器,将其设置为OnTick

同时,我们正在努力使定时器设置独立于消息队列状态。

PS 启用系统定时器和将定时器设置为一个应用程序是不同的问题


这正是我所做的。

计时器错误是在一段时间后发生的--而不是立即发生的。而且正是因为溢出--当有大量的数据,例如订单历史,或当前的50个或更多的订单。

我已经试过了,我还在尝试使用它,但我有一种感觉,我还是会尝试使用它。

 
斯拉瓦
我说的是Sleep(1000)。

是的,你已经把比较整数的话题搞得一团糟了。

 
fxsaber:

是的,你说的是比较整数。

比较整数是没有问题的。

在没有滑移和没有GetMicrosecondsCount的情况下显示相同的内容

 
斯拉瓦

比较整数是没有问题的。

在没有滑移和没有GetMicrosecondsCount的情况下显示相同的内容

ulong GetMicrosecondCount2()
{
  static ulong StartTime = 0;
  
  if (StartTime)
    StartTime += 1000001;            // При повторном - добавляем больше "секунды"
  else
    StartTime = ULONG_MAX - 1000000; // При первом запуске возвращаем это "время"
    
  return(StartTime);
}

void OnStart()
{
  const ulong StartTime = GetMicrosecondCount2();
  
//  Sleep(1000);
  
//  if (GetMicrosecondCount2() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount2() - StartTime > 1000000) // Правильно
    Print("Прошло больше секунды.");
  else
    Print("Прошло меньше секунды."); 
}
而且这不是一个问题,是一个微妙的问题。
 

关于交易、自动交易系统和交易策略测试的论坛

关于 "MetaTrader 5新增对冲头寸会计系统 "的讨论

fxsaber, 2018.01.25 10:14

  1. 显示了安德鲁 在阅读这篇文章时指出的一个交易情况的例子。
  2. HistorySelectByPosition可能不会选择导致交易的订单。
  3. 该订单和它产生的交易可能有不同的ID。
第二和第三点至少应该在某个地方发表意见。它确实如此。

我们谈论的是对历史的分析,甚至是手工贸易,我们不是在谈论写TS。

例如,我们想了解这笔交易是如何滑落的。