文章 "MQL5 对决 QLUA - 为什么在 MQL5 中交易操作速度快达 28 倍?" - 页 4

 

如果我们将问题改写为 "从终端内核调用 MQL5 代码的频率",那么所有的测量都应该是错误的:

  1. 我们应该删除所有不必要的 MQL5 代码,并在一个裸函数中保留几个计数器,以尽量减少测量本身的成本
  2. 找到合适的 OnXXXX 入口点和强制生成内核调用的方法。在这里,我们需要为计量建立一个单独的测试构建。

在这种情况下,构建一个多边形 后,就可以真正测量 MQL5 调用的所有开销,并获得一个有趣的特性。按照我们的习惯,然后对一切进行多次优化。

这是一项有趣的任务,我们将对其进行处理。

 
fxsaber:


我知道了

是的

对不起,我忽略了

 
Renat Fatkhullin:

如果我们将问题改写为 "从终端内核调用 MQL5 代码的频率",那么所有的测量都应该是错误的:

  1. 我们应该删除所有不必要的 MQL5 代码,并在一个裸函数中保留几个计数器,以尽量减少测量本身的成本
  2. 找到合适的 OnXXXX 入口点和强制生成内核调用的方法。在这里,我们需要为计量建立一个单独的测试构建。

在这种情况下,构建一个多边形后,就可以真正测量 MQL5 调用的所有开销,并获得一个有趣的特性。按照我们的习惯,然后对一切进行多次优化。

这是一项有趣的任务,我们会完成它。

感谢您没有忽视这些极客的事情!

也许,我们需要一个单独的构建来测量引用数据包的到达速度。这正是我想测量的。

[删除]  
Renat Fatkhullinfxsaber- 谢谢你们的解释。
 
fxsaber:

请在真实账户上再做一次 MT5 速度测试

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

测试 "CopyTicks

fxsaber, 2016.09.13 11:11 AM

如果通过 OrderSendAsync 在价差内发送两个限价(BuyLimit1_price < BuyLimit2_price),交易所是否会同时(以 1 毫秒的精度)生成两个连续的买入价提高的 ticks?

让我来解释一下这样做的目的。

在价差内发送 BuyLimit1 时,交易所将向我们发送一个刻度线,并标明其诞生时间(它将生成一个新的买价)。在 BuyLimit2 之后 - 另一个刻度线的诞生时间。这两个时间的差异是 MT5 交易订单交付到交易所的速度特征。

为了尽量减少这种实验的金钱损失,您可以不同步发送两个 BuyLimit,而是在点差内发送 BuyLimit 和 SellLimit,并选择一些流动性较差的交易工具。

 

在比较之前,我们需要 "完成 "整个复杂的交易操作过程

(接收数据、证明交易正确、接收交易确认)。

已添加 Build 1395,真正的

2016.09.14 17:30:03.100 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': accepted sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56 placed for execution in 3750.466 ms
2016.09.14 17:30:06.851 Trades  'xxxxx': cancel order #44309414 sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:10.014 Trades  'xxxxx': deal #29388895 sell 1.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:10.014 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:10.385 Trades  'xxxxx': deal #29388914 sell 4.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:12.374 Trades  'xxxxx': accepted exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:12.375 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market placed for execution in 2360.902 ms
2016.09.14 17:30:12.398 Trades  'xxxxx': deal #29389024 buy 1.00 BR-11.16 at 47.25 done (based on order #44309578)
2016.09.14 17:30:12.401 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.006 Trades  'xxxxx': accepted exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.007 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market placed for execution in 606.852 ms
2016.09.14 17:30:13.009 Trades  'xxxxx': deal #29389140 buy 4.00 BR-11.16 at 47.25 done (based on order #44309644)
2016.09.14 17:30:13.015 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74 placed for execution in 342.736 ms
2016.09.14 17:30:13.668 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.712 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.716 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79 placed for execution in 48.228 ms
2016.09.14 17:30:13.718 Trades  'xxxxx': deal #29389165 buy 5.00 BR-12.16 at 47.79 done (based on order #44309680)
2016.09.14 17:30:13.721 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.740 Trades  'xxxxx': accepted exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.741 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market placed for execution in 20.867 ms
2016.09.14 17:30:13.778 Trades  'xxxxx': deal #29389166 sell 5.00 BR-11.16 at 47.29 done (based on order #44309682)
 

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

