Получаем данные биржевого стакана DOM

В прошлой статье мы получали котировки посредством API. В этой статье получаем данные биржевого стакана (Depth of market).

Вот так выглядит биржевой стакан в программе Global Zen Trader:

данные биржевого стакана

За основу возьмем программу из предыдущего примера и добавим необходимый код, а лишний закомментируем.

Итак подключаем обработчик события «изменение биржевого стакана»: OnDOMChanged.  То есть как только будет происходить изменение информации в стакане будет вызываться обработчик «oecapi_OnDOMChanged»

//Обработчик изменения состояния стакана
 oecapi.OnDOMChanged += new OEC.API.OnDOMChangedEvent(oecapi_OnDOMChanged);

Также в процедуре поиска контракта производим подписку на данные стакана:

static void oecapi_OnSymbolLookupReceived(OEC.API.SymbolLookupCriteria symbolLookup, OEC.API.ContractList contracts)
 {
    if (esu6SymbolLookupRequest != null && symbolLookup.ID == esu6SymbolLookupRequest.ID)
      {
        Console.WriteLine("Symbol lookup request for ESU6 found {0} contracts", contracts.Count);
        foreach (var contract in contracts)
         {
           oecapi.Subscribe(contract); // Subscribe for quotes
           oecapi.SubscribeDOM(contract); // Subscribe DOM
         }
     }
 }

Ключевое:

oecapi.SubscribeDOM(contract); // Subscribe DOM

И теперь собственно выводим в обработчике данные первых трех бидов и первых трех асков на экран:

 static void oecapi_OnDOMChanged(OEC.API.Contract contract)
 {
   OEC.API.DOM dom = contract.DOM;
   Console.WriteLine("DOM {0} {1}. Best Bid: {2} Best Ask: {3}",
   contract.Symbol, dom.LastUpdate, 
     dom.BidLevels.Length > 0 ? dom.BidSizes[0].ToString() + "@" + contract.PriceToString(dom.BidLevels[0]) : "-",
     dom.AskLevels.Length > 0 ? dom.AskSizes[0].ToString() + "@" + contract.PriceToString(dom.AskLevels[0]) : "-");
   Console.WriteLine("DOM {0} {1}. Bid1 : {2} Ask1: {3}",
     contract.Symbol, dom.LastUpdate,
     dom.BidLevels.Length > 0 ? dom.BidSizes[0].ToString() + "@" + contract.PriceToString(dom.BidLevels[1]) : "-",
     dom.AskLevels.Length > 0 ? dom.AskSizes[0].ToString() + "@" + contract.PriceToString(dom.AskLevels[1]) : "-");
   Console.WriteLine("DOM {0} {1}. Bid2: {2} As2k: {3}",
     contract.Symbol, dom.LastUpdate,
     dom.BidLevels.Length > 0 ? dom.BidSizes[0].ToString() + "@" + contract.PriceToString(dom.BidLevels[2]) : "-",
     dom.AskLevels.Length > 0 ? dom.AskSizes[0].ToString() + "@" + contract.PriceToString(dom.AskLevels[3]) : "-");
   Console.WriteLine("------------------------------");
 }

В переменной dom (тип OEC.API.DOM) хранится «срез» биржевого стакана после каждого его изменения.

Массив dom.BidSizes хранит количество контрактов по биде, где под индексом 0 хранится лучший бид, под индексом 1 — следующий уровень и так далее.

Массив dom.BidLevels аналогично хранит ЦЕНЫ бидов. Индексация аналогична массиву BidSizes.  Аналогичная картина и для стороны Ask.

И вот результат работы программы:

данные биржевого стакана

А это в динамике:

Надеемся вам был полезен данный материал.

Полный текст программы.

Закажите демоверсию торгового терминала Global Zen Trader
Как открыть реальный счет
Мы в соцсетях:
Наша группа в фейсбук Следите за нами в Твиттере Наша группа в Вконтакте