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

 
Sleep(0);

这样的滑动可能需要几十毫秒的时间来完成。

 
fxsaber:

这样的滑移可以运行几十毫秒。

它是什么意思?

我记得很久以前,在并行进程中提到了Sleep()

 
快528

那是什么意思?

正是他所说的。

 
fxsaber:

这样的滑移可以运行几十毫秒。

不是几十,而是15.625毫秒。
我长期以来一直在使用该建筑。

if(pause>0) Sleep(pause);
 
尼古拉-森科

不是几十,而是15.625毫秒。
我已经使用这个设计很长时间了。

ulong GetSleepTime( const int Pause = 0 )
{
  const ulong StartTime = GetMicrosecondCount();
  
  Sleep(Pause);
  
  return(GetMicrosecondCount() - StartTime);
}

void OnStart()
{
  ulong MaxTime = 0;
  
  while (!IsStopped())
  {
    const ulong SleepTime = GetSleepTime();
    
    if (SleepTime > MaxTime)
    {
      Print(SleepTime);
      
      MaxTime = SleepTime;
    }
  }
}


结果

2542
9983
10033
10041
10148
10348
11982
26116
27529
40066
49915
56319
 
fxsaber:


结果

计算平均时间。

累积SleepTime,然后除以循环结束后的迭代次数。

否则,你刚刚呈现的结果在不成熟的头脑中看起来很可怕。同时显示最短的时间。

PS。MQL5中的Sleep()函数 不是重定向到win api函数::Sleep()。或者说,如果数值低于100,就是一个重定向。但在100以上,它是一个循环,里面有win api slip,所以它可以被IsStopped打断。

还有一个更微妙的问题。如果毫秒数<=0,我们就预加1。也就是说,我们从不调用::Sleep(0)。

PPS从kernel32.dll中导入Sleep函数并做同样的实验

 
斯拉瓦

计算平均时间。

累积SleepTime,并在循环完成后除以迭代次数。

我不是在说平均时间,而是在说有可能出现峰值。我在等待交易历史与OrderSend结果同步的时候遇到了它们。我在用Sleep(0)等待。事实证明这是不可能的。

斯拉瓦

PS。MQL5中的Sleep()函数 不是重定向到win api函数::Sleep()。那么,如果数值低于100,就是重定向。但在100以上,它是一个循环,里面有win api slip,所以它可以被IsStopped打断。

还有一个更微妙的问题。如果毫秒数<=0,我们就预加1。也就是说,我们从不调用::Sleep(0)。

谢谢你提供的细节。我不知道Sleep(5000)可以通过IsStopped()来终止。

 
fxsaber:

这不是指平均时间,而是指出现峰值的可能性。我在等待交易历史与OrderSend结果同步的过程中遇到了这些问题。我在用Sleep(0)等待。事实证明,不能这样做。

因此,Windows操作系统从来都不是一个实时系统
 

fxsaber:

谢谢你提供的细节。不知道Sleep(5000)可以通过IsStopped()来终止。

https://www.mql5.com/ru/docs/common/sleep

该函数有一个内置的检查EA的停止标志的状态,每0.1秒一次。

Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.
 
斯拉瓦
因此,Windows操作系统从来都不是一个实时系统

老实说,我甚至不知道它是什么意思,也不知道在MQL5中哪里可以遇到它。