MT5和速度在行动 - 页 52

 

重新设计的宏观

#define  µsSLEEP(µsRange)                              \
        {                                             \
           ulong c = GetMicrosecondCount() + µsRange; \ 
           while(GetMicrosecondCount() < c);          \
        }


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   while(!_StopFlag)
   {
      µsSLEEP(5000000);
      Print("Прошло 5000000 микросекунд");
   }
}
 
Roman:

当然,它可以做的不仅仅是一个核心。

我的意思是在没有睡觉 的时候。

很明显,滑移在这里是不合适的,因为我们需要微秒。但没有它,它也会嗡嗡作响......

 
Andrey Khatimlianskii:

我的意思是在没有睡觉的时候。

很明显,滑移在这里不起作用,因为我们需要微秒。但没有它,它也会哼唱。

当然,它的嗡嗡声没有滑落。
GetMicrosecondCount 计数器正在运行

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong µs = 0;
   
   while(!_StopFlag)
   {
      µs = GetMicrosecondCount();
      
      Comment((string)µs);
      ChartRedraw();      
   }
   
   Comment("");   
}
 
Roman:

当然,它是在没有打滑的情况下旋转的。
GetMicrosecondCount计数器正在运行。

不仅仅是计数器被加载。一个空的无限循环也会加载它。这就是我的意思。

糟糕的解决方案,一般来说。但我不会建议它更好。

 
Andrey Khatimlianskii:

不仅仅是计数器被加载。一个空的无尽循环也会加载。这就是我的意思。

总而言之,这是个糟糕的解决方案。但我不会建议它更好。

因此,一个空的循环显然会耗尽处理器时钟周期的全部潜力。
我不明白对一个糟糕的解决方案的抱怨。如果它不适合你的资源,这并不意味着它是坏的。
µsSLEEP给你的循环延迟小于标准Sleep(1);即以微秒而不是毫秒为单位。
上面例子中的5000000只是一个例子,战斗中的真实频率将小于1毫秒。

我不明白你的问题。
需要它没有压力吗?
把一个常规的Sleep(20);在毫秒内

 
Roman:

因此,空的同时可以理解为充分挖掘了处理器时钟周期的潜力。
我不明白对一个糟糕的解决方案的抱怨。如果它不适合你的资源,并不意味着它是坏的。
µsSLEEP给你的循环延迟小于标准Sleep(1);即以微秒而不是毫秒为单位。
上面例子中的5000000只是一个例子,战斗中的真实频率将小于1毫秒。

我不明白你的问题。
需要它没有压力吗?
把常规的Sleep(20);在毫秒内。

没有任何投诉。
我不需要这样的计时器,我是出于兴趣而研究它。但我发现这是一个糟糕的解决方案,因为它不必要地加载了处理器。

而你需要微秒滑的目的是什么?

 
Andrey Khatimlianskii:

没有投诉。
我不需要这样的计时器,出于兴趣研究了它。但我觉得这个方案不好,因为它不必要地加载了处理器。

你需要微秒滑的原因是什么?

如果你想知道它为什么加载,并找出原因,你就不会有这种看法。
如果你想少于1毫秒,你就得用资源来支付。
而且在我看来,你不能卸载它,因为你需要微秒计时器 来计算间隔时间。
另一方面,如果微秒计时器不断运行,并给出了等于空的负载,
,那么就有一个问题,为什么这个延迟,然后把,并使用微秒 计时器。但不要紧,它是抒情的。
所以,我正在以一定的频率ping服务器,同时没有延迟。
而且我需要微秒级的采样,因为会有不必要的调用。
我正在使用第一个解决方案,我之前发布的,我也写了µsSleep,它可能会派上用场。


 
Andrey Khatimlianskii:


你需要一个微秒滑的目的是什么?

这里有一个现成的解决方案。
Print(),当然你要用你自己的代码来替换它。

#define  SEND_PING                                           \
{                                                           \   
   ulong currCount = GetMicrosecondCount();                 \
   switch((currCount - prevCount) > 5000000)                \
   {                                                        \
      case 0:                                               \
         break;                                             \
      case 1:                                               \
         prevCount = currCount;                             \
         Print("ping");                                     \
         break;                                             \
   }                                                        \
}
       

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong  prevCount = 0;
   
   while(!_StopFlag)
   {
      SEND_PING;
   }  
 
}
 
Renat Fatkhullin:
在我们正在编写的新测试器中,我们将尝试改变这一点。
fxsaber:

送到了PM那里。

在测试器中,这个EA以修改的形式生成了数百万条完整合理(不是垃圾邮件)的交易订单 记录。由于这个原因,测试员的日志灾难性地很快就被堵塞了。

这些日志在99%的时候是不需要的,但我们经常需要专家顾问通过打印输出的内容。因此,我想再次请你考虑是否可以在测试器中禁止自动生成每个OrderSend包的条目。

如果我理解正确的话,禁用这种字符串的生成将导致单次运行的性能提高。也就是说,其好处是双重的。

 
Renat Fatkhullin:


但是AMPGlobalEU-Live(实际上最好搜索为AMPGlobalUSA-Live),MetaTrader 5的物理平台核心在芝加哥,实际上是19.53毫秒,因为我们最近的服务器在纽约。

特别是手动扫描了他们所有的点--最小是19毫秒。

我们将尝试在接下来的几天里把服务器放在芝加哥。还没来得及做。

在芝加哥的服务器已经部署完毕。

在24小时内,它将扫描所有服务器并开始分发。