Как получить актуальную информацию о ценах в Bloomberg?

Я хочу получить моментальный снимок цены в реальном времени от Bloomberg .Net API 3 с C#.

Из примеров я вижу, как получить исторические цены или подписаться на данные, но я не могу найти правильный запрос для получения снимка книги ордеров, т. е. цену покупки/продажи/последней сделки и количество.

Для внутридневного тика я бы сделал что-то вроде этого:

Service refDataService = d_session.GetService("//blp/refdata");
// create intraday tick request
Request request = refDataService.CreateRequest("IntradayTickRequest");
// set request parameters
request.Set("includeConditionCodes", checkBoxIncludeConditionCode.Checked);
request.Set("includeExchangeCodes", checkBoxIncludeExchangeCode.Checked);
Element eventTypes = request.GetElement("eventTypes");
eventTypes.AppendValue("TRADE");
eventTypes.AppendValue("BID");
eventTypes.AppendValue("ASK");
request.Set("security", d_requestSecurity);
request.Set("startDateTime", new BDateTime(startDate.Year, startDate.Month,
             startDate.Day,startDate.Hour, startDate.Minute, startDate.Second, 0));
request.Set("endDateTime", new BDateTime(endDate.Year, endDate.Month, endDate.Day,
             endDate.Hour, endDate.Minute, endDate.Second, 0));

Есть ли другой запрос на моментальный снимок в реальном времени?


person drexiya    schedule 07.09.2011    source источник
comment
Bloomberg .Net API 3 не является широко используемым API, поэтому вряд ли кто-то здесь сможет помочь, если вы не добавите ссылку на API.   -  person ColinE    schedule 07.09.2011
comment
Я не уверен в этом. У вас есть фигурки?   -  person drexiya    schedule 08.09.2011


Ответы (4)


Минимально адаптировано из примера, который идет с API:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Bloomberglp.Blpapi;

namespace BbServerApiTool
{
    public class GetFields : GetBloombergFields
    {
        private static readonly Name EXCEPTIONS = new Name("exceptions");
        private static readonly Name FIELD_ID = new Name("fieldId");
        private static readonly Name REASON = new Name("reason");
        private static readonly Name CATEGORY = new Name("category");
        private static readonly Name DESCRIPTION = new Name("description");
        private static readonly Name ERROR_CODE = new Name("errorCode");
        private static readonly Name SOURCE = new Name("source");
        private static readonly Name SECURITY_ERROR = new Name("securityError");
        private static readonly Name MESSAGE = new Name("message");
        private static readonly Name RESPONSE_ERROR = new Name("responseError");
        private static readonly Name SECURITY_DATA = new Name("securityData");
        private static readonly Name FIELD_EXCEPTIONS = new Name("fieldExceptions");
        private static readonly Name ERROR_INFO = new Name("errorInfo");

        public override List<List<string>> GetBbFields(string[] tickers, string[] fieldsParam)
        {
            string serverHost = System.Configuration.ConfigurationManager.AppSettings["Host"];
            int serverPort = Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["Port"]);

            var sessionOptions = new SessionOptions {ServerHost = serverHost, ServerPort = serverPort};

            var session = new Session(sessionOptions);
            session.Start();
            session.OpenService("//blp/refdata");
            Service refDataService = session.GetService("//blp/refdata");
            Request request = refDataService.CreateRequest("ReferenceDataRequest");
            Element securities = request.GetElement("securities");
            Element fields = request.GetElement("fields");
            request.Set("returnEids", true);

            foreach (var ticker in tickers)
            {
                securities.AppendValue(ticker);
            }

            foreach (var field in fieldsParam)
            {
                fields.AppendValue(field);
            }

            var cID = new CorrelationID(1);
            session.Cancel(cID);
            Results = new List<List<string>>();
            session.SendRequest(request, cID);

            while (true)
            {
                Event eventObj = session.NextEvent();
                processEvent(eventObj, session, fieldsParam);
                if (eventObj.Type == Event.EventType.RESPONSE)
                {
                    return Results;   
                }
            }
        }

        protected override string GetName()
        {
            return "BbServerApiTool";
        }

        private void processEvent(Event eventObj, Session session, string[] fields)
        {
            switch (eventObj.Type)
            {
                case Event.EventType.RESPONSE:
                case Event.EventType.PARTIAL_RESPONSE:
                    processRequestDataEvent(eventObj, session, fields);
                    break;
                default:
                    processMiscEvents(eventObj, session);
                    break;
            }
        }

