class OandaApiV20::Client

Constants

BASE_URI

Attributes

access_token[RW]
base_uri[R]
connection_pool_size[RW]
debug[RW]
headers[R]
last_api_request_at[RW]
max_requests_per_second[RW]
proxy_url[RW]

Public Class Methods

new(options = {}) click to toggle source
# File lib/oanda_api_v20/client.rb, line 19
def initialize(options = {})
  options.each do |key, value|
    self.send("#{key}=", value) if self.respond_to?("#{key}=")
  end

  @mutex                   = Mutex.new
  @debug                   ||= false
  @connection_pool_size    ||= 2
  @max_requests_per_second ||= 100
  @last_api_request_at     = Array.new(max_requests_per_second)
  uris                     = options[:practice] == true ? BASE_URI[:practice] : BASE_URI[:live]
  @base_uri                = options[:stream] == true ? uris[:stream] : uris[:api]

  @headers                             = {}
  @headers['Authorization']            = "Bearer #{access_token}"
  @headers['X-Accept-Datetime-Format'] = 'RFC3339'
  @headers['Content-Type']             = 'application/json'

  if proxy_url && uri = URI(proxy_url)
    Client.http_proxy(uri.hostname, uri.port, uri.user, uri.password)
  end

  persistent_connection_adapter_options = {
    name:         'oanda_api_v20',
    keep_alive:   30,
    idle_timeout: 10,
    warn_timeout: 2,
    pool_size:    connection_pool_size
  }

  persistent_connection_adapter_options.merge!(logger: ::Logger.new(STDOUT), debug_output: ::Logger.new(STDOUT)) if debug
  Client.persistent_connection_adapter(persistent_connection_adapter_options)
end

Public Instance Methods

govern_api_request_rate() click to toggle source
# File lib/oanda_api_v20/client.rb, line 71
def govern_api_request_rate
  return unless last_api_request_at[0]
  halt = 1 - (last_api_request_at[max_requests_per_second - 1] - last_api_request_at[0])
  sleep halt if halt > 0
end
method_missing(name, *args, &block) click to toggle source
Calls superclass method
# File lib/oanda_api_v20/client.rb, line 53
def method_missing(name, *args, &block)
  case name
  when *Api.api_methods
    api_attributes = {
      client:         self,
      last_action:    name,
      last_arguments: args
    }

    api_attributes.merge!(account_id: args.first) if name == :account
    api_attributes.merge!(instrument: args.first) if name == :instrument

    Api.new(api_attributes)
  else
    super
  end
end
update_last_api_request_at() click to toggle source
# File lib/oanda_api_v20/client.rb, line 77
def update_last_api_request_at
  @mutex.synchronize do
    last_api_request_at.push(Time.now.utc).shift
  end
end