class Bberg::Requests::HistoricalDataRequest

A class for preforming historical data requets.

Constants

DEFAULT_OPTIONS

Public Class Methods

new(session_options, identifiers, start_time, end_time, options_arg = {}) click to toggle source

Create new instance. @param [Bberg::Native::SessionOptions] session_options to specify how to connect session. @param [#each|String] identifiers a list of identifiers for this request @param [Time] start_time start of historical range @param [Time] end_time end of historical range @param [Hash] options_arg specification of what fields or other parameters to use for the request.

# File lib/bberg/requests/historical_data_request.rb, line 21
def initialize(session_options, identifiers, start_time, end_time, options_arg = {})
  @session_options = session_options
  
  @identifiers = unless identifiers.respond_to? 'each'
    [identifiers]
  else
    identifiers
  end
  
  @start_time = start_time
  @end_time = end_time
  
  @options = DEFAULT_OPTIONS.merge(options_arg)
end

Public Instance Methods

create_request() click to toggle source

Create a historical data request.

# File lib/bberg/requests/historical_data_request.rb, line 37
def create_request
  request = @svc.createRequest("HistoricalDataRequest")
  request.set("startDate", @start_time.strftime("%Y%m%d"))
  request.set("endDate", @end_time.strftime("%Y%m%d"))
  request.set("periodicitySelection", @options[:frequency])
  request.set("returnEids", false)
  @identifiers.each {|identifier| request.append("securities", identifier) }
  @options[:fields].each {|f| request.append("fields", f) }
  @request = request
end
parse_response(event) click to toggle source

Parse event for HistoricalDataResponse. @return [Hash] event parsed into a Hash format.

# File lib/bberg/requests/historical_data_request.rb, line 50
def parse_response(event)
  iter = event.messageIterator()
  result = Hash.new
  
  while iter.hasNext()
    
    message = iter.next()
    raise Bberg::BbergException.new("Got a response with incorrect correlation id!") if message.correlationID != @req_id
    msg_type = message.messageType().toString()
    raise Bberg::BbergException.new("Expected message of type HistoricalDataResponse but got #{msg_type}") if msg_type != "HistoricalDataResponse"
    
    field_data = message.getElement("securityData").getElement("fieldData")
    security_name = message.getElement("securityData").getElementAsString("security")
    
    result[security_name] ||= []
    
    (0..(field_data.numValues - 1)).each do |field_num|
      field_values = get_field_values(field_data, field_num)
      result[security_name] << field_values
    end
  end
  result  
end

Private Instance Methods

get_field_values(field_data, field_num) click to toggle source

PRIVATE ############################

# File lib/bberg/requests/historical_data_request.rb, line 78
def get_field_values(field_data, field_num)
  element = field_data.getValueAsElement(field_num)
  timestamp = convert_to_rb_time(element.getElementAsDatetime("date"))
  values = Hash.new
  values["date"] = timestamp
  
  @options[:fields].each do |field|
    raise Bberg::BbergException.new("Can't find required field #{field} in response") unless element.hasElement(field)
    field_element = element.getElement(field)
    
    data_type = element.getElement(field).datatype()
    
    values[field] = case data_type.intValue()
    when Bberg::Native::Schema::Datatype::Constants::INT32
      element.getElementAsInt32(field).to_i
    when Bberg::Native::Schema::Datatype::Constants::INT64
      element.getElementAsInt64(field).to_i
    when Bberg::Native::Schema::Datatype::Constants::FLOAT32
      element.getElementAsFloat32(field).to_f
    when  Bberg::Native::Schema::Datatype::Constants::FLOAT64
      element.getElementAsFloat64(field).to_f
    else
      raise Bberg::BbergException.new("Unsupported data type in response: #{data_type.to_s}")
    end
  end
  values
end