Bloomberg web service call for single field and single instrument taking more than 1 min

最后都变了- 提交于 2020-03-06 02:33:47

问题


I am making a Bloomberg web service GetData call for the "DEBT_TO_EQUITY_FUNDAMENTALS_TKR" field. I am setting secmaster = true and asking for a single instrument with a CUSIP identifier (with yellowkey = MarketSector.Corp).

This strikes me as a fairly lightweight call having seen people asking for thousands of instruments and dozens of fields at once.

I have played around with setting lots of different settings but I just can't get this request to return in a few seconds. It gives me the correct return value but it takes longer than 60 seconds.

Any idea if it is possible to get such a request to execute and return in a few seconds?

Thanks

EDIT - Here is the code I am running:

public string GetFundamentalTicker(string identifier, InstrumentType identifierType = InstrumentType.CUSIP)
        {
            PerSecurityWS ps = new PerSecurityWS();
            try
            {


                log.DebugFormat("Cert path is: {0}", CertPath);                
                X509Certificate2 clientCert = new X509Certificate2(CertPath, "<password_redacted>");

                ps.ClientCertificates.Add(clientCert);
            }
            catch (Exception e)
            {
                log.ErrorFormat("Error in cert setup - {0} - {1}", e.Message, e.InnerException == null ? "" : e.InnerException.Message);
                return null;
            }
            //Set request header
            GetDataHeaders getDataHeaders = new GetDataHeaders();
            getDataHeaders.secmaster = true;
            getDataHeaders.secmasterSpecified = true;
            //getDataHeaders.fundamentals = true;
            //getDataHeaders.fundamentalsSpecified = true;
            //getDataHeaders.programflag = ProgramFlag.oneshot;//unnecessary - defaults to this anyway
            //getDataHeaders.programflagSpecified = true;
            //getDataHeaders.pricing = true;
            getDataHeaders.secid = identifierType;
            getDataHeaders.secidSpecified = true;                    

            SubmitGetDataRequest sbmtGtDtreq = new SubmitGetDataRequest();
            sbmtGtDtreq.headers = getDataHeaders;

            sbmtGtDtreq.fields = new string[] { 
                                                "DEBT_TO_EQUITY_FUNDAMENTALS_TKR"                                                
            };

            int currentFundYear = DateTime.Now.Year;

            //var fundYears = new List<int>();



            List<Instrument> fundYearInstruments = new List<Instrument>();

            Instrument fundYearInstrument = null;

            fundYearInstrument = new Instrument();
            fundYearInstrument.id = identifier;
            fundYearInstrument.typeSpecified = true;
            fundYearInstrument.type = identifierType;

            fundYearInstrument.yellowkey = MarketSector.Corp;
            fundYearInstrument.yellowkeySpecified = true;
            //fundYearInstrument.overrides = new Override[] {};//{ new Override() { field = "EQY_FUND_YEAR", value = currentFundYear.ToString() } };
            fundYearInstruments.Add(fundYearInstrument);
            //fundYears.Add(-1);



            Instrument[] instr = fundYearInstruments.ToArray();
            Instruments instrs = new Instruments();
            instrs.instrument = instr;

            sbmtGtDtreq.instruments = instrs;



            try
            {


                SubmitGetDataResponse sbmtGtDtResp = ps.submitGetDataRequest(sbmtGtDtreq);                       


                RetrieveGetDataRequest rtrvGtDrReq = new RetrieveGetDataRequest();
                rtrvGtDrReq.responseId = sbmtGtDtResp.responseId;

                RetrieveGetDataResponse rtrvGtDrResp;

                do
                {
                    System.Threading.Thread.Sleep(POLL_INTERVAL);
                    rtrvGtDrResp = ps.retrieveGetDataResponse(rtrvGtDrReq);
                }
                while (rtrvGtDrResp.statusCode.code == DATA_NOT_AVAILABLE);                       



                if (rtrvGtDrResp.statusCode.code == SUCCESS)
                {

                    for (int i = 0; i < rtrvGtDrResp.instrumentDatas.Length; i++)
                    {

                        for (int j = 0; j < rtrvGtDrResp.instrumentDatas[i].data.Length; j++)
                        {

                            if (rtrvGtDrResp.instrumentDatas[i].data[j].value == "N.A." || rtrvGtDrResp.instrumentDatas[i].data[j].value == "N.S." || rtrvGtDrResp.instrumentDatas[i].data[j].value == "N.D.")
                                rtrvGtDrResp.instrumentDatas[i].data[j].value = null;

                            return rtrvGtDrResp.instrumentDatas[i].data[j].value;

                        }


                    }
                    return null;
                }
                else if (rtrvGtDrResp.statusCode.code == REQUEST_ERROR)
                {
                    log.ErrorFormat("Error in the submitted request: {0}", rtrvGtDrResp.statusCode.description);
                    return null;
                }
            }
            catch (Exception e)
            {
                log.ErrorFormat("Error in GetData - {0} - {1}", e.Message, e.InnerException == null ? "" : e.InnerException.Message);
                return null;
            }

            return null;
        }

Poll interval is 5 seconds and the SOAP web service url is: https://software.bloomberg.com/datalicensewp/dlws.wsdl


回答1:


I am having the same issue. I found out that there is a difference between making the same call to Bloomberg API from, for example, console app (works very fast) and web service (takes a lot of time to start session). And the difference is that console app runs under the same user as bbcomm process, whereas web service (or actually iis process) runs under System account. You can try to log out all users on the PC where web service is hosted and then try to make the call. In this case, I guess, bbcomm goes under System account as no one else is logged in and works fast. It worked for me and the call was answered instantly.



来源:https://stackoverflow.com/questions/31011747/bloomberg-web-service-call-for-single-field-and-single-instrument-taking-more-th

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!