FORTS.关于执行的问题

Renat Fatkhullin, 2016.08.23 16:35

您只需等待 5-10 毫秒,然后再试一次。

问题是,您会立即得到交易确认,但之后完整的交易细节会异步到达。时间从 0 到 N 毫秒不等,通常在 1-2 毫秒内(当然取决于 ping)。

由于这种情况,与 QLUA 相比,MT5 并不占优势。
 
prostotrader:

在比较之前,我们需要 "完成 "整个复杂的交易操作过程

(接收数据、证明交易、接收交易确认)。

已添加第 1395 版,真实


刚刚手动进行了类似操作:11.7 毫秒

2016.09.14 18:17:26.298	Trades	'10321': order #44324961 buy limit 1.00 / 1.00 BR-12.16 at 47.00 done in 11.759 ms
2016.09.14 18:17:26.295	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00 placed for execution
2016.09.14 18:17:26.293	Trades	'10321': accepted buy limit 1.00 BR-12.16 at 47.00
2016.09.14 18:17:26.286	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00
 
Renat Fatkhullin:

你们不愿意看到真实的报告,而是用自己的漏洞百出的方法来衡量交易时间。

你不想承认自己的错误,宁愿相信你错误脚本中的畸形数字。

我刚刚手动进行了一次类似的操作:11.7 毫秒。

你在说什么,Renate?

这是从 Temninal 的日志中摘录的,不是我自己的日志!

 
fxsaber:
在这种情况下,有必要对与 QLUA 的比较稍作调整,以避免对 MT5 产生不利影响。

没有必要做任何调整。我的说法是针对一般情况的,"在您的网络中,您的 ping 可以是任何值,实际上,根据您的网络,您可以在 0-N 毫秒内完成交易"。而 0 毫秒的可能性比更大。

下面是在异步模式下控制所有交易的验证码:

ulong ExtTicks=0;
//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 以毫秒为单位输出 ping 到交易服务器的时间
   PrintFormat("AsyncTradesTest: last ping %.2f ms, build %d",TerminalInfoInteger(TERMINAL_PING_LAST)/1000.0,TerminalInfoInteger(TERMINAL_BUILD));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   Print(EnumToString(trans.type)," ",trans.symbol,": ",trans.price," ",result.order," time: ",(GetMicrosecondCount()-ExtTicks)/1000.0," ms");
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
   static bool started=false;
//---------------------------------------在第一个刻度运行一次系列
   if(!started)
     {
      started=true;
      //--- 填写询问内容
      MqlTradeRequest req={};
      MqlTradeResult  res={};

      req.volume      =1;
      req.symbol      =_Symbol;
      req.price       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      req.sl          =0;
      req.tp          =0;
      req.deviation   =100;
      req.type_filling=ORDER_FILLING_RETURN;
      req.action      =TRADE_ACTION_DEAL;
      req.type        =ORDER_TYPE_BUY;
      req.magic       =2016;
      //--- 运行操作循环
      ExtTicks=GetMicrosecondCount();
      Print("Start...");
      OrderSendAsync(req,res);
     }
  }

下面是它在一个真实账户 上的输出结果:

2016.09.14 18:32:53.234 Test (BR-12.16,H1)      TRADE_TRANSACTION_HISTORY_ADD BR-12.16: 0.0 0 time: 11.455 ms
2016.09.14 18:32:53.232 Test (BR-12.16,H1)      TRADE_TRANSACTION_DEAL_ADD BR-12.16: 47.13 0 time: 8.778 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_DELETE BR-12.16: 0.0 0 time: 8.457000000000001 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 8.202999999999999 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 8.151 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 5.196 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 5.171 ms
2016.09.14 18:32:53.227 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_ADD BR-12.16: 0.0 0 time: 4.184 ms
2016.09.14 18:32:53.223 Test (BR-12.16,H1)      Start...
2016.09.14 18:32:49.753 Test (BR-12.16,H1)      AsyncTradesTest: last ping 2.15 ms, build 1417

请从下往上阅读。

它显示了交易的所有阶段,以及从一开始花费的累计时间。根据交易类型,你可以看到终端添加了什么以及何时添加的。

总时间为 11.45 毫秒。