From 6333927ddfe5e9fe6d869fddf0545d32008ec0d3 Mon Sep 17 00:00:00 2001 From: CharlesCara Date: Thu, 14 May 2015 18:04:00 +0100 Subject: [PATCH 1/8] Update Connection.java Added handling for the BEQS function ie the Bloomberg Equity Screening --- .../org/findata/blpwrapper/Connection.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/java/src/org/findata/blpwrapper/Connection.java b/java/src/org/findata/blpwrapper/Connection.java index 03d56d3..f9c62eb 100644 --- a/java/src/org/findata/blpwrapper/Connection.java +++ b/java/src/org/findata/blpwrapper/Connection.java @@ -31,6 +31,7 @@ public class Connection { private String histdata_request_name = "HistoricalDataRequest"; private String intraday_tick_request_name = "IntradayTickRequest"; private String intraday_bar_request_name = "IntradayBarRequest"; + private String beqs_request_name = "BeqsRequest"; private String apifields_service_name = "//blp/apiflds"; private boolean apifields_service_open = false; @@ -47,7 +48,8 @@ public class Connection { public static final int FIELD_INFO_RESULT = 4; public static final int INTRADAY_TICK_RESULT = 5; public static final int INTRADAY_BAR_RESULT = 6; - + public static final int BEQS_RESULT = 7; + public static final int MB = 1048576; public static final String DATETIME_OPTION_NAMES[] = { @@ -165,6 +167,7 @@ public CorrelationID nextCorrelationID(int result_type, String[] securities, Str case FIELD_INFO_RESULT: result = new FieldInfoResult(securities); break; case INTRADAY_TICK_RESULT: result = new IntradayTickDataResult(securities, fields); break; case INTRADAY_BAR_RESULT: result = new IntradayBarDataResult(securities, fields); break; + case BEQS_RESULT: result = new BeqsDataResult(securities, fields); break; default: throw new WrapperException("unknown result_type " + result_type); } if (response_cache.add(result)) { @@ -394,6 +397,7 @@ private void processResponseEvent(int result_type, Event event) throws WrapperEx case FIELD_INFO_RESULT: result = (FieldInfoResult)response_cache.get(response_id); break; case INTRADAY_TICK_RESULT: result = (IntradayTickDataResult)response_cache.get(response_id); break; case INTRADAY_BAR_RESULT: result = (IntradayBarDataResult)response_cache.get(response_id); break; + case BEQS_RESULT: result = (BeqsDataResult)response_cache.get(response_id); break; default: throw new WrapperException("unknown result_type " + result_type); } @@ -584,6 +588,28 @@ public DataResult bls(String security, String field, String[] override_fields, S return(data_result); } +/** Might have to overload this function to get it to work + * Have modelled it on bls but might need to use bps or bph instead. + * / + */ + + public DataResult beqs(String security, String field, String[] override_fields, String[] override_values, String[] option_names, String[] option_values) throws Exception { + String[] securities = new String[1]; + securities[0] = security; + + String[] fields = new String[1]; + fields[0] = field; + + int response_id = (int)sendRefDataRequest(BEQS_RESULT, refdata_request_name, securities, fields, override_fields, override_values, option_names, option_values).value(); + processEventLoop(BEQS_RESULT); + DataResult data_result = (DataResult)response_cache.get(response_id); + if (!cache_responses) { + response_cache.set(response_id, null); + } + return(data_result); + } + + public DataResult tick(String security, String[] event_types, String start_date_time, String end_date_time) throws Exception { String[] option_names = new String[0]; String[] option_values = new String[0]; From 0669588e7462af217690bb34077fe748195e5ca1 Mon Sep 17 00:00:00 2001 From: Charles Cara Date: Fri, 15 May 2015 10:43:30 +0100 Subject: [PATCH 2/8] Added the Bloomberg BEQS request type --- .gitignore | 2 + .../findata/blpwrapper/BeqsDataResult.java | 96 +++++++++++++++++++ .../org/findata/blpwrapper/Connection.java | 71 +++++++++++--- java/test/BeqsDataResultTest.java | 35 +++++++ rbloomberg/R/blp.R | 16 ++++ 5 files changed, 208 insertions(+), 12 deletions(-) create mode 100644 java/src/org/findata/blpwrapper/BeqsDataResult.java create mode 100644 java/test/BeqsDataResultTest.java diff --git a/.gitignore b/.gitignore index 9d609f4..e308df9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ script/upload* *.jar build R/bin +.Rproj.user +blpwrapper.Rproj diff --git a/java/src/org/findata/blpwrapper/BeqsDataResult.java b/java/src/org/findata/blpwrapper/BeqsDataResult.java new file mode 100644 index 0000000..ccf87d5 --- /dev/null +++ b/java/src/org/findata/blpwrapper/BeqsDataResult.java @@ -0,0 +1,96 @@ +package org.findata.blpwrapper; + +import com.bloomberglp.blpapi.*; + +import java.util.logging.Logger; + +public class BeqsDataResult extends DataResult { + private String[] fields; + private String[] securities; + private String[] data_types; + private String[][] result_data; + + public BeqsDataResult(String[] argSecurities, String[] argFields) { + securities = argSecurities; + fields = argFields; + + data_types = new String[fields.length]; + // Because we may get data type info out of order, need to + // initialize array at start with a default value. + for (int i = 0; i < fields.length; i++) { + // Call this "NOT_APPLICABLE" since "NA" causes problems in R. + data_types[i] = "NOT_APPLICABLE"; + } + result_data = new String[securities.length][fields.length]; + } + + public String[][] getData() { + return(result_data); + } + + public String[] getColumnNames() { + return(fields); + } + + public String[] getRowNames() { + return(securities); + } + + public String[] getDataTypes() { + return(data_types); + } + + public void processResponse(Element response, Logger logger, boolean throwInvalidTickerError) throws WrapperException { + Element securityDataArray = response.getElement("securityData"); + int numItems = securityDataArray.numValues(); + + for (int i = 0; i < numItems; i++) { + Element securityData = securityDataArray.getValueAsElement(i); + Element fieldData = securityData.getElement("fieldData"); + int seq = securityData.getElementAsInt32("sequenceNumber"); + + processSecurityError(securityData, logger, throwInvalidTickerError); + processFieldExceptions(securityData, logger); + + int field_data_counter = 0; + for (int j = 0; j < fields.length; j++) { + String field_name = fields[j]; + + if (field_data_counter < fieldData.numElements()) { + logger.finest("i = " + i + "\n" + "seq = " + seq + "\n" + "j = " + j + "\n" + "field_data_counter = " + field_data_counter); + Element field = fieldData.getElement(field_data_counter); + if (field.name().toString().equals(field_name)) { + // Raise an error if we're trying to read SEQUENCE data. + // Store the data type for later (if it hasn't already been stored). + if (data_types[j].equals("NOT_APPLICABLE")) { + if (field.datatype().intValue() == Schema.Datatype.Constants.SEQUENCE) { + throw new WrapperException("reference data request cannot handle SEQUENCE data in field " + field.name().toString()); + } + String data_type = field.datatype().toString(); + if (!data_type.equals("NA")) { + logger.finest("Setting field data type to " + data_type); + data_types[j] = data_type; + } + } else { + logger.finest("Field data type is " + data_types[j]); + } + + String value = field.getValueAsString(); + + logger.finest("Setting field value to " + value); + field_data_counter++; + + if (value.equals("-2.4245362661989844E-14")) { + logger.info("Numeric of -2.4245362661989844E-14 encountered. Not a real value. Will be left NULL."); + } else { + result_data[seq][j] = value; + } + } else { + logger.finest("Skipping field."); + } + } + + } + } + } +} diff --git a/java/src/org/findata/blpwrapper/Connection.java b/java/src/org/findata/blpwrapper/Connection.java index f9c62eb..e2c75f2 100644 --- a/java/src/org/findata/blpwrapper/Connection.java +++ b/java/src/org/findata/blpwrapper/Connection.java @@ -165,9 +165,9 @@ public CorrelationID nextCorrelationID(int result_type, String[] securities, Str case BULK_DATA_RESULT: result = new BulkDataResult(securities, fields); break; case HISTORICAL_DATA_RESULT: result = new HistoricalDataResult(securities, fields); break; case FIELD_INFO_RESULT: result = new FieldInfoResult(securities); break; - case INTRADAY_TICK_RESULT: result = new IntradayTickDataResult(securities, fields); break; - case INTRADAY_BAR_RESULT: result = new IntradayBarDataResult(securities, fields); break; - case BEQS_RESULT: result = new BeqsDataResult(securities, fields); break; + case INTRADAY_TICK_RESULT: result = new IntradayTickDataResult(securities, fields); break; + case INTRADAY_BAR_RESULT: result = new IntradayBarDataResult(securities, fields); break; + case BEQS_RESULT: result = new BeqsDataResult(securities, fields); break; default: throw new WrapperException("unknown result_type " + result_type); } if (response_cache.add(result)) { @@ -303,6 +303,30 @@ private CorrelationID sendRefDataRequest(int result_type, String request_name, S } } + private CorrelationID sendBeqsDataRequest(int result_type, String request_name, String screenName, String screenType, String languageId, String Group, String AsOfDate) throws Exception { + Service service = getRefDataService(); + Request request = service.createRequest(request_name); + + request.Set("screenName", screenName); + + request.Set("screenType", screenType); + + if( !languageId.equals("") ){ + request.Set("languageId", languageId); + } + + if( !Group.equals("") ){ + request.Set("Group", Group); + } + + if ( !StringAsOfDate.equals("") ) { + Element override_values_element = request.getElement("overrides"); + Element override = override_values_element.appendElement(); + override.setElement("fieldId", "PiTDate"); + override.setElement("value", AsOfDate); + logger.fine("override PiTDate set to " + AsOfDate); + } + CorrelationID correlation_id = nextCorrelationID(result_type, securities, fields); if (identity == null) { session.sendRequest(request, correlation_id); @@ -397,7 +421,7 @@ private void processResponseEvent(int result_type, Event event) throws WrapperEx case FIELD_INFO_RESULT: result = (FieldInfoResult)response_cache.get(response_id); break; case INTRADAY_TICK_RESULT: result = (IntradayTickDataResult)response_cache.get(response_id); break; case INTRADAY_BAR_RESULT: result = (IntradayBarDataResult)response_cache.get(response_id); break; - case BEQS_RESULT: result = (BeqsDataResult)response_cache.get(response_id); break; + case BEQS_RESULT: result = (BeqsDataResult)response_cache.get(response_id); break; default: throw new WrapperException("unknown result_type " + result_type); } @@ -588,19 +612,41 @@ public DataResult bls(String security, String field, String[] override_fields, S return(data_result); } -/** Might have to overload this function to get it to work - * Have modelled it on bls but might need to use bps or bph instead. +/** + * Might have to overload this function to get it to work + * Have modelled it on blp. * / */ - public DataResult beqs(String security, String field, String[] override_fields, String[] override_values, String[] option_names, String[] option_values) throws Exception { - String[] securities = new String[1]; - securities[0] = security; + public DataResult beqs(String screenName) throws Exception { + String screenType = "PRIVATE"; + String languageId = "ENGLISH"; + String Group = ""; + String AsOfDate = ""; + return(beqs(screenName, screenType, languageId, Group, override_fields, AsOfDate)); + } - String[] fields = new String[1]; - fields[0] = field; + public DataResult beqs(String screenName, String AsOfDate) throws Exception { + String screenType = "PRIVATE"; + String languageId = "ENGLISH"; + String Group = ""; + return(beqs(screenName, screenType, languageId, Group, AsOfDate)); + } - int response_id = (int)sendRefDataRequest(BEQS_RESULT, refdata_request_name, securities, fields, override_fields, override_values, option_names, option_values).value(); + public DataResult beqs(String screenName, String Group, String AsOfDate) throws Exception { + String screenType = "PRIVATE"; + String languageId = "ENGLISH"; + return(beqs(screenName, screenType, languageId, Group, AsOfDate)); + } + + public DataResult beqs(String screenName, String screenType, String languageId, String Group) throws Exception { + String AsOfDate = ""; + return(beqs(screenName, screenType, languageId, Group, AsOfDate)); + } + + + public DataResult beqs(String screenName, String screenType, String languageId, String Group, String AsOfDate) throws Exception { + int response_id = (int)sendBeqsDataRequest(BEQS_RESULT, beqs_request_name, screenName, screenType, languageId, Group, AsOfDate).value(); processEventLoop(BEQS_RESULT); DataResult data_result = (DataResult)response_cache.get(response_id); if (!cache_responses) { @@ -610,6 +656,7 @@ public DataResult beqs(String security, String field, String[] override_fields, } + public DataResult tick(String security, String[] event_types, String start_date_time, String end_date_time) throws Exception { String[] option_names = new String[0]; String[] option_values = new String[0]; diff --git a/java/test/BeqsDataResultTest.java b/java/test/BeqsDataResultTest.java new file mode 100644 index 0000000..3797fef --- /dev/null +++ b/java/test/BeqsDataResultTest.java @@ -0,0 +1,35 @@ +import junit.framework.*; +import java.util.regex.*; +import org.findata.blpwrapper.*; + +public class ReferenceDataResultTest extends TestCase { + private Connection conn; + + public void setUp() throws Exception{ + conn = new Connection(); + } + + public void tearDown() throws Exception{ + conn.close(); + } + + + + public void testValidRequest() throws Exception { + String screenName = "Quality Screen"; + String screenType = "GLOBAL"; + BeqsDataResult result = (BeqsDataResult)conn.beqs(screenName, screenType); + + } + + public void testValidRequestWithAsOfDate() throws Exception { + String screenName = {"Quality Screen"}; + String screenType = {"GLOBAL"}; + StringAsOfDate = "20100201"; + + BeqsDataResult result = (BeqsDataResult)conn.beqs(screenName, screenType, AsOfDate); + + } + + +} diff --git a/rbloomberg/R/blp.R b/rbloomberg/R/blp.R index 8a72e46..acbe945 100644 --- a/rbloomberg/R/blp.R +++ b/rbloomberg/R/blp.R @@ -235,6 +235,22 @@ tick <- function(conn, security, fields, start_date_time, end_date_time, return(process.result(result)) } + +### @export "beqs-definition" +beqs <- function(conn, screenName, screenType="PRIVATE", languageId="ENGLISH", Group = "", asOfDate=NULL) +### @end +{ + if(is.null(AsOfDate)){ + result <- conn$beqs(screenName, screenType, languageId, Group) + } else { + dAsOfDate = format(asOfDate, format="%Y%m%d") + result <- conn$beqs(screenName, screenType, languageId, Group, dAsOfDate) + } + + return(process.result(result)) +} + + process.result <- function(result, row.name.source = "none") { matrix.data <- .jevalArray(result$getData(), simplify = TRUE) if (is.null(matrix.data)) return(NULL) From 094fed50c21912f5e731d6244ac8f604c5a056b3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 May 2015 13:29:49 +0100 Subject: [PATCH 3/8] Minor edits --- java/src/org/findata/blpwrapper/Connection.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/src/org/findata/blpwrapper/Connection.java b/java/src/org/findata/blpwrapper/Connection.java index e2c75f2..20cea52 100644 --- a/java/src/org/findata/blpwrapper/Connection.java +++ b/java/src/org/findata/blpwrapper/Connection.java @@ -302,6 +302,9 @@ private CorrelationID sendRefDataRequest(int result_type, String request_name, S request.set(n, option_values[i]); } } + return(correlation_id); + } + private CorrelationID sendBeqsDataRequest(int result_type, String request_name, String screenName, String screenType, String languageId, String Group, String AsOfDate) throws Exception { Service service = getRefDataService(); From 416fe23f0389080d3d313c59a6ee55607e51b306 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 May 2015 18:28:00 +0100 Subject: [PATCH 4/8] Some more bug fixes --- java/src/org/findata/blpwrapper/Connection.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/java/src/org/findata/blpwrapper/Connection.java b/java/src/org/findata/blpwrapper/Connection.java index 20cea52..4e96b26 100644 --- a/java/src/org/findata/blpwrapper/Connection.java +++ b/java/src/org/findata/blpwrapper/Connection.java @@ -302,6 +302,13 @@ private CorrelationID sendRefDataRequest(int result_type, String request_name, S request.set(n, option_values[i]); } } + + CorrelationID correlation_id = nextCorrelationID(result_type, securities, fields); + if (identity == null) { + session.sendRequest(request, correlation_id); + } else { + session.sendRequest(request, identity, correlation_id); + } return(correlation_id); } @@ -310,19 +317,19 @@ private CorrelationID sendBeqsDataRequest(int result_type, String request_name, Service service = getRefDataService(); Request request = service.createRequest(request_name); - request.Set("screenName", screenName); + request.set("screenName", screenName); - request.Set("screenType", screenType); + request.set("screenType", screenType); if( !languageId.equals("") ){ request.Set("languageId", languageId); } if( !Group.equals("") ){ - request.Set("Group", Group); + request.set("Group", Group); } - if ( !StringAsOfDate.equals("") ) { + if ( !AsOfDate.equals("") ) { Element override_values_element = request.getElement("overrides"); Element override = override_values_element.appendElement(); override.setElement("fieldId", "PiTDate"); @@ -626,7 +633,7 @@ public DataResult beqs(String screenName) throws Exception { String languageId = "ENGLISH"; String Group = ""; String AsOfDate = ""; - return(beqs(screenName, screenType, languageId, Group, override_fields, AsOfDate)); + return(beqs(screenName, screenType, languageId, Group, AsOfDate)); } public DataResult beqs(String screenName, String AsOfDate) throws Exception { From 0daac6abbdf3b766bb4af7651280f296e5341a15 Mon Sep 17 00:00:00 2001 From: CharlesCara Date: Thu, 21 May 2015 10:32:05 +0100 Subject: [PATCH 5/8] Added dummy fields variable --- java/src/org/findata/blpwrapper/Connection.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/src/org/findata/blpwrapper/Connection.java b/java/src/org/findata/blpwrapper/Connection.java index 4e96b26..5f703b9 100644 --- a/java/src/org/findata/blpwrapper/Connection.java +++ b/java/src/org/findata/blpwrapper/Connection.java @@ -336,6 +336,11 @@ private CorrelationID sendBeqsDataRequest(int result_type, String request_name, override.setElement("value", AsOfDate); logger.fine("override PiTDate set to " + AsOfDate); } + + // BEQSRequest does not have the fields element (table columns) as they are defined using the BEQS + // function on the terminal when defining a screen. But create a dummy one as nextCorrelationID expects it + + String[] fields = new String[0]; CorrelationID correlation_id = nextCorrelationID(result_type, securities, fields); if (identity == null) { From fcfcc18fe7d9300d915db6ec0b6c4abe1bec8891 Mon Sep 17 00:00:00 2001 From: CharlesCara Date: Thu, 21 May 2015 11:30:40 +0100 Subject: [PATCH 6/8] Update BeqsDataResult.java We do not know the size of BEQS responses until after we receive them, so removed the pre-initialisation of the results array. Now sized when we process the response. --- .../findata/blpwrapper/BeqsDataResult.java | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/java/src/org/findata/blpwrapper/BeqsDataResult.java b/java/src/org/findata/blpwrapper/BeqsDataResult.java index ccf87d5..4c75ce3 100644 --- a/java/src/org/findata/blpwrapper/BeqsDataResult.java +++ b/java/src/org/findata/blpwrapper/BeqsDataResult.java @@ -11,17 +11,9 @@ public class BeqsDataResult extends DataResult { private String[][] result_data; public BeqsDataResult(String[] argSecurities, String[] argFields) { - securities = argSecurities; - fields = argFields; - - data_types = new String[fields.length]; - // Because we may get data type info out of order, need to - // initialize array at start with a default value. - for (int i = 0; i < fields.length; i++) { - // Call this "NOT_APPLICABLE" since "NA" causes problems in R. - data_types[i] = "NOT_APPLICABLE"; - } - result_data = new String[securities.length][fields.length]; + // With BEQS we do not know the size of the result data until + // we process response, so we cannot pre initialise the output + } public String[][] getData() { @@ -43,7 +35,34 @@ public String[] getDataTypes() { public void processResponse(Element response, Logger logger, boolean throwInvalidTickerError) throws WrapperException { Element securityDataArray = response.getElement("securityData"); int numItems = securityDataArray.numValues(); + if (numItems == 0 ){ + logger.info("No securities in response"); + securities = new String[0]; + fields = new String[0]; + data_types = new String[0]; + result_data = new String[0][0]; + return(); + } + + securities = new String[numItems]; + + // Use the number of fields in the first security to size the results_data array + Element secData = securityDataArray.getValueAsElement(0); + Element fldData = secData.getElement("fieldData"); + int numCols = fldData.numValues(); + fields = new String[numCols]; + data_types = new String[fields.length]; + // Because we may get data type info out of order, need to + // initialize array at start with a default value. + for (int i = 0; i < fields.length; i++) { + // Call this "NOT_APPLICABLE" since "NA" causes problems in R. + data_types[i] = "NOT_APPLICABLE"; + } + + result_data = new String[securities.length][fields.length]; + + for (int i = 0; i < numItems; i++) { Element securityData = securityDataArray.getValueAsElement(i); Element fieldData = securityData.getElement("fieldData"); From bc3be5470dc2242c897a3f226ab689667bfb0512 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 21 May 2015 12:19:30 +0100 Subject: [PATCH 7/8] Corrected compile errors --- java/src/org/findata/blpwrapper/BeqsDataResult.java | 2 +- java/src/org/findata/blpwrapper/Connection.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/java/src/org/findata/blpwrapper/BeqsDataResult.java b/java/src/org/findata/blpwrapper/BeqsDataResult.java index 4c75ce3..70b6f87 100644 --- a/java/src/org/findata/blpwrapper/BeqsDataResult.java +++ b/java/src/org/findata/blpwrapper/BeqsDataResult.java @@ -41,7 +41,7 @@ public void processResponse(Element response, Logger logger, boolean throwInvali fields = new String[0]; data_types = new String[0]; result_data = new String[0][0]; - return(); + return; } securities = new String[numItems]; diff --git a/java/src/org/findata/blpwrapper/Connection.java b/java/src/org/findata/blpwrapper/Connection.java index 5f703b9..e1bf089 100644 --- a/java/src/org/findata/blpwrapper/Connection.java +++ b/java/src/org/findata/blpwrapper/Connection.java @@ -322,7 +322,7 @@ private CorrelationID sendBeqsDataRequest(int result_type, String request_name, request.set("screenType", screenType); if( !languageId.equals("") ){ - request.Set("languageId", languageId); + request.set("languageId", languageId); } if( !Group.equals("") ){ @@ -337,9 +337,11 @@ private CorrelationID sendBeqsDataRequest(int result_type, String request_name, logger.fine("override PiTDate set to " + AsOfDate); } - // BEQSRequest does not have the fields element (table columns) as they are defined using the BEQS - // function on the terminal when defining a screen. But create a dummy one as nextCorrelationID expects it + // BEQSRequest does not have the securities or fields elements as they are defined using the BEQS + // function on the terminal when defining a screen. But create dummy ones as nextCorrelationID expects it + + String[] securities = new String[0]; String[] fields = new String[0]; CorrelationID correlation_id = nextCorrelationID(result_type, securities, fields); From 4204885a328b4295da0bd303f878bd58b3d6194c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 21 May 2015 18:16:28 +0100 Subject: [PATCH 8/8] Running version of the beqs function, and added documentation. --- .../findata/blpwrapper/BeqsDataResult.java | 32 +++++++++++------ .../org/findata/blpwrapper/Connection.java | 2 +- rbloomberg/DESCRIPTION | 4 +-- rbloomberg/R/blp.R | 2 +- rbloomberg/man/beqs.Rd | 36 +++++++++++++++++++ 5 files changed, 62 insertions(+), 14 deletions(-) create mode 100644 rbloomberg/man/beqs.Rd diff --git a/java/src/org/findata/blpwrapper/BeqsDataResult.java b/java/src/org/findata/blpwrapper/BeqsDataResult.java index 70b6f87..f9531ea 100644 --- a/java/src/org/findata/blpwrapper/BeqsDataResult.java +++ b/java/src/org/findata/blpwrapper/BeqsDataResult.java @@ -10,7 +10,7 @@ public class BeqsDataResult extends DataResult { private String[] data_types; private String[][] result_data; - public BeqsDataResult(String[] argSecurities, String[] argFields) { + public BeqsDataResult() { // With BEQS we do not know the size of the result data until // we process response, so we cannot pre initialise the output @@ -33,8 +33,13 @@ public String[] getDataTypes() { } public void processResponse(Element response, Logger logger, boolean throwInvalidTickerError) throws WrapperException { - Element securityDataArray = response.getElement("securityData"); + logger.finest("BeqsDataResult: Processing response"); + + Element dataElement = response.getElement("data"); + Element securityDataArray = dataElement.getElement("securityData"); + int numItems = securityDataArray.numValues(); + logger.finest("BeqsDataResult: Number of securities is " + numItems); if (numItems == 0 ){ logger.info("No securities in response"); securities = new String[0]; @@ -47,26 +52,31 @@ public void processResponse(Element response, Logger logger, boolean throwInvali securities = new String[numItems]; // Use the number of fields in the first security to size the results_data array - Element secData = securityDataArray.getValueAsElement(0); - Element fldData = secData.getElement("fieldData"); - int numCols = fldData.numValues(); + Element fldData = dataElement.getElement("fieldDisplayUnits"); + int numCols = fldData.numElements(); fields = new String[numCols]; data_types = new String[fields.length]; // Because we may get data type info out of order, need to // initialize array at start with a default value. + // get the names of each field/column from fieldDisplayUnits + for (int i = 0; i < fields.length; i++) { // Call this "NOT_APPLICABLE" since "NA" causes problems in R. data_types[i] = "NOT_APPLICABLE"; + fields[i] = fldData.getElement(i).name().toString(); } + logger.finest("BeqsDataResult: Number of fields is " + fields.length); + result_data = new String[securities.length][fields.length]; for (int i = 0; i < numItems; i++) { - Element securityData = securityDataArray.getValueAsElement(i); +logger.finest("***"); +Element securityData = securityDataArray.getValueAsElement(i); Element fieldData = securityData.getElement("fieldData"); - int seq = securityData.getElementAsInt32("sequenceNumber"); + String sec = securityData.getElementAsString("security"); processSecurityError(securityData, logger, throwInvalidTickerError); processFieldExceptions(securityData, logger); @@ -76,8 +86,9 @@ public void processResponse(Element response, Logger logger, boolean throwInvali String field_name = fields[j]; if (field_data_counter < fieldData.numElements()) { - logger.finest("i = " + i + "\n" + "seq = " + seq + "\n" + "j = " + j + "\n" + "field_data_counter = " + field_data_counter); + logger.finest("i = " + i + "\n" + " security = " + sec + "\n" + " j = " + j + "\n" + " field_data_counter = " + field_data_counter); Element field = fieldData.getElement(field_data_counter); + if (field.name().toString().equals(field_name)) { // Raise an error if we're trying to read SEQUENCE data. // Store the data type for later (if it hasn't already been stored). @@ -98,14 +109,15 @@ public void processResponse(Element response, Logger logger, boolean throwInvali logger.finest("Setting field value to " + value); field_data_counter++; + logger.finest("field_data_counter = " + field_data_counter); if (value.equals("-2.4245362661989844E-14")) { logger.info("Numeric of -2.4245362661989844E-14 encountered. Not a real value. Will be left NULL."); } else { - result_data[seq][j] = value; + result_data[i][j] = value; } } else { - logger.finest("Skipping field."); + logger.finest("Skipping field as does not match."); } } diff --git a/java/src/org/findata/blpwrapper/Connection.java b/java/src/org/findata/blpwrapper/Connection.java index e1bf089..8830b36 100644 --- a/java/src/org/findata/blpwrapper/Connection.java +++ b/java/src/org/findata/blpwrapper/Connection.java @@ -167,7 +167,7 @@ public CorrelationID nextCorrelationID(int result_type, String[] securities, Str case FIELD_INFO_RESULT: result = new FieldInfoResult(securities); break; case INTRADAY_TICK_RESULT: result = new IntradayTickDataResult(securities, fields); break; case INTRADAY_BAR_RESULT: result = new IntradayBarDataResult(securities, fields); break; - case BEQS_RESULT: result = new BeqsDataResult(securities, fields); break; + case BEQS_RESULT: result = new BeqsDataResult(); break; default: throw new WrapperException("unknown result_type " + result_type); } if (response_cache.add(result)) { diff --git a/rbloomberg/DESCRIPTION b/rbloomberg/DESCRIPTION index 7d358f3..2ffbf06 100644 --- a/rbloomberg/DESCRIPTION +++ b/rbloomberg/DESCRIPTION @@ -1,6 +1,6 @@ Package: Rbbg -Version: 0.5.3 -Date: 2014-09-03 +Version: 0.6.1 +Date: 2015-10-21 Title: R/bbg Author: Robert Sams , Ana Nelson Maintainer: John Laing diff --git a/rbloomberg/R/blp.R b/rbloomberg/R/blp.R index acbe945..1cb88f4 100644 --- a/rbloomberg/R/blp.R +++ b/rbloomberg/R/blp.R @@ -240,7 +240,7 @@ tick <- function(conn, security, fields, start_date_time, end_date_time, beqs <- function(conn, screenName, screenType="PRIVATE", languageId="ENGLISH", Group = "", asOfDate=NULL) ### @end { - if(is.null(AsOfDate)){ + if(is.null(asOfDate)){ result <- conn$beqs(screenName, screenType, languageId, Group) } else { dAsOfDate = format(asOfDate, format="%Y%m%d") diff --git a/rbloomberg/man/beqs.Rd b/rbloomberg/man/beqs.Rd new file mode 100644 index 0000000..c35e8e4 --- /dev/null +++ b/rbloomberg/man/beqs.Rd @@ -0,0 +1,36 @@ +\name{beqs} +\alias{beqs} +\title{Get Bloomberg Equity Screen Data} +\description{ + This is the primary user-level function for retrieving Bloomberg Equity Screen data created using the EQS function in Bloomberg. +} +\usage{ +blp(conn, securities, fields, start_date, end_date = NULL, override_fields = NULL, overrides NULL) +} +\arguments{ + \item{conn}{Connection object} + \item{screenName}{The name of the Equity Screen listed on EQS.} + \item{screenType}{string with the location of the screen either PRIVATE for user defined screen or GLOBAL for a Bloomberg EQS screen.} + \item{languageId}{string with the language eg ENGLISH, KANJI, FRENCH, GERMAN, SPANISH, PORTUGUESE, ITALIAN, CHINESE_TRA, KOREAN, CHINESE_SIM, THAI, SWED, FINNISH, DUTCH, MALAY, RUSSIAN, GREEK, POLISH, DANISH, FLEMISH, ESTONIAN, TURKISH, NORWEGIAN, LATVIAN, LITHUANIAN, INDONESIAN } + \item{Group}{Screen folder name as defined in EQS.} + \item{asOfDate}{As Of date for data retrieved, either as a YYYYMMDD format string or a date object of any class which responds correctly to format().} +} +\details{ +an equivalent to the beqs() function in Bloomberg Excel. Returns as a dataframe with the contents of an Equity Screen set up using the EQS page on Bloomberg. The data can be as of a date. +} +\keyword{math} +\examples{ +# Please consult unit tests for more examples. +\dontrun{ +library(RBloomberg) +conn <- blpConnect() + +beqs(conn, "Global Volume Surges", "GLOBAL") + + +blpDisconnect(conn) + +} +} +\author{Charles Cara \email{charles.cara@absolute-strategy.com}} +