MT5和速度在行动 - 页 60

 
Anton:

测试代码。

这段代码表明,作者并不了解这个问题。

证明一下吧。
// Классический SYMBOL_BID vs Альтернативный SYMBOL_BID.
// Запускать только на демо-счетах.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

bool GetPosition( const int Type = OP_BUY )
{
  bool Res = false;
  
  for (int i = PositionsTotal() - 1; (i >= 0) && !Res; i--)
    Res = PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && 
                                  (PositionGetString(POSITION_SYMBOL) == _Symbol);
                                  
  return(Res);
}

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
{
  static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger(POSITION_TICKET) : OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
  
  return(PositionSelectByTicket(Ticket) ? PositionGetDouble(POSITION_PRICE_CURRENT) : 0);
}

#define  TOSTRING(A) ", "#A + " = " + (string)(A)

#define  MACROS(A, B)                                              \
  const ulong StartTime##A = GetMicrosecondCount();               \
  const double A = B;                                             \
  const ulong Interval##A = GetMicrosecondCount() - StartTime##A; \
                                                                  \
  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;  

long TimeBid1 = 0; // Суммарное время на длительный SYMBOL_BID
long TimeBid2 = 0; // Суммарное время на длительный GetBid()

const bool Init = EventSetTimer(10) && GetBid(); // Будем выводить статистику каждый 10 секунд.

void OnTimer()
{
  // На сколько отстает один вариант от другого по времени выполнения.
  Alert(TOSTRING(TimeBid1 - TimeBid2) + " mcs." + TOSTRING(TimeBid1) + TOSTRING(TimeBid2));
}

void OnTick()
{  
  const uint StartTime = GetTickCount();
  
//  return;
  
  while (!IsStopped() && (GetTickCount() - StartTime < 10000))
  {
    MACROS(Bid1, SymbolInfoDouble(_Symbol, SYMBOL_BID))
    MACROS(Bid2, GetBid())
      
//    if (Bid1 != Bid2)
//      Alert("Error!" + TOSTRING(Bid1) + TOSTRING(Bid2));
    
//    Sleep(0); // Специально убрал.
  }
}

该EA通过两种方式获得当前符号的买入价。对于每一种情况,它都会总结出长执行情况的执行时间。然后显示了两者之间的区别。


装载了6/8个代理。并在RannForex-Server 演示的六个图表(不同的符号)上运行该EA。结果。

2020.10.26 16:10:40.596 Test9 (EURNZD,H1)       Alert: , TimeBid1-TimeBid2 = 236507295 mcs., TimeBid1 = 246491044, TimeBid2 = 9983749
2020.10.26 16:10:42.596 Test9 (CAC40,H1)        Alert: , TimeBid1-TimeBid2 = 235249710 mcs., TimeBid1 = 241768964, TimeBid2 = 6519254
2020.10.26 16:10:44.267 Test9 (DAX30,H1)        Alert: , TimeBid1-TimeBid2 = 243552816 mcs., TimeBid1 = 253424672, TimeBid2 = 9871856
2020.10.26 16:10:44.382 Test9 (DJI30,H1)        Alert: , TimeBid1-TimeBid2 = 265778370 mcs., TimeBid1 = 272279313, TimeBid2 = 6500943
2020.10.26 16:10:44.623 Test9 (ASX200,H1)       Alert: , TimeBid1-TimeBid2 = 210921561 mcs., TimeBid1 = 219901110, TimeBid2 = 8979549
2020.10.26 16:10:44.732 Test9 (FTSE100,H1)      Alert: , TimeBid1-TimeBid2 = 226824499 mcs., TimeBid1 = 235809635, TimeBid2 = 8985136

我们有一个完整的证明,SYMBOL_BID的总执行时间(TimeBid1)灾难性地输给了(TimeBid2)替代的得到Bid价格。


这种获取当前价格的拐杖式解决方案胜过了MQL5主要功能本身的性能。你同意这个证明吗?


我希望我以前能想到这个雄辩的拐杖。


ZZZY 专家顾问需要让algo交易发挥作用。因此,只在模拟账户上运行。

 
fxsaber:

该EA通过两种方式获得当前符号的买入价。

