2016-06-14 16 views
1

В запросе «YAS_YLD_SPREAD» для нескольких ценных бумаг, я пытаюсь присвоить другое значение переопределения для «YAS_BOND_PX» переопределения каждого (по снимку Excel)Реализация Overrides в Bloomberg C# API

enter image description here

Тем не менее, я делаю что-то неправильно при назначении переопределений, так как вывод не возвращает ни одного «YAS_YLD_SPREAD» для каждой безопасности (он также ложно возвращает «YAS_YLD_SPREAD 1»), а возвращаемые значения не являются значениями 100.21, 645.06, которые я ожидаю/нуждаются

enter image description here

Благодарен за помощь,

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using ArrayList = System.Collections.ArrayList; 
using Event = Bloomberglp.Blpapi.Event; 
using Element = Bloomberglp.Blpapi.Element; 
using Message = Bloomberglp.Blpapi.Message; 
using Name = Bloomberglp.Blpapi.Name; 
using Request = Bloomberglp.Blpapi.Request; 
using Service = Bloomberglp.Blpapi.Service; 
using Session = Bloomberglp.Blpapi.Session; 
using SessionOptions = Bloomberglp.Blpapi.SessionOptions; 
using InvalidRequestException = 
     Bloomberglp.Blpapi.InvalidRequestException; 
using Subscription = Bloomberglp.Blpapi.Subscription; 

namespace COATI 
{ 
    public class BloombergFetch 
    { 
     public string[] IsinArray; 

     private const String APIREFDATA_SVC = "//blp/refdata"; 
     private static readonly Name SECURITY_DATA = 
             Name.GetName("securityData"); 
     private static readonly Name SECURITY = Name.GetName("security"); 
     private static readonly Name FIELD_DATA = Name.GetName("fieldData"); 
     private static readonly Name RESPONSE_ERROR = 
              Name.GetName("responseError"); 

     private static readonly Name SECURITY_ERROR = 
             Name.GetName("securityError"); 
     private static readonly Name FIELD_EXCEPTIONS = 
              Name.GetName("fieldExceptions"); 
     private static readonly Name FIELD_ID = Name.GetName("fieldId"); 
     private static readonly Name ERROR_INFO = Name.GetName("errorInfo"); 
     private static readonly Name CATEGORY = Name.GetName("category"); 
     private static readonly Name MESSAGE = Name.GetName("message"); 

     private ArrayList d_securities = new ArrayList(); 
     private ArrayList d_fields = new ArrayList(); 
     private ArrayList d_overrides = new ArrayList(); 
     private ArrayList d_overridevalues = new ArrayList(); 

     static void Main() 
     { 
      BloombergFetch example = new BloombergFetch(); 
      example.run(); 
      System.Console.WriteLine("Press ENTER to quit"); 
      System.Console.Read(); 
     } 


     public void run() 
     { 

      string serverHost = "localhost"; 
      int serverPort = 8194; 

      SessionOptions sessionOptions = new SessionOptions(); 
      sessionOptions.ServerHost = serverHost; 
      sessionOptions.ServerPort = serverPort; 

      System.Console.WriteLine("Connecting to " + serverHost + ":" + 
      serverPort); 

      Session session = new Session(sessionOptions); 
      bool sessionStarted = session.Start(); 

      if (!sessionStarted) 
      { 
       System.Console.Error.WriteLine("Failed to start session."); 
       return; 
      } 

      d_securities.Add("XS0975256685 Corp"); 
      d_securities.Add("XS1207058733 Corp"); 

      d_fields.Add("YAS_YLD_SPREAD"); 
      d_fields.Add("YAS_YLD_SPREAD"); 

      d_overrides.Add("YAS_BOND_PX"); d_overridevalues.Add(116); 
      d_overrides.Add("YAS_BOND_PX"); d_overridevalues.Add(88); 


      try 
      { 
       sendRefDataRequest(session); 
      } 

      catch (InvalidRequestException e) 
      { 
       System.Console.WriteLine(e.ToString()); 
      } 

      // wait for events from session. 
      eventLoop(session); 
      session.Stop(); 

      */ 
     } 

