2011-09-07 15 views
6

Estoy buscando obtener una instantánea del precio real de Bloomberg .Net API 3 con C#.¿Cómo obtener una instantánea del precio en vivo en Bloomberg?

Puedo ver en las muestras cómo obtener precios históricos o suscribir datos, pero no puedo encontrar la solicitud correcta para obtener una instantánea del libro de pedidos, es decir, Bid/Ask/Last trade Price and Quantities.

Para una garrapata intradía me gustaría hacer algo como esto:

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

¿Hay una solicitud instantánea diferente, en directo?

+0

Bloomberg .Net API 3 no es una API muy utilizado, por lo que es poco probable que alguien aquí será capaz de ayudar a menos que se añada un enlace a la API – ColinE

+0

No estoy tan seguro de eso. ¿Tienes alguna figura? – drexiya

Respuesta

5

mínimamente adaptado del ejemplo que viene con la 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); 
        } 
       } 
      } 
     } 
    } 
} 
+0

Gracias Ross. He estado probando la ReferenceDataRequest pero no estaba seguro sobre el uso de esta, ya que parece una solicitud de tipo de datos "estático" o de "referencia", y no estaba totalmente seguro de obtener precios en vivo. No puedo encontrar ninguna definición definitiva de ReferenceDataRequest, y no sé la latencia en esto. Puedo tratar de comparar estos precios con una suscripción, pero estaba pensando que podría ser mejor obtener IntradayTickRequest pero solo quería lo último, no por un período específico. ¿Sabes si esto pretende ser una instantánea en vivo/en tiempo real? – drexiya

+1

Si usa un campo como PX_LAST le dará el último precio. No habrá un retraso siempre que su cuenta tenga permisos para precios en tiempo real. Puede haber una manera de obtener el precio con una mejor latencia, pero este enfoque es lo suficientemente rápido para mis propósitos. – RossFabricant

2

Si desea asegurarse de precios absolutamente vivo, es probable que utilice el servicio de suscripción API (// BLP/mktdata), que también devuelva el precio con la hora exacta de la última operación etiquetada.

Hay un buen ejemplo de esto en la Guía del desarrollador disponible a través de un Terminal de Bloomberg en el apéndice C.2 (El paradigma de suscripción uno).

+0

Sí, gracias, es verdad, había considerado una suscripción, pero por el momento no quiero tener que esperar a la próxima operación, lo que puede llevar un tiempo en algunos mercados. Solo quiero poder solicitar una instantánea en vivo con una latencia mínima. Esto es algo que sorprendentemente falta en las muestras de la biblioteca de escritorio y aparentemente está más allá del conocimiento del equipo de soporte de Bloomberg. Estaba buscando más la experiencia de alguien tratando de hacer esto, ya que no encontré las muestras útiles. – drexiya

+0

Siempre puede usar el campo LAST_PRICE de ReferenceDataService como una semilla, y luego seguir la suscripción para las actualizaciones. Eso le garantizará el precio negociado más actualizado. –

2

Parece que no hay una solicitud específica de Bloomberg para una "instantánea en vivo" de la cartera de pedidos. Los otros métodos están obviamente documentados en los ejemplos, pero parece que Bloomberg no da esto en su API .Net.

Existen solicitudes de datos de referencia que parecen ser las más cercanas a una consulta de tipo de instantánea, pero no hay documentación sobre la latencia en la actualización de estas variables. El nombre 'referencia' no inspira gran confianza en algo que suena como una solicitud en tiempo real.

Una suscripción es el método alternativo a una solicitud de tipo de instantánea y puede ser superior en muchas aplicaciones. Con una suscripción, las actualizaciones de la cartera de pedidos se transmiten en vivo a su socket. El inconveniente de este enfoque es que necesita la arquitectura interna para soportarlo y también puede tener que esperar durante un tiempo indeterminado para ver cualquier actividad en algunos mercados.

Con esto en mente, creo que un enfoque de prueba y error es el mejor, y trabajar con otro proveedor de datos podría ser más fructífero.

1

Si necesita obtener precios en tiempo real y no los estáticos, puede hacerlo a través de ReferenceDataRequest. La única diferencia es qué campo usar. PX_LAST le ofrece el último precio que cuenta para su límite mensual de datos de referencia. LAST_PRICE le brinda el último precio en tiempo real que cuenta para su límite mensual de datos en tiempo real.

PS:. Tengo esta información de nuestra Bloomberg representante de ventas

Cuestiones relacionadas