        private void processMiscEvents(Event eventObj, Session session)
        {
            foreach (Message msg in eventObj.GetMessages())
            {
                switch (msg.MessageType.ToString())
                {
                    case "RequestFailure":
                        Element reason = msg.GetElement(REASON);
                        string message = string.Concat("Error: Source-", reason.GetElementAsString(SOURCE),
                            ", Code-", reason.GetElementAsString(ERROR_CODE), ", category-", reason.GetElementAsString(CATEGORY),
                            ", desc-", reason.GetElementAsString(DESCRIPTION));
                        throw new ArgumentException(message);
                    case "SessionStarted":
                    case "SessionTerminated":
                    case "SessionStopped":
                    case "ServiceOpened":
                    default:
                        break;
                }
            }
        }
        private void processRequestDataEvent(Event eventObj, Session session, string[] fields)
        {
            foreach (Message msg in eventObj.GetMessages())
            {
                if (msg.MessageType.Equals(Name.GetName("ReferenceDataResponse")))
                {
                    Element secDataArray = msg.GetElement(SECURITY_DATA);
                    int numberOfSecurities = secDataArray.NumValues;
                    for (int index = 0; index < numberOfSecurities; index++)
                    {
                        Element secData = secDataArray.GetValueAsElement(index);
                        Element fieldData = secData.GetElement("fieldData");

                        if (secData.HasElement(FIELD_EXCEPTIONS))
                        {
                            // process error
                            Element error = secData.GetElement(FIELD_EXCEPTIONS);
                            if (error.Elements.Count() > 0)
                            {
                                Element errorException = error.GetValueAsElement(0);
                                Element errorInfo = errorException.GetElement(ERROR_INFO);
                                string message = errorInfo.GetElementAsString(MESSAGE);
                                throw new ArgumentException(message);
                            }
                        }

                        var list = new List<string> { secData.GetElement("security").GetValueAsString() };
                        if (secData.HasElement(SECURITY_ERROR))
                        {
                            Element error = secData.GetElement(SECURITY_ERROR);
                            string errorMessage = error.GetElementAsString(MESSAGE);
                            //                            throw new ArgumentException(errorMessage);
                            //TODO Log
                            logger.WriteLine("Couldn't get a value for " + secData.GetElement("security").GetValueAsString());
                            foreach (var field in fields)
                            {
                                list.Add("N/A");
                            }
                        }
                        else
                        {
                            foreach (var field in fields)
                            {
                                Element item = fieldData.GetElement(field);
                                list.Add(item.IsNull ? "N/A" : item.GetValueAsString());
                            }
                        }
                        Results.Add(list);
                    }
                }
            }
        }
    }
}
person RossFabricant    schedule 07.09.2011
comment
Спасибо, Росс. Я тестировал ReferenceDataRequest, но не был уверен в его использовании, так как это похоже на «статический» или «эталонный» тип запроса данных, и я не был полностью уверен в получении реальных цен. Я не могу найти никакого окончательного определения ReferenceDataRequest, и я не знаю задержки на этом. Я могу попробовать сравнить эти цены с подпиской, но подумал, что лучше получить IntradayTickRequest, но просто хотел самую последнюю, а не за указанный период. Знаете ли вы, предназначен ли это для моментального снимка в реальном времени? - person drexiya; 07.09.2011
comment
Если вы используете такое поле, как PX_LAST, оно даст вам последнюю цену. Задержки не будет, если у вашей учетной записи есть разрешение на цены в реальном времени. Может быть способ получить цену с лучшей задержкой, но этот подход достаточно быстр для моих целей. - person RossFabricant; 07.09.2011

Если вы хотите обеспечить абсолютно живое ценообразование, вы, вероятно, воспользуетесь API сервиса подписки (//blp/mktdata), который также вернет цену с указанием точного времени последней сделки.

Хороший пример этого есть в Руководстве разработчика, доступном через терминал Bloomberg в приложении C.2 (первая парадигма подписки).

person Simon Elliston Ball    schedule 08.09.2011
comment
Да, спасибо, это правда, я думал о подписке, но на данный момент не хочу ждать следующей сделки, которая на некоторых рынках может занять некоторое время. Я просто хочу иметь возможность запросить моментальный снимок в реальном времени с минимальной задержкой. Это то, чего на удивление не хватает в образцах настольных библиотек и, по-видимому, не известно команде поддержки Bloomberg. Я больше искал чей-либо опыт, пытаясь сделать это, так как я не нашел образцы, которые были бы полезными. - person drexiya; 11.09.2011
comment
Вы всегда можете использовать поле ReferenceDataService LAST_PRICE в качестве начального значения, а затем подписаться на обновления. Это гарантирует вам самую актуальную торгуемую цену. - person Simon Elliston Ball; 12.09.2011

Похоже, что у Bloomberg нет конкретного запроса на «живой снимок» книги ордеров. Другие методы, очевидно, задокументированы в примерах, но, похоже, Bloomberg не дает этого в своем .Net API.

Есть запросы на справочные данные, которые кажутся наиболее близкими к типу запроса снимка, но нет документации по задержке при обновлении этих переменных. Название «ссылка» не внушает большого доверия к чему-то похожему на запрос в реальном времени.

Подписка — это альтернативный метод запроса типа моментального снимка, который может быть лучше во многих приложениях. При наличии подписки обновления книги ордеров передаются в прямом эфире на ваш сокет. Недостатком этого подхода является то, что вам нужна внутренняя архитектура для его поддержки, а также вам, возможно, придется ждать неопределенное время, чтобы увидеть какую-либо активность на некоторых рынках.

Имея это в виду, я думаю, что лучше всего использовать метод проб и ошибок, а работа с другим поставщиком данных может быть более плодотворной.

person drexiya    schedule 26.09.2011

Если вам нужно получить цены в реальном времени, а не статические, вы все равно можете сделать это через ReferenceDataRequest. Разница только в том, какое поле использовать. PX_LAST дает вам последнюю цену, которая учитывается в вашем месячном лимите эталонных данных. LAST_PRICE дает вам последнюю цену в реальном времени, которая учитывается в вашем месячном лимите данных в реальном времени.

PS: я получил эту информацию от нашего торгового представителя Bloomberg.

person Sergey Kuznetsov    schedule 07.10.2011