MT5和速度在行动 - 页 61

 
fxsaber:

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

1.你的测试由于条件所限,真正计算出的迭代比例很小

if (Interval##A > 100)

实质上,你只计算处理器任务过重并推迟执行远架给定任务的异常情况,因为超过99%的迭代是在不到1微秒内完成的。

而且,即使你设置的条件>0,仍然没有客观性。

2.这种快速操作的时间测量只应作为一个完整的周期时间,而不是一个单一的迭代。

3.但由于你的例子中的周期被限制在10秒内(为什么?对于ticks,我认为0.1秒已经很足够了。因为很可能发生在一秒钟内有3个ticks到达,而这三个ticks将分别执行10秒,并且是并行的),所以不需要计时。计算在给定时间内将执行多少次迭代比较容易。越多,生产力就越高。

我修改了你的代码 "一点"。我认为我的变体更能反映现实。

计算是一个一个地进行的,以便不把两种变体混在一起。偶数的刻度线用于SYMBOL_BID,奇数的--用于GetBid()。

为了以防万一,我添加了和值及其输出,试图欺骗编译器,使之不被优化。
输出的结果是累积的。

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

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define  TimeLoop 125  // 15.625*8  

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)


long N1=0;
long N2=0;
long n=0;
double sum1=0;
double sum2=0;

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

//+------------------------------------------------------------------+