POSITION_PRICE_CURRENT 被抢走?

那么我们与什么相比较呢?获取最后存储的(何时?)价格与获取终端已知的最后价格?

嗯,而且8个核心中大约有6个直接说了出来。为什么要进行这样的 测试?

 
fxsaber:

这段代码表明,作者并不了解这个问题。

你的说法证明你不想看到明显的事实。

这段代码显示,没有 "SymbolInfoTick制动 "的情况。

在或多或少的现代硬件上,SymbolInfoTick的运行时间小于1 MICROS秒。

该专家顾问通过两种方式获得当前符号的买入价。对于每一种情况,它都会总结出长执行情况的执行时间。然后它显示了它们之间的差异。

装载了6/8个代理。并在RannForex-Server 演示的六个图表(不同的符号)上运行该EA。结果。

我们有充分的证据表明,SYMBOL_BID的总执行时间(TimeBid1)灾难性地输给了(TimeBid2)替代得到的Bid价格。

这种获取当前价格的拐杖式解决方案胜过了MQL5主要功能本身的性能。你同意这个证明吗?

我希望我以前能想到这个雄辩的拐杖。

ZZZY 专家顾问需要让algo交易发挥作用。因此,只在模拟账户上运行它可能是有用的。

不,这不是证据。这是一个绝对肮脏的测试,不能认真对待。

我甚至懒得去讨论细节,事实上,你又是用GetMicrosecondCount()来为单个调用计时,又是在后台4个内核的CPU上 "加载了6/8个代理"。

我在上面已经清楚地表明,在 "x++"执行中也可以通过这种方式找到假想的刹车。

你关于 "SymbolInfoTick brakes "的说法被我的代码基本检查和反驳,非常简单和明显。

SymbolInfoTick的原始实现虽然相当快,但在紧张的多线程负载下,确实允许单个线程出现零星的执行时间 高峰。

在最新的构建中,它也没有这个缺点。

你一直在和一个完全知道自己在说什么的人争论,也就是说,看到了实现,并能在不同的模式下对它们进行剖析,这实在令人惊讶。

"让我们和那些吃过牡蛎和椰子的人争论一下它们的味道"。

 
Andrey Khatimlianskii:

POSITION_PRICE_CURRENT 被抢走?

不,MT4Orders只用于建仓。

