市场深度

当涉及到交易所金融工具时,MetaTrader 5 不仅可以让你获得以 分时报价方式打包的价格和交易量信息,还可以获得市场深度(订单簿,二级价格),即围绕当前价格的几个最接近水平下已下达买入和卖出订单的交易量分布。交易品种 SYMBOL_TICKS_BOOKDEPTH 的其中一个整数特性包含市场深度中显示的最大层级数。每一方均允许该交易量,即订单簿的总规模可以扩大两倍(并且不考虑未播报的零交易量价位)。

根据市场情况,传输的订单簿的实际规模可能会小于该特性中显示的规模。对于非交易所金融工具,此特性通常等于 0,尽管一些经纪商可以播报仅受其客户订单限制的外汇交易品种的订单簿。

订单簿本身及其更新通知必须通过感兴趣的 MQL 程序使用一个特殊的 API 进行请求,我们将在 下一章讨论。

需要注意的是,由于平台的架构特点,该特性与订单簿的转换没有直接关系,也就是说,它只是由经纪商填充的规范字段。换言之,该特性的非零值并不意味着订单簿一定会在开放市场中到达终端。这取决于其他服务器设置以及其是否与数据提供程序有活动连接。

让我们尝试使用脚本 SymbolFilterBookDepth.mq5 来获得所有或选定交易品种的市场深度统计数据。

input bool UseMarketWatch = false;
input int ShowSymbolsWithDepth = -1;

参数 ShowSymbolsWithDepth(默认等于 -1)指示收集所有交易品种中不同市场深度设置的统计数据。如果将该参数设置为不同的值,程序将尝试查找具有指定订单簿深度的所有交易品种。

void OnStart()
{
   SymbolFilter f;                // filter object
   string symbols[];              // array for symbol names
   long depths[];                 // array of property values
   MapArray<long,intstats;      // counters of occurrences of each depth
   
   if(ShowSymbolsWithDepth > -1)
   {
      f.let(SYMBOL_TICKS_BOOKDEPTHShowSymbolsWithDepth);
   }
   
   // apply filter and fill arrays
   f.select(UseMarketWatchSYMBOL_TICKS_BOOKDEPTHsymbolsdepthstrue);
   const int n = ArraySize(symbols);
   
   PrintFormat("===== Book depths for %s symbols %s=====",
      (UseMarketWatch ? "Market Watch" : "all available"),
      (ShowSymbolsWithDepth > -1 ? "(filtered by depth="
      + (string)ShowSymbolsWithDepth + ") " : ""));
   PrintFormat("Total symbols: %d"n);
   ...

如果给定了特定深度,我们只需输出一个交易品种数组(均满足筛选条件),然后退出。

   if(ShowSymbolsWithDepth > -1)
   {
      ArrayPrint(symbols);
      return;
   }
   ...

否则,我们将计算并显示统计数据。

   for(int i = 0i < n; ++i)
   {
      stats.inc(depths[i]);
   }
   
   Print("Stats per depth:");
   stats.print();
   Print("Legend: key=depth, value=count");
}

使用默认设置时,我们可以得到下图。

===== Book depths for all available symbols =====
Total symbols: 52357
Stats per depth:
    [key] [value]
[0]     0   52244
[1]     5       3
[2]    10      67
[3]    16       5
[4]    20      13
[5]    32      25
Legend: key=depth, value=count

如果将 ShowSymbolsWithDepth 设置为检测到的值之一(例如 32),我们可获得一个具有此订单簿深度的交易品种列表。

===== Book depths for all available symbols (filtered by depth=32) =====
Total symbols: 25
[ 0] "USDCNH" "USDZAR" "USDHUF" "USDPLN" "EURHUF" "EURNOK" "EURPLN" "EURSEK" "EURZAR" "GBPNOK" "GBPPLN" "GBPSEK" "GBPZAR"
[13] "NZDCAD" "NZDCHF" "USDMXN" "EURMXN" "GBPMXN" "CADMXN" "CHFMXN" "MXNJPY" "NZDMXN" "USDCOP" "USDARS" "USDCLP"