class Trader::BitstampBackend

Constants

BASE_CUR
MAIN_MARKET
QUOTE_CUR
TYPE_MAP

Attributes

session[R]

Public Class Methods

new() click to toggle source
Calls superclass method Trader::BaseBackend::new
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 43
def initialize
  super :bitstamp
end

Public Instance Methods

create_order(_session, _pair, _volume, _price, _type) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 81
def create_order(_session, _pair, _volume, _price, _type)
  not_supported('market orders') if _price.nil?

  normalize_raw_order execute_request(
    _session || session,
    _type == Order::BID ? 'buy' : 'sell',
    { amount: _volume.to_f, price: _price.to_f }
  )
end
fetch_order(_session, _id) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 91
def fetch_order(_session, _id)
  normalize_raw_order_status _id, execute_request(
    _session || session,
    'order_status',
    { id: _id['id'] }
  )
end
fill_book(_book) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 51
def fill_book(_book)
  # TODO: consider book pair

  _book.prepare Time.now

  ob = execute_request(nil, 'order_book')
  ob['bids'].each { |o| _book.add_bid(o[0], o[1]) }
  ob['asks'].each { |o| _book.add_ask(o[0], o[1]) }

  tx = execute_request(nil, 'transactions')
  tx.each do |t|
    _book.add_transaction t['price'], t['amount'], Time.at(t['date'].to_i)
  end
end
get_available_markets() click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 47
def get_available_markets
  [MAIN_MARKET]
end
get_balance(_session, _currency) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 66
def get_balance(_session, _currency)
  raw = execute_request(_session || session, 'balance')

  if _currency == BASE_CUR
    return BackendBalance.new raw['btc_balance'], raw['btc_available']
  else
    return BackendBalance.new raw['usd_balance'], raw['usd_available']
  end
end
get_orders(_session, _pair) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 76
def get_orders(_session, _pair)
  raw_orders = execute_request(_session || session, 'open_orders')
  raw_orders.map { |o| normalize_raw_order o }
end

Private Instance Methods

big(_string) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 151
def big(_string)
  BigDecimal.new _string
end
execute_request(_signing, _resource, _data=nil) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 103
def execute_request(_signing, _resource, _data=nil)
  _data = sign_params _signing, _data if _signing

  JSON.parse(if _data.nil?
    RestClient.get "https://www.bitstamp.net/api/#{_resource}/"
  else
    RestClient.post "https://www.bitstamp.net/api/#{_resource}/", _data
  end)
end
normalize_raw_order(_order) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 131
def normalize_raw_order(_order)
  BitstampOrder.new({
    'raw' => _order,
    'executed_volume' => big(0),
    'status' => 'In Queue'
  })
end
normalize_raw_order_status(_id, _status) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 139
def normalize_raw_order_status(_id, _status)
  executed_volume = _status['transactions'].inject(big(0)) { |r, t| r + big(t['btc']) }
  executed_price = _status['transactions'].inject(big(0)) { |r, t| r + (big(t['price']) * big(t['btc'])) }

  BitstampOrder.new({
    'raw' => _id,
    'executed_volume' => executed_volume,
    'executed_price' => executed_price / executed_volume,
    'status' => _status['status']
  })
end
sign_params(_keys, _params) click to toggle source
# File lib/trade-o-matic/adapters/bitstamp_backend.rb, line 113
def sign_params(_keys, _params)
  nonce = (Time.now.to_f*10000).to_i.to_s

  customer_id = _keys[:customer_id].to_s
  api_key = _keys[:api_key]
  api_secret = _keys[:api_secret]

  digest = OpenSSL::Digest.new('sha256')
  signature_data = "#{nonce}#{customer_id}#{api_key}"
  signature = OpenSSL::HMAC.hexdigest(digest, api_secret, signature_data)

  (_params || {}).merge({
    nonce: nonce,
    signature: signature.upcase,
    key: api_key
  })
end