当前市场信息(分时报价)

获取交易品种的最新分时报价一节中,我们已经遇到过 SymbolInfoTick 函数,其以 MqlTick 结构体的形式提供了关于最后一条分时报价(价格变化事件)的完整信息。如有必要,MQL 程序可以分别请求与该结构体的字段相对应的价格和交易量的值。二者表示为不同类型的特性,这些特性为 ENUM_SYMBOL_INFO_INTEGER 和ENUM_SYMBOL_INFO_DOUBLE 枚举的一部分。

标识符

说明

特性类型

SYMBOL_TIME

最新报价时间

datetime

SYMBOL_BID

买入价;最佳卖出价格

double

SYMBOL_ASK

卖出价;最佳买入价格

double

SYMBOL_LAST

最后一笔;最后一笔交易的价格

double

SYMBOL_VOLUME

最后一笔交易的成交量

long

SYMBOL_TIME_MSC

自 1970 年 01 月 01 日以来最后一次报价的时间(以毫秒为单位)

long

SYMBOL_VOLUME_REAL

最后一笔交易的成交量(精度更高)

double

注意,两个与成交量相关的特性 SYMBOL_VOLUME 和 SYMBOL_VOLUME_REAL 的代码在两个枚举中是相同的。这是不同枚举的元素 ID 发生重叠的唯一情况。事实上,二者返回本质上相同的分时报价特性,只是表示精度不同而已。

与结构体不同的是,特性未提供类似 uint flags 的字段,该字段表示市场上哪种变化导致了分时报价的生成。该字段仅在结构体中有意义。

我们来尝试单独请求分时报价特性,并将其与 SymbolInfoTick 调用的结果进行比较。在快速变化的市场上,结果可能会有所不同。函数调用之间可能会出现一条新分时报价(甚至几条分时报价)。

void OnStart()
{
   PRTF(TimeToString(SymbolInfoInteger(_SymbolSYMBOL_TIME), TIME_DATE | TIME_SECONDS));
   PRTF(SymbolInfoDouble(_SymbolSYMBOL_BID));
   PRTF(SymbolInfoDouble(_SymbolSYMBOL_ASK));
   PRTF(SymbolInfoDouble(_SymbolSYMBOL_LAST));
   PRTF(SymbolInfoInteger(_SymbolSYMBOL_VOLUME));
   PRTF(SymbolInfoInteger(_SymbolSYMBOL_TIME_MSC));
   PRTF(SymbolInfoDouble(_SymbolSYMBOL_VOLUME_REAL));
   
   MqlTick tick[1];
   SymbolInfoTick(_Symboltick[0]);
   ArrayPrint(tick);
}

在特定情况下,很容易验证信息是否一致。

TimeToString(SymbolInfoInteger(_Symbol,SYMBOL_TIME),TIME_DATE|TIME_SECONDS)
   =2022.01.25 13:52:51 / ok
SymbolInfoDouble(_Symbol,SYMBOL_BID)=1838.44 / ok
SymbolInfoDouble(_Symbol,SYMBOL_ASK)=1838.49 / ok
SymbolInfoDouble(_Symbol,SYMBOL_LAST)=0.0 / ok
SymbolInfoInteger(_Symbol,SYMBOL_VOLUME)=0 / ok
SymbolInfoInteger(_Symbol,SYMBOL_TIME_MSC)=1643118771166 / ok
SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_REAL)=0.0 / ok
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2022.01.25 13:52:51 1838.44 1838.49   0.00        0 1643118771166       6          0.00