В прошлой статье мы получали котировки посредством API. В этой статье получаем данные биржевого стакана (Depth of market).
Вот так выглядит биржевой стакан в программе S5 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.
И вот результат работы программы:
А это в динамике:
Надеемся вам был полезен данный материал.
Как открыть реальный счет
Мы в соцсетях: