Class: KrakenOrder

Inherits:
Object
  • Object
show all
Defined in:
lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb

Overview

Wrapper for Kraken orders.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, order_data) ⇒ KrakenOrder

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'
}

}



98
99
100
101
102
103
104
105
106
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 98

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

Instance Attribute Details

#amountObject

Returns the value of attribute amount.



6
7
8
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 6

def amount
  @amount
end

#avg_priceObject

Returns the value of attribute avg_price.



6
7
8
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 6

def avg_price
  @avg_price
end

#datetimeObject

Returns the value of attribute datetime.



6
7
8
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 6

def datetime
  @datetime
end

#executed_amountObject

Returns the value of attribute executed_amount.



6
7
8
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 6

def executed_amount
  @executed_amount
end

#idObject

Returns the value of attribute id.



6
7
8
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 6

def id
  @id
end

#priceObject

Returns the value of attribute price.



6
7
8
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 6

def price
  @price
end

#typeObject

Returns the value of attribute type.



6
7
8
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 6

def type
  @type
end

Class Method Details

.amount_and_quantity(order_id) ⇒ Object



42
43
44
45
46
47
48
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 42

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) ⇒ Object



56
57
58
59
60
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 56

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) ⇒ Object

description: [type, price, quantity]



83
84
85
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 83

def self.closed_order_by(type, price, quantity)
  closed(start: last_closed_order).detect { |o| o == [type, price, quantity] }
end

.create!(type, price, quantity) ⇒ Object

rubocop:disable Metrics/AbcSize



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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
  find(order_info_by(type, price.truncate(1), quantity.truncate(8))['txid'].first)
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) ⇒ Object



36
37
38
39
40
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 36

def self.find(id)
  new(*api_wrapper.client.private.query_orders(txid: id).first)
rescue KrakenClient::ErrorResponse
  retry
end

.find_lost(type, price, quantity) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 62

def self.find_lost(type, price, quantity)
  BitexBot::Robot.log(:debug, "Looking for #{type} order in open orders...")
  order = open_order_by(type, price, quantity)
  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, quantity)
  return log_and_return(order, :closed) if order && order.id != last_closed_order
end

.log_and_return(order, status) ⇒ Object



72
73
74
75
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 72

def self.log_and_return(order, status)
  BitexBot::Robot.log(:debug, "Found open #{status} with ID #{order.id}")
  order
end

.openObject



50
51
52
53
54
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 50

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) ⇒ Object

description: [type, price, quantity]



78
79
80
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 78

def self.open_order_by(type, price, quantity)
  open.detect { |o| o == [type, price, quantity] }
end

.order_info_by(type, price, quantity) ⇒ Object

rubocop:enable Metrics/AbcSize



26
27
28
29
30
31
32
33
34
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 26

def self.order_info_by(type, price, quantity)
  api_wrapper.client.private.add_order(
    pair: KrakenApiWrapper.currency_pair[:altname],
    type: type,
    ordertype: 'limit',
    price: price,
    volume: quantity
  )
end

Instance Method Details

#==(other) ⇒ Object



114
115
116
117
118
119
120
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 114

def ==(other)
  if other.is_a?(self.class)
    other.id == id
  elsif other.is_a?(Array)
    other == [type, price, amount]
  end
end

#cancel!Object



108
109
110
111
112
# File 'lib/bitex_bot/models/api_wrappers/kraken/kraken_order.rb', line 108

def cancel!
  api_wrapper.client.private.cancel_order(txid: id)
rescue KrakenClient::ErrorResponse => e
  e.message == 'EService:Unavailable' ? retry : raise
end