Текущая рыночная информация (тик)

В разделе Получение последнего тика по символу мы уже познакомились с функцией SymbolInfoTick, которая предоставляет полную информацию о последнем тике (событии изменении цены) в виде структуры MqlTick. При необходимости MQL-программа может запросить значения цен и объемов, соответствующих полям этой структуры, по отдельности. Все они обозначаются свойствами разных типов, входящих в состав перечислений ENUM_SYMBOL_INFO_INTEGER и ENUM_SYMBOL_INFO_DOUBLE.

Идентификатор

Описание

Тип свойства

SYMBOL_TIME

Время последней котировки

datetime

SYMBOL_BID

Цена Bid — лучшее предложение на продажу

double

SYMBOL_ASK

Цена Ask — лучшее предложение на покупку

double

SYMBOL_LAST

Last — цена совершения последней сделки

double

SYMBOL_VOLUME

Объем в последней сделке

long

SYMBOL_TIME_MSC

Время последней котировки в миллисекундах с 1970.01.01

long

SYMBOL_VOLUME_REAL

Объем в последней сделке с повышенной точностью

double

Следует отметить, что код двух свойств, связанных с объемом — SYMBOL_VOLUME и SYMBOL_VOLUME_REAL — одинаковый в обоих перечислениях. Это единственный случай, когда идентификаторы элементов разных перечислений пересекаются. Дело в том, что они возвращают по сути одно и то же свойство тика, но с разной точностью представления.

В отличие от структуры, среди свойств нет аналога полю 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