那么我们与什么相比较呢?获得最后保存的价格(何时? 与获得终端已知的最后价格?

我们比较了从市场观察得到的价格的持续时间和位置。价格当然是一致的。

而8个核心中大约有6个直接说。为什么要进行这样的 测试?

只有让盲人也看到有问题。这是无稽之谈,当Bid-price没有通过位置放缓,而SymbolInfoTick滞后得很厉害。


我觉得如果没有论坛用户的支持,这堵MQ墙是不可能被打破的。代码很短,专业人士应该能够迅速掌握。这里面没有任何缺陷。这清楚地表明,通过头寸获得的价格比从市场观察获得的价格要快得多。我不明白为什么MQ们看不到这些明显的事实。

 
Anton:

你的说法证明你不想看到明显的事实。

这段代码显示,没有 "SymbolInfoTick制动 "的情况。

在或多或少的现代硬件上,SymbolInfoTick的运行时间不超过1 MICROsecond。

不,这不是一个证明。一个绝对混乱的测试,不能认真对待。

我甚至懒得讨论细节,你再次通过GetMicrosecondCount()测量单次调用的时间,而且是在4核CPU上 "加载了6/8个代理 "的背景下,就足够了。

我在上面已经清楚地表明,在 "x++"执行中也可以通过这种方式找到假想的刹车。

你关于 "SymbolInfoTick brakes "的说法被我的代码基本检查和反驳,非常简单和明显。

SymbolInfoTick的原始实现虽然相当快,但在紧张的多线程负载下,确实允许单个线程出现零星的执行时间 高峰。

最新的构建版本也没有这个缺点。

你一直在和一个完全知道自己在说什么的人争论,也就是说,看到了实现,并能在不同的模式下对它们进行剖析,这实在令人惊讶。

"让我们和那些吃过牡蛎和椰子的人争论一下它们的味道"。

你还没有看过代码。我不相信无能。

  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;

这是一个条件,只有执行时间超过100µs才算数。如果你认为这是个小数值,那就把它变成一个数量级的长度。其效果是一样的。

被比较的两个功能都处于绝对平等的条件下。一个是在最后刹车,另一个是没有。再仔细看一下代码的衡量标准。


目前,用建议的拐杖取代战斗中的SymbolInfoTick,几乎消除了与获得当前价格有关的所有滞后。这是痴心妄想,但不幸的是,它确实如此。


HI 注意OnTick中的while。它是特意用来捕捉OnTick被接受后的虱子的。这段代码并不是突然写出来的。这不是一个完全人为的for-cycle,测量理想条件下的医院平均温度。

 
fxsaber:

我觉得如果没有论坛成员的支持,这堵MQ墙将无法通过。代码很短,专业人员应该能很快搞清楚。那里没有任何缺陷。这清楚地表明,通过头寸获得的价格比从市场观察获得的价格要快得多。MQ怎么会看不到这些明显的东西--我不明白。

代码中没有错误,所以SymbolInfoTick比获取未平仓 合约的价格要慢一些

从位置上获取价格的黑客技术不错,没有猜到或意识到会有这样的区别。
 
fxsaber:

只是为了让盲人也能看到有问题。好吧,当Bid价格通过位置不慢时,这是无稽之谈,但SymbolInfoTick以一种可怕的方式滞后。

试着测试SymbolInfoTick,当市场概览中只有一个符号时,以及有几十个符号时,但要求有一个符号--就像你的例子中那样

很有可能是服务器压缩了流量,SymbolInfoTick在解压数据时有这种间歇性的滞后。

也就是说,当有很多角色的时候,测试时间会有更频繁或更深的下降。


因此,如果这被证明是真的,那么重做整个架构....。疑惑的快乐

 
Igor Makanu:

尝试测试SymbolInfoTick,当市场概览中只有一个符号时,以及有几十个符号时,但要求使用一个工具--就像你的例子中那样

很有可能服务器正在发送压缩的流量,并且SymbolInfoTick在解压数据时遇到了这种间歇性的速度下降。

也就是说,当有很多符号时,测试时间会有更频繁或更深的下降。

这个假设指的是当市场观察中的价格落后于tumblr价格(反之亦然)的这种情况。但到目前为止,我们只讨论了终端内部SymbolInfoTick本身的制动问题,没有触及价格相关性的问题。

 
fxsaber:

被比较的两个函数处于完全相同的条件下。

至少GetBid是在SymbolInfoDouble之后调用的。如果我们把它们对调,结果会一样吗?

有些东西告诉我,POSITION_PRICE_CURRENT 取的是存储的价格,而不是新的价格。

话说回来,我不认为在一个80%负载的CPU上进行测试有什么意义。我们正在测试CPU性能和资源分配的胜博发,而不是我们需要的功能。

 
Andrey Khatimlianskii:

至少GetBid是在SymbolInfoDouble之后调用的。如果你把它换掉,结果会一样吗?

我是在出版前进行实验的。不,它没有。

有些东西告诉我,POSITION_PRICE_CURRENT 取的是存储的价格,而不是新的价格。

这就是问题的关键,MQL-程序需要的是来到终端的最后价格,而不是其他东西。当蜱虫进入终端时,它会自动更新所有的仓位/订单表。

好吧,再说一遍,我不认为在一个80%负载的CPU上进行测试有什么意义。我们正在测试CPU性能和资源分配的赢利,而不是我们需要的功能。

主要条件是两个功能的环境是相同的。CPU负载是差异可见性的更突出的因素。

20个并行的EA有时可以同时进行SymbolInfoTick的调用,那么就会出现一毫秒的爆发性负载和滞后。我只是建议明确地这样做,以便立即注意到问题。


同样,两个功能的测试条件是相同的。事实。

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

MT5和速度在行动

fxsaber, 2020.10.26 17:53

目前,用建议的拐杖 取代战斗中的SymbolInfoTick,几乎消除了与获得当前价格有关的所有制动。这是痴心妄想,但不幸的是,它确实如此。