2016-06-14 21 views
1

In "YAS_YLD_SPREAD" für mehrere Wertpapiere abfragt, ich versuche, einen anderen Umgehungswert für die "YAS_BOND_PX" Überschreibung von jedem (per Excel Snapshot) zuweisenImplementierung von Überschreibungen in Bloomberg C# API

enter image description here

Ich mache jedoch etwas falsch beim Zuweisen der Überschreibungen, da die Ausgabe kein einzelnes "YAS_YLD_SPREAD" für jede Sicherheit zurückgibt (es gibt auch fälschlicherweise ein "YAS_YLD_SPREAD 1" zurück) und die zurückgegebenen Werte sind nicht die 100.21, 645.06 Werte, die ich erwarte/

enter image description here

dankbar für Ihre Hilfe,

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


       } 

      } 
     } 

    } 
} 

Antwort

1

Ich habe nicht den Code im Detail lesen, aber ein offensichtliches Problem ist, dass wenn Sie einen anderen überschriebenen Wert für die beiden Wertpapiere verwenden möchten, müssen Sie zwei einreichen separate Anfragen.

Wenn Sie einen Antrag auf XS0975256685 einreichen nur mit der YAS_BOND_PX Überschreibung auf 116, sollten Sie das gewünschte Ergebnis erhalten (Ich habe 101,8739 eine Minute vor dem Spiel Excel Ergebnisses im selben Moment).

Beachten Sie auch, dass der zurückgegebene Wert sich mit dem Markt ändert, sodass Sie bei jedem Lauf unterschiedliche Werte erhalten: Aktualisieren Sie Ihre Excel-Tabelle gleichzeitig, wenn Sie überprüfen möchten, ob die Daten übereinstimmen.

+0

danke, ich weiß, es ändert sich, aber der Unterschied ist enorm bei 20bp + für einen nahezu synchronen Lauf. – user152112

+0

@ user152112 ja, weil die Überschreibung 116 durch die zweite Überschreibung 88 überschrieben wird. Führen Sie wie oben erklärt nur eine Anfrage für das erste Gerät aus und Sie erhalten das erwartete Ergebnis. – assylias

+0

danke, da ich kein C# -Entwickler bin und es winge, muss es wirklich, wenn möglich, hier einen Code gespuckt werden. – user152112