     private void sendRefDataRequest(Session session) 
     { 
      if (!session.OpenService(APIREFDATA_SVC)) 
      { 
       System.Console.Error.WriteLine("Failed to open service: " + 
        APIREFDATA_SVC); 
       return; 
      } 
      Service refDataService = session.GetService(APIREFDATA_SVC); 

      Request request = refDataService.CreateRequest("ReferenceDataRequest"); 

      Element securities = request.GetElement("securities"); 

      Element overrides = request.GetElement("overrides"); 

      for (int i = 0; i < d_securities.Count; ++i) 
      { 
       securities.AppendValue((string)d_securities[i]); 
      } 

      Element fields = request.GetElement("fields"); 

      for (int i = 0; i < d_fields.Count; ++i) 
      { 
       fields.AppendValue((string)d_fields[i]); 
      } 

      for (int i = 0; i < d_overrides.Count; ++i) 
      { 
       Element bboverride = overrides.AppendElement(); 
       bboverride.SetElement("fieldId",d_overrides[i].ToString()); 
       //bboverride.SetElement("fieldId", "YAS_BOND_PX"); 
       bboverride.SetElement("value", Convert.ToBoolean(d_overridevalues[i])); 
       //bboverride.SetElement("value", 100); 
      } 

      System.Console.WriteLine("Sending Request: " + request); 
      session.SendRequest(request, null); 

     } 

     private void eventLoop(Session session) 
     { 
      bool done = false; 

      while (!done) 
      { 
       Event eventObj = session.NextEvent(); 
       if (eventObj.Type == Event.EventType.PARTIAL_RESPONSE) 
       { 
        System.Console.WriteLine("Processing Partial Response"); 
        processResponseEvent(eventObj); 
       } 
       else if (eventObj.Type == Event.EventType.RESPONSE) 
       { 
        System.Console.WriteLine("Processing Response"); 
        processResponseEvent(eventObj); 
        done = true; 
       } 
       else 
       { 
        foreach (Message msg in eventObj.GetMessages()) 
        { 
         System.Console.WriteLine(msg.AsElement); 
         if (eventObj.Type == Event.EventType.SESSION_STATUS) 
         { 
          if (msg.MessageType.Equals("SessionTerminated")) 
          { 
           done = true; 
          } 
         } 
        } 
       } 
      } 

     } 

     private void processResponseEvent(Event eventObj) 
     { 
      foreach (Message msg in eventObj.GetMessages()) 
      { 
       if (msg.HasElement(RESPONSE_ERROR)) 
       { 
        System.Console.WriteLine("REQUEST FAILED: " + 
           msg.GetElement(RESPONSE_ERROR)); 
        continue; 
       } 

       Element securities = msg.GetElement(SECURITY_DATA); 
       int numSecurities = securities.NumValues; 
       System.Console.WriteLine("Processing " + numSecurities + " securities:"); 

       for (int i = 0; i < numSecurities; ++i) 
       { 
        Element security = securities.GetValueAsElement(i); 
        string ticker = security.GetElementAsString(SECURITY); 
        System.Console.WriteLine("\nTicker: " + ticker); 

        if (security.HasElement("securityError")) 
        { 
         System.Console.WriteLine("\tSECURITY FAILED: " + 
          security.GetElement(SECURITY_ERROR)); 
         continue; 
        } 

        Element fields = security.GetElement(FIELD_DATA); 

        if (fields.NumElements > 0) 
        { 
         System.Console.WriteLine("FIELD\t\tVALUE"); 
         System.Console.WriteLine("-----\t\t-----"); 
         int numElements = fields.NumElements; 

         for (int j = 0; j < numElements; ++j) 
         { 
          Element field = fields.GetElement(j); 
          System.Console.WriteLine(field.Name + "\t\t" + 
           field.GetValueAsString()); 
         } 
        } 
        else System.Console.WriteLine("No fields"); 


       } 

      } 
     } 

    } 
} 

ответ

1

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

Если подать одну заявку на XS0975256685 только с YAS_BOND_PX переопределения установлен в 116, вы должны получить желаемый результат (я получил 101.8739 минуту назад, что соответствует результату Excel в то же время).

Также обратите внимание, что возвращаемое значение изменяется на рынке, поэтому при каждом запуске вы можете получать разные значения: обновите таблицу Excel одновременно, если вы хотите проверить соответствие данных.

+0

спасибо, я знаю, что это меняется, но разница огромна при 20bp + для почти синхронного запуска. – user152112

+0

@ user152112 да, потому что переопределение 116 заменяется вторым переопределением 88. Как объяснялось выше, запустите запрос только для первого инструмента, и вы получите ожидаемый результат. – assylias

+0

спасибо, так как я не разработчик C# и не прикрываю его, на самом деле, если это возможно, нам нужно, если это возможно, добавить код. – user152112