class KrakenOrder

Wrapper for Kraken orders.

Attributes

amount[RW]
avg_price[RW]
datetime[RW]
executed_amount[RW]
id[RW]
price[RW]
type[RW]

Public Class Methods

amount_and_quantity(order_id) click to toggle source
BigDecimal, BigDecimal
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 47
def self.amount_and_quantity(order_id)
  order = find(order_id)
  amount = order.avg_price * order.executed_amount
  quantity = order.executed_amount

  [amount, quantity]
end
closed(start: 1.hour.ago.to_i) click to toggle source
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 61
def self.closed(start: 1.hour.ago.to_i)
  api_wrapper.client.private.closed_orders(start: start)[:closed].map { |o| new(*o) }
rescue KrakenClient::ErrorResponse
  retry
end
closed_order_by(type, price, quantity) click to toggle source

description: [type, price, quantity]

# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 88
def self.closed_order_by(type, price, quantity)
  closed(start: last_closed_order).detect { |order| order == [type, price, quantity] }
end
create!(type, price, quantity) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 9
def self.create!(type, price, quantity)
  self.last_closed_order = closed.first.try(:id) || Time.now.to_i
  order = place_order(type, price.truncate(1), quantity.truncate(8))
  order_id = order['txid'].first
  find(order_id)
rescue KrakenClient::ErrorResponse => e
  # Order could not be placed
  if e.message == 'EService:Unavailable'
    BitexBot::Robot.log(:debug, 'Captured EService:Unavailable error when placing order on Kraken. Retrying...')
    retry
  elsif e.message.start_with?('EGeneral:Invalid')
    BitexBot::Robot.log(:debug, "Captured #{e.message}: type: #{type}, price: #{price}, quantity: #{quantity}")
    raise OrderArgumentError, e.message
  elsif e.message != 'error'
    raise
  end
end
find(id) click to toggle source
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 40
def self.find(id)
  new(*api_wrapper.client.private.query_orders(txid: id).first)
rescue KrakenClient::ErrorResponse
  retry
end
find_lost(type, price, quantity) click to toggle source
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 67
def self.find_lost(type, price, quantity)
  BitexBot::Robot.log(:debug, "Looking for #{type} order in open orders...")
  order = open_order_by(type, price.truncate(2), quantity.truncate(8))
  return log_and_return(order, :open) if order.present?

  BitexBot::Robot.log(:debug, "Looking for #{type} order in closed orders...")
  order = closed_order_by(type, price.truncate(2), quantity.truncate(8))
  return log_and_return(order, :closed) if order.present? && order.id != last_closed_order
end
log_and_return(order, status) click to toggle source
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 77
def self.log_and_return(order, status)
  BitexBot::Robot.log(:debug, "Found open #{status} with ID #{order.id}")
  order
end
new(id, order_data) click to toggle source

id: 'O5TDV2-WDYB2-6OGJRD' order_data: {

  'refid': nil, 'userref': nil, 'status': 'open', 'opentm': 1440292821.4839, 'starttm': 0, 'expiretm': 0,
  'descr': {
    'pair': 'ETHEUR', 'type': 'buy', 'ordertype': 'limit', 'price': '1.19000', 'price2': '0', 'leverage': 'none',
    'order': 'buy 1204.00000000 ETHEUR @ limit 1.19000'
  },
  'vol': '1204.00000000', 'vol_exec': '0.00000000', 'cost': '0.00000', 'fee': '0.00000', 'price': '0.00000',
  'misc': '', 'oflags': 'fciq'
}

}

# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 103
def initialize(id, order_data)
  self.id = id
  self.type = order_data[:descr][:type].to_sym
  self.datetime = order_data[:opentm].to_i
  self.amount = order_data[:vol].to_d
  self.executed_amount = order_data[:vol_exec].to_d
  self.price = order_data[:descr][:price].to_d
  self.avg_price = order_data[:price].to_d
end
open() click to toggle source
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 55
def self.open
  api_wrapper.client.private.open_orders['open'].map { |o| new(*o) }
rescue KrakenClient::ErrorResponse
  retry
end
open_order_by(type, price, quantity) click to toggle source

description: [type, price, quantity]

# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 83
def self.open_order_by(type, price, quantity)
  open.detect { |order| order == [type, price, quantity] }
end
place_order(type, price, quantity) click to toggle source

<KrakenOrder:0x007faf255382d0 @id=“OGZ3HI-5I322-OIOV52”, @type=:sell, @datetime=1546971756, @amount=0.248752e-2,

@executed_amount=0.248752e-2, @price=0.40025e4, @avg_price=0.40074e4>
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 30
def self.place_order(type, price, quantity)
  api_wrapper.client.private.add_order(
    pair: api_wrapper.currency_pair[:altname],
    type: type,
    ordertype: 'limit',
    price: price,
    volume: quantity
  )
end

Public Instance Methods

==(other) click to toggle source
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 119
def ==(other)
  if other.is_a?(self.class)
    other.id == id
  elsif other.is_a?(Array)
    other == [type, price, amount]
  end
end
cancel!() click to toggle source
# File lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb, line 113
def cancel!
  api_wrapper.client.private.cancel_order(txid: id)
rescue KrakenClient::ErrorResponse => e
  e.message == 'EService:Unavailable' ? retry : raise
end