Как получить живой снимок цены в Bloomberg? - PullRequest
6 голосов
/ 07 сентября 2011

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

Я могу видеть из примеров, как получить исторические цены или подписаться на данные, но не могу найти правильный запрос на получение снимка книги ордеров, т. Е. Bid / Ask / Last trade Price and Quantities.

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

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));

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

Ответы [ 4 ]

5 голосов
/ 07 сентября 2011

Минимально адаптировано из примера, который поставляется с 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);
                    }
                }
            }
        }
    }
}
2 голосов
/ 26 сентября 2011

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

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

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

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

2 голосов
/ 08 сентября 2011

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

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

1 голос
/ 07 октября 2011

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

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

...