void OnTick()
  {
//  return;
   const uint StartTime = GetTickCount();
   if(n%2==0)
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum1+=SymbolInfoDouble(_Symbol, SYMBOL_BID);
         N1++;
        }
   else
      while(!IsStopped() && (GetTickCount() - StartTime < TimeLoop))
        {
         sum2+=GetBid();
         N2++;
        }
   if(n%2==0 && n>1)
      if (N1>N2) Print(_Symbol+": SYMBOL_BID быстрее GetBid() в " + DoubleToString(double(N1)/N2,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      else       Print(_Symbol+": GetBid() быстрее SYMBOL_BID в " + DoubleToString(double(N2)/N1,2) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString((TimeLoop*1000000.0*n/2)/N1,2) + " ns, GetBid() - " + DoubleToString((TimeLoop*1000000.0*n/2)/N2,2) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      n++;
  }
//+------------------------------------------------------------------+

我的结果。

2020.10.26 19:26:46.193 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.97 раза. Среднее время одной итерации: SYMBOL_BID - 45.80 ns, GetBid() - 135.80 ns, sum1 = 106706334.7283292, sum2 = 35987491.50911281
2020.10.26 19:26:46.193 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.90 раза. Среднее время одной итерации: SYMBOL_BID - 45.10 ns, GetBid() - 130.82 ns, sum1 = 34042649.2788716,  sum2 = 11735304.45101236
2020.10.26 19:26:47.085 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.95 раза. Среднее время одной итерации: SYMBOL_BID - 45.57 ns, GetBid() - 134.55 ns, sum1 = 110131593.3516681, sum2 = 37303001.98488424
2020.10.26 19:26:52.397 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 45.48 ns, GetBid() - 135.90 ns, sum1 = 113269505.1945728, sum2 = 37903458.6724181
2020.10.26 19:26:59.412 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.85 раза. Среднее время одной итерации: SYMBOL_BID - 45.16 ns, GetBid() - 128.57 ns, sum1 = 36611618.7279973,  sum2 = 12858907.51985167
2020.10.26 19:27:00.131 FxSaberBidSpeed (BTCUSD,M1)     BTCUSD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 47.10 ns, GetBid() - 130.88 ns, sum1 = 305215291120.0239, sum2 = 109832697267.1495
2020.10.26 19:27:03.303 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.96 раза. Среднее время одной итерации: SYMBOL_BID - 45.44 ns, GetBid() - 134.61 ns, sum1 = 116279675.0471961, sum2 = 39248002.75579567
2020.10.26 19:27:06.318 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 45.17 ns, GetBid() - 135.96 ns, sum1 = 119877506.6663743, sum2 = 39829996.08171722
2020.10.26 19:27:06.709 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 44.92 ns, GetBid() - 135.42 ns, sum1 = 123505976.1123297, sum2 = 40965170.16304104
2020.10.26 19:27:07.803 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 44.84 ns, GetBid() - 134.00 ns, sum1 = 126664503.6443297, sum2 = 42385980.37108831
正如你所看到的,性能上的差异是有利于标准版的三倍。
 
Nikolai Semko:


正如你所看到的,性能上的差异是有利于原始版本的三倍。

fxsaber的原始版本是否显示了GetBid的优势,还是关于更强大/更少负载的PC?

 
Andrey Khatimlianskii:

fxsaber的原始版本是否显示出GetBid的优势,还是它的功能更强大/负载更少的PC?

他的变体也显示了GetBid在CPU全负荷下的优势。但与此同时,我的变体在相同的负载下显示出三倍于常规功能的优势。
是因为我的变体考虑到了所有迭代获得Bid价格的平均时间,其只有极小部分有异常的挂起。
谁知道出于什么原因,处理器在困难的 "一分钟 "内被常规功能所困(当延迟超过100µ)。但平均时间仍然是普通功能的三倍。

因此,例如,如果(Interval##A>100)这种情况。

而如果(Interval##A > 0)已经很不一样了,显示出常规版本和替代版本之间的非正常延迟的随机分布,以获得投标价格

在同一时间,我的测试在相同的CPU负载下显示。

2020.10.26 22:16:10.569 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.95 ns, GetBid() - 161.43 ns, sum1 = 108105265.450882, sum2 = 38804020.20301527
2020.10.26 22:16:12.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.81 ns, GetBid() - 161.06 ns, sum1 = 111212159.8857315, sum2 = 39917412.88663763
2020.10.26 22:16:13.741 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.37 ns, GetBid() - 159.91 ns, sum1 = 114942034.0034028, sum2 = 41233865.03452455
2020.10.26 22:16:14.740 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.18 раза. Среднее время одной итерации: SYMBOL_BID - 52.88 ns, GetBid() - 167.92 ns, sum1 = 75470423.51597476, sum2 = 23764764.64380601
2020.10.26 22:16:15.756 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 57.30 ns, GetBid() - 159.06 ns, sum1 = 117956798.0483066, sum2 = 42491447.24894404
2020.10.26 22:16:17.646 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.19 ns, GetBid() - 158.36 ns, sum1 = 121056970.4066543, sum2 = 43721243.0341278
2020.10.26 22:16:20.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.76 раза. Среднее время одной итерации: SYMBOL_BID - 57.14 ns, GetBid() - 157.85 ns, sum1 = 124053724.3725583, sum2 = 44907061.11418578
2020.10.26 22:16:21.553 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.15 раза. Среднее время одной итерации: SYMBOL_BID - 52.80 ns, GetBid() - 166.11 ns, sum1 = 78375839.87008552, sum2 = 24913626.42960918
2020.10.26 22:16:24.865 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 56.94 ns, GetBid() - 157.50 ns, sum1 = 127392085.5933389, sum2 = 46051851.71182434
2020.10.26 22:16:27.678 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.13 ns, GetBid() - 158.30 ns, sum1 = 129851046.9417646, sum2 = 46862113.16739535

因此,我认为fxsaber版本的测试远远不够客观。

我没有用代理加载CPU,而是用这个脚本。它的效率更高。

附加的文件:
LSD.mq5  6 kb
 

在对fxsaber测试稍作修改后,清楚地表明在计算中迭代的百分比是多少。

2020.10.26 22:45:03.679 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669, TimeBid2 = 716253,  Всего итераций - 31456223, из них принято во внимание, NBid1 = 3015, NBid2 = 1714
2020.10.26 22:45:05.739 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:06.006 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507, TimeBid2 = 962617,  Всего итераций - 54138004, из них принято во внимание, NBid1 = 4401, NBid2 = 2083
2020.10.26 22:45:09.099 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646, TimeBid2 = 495818,  Всего итераций - 10037824, из них принято во внимание, NBid1 = 2429, NBid2 = 1711
2020.10.26 22:45:14.803 FxSaberBidSpeed (USDCAD,M1)     Alert: , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168, TimeBid2 = 1239895, Всего итераций - 41606744, из них принято во внимание, NBid1 = 4935, NBid2 = 3790
2020.10.26 22:45:15.745 FxSaberBidSpeed (BTCUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285, TimeBid2 = 760589,  Всего итераций - 31417549, из них принято во внимание, NBid1 = 1794, NBid2 = 1418
2020.10.26 22:45:16.115 FxSaberBidSpeed (USDJPY,M1)     Alert: , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095, TimeBid2 = 1541285, Всего итераций - 64310228, из них принято во внимание, NBid1 = 6486, NBid2 = 3879
2020.10.26 22:45:19.834 FxSaberBidSpeed (EURUSD,M1)     Alert: , TimeBid1-TimeBid2 = 1949809 mcs., TimeBid1 = 3091755, TimeBid2 = 1141946, Всего итераций - 19435170, из них принято во внимание, NBid1 = 4724, NBid2 = 3547

即大约0.01%。

你打赌。
如果SymbolInfoDouble(_Symbol,SYMBOL_BID)的平均执行时间约为50纳秒,只考虑执行时间超过100 000纳秒的。

附加的文件:
 
Nikolai Semko:

在对fxsaber测试稍作修改后,清楚地表明在计算中迭代的百分比是多少。

即大约0.01%。

你打赌。
如果SymbolInfoDouble(_Symbol,SYMBOL_BID)的平均执行时间约为50纳秒,则只计算那些大于100 000纳秒的遍历。

我们可以简单地使该条件不超过100微秒,但超过3微秒。结果显然是一样的。我们的想法是,分段研究和在不同的执行条件下,在不同的分段和不同的部分可能会有差异。执行的优先次序往往是根据任何事情来决定的。在轻度负载时,一些优先事项,在高负载时,其他优先事项,在关键的时候,那些不会让计算机挂起和崩溃的优先事项,性能进入后台。

一般来说,以超过70%的硬件负荷进行交易是不对的。这几乎是关键的表现。战斗中的EA的铁负荷不应超过60%。

 
我将有一段时间不在电脑前,所以我将保持简短。

在algotrading中,当有定期的减速时,没有人关心医院的平均温度。以毫秒为单位获取价格是经常发生的事。而这是在战斗环境中。

如果有可能在交易的重要时刻获得没有滞后尖峰的价格,那么我将为这个机会而奋斗。

我已经通过代码证明了这种拐杖的存在。如果你想避免滞后,请使用拐杖。

这里没有人在工作时也看了代码比较收到的价格,也是用滚揉机。而在那里,说句不好听的,是严重的问题。

事实是,常规功能比拐杖更经常出现灾难性的滞后。而且我不在乎平均时间接近于零。在交易中造成问题的是滞后。

想要HFT--现在连缓慢的毫秒级别都忘了。
 
你已经有了HFT经纪商吗?)
 
secret:
和你已经有了HFT经纪商吗?)
是的。
 
Igor Makanu:

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

很有可能服务器正在发送压缩的流量,并且SymbolInfoTick在数据被解压缩时遇到了周期性的滞后。

即,当有很多符号时,测试时间会有更频繁或更深的下降

在最近的构建中,即使从理论上讲,接收tick流也没有效果。实际上,SymbolInfoTick已经可以使用缓存了,但有些市民一直在寻找一只黑猫。

我不认为在80%负载的处理器上测试有什么意义。

在测试中,它甚至没有80%。有6个代理在4个核心上运行,即100%保证。

唯一的问题是他的系统的任务调度器是如何处理这种情况的。同时,作者还提出主张,认为是终端的实施造成的。

也就是说,当一台电脑超载时,会人为地制造出一种情况,这时电脑上的一切都会变慢,然后以 "哦,看,为什么终端有时会滞后 "的形式提出一些主张。

让我们闭上眼睛,即使在这样的条件下,它也是 "大约0.01%" - 让细节见鬼去吧!只要说 "没有人关心医院的平均温度","交易时滞后会造成问题 "和 "我们想要HFT "就够了。

此外,我们当然希望HFT 在20个专家的旧办公室桌面或一个死的虚拟机上。

PS PositionSelectByTicket()在其实现中当然可以访问一个具有访问同步性的共享资源。而如果你不在每次看涨时选择仓位,你就会读到旧的价格。通过SymbolInfoDouble来 "快照 "更容易。

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
 
实时内核可以提供任何帮助吗?