bitex 0.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +63 -0
- data/.rubocop.yml +32 -0
- data/.ruby-version +1 -0
- data/bitex.gemspec +21 -18
- data/lib/bitex.rb +7 -1
- data/lib/bitex/api.rb +34 -41
- data/lib/bitex/ask.rb +74 -0
- data/lib/bitex/base_order.rb +106 -0
- data/lib/bitex/bid.rb +72 -0
- data/lib/bitex/buy.rb +8 -5
- data/lib/bitex/kyc_file.rb +31 -9
- data/lib/bitex/kyc_profile.rb +113 -38
- data/lib/bitex/{market.rb → market_data.rb} +3 -3
- data/lib/bitex/match.rb +30 -15
- data/lib/bitex/order.rb +6 -238
- data/lib/bitex/payment.rb +30 -18
- data/lib/bitex/rates.rb +6 -8
- data/lib/bitex/sell.rb +5 -5
- data/lib/bitex/specie_deposit.rb +9 -4
- data/lib/bitex/specie_withdrawal.rb +29 -28
- data/lib/bitex/trade.rb +4 -5
- data/lib/bitex/transaction.rb +7 -8
- data/lib/bitex/usd_deposit.rb +46 -47
- data/lib/bitex/usd_withdrawal.rb +33 -34
- data/lib/bitex/version.rb +1 -1
- data/spec/ask_spec.rb +17 -5
- data/spec/bid_spec.rb +17 -5
- data/spec/buy_spec.rb +14 -4
- data/spec/kyc_file_spec.rb +34 -18
- data/spec/kyc_profile_spec.rb +158 -122
- data/spec/order_spec.rb +1 -1
- data/spec/payment_spec.rb +51 -45
- data/spec/sell_spec.rb +14 -4
- data/spec/spec_helper.rb +7 -6
- data/spec/specie_deposit_spec.rb +10 -4
- data/spec/specie_withdrawal_spec.rb +26 -25
- data/spec/support/from_json_shared_examples.rb +20 -22
- data/spec/support/order_shared_examples.rb +14 -17
- data/spec/support/request_stubs.rb +18 -12
- data/spec/trade_spec.rb +5 -5
- data/spec/transaction_spec.rb +12 -13
- data/spec/usd_deposit_spec.rb +120 -105
- data/spec/usd_withdrawal_spec.rb +89 -79
- metadata +57 -10
data/lib/bitex/bid.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module Bitex
|
2
|
+
# A Bid is an order to buy a given orderbook.
|
3
|
+
# @see BaseOrder
|
4
|
+
class Bid < BaseOrder
|
5
|
+
# @!attribute id
|
6
|
+
# @return [Integer] This Bid's unique ID.
|
7
|
+
|
8
|
+
# @!attribute created_at
|
9
|
+
# @return [Time] Time when this Bid was created.
|
10
|
+
|
11
|
+
# @!attribute orderbook
|
12
|
+
# @return [Symbol] :btc_usd or :btc_ars
|
13
|
+
|
14
|
+
# @!attribute amount
|
15
|
+
# @return [BigDecimal] Amount of USD to spend in this Bid.
|
16
|
+
attr_accessor :amount
|
17
|
+
|
18
|
+
# @!attribute remaining_amount
|
19
|
+
# @return [BigDecimal] Amount of USD left to be spent in this Bid.
|
20
|
+
attr_accessor :remaining_amount
|
21
|
+
|
22
|
+
# @!attribute price
|
23
|
+
# @return [BigDecimal] Maximum price to pay per unit.
|
24
|
+
|
25
|
+
# @!attribute status
|
26
|
+
# The status of this Bid in its lifecycle.
|
27
|
+
# * :received queued to check if you have enough funds.
|
28
|
+
# * :executing available in our ourderbook waiting to be matched.
|
29
|
+
# * :cancelling To be cancelled as soon as our trading engine unlocks it.
|
30
|
+
# * :cancelled no further executed. May have some Remaining Amount.
|
31
|
+
# * :completed Fully executed, Remaining Amount should be 0.
|
32
|
+
|
33
|
+
# @!attribute reason
|
34
|
+
# The cancellation reason for this Bid, if any.
|
35
|
+
# * :not_cancelled Has not been cancelled.
|
36
|
+
# * :not_enough_funds Not enough funds to place this order.
|
37
|
+
# * :user_cancelled Cancelled per user's request
|
38
|
+
# * :system_cancelled Bitex cancelled this order, for a good reason.
|
39
|
+
|
40
|
+
# @!attribute produced_quantity
|
41
|
+
# TODO: rever esta documentacion
|
42
|
+
# @return [BigDecimal] Quantity of specie produced by this bid so far.
|
43
|
+
attr_accessor :produced_quantity
|
44
|
+
|
45
|
+
# @!attribute issuer
|
46
|
+
# @return [String] The issuer of this order, helps you tell apart orders created from the web UI and the API.
|
47
|
+
|
48
|
+
# @visibility private
|
49
|
+
def self.base_path
|
50
|
+
'/bids'
|
51
|
+
end
|
52
|
+
|
53
|
+
# Create a new Bid for spending Amount USD paying no more than price per unit.
|
54
|
+
# @param orderbook [Symbol] :btc_usd or :btc_ars, whatever you're buying.
|
55
|
+
# @param amount [BigDecimal] Amount to spend buying.
|
56
|
+
# @param price [BigDecimal] Maximum price to pay per unit.
|
57
|
+
# @param wait [Boolean] Block the process and wait until this bid moves out of the :received state, defaults to false.
|
58
|
+
# @see https://bitex.la/developers#create-bid
|
59
|
+
def self.create!(orderbook, amount, price, wait = false)
|
60
|
+
super
|
61
|
+
end
|
62
|
+
|
63
|
+
# @visibility private
|
64
|
+
def self.from_json(json, order = nil)
|
65
|
+
super(json, order).tap do |thing|
|
66
|
+
thing.amount = (json[4].presence || 0).to_d
|
67
|
+
thing.remaining_amount = (json[5].presence || 0).to_d
|
68
|
+
thing.produced_quantity = (json[9].presence || 0).to_d
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/bitex/buy.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
module Bitex
|
2
|
+
# TODO: rever esta docu
|
2
3
|
# A transaction in which you bought some quantity of specie.
|
3
4
|
class Buy < Match
|
4
5
|
# @!attribute id
|
@@ -7,18 +8,20 @@ module Bitex
|
|
7
8
|
# @!attribute created_at
|
8
9
|
# @return [Time] Time when this Buy happened.
|
9
10
|
|
10
|
-
# @!attribute
|
11
|
-
# @return [Symbol] :
|
12
|
-
|
11
|
+
# @!attribute orderbook
|
12
|
+
# @return [Symbol] :btc_usd or :btc_ars
|
13
|
+
|
13
14
|
# @!attribute quantity
|
15
|
+
# TODO: rever esta docu
|
14
16
|
# @return [BigDecimal] Quantity of specie bought
|
15
|
-
|
17
|
+
|
16
18
|
# @!attribute amount
|
17
19
|
# @return [BigDecimal] Amount of USD spent
|
18
20
|
|
19
21
|
# @!attribute fee
|
22
|
+
# TODO: rever esta docu
|
20
23
|
# @return [BigDecimal] Quantity of specie paid as transaction fee.
|
21
|
-
|
24
|
+
|
22
25
|
# @!attribute price
|
23
26
|
# @return [BigDecimal] Price paid per unit
|
24
27
|
|
data/lib/bitex/kyc_file.rb
CHANGED
@@ -1,18 +1,40 @@
|
|
1
1
|
module Bitex
|
2
|
+
##
|
3
|
+
# Documentation here!
|
4
|
+
#
|
2
5
|
class KycFile
|
3
|
-
|
4
|
-
|
6
|
+
# @!attribute id
|
7
|
+
# @return [Integer] This KycFile's unique ID.
|
8
|
+
attr_accessor :id
|
9
|
+
|
10
|
+
# @!attribute id
|
11
|
+
# @return [Integer] This KycProfile's unique ID.
|
12
|
+
attr_accessor :kyc_profile_id
|
13
|
+
|
14
|
+
# @!attribute url
|
15
|
+
# @return [String] url to photo file.
|
16
|
+
attr_accessor :url
|
17
|
+
|
18
|
+
# @!attribute file_name
|
19
|
+
# @return [String] file name.
|
20
|
+
attr_accessor :file_name
|
21
|
+
|
22
|
+
# @!attribute file_size
|
23
|
+
# @return [Integer] file size.
|
24
|
+
attr_accessor :file_size
|
25
|
+
|
26
|
+
# @!attribute content_type
|
27
|
+
# @return [String] Content type.
|
28
|
+
attr_accessor :content_type
|
5
29
|
|
6
30
|
def self.from_json(json)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
t
|
31
|
+
new.tap do |file|
|
32
|
+
file.id, file.kyc_profile_id, file.url, file.file_name, file.content_type, file.file_size = json
|
33
|
+
end
|
11
34
|
end
|
12
|
-
|
35
|
+
|
13
36
|
def self.all
|
14
|
-
Api.private(:get,
|
37
|
+
Api.private(:get, '/private/kyc_files').map { |file| from_json(file) }
|
15
38
|
end
|
16
39
|
end
|
17
40
|
end
|
18
|
-
|
data/lib/bitex/kyc_profile.rb
CHANGED
@@ -1,40 +1,108 @@
|
|
1
1
|
module Bitex
|
2
|
+
##
|
3
|
+
# Documentation here!
|
4
|
+
#
|
2
5
|
class KycProfile
|
6
|
+
# @!attribute id
|
7
|
+
# @return [Integer] This KycProfile's unique ID.
|
8
|
+
attr_accessor :id
|
3
9
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
10
|
+
# @!attribute first_name
|
11
|
+
# @return [String] Name.
|
12
|
+
attr_accessor :first_name
|
13
|
+
|
14
|
+
# @!attribute last_name
|
15
|
+
# @return [String] Last Name.
|
16
|
+
attr_accessor :last_name
|
17
|
+
|
18
|
+
# @!attribute personal_id_number
|
19
|
+
# @return [String] Personal ID Number.
|
20
|
+
attr_accessor :personal_id_number
|
21
|
+
|
22
|
+
# @!attribute personal_id_issuer
|
23
|
+
# @return [String] ISO country code for the issuer of this ID.
|
24
|
+
attr_accessor :personal_id_issuer
|
25
|
+
|
26
|
+
# @!attribute personal_id_type
|
27
|
+
# @return [symbol] Type of ID. [:passport]
|
28
|
+
attr_accessor :personal_id_type
|
29
|
+
|
30
|
+
# @!attribute tax_id
|
31
|
+
# @return [Intger] Tax ID.
|
32
|
+
attr_accessor :tax_id
|
33
|
+
|
34
|
+
# @!attribute birth_date
|
35
|
+
# @return [Time] Birth date.
|
36
|
+
attr_accessor :birth_date
|
37
|
+
|
38
|
+
# @!attribute nationality
|
39
|
+
# @return [String] Nationality.
|
40
|
+
attr_accessor :nationality
|
41
|
+
|
42
|
+
# @!attribute gender
|
43
|
+
# @return [Symbol] Gender.
|
44
|
+
attr_accessor :gender
|
45
|
+
|
46
|
+
# @!attribute occupation
|
47
|
+
# @return [String]
|
48
|
+
attr_accessor :occupation
|
49
|
+
|
50
|
+
# @!attribute home_address
|
51
|
+
# @return [String] Home address.
|
52
|
+
attr_accessor :home_address
|
53
|
+
|
54
|
+
# @!attribute work_address
|
55
|
+
# @return [String] Work address.
|
56
|
+
attr_accessor :work_address
|
57
|
+
|
58
|
+
# @!attribute phone_numbers
|
59
|
+
# @return [String] Phone numbers.
|
60
|
+
attr_accessor :phone_numbers
|
61
|
+
|
62
|
+
# @!attribute legal_entity
|
63
|
+
# @return [Boolean] Is legal entity.
|
64
|
+
attr_accessor :legal_entity
|
65
|
+
|
66
|
+
# @!attribute politically_exposed_person
|
67
|
+
# @return [Boolean] Is politically exposed.
|
68
|
+
attr_accessor :politically_exposed_person
|
69
|
+
|
70
|
+
# @!attribute usage_tier
|
71
|
+
# @return [Symbol] Requested usage tier.
|
72
|
+
attr_accessor :usage_tier
|
73
|
+
|
74
|
+
# @!attribute accepted_usage_tier
|
75
|
+
# @return [Symbol] Current usage tier as accepted by our compliance officers.
|
76
|
+
attr_accessor :accepted_usage_tier
|
9
77
|
|
10
78
|
# @visibility private
|
79
|
+
# rubocop:disable Metrics/AbcSize
|
11
80
|
def self.from_json(json)
|
12
|
-
new.tap do |
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
81
|
+
new.tap do |profile|
|
82
|
+
profile.id = json[0]
|
83
|
+
profile.first_name = json[1]
|
84
|
+
profile.last_name = json[2]
|
85
|
+
profile.personal_id_number = json[3]
|
86
|
+
profile.personal_id_issuer = json[4]
|
87
|
+
profile.personal_id_type = json[5].to_sym
|
88
|
+
profile.tax_id = json[6]
|
89
|
+
profile.birth_date = json[7] ? Time.at(json[7]) : nil
|
90
|
+
profile.nationality = json[8]
|
91
|
+
profile.gender = json[9].to_sym
|
92
|
+
profile.occupation = json[10]
|
93
|
+
profile.home_address = json[11]
|
94
|
+
profile.work_address = json[12]
|
95
|
+
profile.phone_numbers = json[13]
|
96
|
+
profile.legal_entity = json[14]
|
97
|
+
profile.politically_exposed_person = json[15]
|
98
|
+
profile.usage_tier = json[16].to_sym
|
99
|
+
profile.accepted_usage_tier = json[17].to_sym
|
31
100
|
end
|
32
101
|
end
|
102
|
+
# rubocop:enable Metrics/AbcSize
|
33
103
|
|
34
104
|
def self.create!(params)
|
35
|
-
|
36
|
-
.merge(birth_date: params[:birth_date].strftime('%Y/%m/%d'))
|
37
|
-
from_json(Api.private(:post, "/private/kyc_profiles", params))
|
105
|
+
from_json(Api.private(:post, '/private/kyc_profiles', sanitize(params)))
|
38
106
|
end
|
39
107
|
|
40
108
|
def self.find(id)
|
@@ -42,25 +110,32 @@ module Bitex
|
|
42
110
|
end
|
43
111
|
|
44
112
|
def self.all
|
45
|
-
Api.private(:get,
|
113
|
+
Api.private(:get, '/private/kyc_profiles').map { |kyc| from_json(kyc) }
|
114
|
+
end
|
115
|
+
|
116
|
+
private_class_method
|
117
|
+
|
118
|
+
def self.sanitize(params)
|
119
|
+
params.merge(birth_date: params[:birth_date].strftime('%Y/%m/%d'))
|
46
120
|
end
|
47
121
|
|
48
122
|
def update!(params)
|
49
|
-
|
50
|
-
.merge(birth_date: params[:birth_date].strftime('%Y/%m/%d'))
|
51
|
-
self.class.from_json(Api.private(:put, "/private/kyc_profiles/#{id}", params))
|
123
|
+
self.class.from_json(Api.private(:put, "/private/kyc_profiles/#{id}", self.class.sanitize(params)))
|
52
124
|
end
|
53
|
-
|
125
|
+
|
54
126
|
def add_kyc_file!(path, content_type = nil)
|
55
|
-
response = Api.private(
|
56
|
-
|
127
|
+
response = Api.private(
|
128
|
+
:post,
|
129
|
+
"/private/kyc_profiles/#{id}/kyc_files",
|
130
|
+
{ document_content_type: content_type },
|
131
|
+
document: path
|
132
|
+
)
|
133
|
+
|
57
134
|
KycFile.from_json(response)
|
58
135
|
end
|
59
|
-
|
136
|
+
|
60
137
|
def kyc_files
|
61
|
-
Api.private(:get, "/private/kyc_profiles/#{id}/kyc_files")
|
62
|
-
.collect{|x| KycFile.from_json(x)}
|
138
|
+
Api.private(:get, "/private/kyc_profiles/#{id}/kyc_files").map { |kyc| KycFile.from_json(kyc) }
|
63
139
|
end
|
64
140
|
end
|
65
141
|
end
|
66
|
-
|
@@ -2,7 +2,6 @@ module Bitex
|
|
2
2
|
# Public market data for a specie, do not use directly, use
|
3
3
|
# {BitcoinMarketData} instead.
|
4
4
|
class MarketData
|
5
|
-
|
6
5
|
# The species currency ticker conveniently formatted as a ruby Hash with
|
7
6
|
# symbolized keys.
|
8
7
|
# @see https://bitex.la/developers#ticker
|
@@ -12,7 +11,8 @@ module Bitex
|
|
12
11
|
|
13
12
|
# The species order book as a Hash with two keys: bids and asks.
|
14
13
|
# Each of them is a list of list consisting of [price, quantity]
|
15
|
-
# @see https://bitex.la/developers#
|
14
|
+
# @see https://bitex.la/developers#orderbook
|
15
|
+
# TODO: standarize name for order-books: orderbook | order_book
|
16
16
|
def self.order_book
|
17
17
|
api_get('/market/order_book').symbolize_keys
|
18
18
|
end
|
@@ -23,7 +23,7 @@ module Bitex
|
|
23
23
|
def self.transactions
|
24
24
|
api_get('/market/transactions')
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
# Returns a list of lists with aggregated transaction data for each hour
|
28
28
|
# from the last 24 hours.
|
29
29
|
# @see https://bitex.la/developers#last_24_hours
|
data/lib/bitex/match.rb
CHANGED
@@ -1,24 +1,39 @@
|
|
1
1
|
module Bitex
|
2
2
|
# @visibility private
|
3
|
-
# Both Buy and Sell are a kind of Match, they deserialize the same
|
4
|
-
#
|
3
|
+
# Both Buy and Sell are a kind of Match, they deserialize the same and have very similar fields, although their documentation
|
4
|
+
# may differ.
|
5
5
|
class Match
|
6
|
-
attr_accessor :id
|
7
|
-
attr_accessor :created_at
|
8
|
-
attr_accessor :specie
|
9
|
-
attr_accessor :quantity
|
10
|
-
attr_accessor :amount
|
11
|
-
attr_accessor :fee
|
12
|
-
attr_accessor :price
|
6
|
+
attr_accessor :id, :orderbook, :quantity, :amount, :fee, :price, :created_at
|
13
7
|
|
14
8
|
# @visibility private
|
15
9
|
def self.from_json(json)
|
16
|
-
Api.from_json(new, json
|
17
|
-
thing.
|
18
|
-
thing.
|
19
|
-
thing.
|
20
|
-
thing.
|
21
|
-
|
10
|
+
Api.from_json(new, json) do |thing|
|
11
|
+
thing.orderbook = orderbooks[json[3]]
|
12
|
+
thing.quantity = json[4].to_s.to_d
|
13
|
+
thing.amount = json[5].to_s.to_d
|
14
|
+
thing.fee = json[6].to_s.to_d
|
15
|
+
thing.price = json[7].to_s.to_d
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private_class_method
|
20
|
+
|
21
|
+
def self.orderbooks
|
22
|
+
{ 1 => :btc_usd, 5 => :btc_ars }
|
23
|
+
end
|
24
|
+
|
25
|
+
def base_currency
|
26
|
+
base_quote[0]
|
27
|
+
end
|
28
|
+
|
29
|
+
def quote_currency
|
30
|
+
base_quote[1]
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def base_quote
|
36
|
+
orderbook.upcase.to_s.split('_')
|
22
37
|
end
|
23
38
|
end
|
24
39
|
end
|
data/lib/bitex/order.rb
CHANGED
@@ -1,249 +1,17 @@
|
|
1
1
|
module Bitex
|
2
|
-
|
3
|
-
# Base class for Bids and Asks
|
4
|
-
class OrderBase
|
5
|
-
attr_accessor :id
|
6
|
-
attr_accessor :created_at
|
7
|
-
attr_accessor :specie
|
8
|
-
attr_accessor :price
|
9
|
-
attr_accessor :status
|
10
|
-
attr_accessor :reason
|
11
|
-
attr_accessor :issuer
|
12
|
-
|
13
|
-
# Returns an array with all your active orders
|
14
|
-
# of this type, and any other order of this type that was active in the
|
15
|
-
# last 2 hours. Uses {Order.all} under the hood.
|
16
|
-
def self.all
|
17
|
-
Order.all.select{|o| o.is_a?(self) }
|
18
|
-
end
|
19
|
-
|
20
|
-
# Returns an array with all your active orders of this type
|
21
|
-
# Uses {Order.active} under the hood.
|
22
|
-
def self.active
|
23
|
-
Order.active.select{|o| o.is_a?(self) }
|
24
|
-
end
|
25
|
-
|
26
|
-
# Find an order in your list of active orders.
|
27
|
-
# Uses {Order.active} under the hood.
|
28
|
-
def self.find(id)
|
29
|
-
from_json(Api.private(:get, "/private#{base_path}/#{id}"))
|
30
|
-
end
|
31
|
-
|
32
|
-
# @visibility private
|
33
|
-
def self.create!(specie, amount, price, wait=false)
|
34
|
-
params = {
|
35
|
-
amount: amount,
|
36
|
-
price: price,
|
37
|
-
specie: {btc: 1, ltc: 2}[specie]
|
38
|
-
}
|
39
|
-
order = from_json(Api.private(:post, "/private#{base_path}", params))
|
40
|
-
retries = 0
|
41
|
-
while wait && order.status == :received
|
42
|
-
sleep 0.2
|
43
|
-
begin
|
44
|
-
order = find(order.id)
|
45
|
-
rescue StandardError => e
|
46
|
-
end
|
47
|
-
retries += 1
|
48
|
-
if retries > 5000 # Wait 15 minutes for the order to be accepted.
|
49
|
-
raise StandardError.new(
|
50
|
-
"Timed out waiting for #{base_path} ##{order.id}")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
return order
|
54
|
-
end
|
55
|
-
|
56
|
-
def cancel!
|
57
|
-
path = "/private#{self.class.base_path}/#{self.id}/cancel"
|
58
|
-
self.class.from_json(Api.private(:post, path), self)
|
59
|
-
end
|
60
|
-
|
61
|
-
# @visibility private
|
62
|
-
def self.from_json(json, order = nil)
|
63
|
-
status_lookup = {
|
64
|
-
1 => :received,
|
65
|
-
2 => :executing,
|
66
|
-
3 => :cancelling,
|
67
|
-
4 => :cancelled,
|
68
|
-
5 => :completed,
|
69
|
-
}
|
70
|
-
reason_lookup = {
|
71
|
-
0 => :not_cancelled,
|
72
|
-
1 => :not_enough_funds,
|
73
|
-
2 => :user_cancelled,
|
74
|
-
3 => :system_cancelled,
|
75
|
-
}
|
76
|
-
Api.from_json(order || new, json, true) do |thing|
|
77
|
-
thing.price = BigDecimal.new(json[6].to_s)
|
78
|
-
thing.status = status_lookup[json[7]]
|
79
|
-
thing.reason = reason_lookup[json[8]]
|
80
|
-
thing.issuer = json[10]
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# A Bid is an order to buy a given specie.
|
86
|
-
# @see OrderBase
|
87
|
-
class Bid < OrderBase
|
88
|
-
# @!attribute id
|
89
|
-
# @return [Integer] This Bid's unique ID.
|
90
|
-
|
91
|
-
# @!attribute created_at
|
92
|
-
# @return [Time] Time when this Bid was created.
|
93
|
-
|
94
|
-
# @!attribute specie
|
95
|
-
# @return [Symbol] :btc or :ltc
|
96
|
-
|
97
|
-
# @!attribute amount
|
98
|
-
# @return [BigDecimal] Amount of USD to spend in this Bid.
|
99
|
-
attr_accessor :amount
|
100
|
-
|
101
|
-
# @!attribute remaining_amount
|
102
|
-
# @return [BigDecimal] Amount of USD left to be spent in this Bid.
|
103
|
-
attr_accessor :remaining_amount
|
104
|
-
|
105
|
-
# @!attribute price
|
106
|
-
# @return [BigDecimal] Maximum price to pay per unit.
|
107
|
-
|
108
|
-
# @!attribute status
|
109
|
-
# The status of this Bid in its lifecycle.
|
110
|
-
# * :received queued to check if you have enough funds.
|
111
|
-
# * :executing available in our ourderbook waiting to be matched.
|
112
|
-
# * :cancelling To be cancelled as soon as our trading engine unlocks it.
|
113
|
-
# * :cancelled no further executed. May have some Remaining Amount.
|
114
|
-
# * :completed Fully executed, Remaining Amount should be 0.
|
115
|
-
|
116
|
-
# @!attribute reason
|
117
|
-
# The cancellation reason for this Bid, if any.
|
118
|
-
# * :not_cancelled Has not been cancelled.
|
119
|
-
# * :not_enough_funds Not enough funds to place this order.
|
120
|
-
# * :user_cancelled Cancelled per user's request
|
121
|
-
# * :system_cancelled Bitex cancelled this order, for a good reason.
|
122
|
-
|
123
|
-
# @!attribute produced_quantity
|
124
|
-
# @return [BigDecimal] Quantity of specie produced by this bid so far.
|
125
|
-
attr_accessor :produced_quantity
|
126
|
-
|
127
|
-
# @!attribute issuer
|
128
|
-
# @return [String] The issuer of this order, helps you tell
|
129
|
-
# apart orders created from the web UI and the API.
|
130
|
-
|
131
|
-
# @visibility private
|
132
|
-
def self.base_path
|
133
|
-
'/bids'
|
134
|
-
end
|
135
|
-
|
136
|
-
# Create a new Bid for spending Amount USD paying no more than
|
137
|
-
# price per unit.
|
138
|
-
# @param specie [Symbol] :btc or :ltc, whatever you're buying.
|
139
|
-
# @param amount [BigDecimal] Amount to spend buying.
|
140
|
-
# @param price [BigDecimal] Maximum price to pay per unit.
|
141
|
-
# @param wait [Boolean] Block the process and wait until this
|
142
|
-
# bid moves out of the :received state, defaults to false.
|
143
|
-
# @see https://bitex.la/developers#create-bid
|
144
|
-
def self.create!(specie, amount, price, wait=false)
|
145
|
-
super
|
146
|
-
end
|
147
|
-
|
148
|
-
# @visibility private
|
149
|
-
def self.from_json(json, order = nil)
|
150
|
-
super(json, order).tap do |thing|
|
151
|
-
thing.amount = BigDecimal.new(json[4].to_s)
|
152
|
-
thing.remaining_amount = BigDecimal.new(json[5].to_s)
|
153
|
-
thing.produced_quantity = BigDecimal.new(json[9].to_s)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
# An Ask is an order to sell a given specie.
|
159
|
-
# @see OrderBase
|
160
|
-
class Ask < OrderBase
|
161
|
-
# @!attribute id
|
162
|
-
# @return [Integer] This Ask's unique ID.
|
163
|
-
|
164
|
-
# @!attribute created_at
|
165
|
-
# @return [Time] Time when this Ask was created.
|
166
|
-
|
167
|
-
# @!attribute specie
|
168
|
-
# @return [Symbol] :btc or :ltc
|
169
|
-
|
170
|
-
# @!attribute quantity
|
171
|
-
# @return [BigDecimal] Quantity of specie to sell in this Ask.
|
172
|
-
attr_accessor :quantity
|
173
|
-
|
174
|
-
# @!attribute remaining_quantity
|
175
|
-
# @return [BigDecimal] Quantity of specie left to sell in this Ask.
|
176
|
-
attr_accessor :remaining_quantity
|
177
|
-
|
178
|
-
# @!attribute price
|
179
|
-
# @return [BigDecimal] Minimum price to charge per unit.
|
180
|
-
|
181
|
-
# @!attribute status
|
182
|
-
# The status of this Ask in its lifecycle.
|
183
|
-
# * :received queued to check if you have enough funds.
|
184
|
-
# * :executing available in our ourderbook waiting to be matched.
|
185
|
-
# * :cancelling To be cancelled as soon as our trading engine unlocks it.
|
186
|
-
# * :cancelled no further executed. May have some Remaining Quantity.
|
187
|
-
# * :completed Fully executed, Remaining Quantity should be 0.
|
188
|
-
|
189
|
-
# @!attribute reason
|
190
|
-
# The cancellation reason of this Ask.
|
191
|
-
# * :not_cancelled Has not been cancelled.
|
192
|
-
# * :not_enough_funds Not enough funds to place this order.
|
193
|
-
# * :user_cancelled Cancelled per user's request
|
194
|
-
# * :system_cancelled Bitex cancelled this order, for a good reason.
|
195
|
-
|
196
|
-
# @!attribute produced_amount
|
197
|
-
# @return [BigDecimal] Amount of USD produced from this sale
|
198
|
-
attr_accessor :produced_amount
|
199
|
-
|
200
|
-
# @!attribute issuer
|
201
|
-
# @return [String] The issuer of this order, helps you tell
|
202
|
-
# apart orders created from the web UI and the API.
|
203
|
-
|
204
|
-
# @visibility private
|
205
|
-
def self.base_path
|
206
|
-
'/asks'
|
207
|
-
end
|
208
|
-
|
209
|
-
# Create a new Ask for selling a Quantity of specie charging no less than
|
210
|
-
# Price per each.
|
211
|
-
# @param specie [Symbol] :btc or :ltc, whatever you're selling.
|
212
|
-
# @param quantity [BigDecimal] Quantity to sell.
|
213
|
-
# @param price [BigDecimal] Minimum price to charge when selling.
|
214
|
-
# @param wait [Boolean] Block the process and wait until this
|
215
|
-
# ask moves out of the :received state, defaults to false.
|
216
|
-
# @see https://bitex.la/developers#create-ask
|
217
|
-
def self.create!(specie, quantity, price, wait=false)
|
218
|
-
super
|
219
|
-
end
|
220
|
-
|
221
|
-
# @visibility private
|
222
|
-
def self.from_json(json, order = nil)
|
223
|
-
super(json, order).tap do |thing|
|
224
|
-
thing.quantity = BigDecimal.new(json[4].to_s)
|
225
|
-
thing.remaining_quantity = BigDecimal.new(json[5].to_s)
|
226
|
-
thing.produced_amount = BigDecimal.new(json[9].to_s)
|
227
|
-
end
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
# Convenience class for fetching heterogeneous lists with all your Bids and
|
232
|
-
# Asks.
|
2
|
+
# Convenience class for fetching heterogeneous lists with all your Bids and Asks.
|
233
3
|
class Order
|
234
|
-
# @return [Array<Bitex::Bid, Bitex::Ask>] Returns an heterogeneous array
|
235
|
-
#
|
236
|
-
# last 2 hours.
|
4
|
+
# @return [Array<Bitex::Bid, Bitex::Ask>] Returns an heterogeneous array with all your active orders and any other order that
|
5
|
+
# was active in the last 2 hours.
|
237
6
|
# @see https://bitex.la/developers#orders
|
238
7
|
def self.all
|
239
|
-
Api.private(:GET, '/private/orders').
|
8
|
+
Api.private(:GET, '/private/orders').map { |response| Api.deserialize(response) }
|
240
9
|
end
|
241
10
|
|
242
|
-
# @return [Array<Bitex::Bid, Bitex::Ask>] Returns an heterogeneous array
|
243
|
-
# with all your active orders.
|
11
|
+
# @return [Array<Bitex::Bid, Bitex::Ask>] Returns an heterogeneous array with all your active orders.
|
244
12
|
# @see https://bitex.la/developers#active-orders
|
245
13
|
def self.active
|
246
|
-
Api.private(:GET, '/private/orders/active').
|
14
|
+
Api.private(:GET, '/private/orders/active').map { |response| Api.deserialize(response) }
|
247
15
|
end
|
248
16
|
end
|
249
17
|
end
|