class Ubea::Exchange::BtcEBase

Public Instance Methods

balance() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 32
def balance
  balance = post_private("getInfo")

  OpenStruct.new(
    fiat: Money.new(balance["funds"][fiat_currency.downcase].to_s, fiat_currency),
    xbt: BigDecimal.new(balance["funds"]["btc"].to_s),
  ).freeze
end
exchange_settings() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 14
def exchange_settings
  raise NotImplementedError
end
fiat_currency() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 6
def fiat_currency
  raise NotImplementedError
end
name() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 10
def name
  "BTC-E (#{fiat_currency})"
end
open_orders() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 54
def open_orders
  post_private("ActiveOrders", {}, false)
end
open_orders?() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 58
def open_orders?
  open_orders["error"] != "no orders"
end
refresh_order_book!() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 22
def refresh_order_book!
  json = get_json("https://btc-e.com/api/2/btc_#{fiat_currency.downcase}/depth") or return

  asks = format_asks_bids(json["asks"])
  bids = format_asks_bids(json["bids"])

  mark_as_refreshed
  @order_book = OrderBook.new(asks: asks, bids: bids)
end
trade!(args) click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 41
def trade!(args)
  params = {
    pair: "btc_#{fiat_currency.downcase}",
    type: args.fetch(:type),
    rate: args.fetch(:price),
    amount: args.fetch(:volume),
  }

  Log.debug params
  trade = post_private("Trade", params)
  Log.info trade
end
trade_fee() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 18
def trade_fee
  BigDecimal.new("0.002").freeze # 0.2%
end

Private Instance Methods

encode_params(params) click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 119
def encode_params(params)
  uri = Addressable::URI.new
  uri.query_values = params
  uri.query
end
format_asks_bids(json) click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 64
def format_asks_bids(json)
  json.map do |price, volume|
    Offer.new(
      price: Money.new(price.to_s, fiat_currency),
      volume: volume.to_s
    ).freeze
  end
end
generate_hmac(key, message) click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 115
def generate_hmac(key, message)
  OpenSSL::HMAC.hexdigest('sha512', key, message)
end
generate_message(params) click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 111
def generate_message(params)
  encode_params(params)
end
generate_signature(params) click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 105
def generate_signature(params)
  key = exchange_settings[:api_secret]
  message = generate_message(params)
  generate_hmac(key, message)
end
nonce() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 94
def nonce
  now = Time.now.to_i + 2

  if now >= (@nonce || 0) - 2
    sleep 1
    now = Time.now.to_i + 2
  end

  @nonce = now
end
post_private(method, params = {}, validate = true) click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 73
def post_private(method, params = {}, validate = true)
  params['method'] = method
  params['nonce'] = nonce

  response = retryable_http_request do
    http_adapter("https://btc-e.com").post(url_path, params) do |request|
      request.headers['Key'] = exchange_settings[:api_key]
      request.headers['Sign'] = generate_signature(params)
    end
  end

  json = JSON.parse(response.body)
  return json unless validate

  unless json["success"] == 1
    p json
    raise "OOPS"
  end
  json["return"]
end
url_path() click to toggle source
# File lib/ubea/exchanges/btc_e_base.rb, line 125
def url_path
  "/tapi"
end