bitfinex-rb 1.0.2 → 1.0.7
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 +5 -5
- data/lib/models/funding_offer.rb +14 -0
- data/lib/models/funding_ticker.rb +24 -36
- data/lib/models/order.rb +25 -3
- data/lib/models/position.rb +11 -1
- data/lib/models/trading_ticker.rb +11 -10
- data/lib/rest/rest_client.rb +1 -1
- data/lib/rest/v1/orders.rb +2 -1
- data/lib/rest/v2.rb +13 -3
- data/lib/rest/v2/funding.rb +86 -0
- data/lib/rest/v2/orders.rb +95 -0
- data/lib/rest/v2/personal.rb +0 -9
- data/lib/rest/v2/positions.rb +25 -0
- data/lib/rest/v2/trading.rb +0 -22
- data/lib/rest/v2/wallet.rb +69 -0
- data/lib/ws/ws2.rb +13 -2
- metadata +47 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: aae43b19cd5b14ec09f9c24c1c1fb2f569e144189e614298715498d906c5536b
|
4
|
+
data.tar.gz: f0df02719dc6aa0f9bbeea16f10f9df1dc24cd2ae0b708128f761642b0f19c8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 401d3de4b62ffafa75c7c59b1f0f82658fd34a7bede699abda7bb34b979d3149c5c2871e13252624b3cdad8107ac8315b8ef3d0f11d771603f9357ce78c5644e
|
7
|
+
data.tar.gz: 79d46fa771c9917958d014e4fc421d95ba270cbf1c76bbb12ae22f00c837be64a42f15e3a6bf690cfae6fca511ca9d06c49e79927def2144039ffffb0db5c4ea
|
data/lib/models/funding_offer.rb
CHANGED
@@ -33,6 +33,20 @@ module Bitfinex
|
|
33
33
|
def self.unserialize (data)
|
34
34
|
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
35
35
|
end
|
36
|
+
|
37
|
+
def to_new_order_packet
|
38
|
+
data = {
|
39
|
+
:type => @type,
|
40
|
+
:symbol => @symbol,
|
41
|
+
:amount => BigDecimal.new(@amount, 8).to_s,
|
42
|
+
:rate => BigDecimal.new(@rate, 8).to_s,
|
43
|
+
:period => 2
|
44
|
+
}
|
45
|
+
if !@flags.nil?
|
46
|
+
data[:flags] = @flags
|
47
|
+
end
|
48
|
+
data
|
49
|
+
end
|
36
50
|
end
|
37
51
|
end
|
38
52
|
end
|
@@ -3,48 +3,36 @@ require_relative './model'
|
|
3
3
|
module Bitfinex
|
4
4
|
module Models
|
5
5
|
class FundingTicker < Model
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
BOOL_FIELDS = []
|
7
|
+
FIELDS = {
|
8
|
+
symbol: 0,
|
9
|
+
frr: 1,
|
10
|
+
bid: 2,
|
11
|
+
bid_size: 3,
|
12
|
+
bid_period: 4,
|
13
|
+
ask: 5,
|
14
|
+
ask_size: 6,
|
15
|
+
ask_period: 7,
|
16
|
+
daily_change: 8,
|
17
|
+
daily_change_perc: 9,
|
18
|
+
last_price: 10,
|
19
|
+
volume: 11,
|
20
|
+
high: 12,
|
21
|
+
low: 13
|
22
|
+
}
|
9
23
|
|
10
|
-
|
11
|
-
|
24
|
+
FIELDS.each do |key, index|
|
25
|
+
attr_accessor key
|
12
26
|
end
|
13
27
|
|
14
|
-
def
|
15
|
-
|
16
|
-
self.symbol,
|
17
|
-
[
|
18
|
-
self.frr, self.bid, self.bid_period, self.bid_size, self.ask,
|
19
|
-
self.ask_period, self.ask_size, self.daily_change,
|
20
|
-
self.daily_change_perc, self.last_price, self.volume, self.high,
|
21
|
-
self.low
|
22
|
-
]
|
23
|
-
]
|
28
|
+
def initialize (data)
|
29
|
+
super(data, FIELDS, BOOL_FIELDS)
|
24
30
|
end
|
25
31
|
|
26
|
-
def self.unserialize (
|
27
|
-
|
28
|
-
payload = arr[1]
|
29
|
-
data = payload.kind_of?(Array) ? payload : arr.dup[1..-1]
|
30
|
-
|
31
|
-
{
|
32
|
-
:symbol => symbol,
|
33
|
-
:frr => data[0],
|
34
|
-
:bid => data[1],
|
35
|
-
:bid_period => data[2],
|
36
|
-
:bid_size => data[3],
|
37
|
-
:ask => data[4],
|
38
|
-
:ask_period => data[5],
|
39
|
-
:ask_size => data[6],
|
40
|
-
:daily_change => data[7],
|
41
|
-
:daily_change_perc => data[8],
|
42
|
-
:last_price => data[9],
|
43
|
-
:volume => data[10],
|
44
|
-
:high => data[11],
|
45
|
-
:low => data[12]
|
46
|
-
}
|
32
|
+
def self.unserialize (data)
|
33
|
+
return Model.unserialize(data, FIELDS, BOOL_FIELDS)
|
47
34
|
end
|
35
|
+
|
48
36
|
end
|
49
37
|
end
|
50
38
|
end
|
data/lib/models/order.rb
CHANGED
@@ -16,14 +16,28 @@ module Bitfinex
|
|
16
16
|
:amount_orig => 7,
|
17
17
|
:type => 8,
|
18
18
|
:type_prev => 9,
|
19
|
+
:mts_tif => 10,
|
20
|
+
# placeholder
|
19
21
|
:flags => 12,
|
20
22
|
:status => 13,
|
23
|
+
# placeholder
|
24
|
+
# placeholder
|
21
25
|
:price => 16,
|
22
26
|
:price_avg => 17,
|
23
27
|
:price_trailing => 18,
|
24
28
|
:price_aux_limit => 19,
|
29
|
+
# placeholder
|
30
|
+
# placeholder
|
31
|
+
# placeholder
|
25
32
|
:notify => 23,
|
26
|
-
:
|
33
|
+
:hidden => 24,
|
34
|
+
:placed_id => 25,
|
35
|
+
# placeholder
|
36
|
+
# placeholder
|
37
|
+
:routing => 28,
|
38
|
+
# placeholder
|
39
|
+
# placeholder
|
40
|
+
:meta => 31
|
27
41
|
}
|
28
42
|
|
29
43
|
FLAG_OCO = 2 ** 14 # 16384
|
@@ -39,7 +53,7 @@ module Bitfinex
|
|
39
53
|
attr_accessor key
|
40
54
|
end
|
41
55
|
|
42
|
-
attr_accessor :last_amount, :
|
56
|
+
attr_accessor :last_amount, :lev
|
43
57
|
|
44
58
|
def self.gen_cid
|
45
59
|
@@last_cid += 1
|
@@ -57,6 +71,9 @@ module Bitfinex
|
|
57
71
|
set_oco(data[:oco]) if data.has_key?(:oco)
|
58
72
|
set_hidden(data[:hidden]) if data.has_key?(:hidden)
|
59
73
|
set_post_only(data[:post_only]) if data.has_key?(:post_only)
|
74
|
+
if data.has_key?(:lev)
|
75
|
+
@lev = data[:lev]
|
76
|
+
end
|
60
77
|
end
|
61
78
|
end
|
62
79
|
|
@@ -153,7 +170,6 @@ module Bitfinex
|
|
153
170
|
end
|
154
171
|
|
155
172
|
data = {
|
156
|
-
:gid => @gid,
|
157
173
|
:cid => cid,
|
158
174
|
:symbol => @symbol,
|
159
175
|
:type => @type,
|
@@ -161,6 +177,12 @@ module Bitfinex
|
|
161
177
|
:flags => @flags || 0,
|
162
178
|
:meta => @meta
|
163
179
|
}
|
180
|
+
if !@gid.nil?
|
181
|
+
data[:gid] = @gid
|
182
|
+
end
|
183
|
+
if !@lev.nil?
|
184
|
+
data[:lev] = @lev
|
185
|
+
end
|
164
186
|
|
165
187
|
data[:price] = BigDecimal.new(@price, 5).to_s if !@price.nil?
|
166
188
|
data[:price_trailing] = BigDecimal.new(@price_trailing, 5).to_s if !@price_trailing.nil?
|
data/lib/models/position.rb
CHANGED
@@ -14,7 +14,17 @@ module Bitfinex
|
|
14
14
|
:pl => 6,
|
15
15
|
:pl_perc => 7,
|
16
16
|
:liquidation_price => 8,
|
17
|
-
:leverage => 9
|
17
|
+
:leverage => 9,
|
18
|
+
# placeholder
|
19
|
+
:id => 11,
|
20
|
+
:mts_create => 12,
|
21
|
+
:mts_update => 13,
|
22
|
+
# placeholder
|
23
|
+
:type => 15,
|
24
|
+
# placeholder
|
25
|
+
:collateral => 17,
|
26
|
+
:callateral_min => 18,
|
27
|
+
:meta => 19
|
18
28
|
}
|
19
29
|
|
20
30
|
FIELDS.each do |key, index|
|
@@ -5,16 +5,17 @@ module Bitfinex
|
|
5
5
|
class TradingTicker < Model
|
6
6
|
BOOL_FIELDS = []
|
7
7
|
FIELDS = {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
symbol: 0,
|
9
|
+
bid: 1,
|
10
|
+
bid_size: 2,
|
11
|
+
ask: 3,
|
12
|
+
ask_size: 4,
|
13
|
+
daily_change: 5,
|
14
|
+
daily_change_perc: 6,
|
15
|
+
last_price: 7,
|
16
|
+
volume: 8,
|
17
|
+
high: 9,
|
18
|
+
low: 10
|
18
19
|
}
|
19
20
|
|
20
21
|
FIELDS.each do |key, index|
|
data/lib/rest/rest_client.rb
CHANGED
data/lib/rest/v1/orders.rb
CHANGED
@@ -10,11 +10,12 @@ module Bitfinex
|
|
10
10
|
# @param params :is_postonly [bool] (optional) true if the order should be post only. Default is false. Only relevant for limit orders
|
11
11
|
# @param params :ocoorder [bool] Set an additional STOP OCO order that will be linked with the current order
|
12
12
|
# @param params :buy_price_oco [decimal] If ocoorder is true, this field represent the price of the OCO stop order to place
|
13
|
+
# @param params :sell_price_oco [decimal] If ocoorder is true, this field represent the price of the OCO stop order to place
|
13
14
|
# @return [Hash]
|
14
15
|
# @example:
|
15
16
|
# client.new_order("usdbtc", 100, "market", "sell", 0)
|
16
17
|
def new_order(symbol, amount, type, side, price = nil, params = {})
|
17
|
-
check_params(params, %i{is_hidden is_postonly ocoorder buy_price_oco use_all_available})
|
18
|
+
check_params(params, %i{is_hidden is_postonly ocoorder buy_price_oco use_all_available sell_price_oco})
|
18
19
|
|
19
20
|
# for 'market' order, we need to pass a random positive price, not nil
|
20
21
|
price ||= 0.001 if type == "market" || type == "exchange market"
|
data/lib/rest/v2.rb
CHANGED
@@ -5,12 +5,16 @@ require_relative './v2/stats'
|
|
5
5
|
require_relative './v2/ticker'
|
6
6
|
require_relative './v2/trading'
|
7
7
|
require_relative './v2/utils'
|
8
|
+
require_relative './v2/orders'
|
9
|
+
require_relative './v2/wallet'
|
10
|
+
require_relative './v2/funding'
|
11
|
+
require_relative './v2/positions'
|
8
12
|
|
9
13
|
module Bitfinex
|
10
14
|
class RESTv2
|
11
15
|
attr_accessor :api_endpoint, :debug, :debug_connection, :api_version
|
12
16
|
attr_accessor :rest_timeout, :rest_open_timeout, :proxy
|
13
|
-
attr_accessor :api_key, :api_secret
|
17
|
+
attr_accessor :api_key, :api_secret, :aff_code
|
14
18
|
|
15
19
|
include Bitfinex::RESTClient
|
16
20
|
include Bitfinex::RESTv2Margin
|
@@ -19,6 +23,10 @@ module Bitfinex
|
|
19
23
|
include Bitfinex::RESTv2Ticker
|
20
24
|
include Bitfinex::RESTv2Trading
|
21
25
|
include Bitfinex::RESTv2Utils
|
26
|
+
include Bitfinex::RESTv2Orders
|
27
|
+
include Bitfinex::RESTv2Wallet
|
28
|
+
include Bitfinex::RESTv2Funding
|
29
|
+
include Bitfinex::RESTv2Positions
|
22
30
|
|
23
31
|
def initialize(args = {})
|
24
32
|
self.api_endpoint = args[:url] ? "#{args[:url]}/v2/" : "https://api.bitfinex.com/v2/"
|
@@ -29,6 +37,7 @@ module Bitfinex
|
|
29
37
|
self.rest_open_timeout = 30
|
30
38
|
self.api_key = args[:api_key]
|
31
39
|
self.api_secret = args[:api_secret]
|
40
|
+
self.aff_code = args[:aff_code]
|
32
41
|
end
|
33
42
|
|
34
43
|
def config
|
@@ -40,8 +49,9 @@ module Bitfinex
|
|
40
49
|
:rest_open_timeout => self.rest_open_timeout,
|
41
50
|
:proxy => self.proxy,
|
42
51
|
:api_key => self.api_key,
|
43
|
-
:api_secret => self.api_secret
|
52
|
+
:api_secret => self.api_secret,
|
53
|
+
:aff_code => self.aff_code
|
44
54
|
}
|
45
55
|
end
|
46
56
|
end
|
47
|
-
end
|
57
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Bitfinex
|
2
|
+
module RESTv2Funding
|
3
|
+
###
|
4
|
+
# Submit a new funding offer
|
5
|
+
#
|
6
|
+
# @param [Hash|FundingOffer] offer
|
7
|
+
#
|
8
|
+
# @return [Array] Raw notification
|
9
|
+
###
|
10
|
+
def submit_funding_offer(offer)
|
11
|
+
if offer.instance_of?(Models::FundingOffer)
|
12
|
+
packet = offer.to_new_order_packet
|
13
|
+
elsif offer.kind_of?(Hash)
|
14
|
+
packet = Models::FundingOffer.new(offer).to_new_order_packet
|
15
|
+
else
|
16
|
+
raise Exception, 'tried to submit offer of unkown type'
|
17
|
+
end
|
18
|
+
authenticated_post("auth/w/funding/offer/submit", params: packet).body
|
19
|
+
end
|
20
|
+
|
21
|
+
###
|
22
|
+
# Cancel an active funding offer
|
23
|
+
#
|
24
|
+
# @param [Hash|Array|FundingOffer|number] offer - must contain or be ID
|
25
|
+
#
|
26
|
+
# @return [Array] Raw notification
|
27
|
+
###
|
28
|
+
def cancel_funding_offer(offer)
|
29
|
+
if offer.is_a?(Numeric)
|
30
|
+
id = offer
|
31
|
+
elsif offer.is_a?(Array)
|
32
|
+
id = offer[0]
|
33
|
+
elsif offer.instance_of?(Models::FundingOffer)
|
34
|
+
id = offer.id
|
35
|
+
elsif offer.kind_of?(Hash)
|
36
|
+
id = offer[:id] || order['id']
|
37
|
+
else
|
38
|
+
raise Exception, 'tried to cancel offer with invalid ID'
|
39
|
+
end
|
40
|
+
authenticated_post("auth/w/funding/offer/cancel", params: { :id => id }).body
|
41
|
+
end
|
42
|
+
|
43
|
+
###
|
44
|
+
# Close a funding loan/credit
|
45
|
+
#
|
46
|
+
# @param [Hash|Array|FundingOffer|FundingLoan|FundingCredit|number] funding - must contain or be ID
|
47
|
+
#
|
48
|
+
# @return [Array] Raw notification
|
49
|
+
###
|
50
|
+
def close_funding(funding)
|
51
|
+
if funding.is_a?(Numeric)
|
52
|
+
id = funding
|
53
|
+
elsif funding.is_a?(Array)
|
54
|
+
id = funding[0]
|
55
|
+
elsif funding.instance_of?(Models::FundingOffer)
|
56
|
+
id = funding.id
|
57
|
+
elsif funding.instance_of?(Models::FundingLoan)
|
58
|
+
id = funding.id
|
59
|
+
elsif funding.instance_of?(Models::FundingCredit)
|
60
|
+
id = funding.id
|
61
|
+
elsif funding.kind_of?(Hash)
|
62
|
+
id = funding[:id] || order['id']
|
63
|
+
else
|
64
|
+
raise Exception, 'tried to close funding with invalid ID'
|
65
|
+
end
|
66
|
+
authenticated_post("auth/w/funding/close", params: { :id => id }).body
|
67
|
+
end
|
68
|
+
|
69
|
+
###
|
70
|
+
# Submit a new auto funding request
|
71
|
+
#
|
72
|
+
# @param [string] currency - urrency for which to enable auto-renew
|
73
|
+
# @param [number] amount - amount to be auto-renewed (Minimum 50 USD equivalent)
|
74
|
+
# @param [string] rate - percentage rate at which to auto-renew. (rate == 0 to renew at FRR)
|
75
|
+
# @param [integer] period - period in days
|
76
|
+
# @param [integer] status - 1 for activate and 0 for deactivate
|
77
|
+
#
|
78
|
+
# @return [Array] Raw notification
|
79
|
+
###
|
80
|
+
def submit_funding_auto(currency, amount, period, rate='0', status=1)
|
81
|
+
dec_amount = BigDecimal.new(amount, 8).to_s
|
82
|
+
payload = { :status => status, :currency => currency, :amount => dec_amount, :period => period, :rate => rate }
|
83
|
+
authenticated_post("auth/w/funding/auto", params: payload).body
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Bitfinex
|
2
|
+
module RESTv2Orders
|
3
|
+
# Get active orders
|
4
|
+
#
|
5
|
+
# example:
|
6
|
+
# client.orders
|
7
|
+
def orders
|
8
|
+
authenticated_post("auth/r/orders").body
|
9
|
+
end
|
10
|
+
|
11
|
+
# Get Trades generated by an Order
|
12
|
+
#
|
13
|
+
# @param order_id [int32] Id of the order
|
14
|
+
# @param symbol [string] symbol used for the order
|
15
|
+
#
|
16
|
+
# @return [Array]
|
17
|
+
#
|
18
|
+
# @example:
|
19
|
+
# client.order_trades 10010, "tBTCUSD"
|
20
|
+
#
|
21
|
+
def order_trades(order_id, symbol="tBTCUSD")
|
22
|
+
authenticated_post("auth/r/order/#{symbol}:#{order_id}/trades").body
|
23
|
+
end
|
24
|
+
|
25
|
+
###
|
26
|
+
# Submit a new order
|
27
|
+
#
|
28
|
+
# @param [Hash|Order] order
|
29
|
+
#
|
30
|
+
# @return [Array] Raw notification
|
31
|
+
###
|
32
|
+
def submit_order(order)
|
33
|
+
if order.instance_of?(Models::Order)
|
34
|
+
packet = order.to_new_order_packet
|
35
|
+
elsif order.kind_of?(Hash)
|
36
|
+
packet = Models::Order.new(order).to_new_order_packet
|
37
|
+
else
|
38
|
+
raise Exception, 'tried to submit order of unkown type'
|
39
|
+
end
|
40
|
+
|
41
|
+
if !@aff_code.nil?
|
42
|
+
unless packet[:meta]
|
43
|
+
packet[:meta] = {}
|
44
|
+
end
|
45
|
+
|
46
|
+
packet[:meta][:aff_code] = @aff_code
|
47
|
+
end
|
48
|
+
|
49
|
+
authenticated_post("auth/w/order/submit", params: packet).body
|
50
|
+
end
|
51
|
+
|
52
|
+
###
|
53
|
+
# Update an order with a changeset by ID
|
54
|
+
#
|
55
|
+
# @param [Hash] changes - must contain ID
|
56
|
+
#
|
57
|
+
# @return [Array] Raw notification
|
58
|
+
###
|
59
|
+
def update_order (changes)
|
60
|
+
authenticated_post("auth/w/order/update", params: changes).body
|
61
|
+
end
|
62
|
+
|
63
|
+
###
|
64
|
+
# Cancel an order by ID
|
65
|
+
#
|
66
|
+
# @param [Hash|Array|Order|number] order - must contain or be ID
|
67
|
+
#
|
68
|
+
# @return [Array] Raw notification
|
69
|
+
###
|
70
|
+
def cancel_order (order)
|
71
|
+
if order.is_a?(Numeric)
|
72
|
+
id = order
|
73
|
+
elsif order.is_a?(Array)
|
74
|
+
id = order[0]
|
75
|
+
elsif order.instance_of?(Models::Order)
|
76
|
+
id = order.id
|
77
|
+
elsif order.kind_of?(Hash)
|
78
|
+
id = order[:id] || order['id']
|
79
|
+
else
|
80
|
+
raise Exception, 'tried to cancel order with invalid ID'
|
81
|
+
end
|
82
|
+
authenticated_post("auth/w/order/cancel", params: { :id => id }).body
|
83
|
+
end
|
84
|
+
|
85
|
+
# TODO - requires websocket implementation as well
|
86
|
+
def cancel_multi ()
|
87
|
+
raise Exception, 'not implemented'
|
88
|
+
end
|
89
|
+
|
90
|
+
# TODO - requires websocket implementation as well
|
91
|
+
def order_multi ()
|
92
|
+
raise Exception, 'not implemented'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/rest/v2/personal.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Bitfinex
|
2
|
+
module RESTv2Positions
|
3
|
+
###
|
4
|
+
# Claim an active position
|
5
|
+
#
|
6
|
+
# @param [Hash|Array|Position|number] position - must contain or be ID
|
7
|
+
#
|
8
|
+
# @return [Array] Raw notification
|
9
|
+
###
|
10
|
+
def claim_position(position)
|
11
|
+
if position.is_a?(Numeric)
|
12
|
+
id = position
|
13
|
+
elsif position.is_a?(Array)
|
14
|
+
id = position[0]
|
15
|
+
elsif position.instance_of?(Models::Position)
|
16
|
+
id = position.id
|
17
|
+
elsif position.kind_of?(Hash)
|
18
|
+
id = position[:id] || position['id']
|
19
|
+
else
|
20
|
+
raise Exception, 'tried to claim position with invalid ID'
|
21
|
+
end
|
22
|
+
authenticated_post("auth/w/position/claim", params: { :id => id }).body
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/rest/v2/trading.rb
CHANGED
@@ -65,28 +65,6 @@ module Bitfinex
|
|
65
65
|
get("trades/#{symbol}", params).body
|
66
66
|
end
|
67
67
|
|
68
|
-
# Get active orders
|
69
|
-
#
|
70
|
-
# example:
|
71
|
-
# client.orders
|
72
|
-
def orders
|
73
|
-
authenticated_post("auth/r/orders").body
|
74
|
-
end
|
75
|
-
|
76
|
-
# Get Trades generated by an Order
|
77
|
-
#
|
78
|
-
# @param order_id [int32] Id of the order
|
79
|
-
# @param symbol [string] symbol used for the order
|
80
|
-
#
|
81
|
-
# @return [Array]
|
82
|
-
#
|
83
|
-
# @example:
|
84
|
-
# client.order_trades 10010, "tBTCUSD"
|
85
|
-
#
|
86
|
-
def order_trades(order_id, symbol="tBTCUSD")
|
87
|
-
authenticated_post("auth/r/order/#{symbol}:#{order_id}/trades").body
|
88
|
-
end
|
89
|
-
|
90
68
|
# Get active positions
|
91
69
|
#
|
92
70
|
# return [Array]
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Bitfinex
|
2
|
+
module RESTv2Wallet
|
3
|
+
# Get account wallets
|
4
|
+
#
|
5
|
+
# @example:
|
6
|
+
# client.wallets
|
7
|
+
def wallets
|
8
|
+
authenticated_post("auth/r/wallets").body
|
9
|
+
end
|
10
|
+
|
11
|
+
###
|
12
|
+
# Transfer between bitfinex wallets
|
13
|
+
#
|
14
|
+
# @param from [string] wallet to transfer funds from (exchange, margin ect...)
|
15
|
+
# @param to [string] wallet to transfer funds to (exchange, margin ect...)
|
16
|
+
# @param currency_from [string] original currency of funds
|
17
|
+
# @param currency_to [string] currency to convert funds to
|
18
|
+
# @param amount [number] amount of funds to convert
|
19
|
+
#
|
20
|
+
# @return [Array] Raw notification
|
21
|
+
###
|
22
|
+
def transfer (from, to, currency_from, currency_to, amount)
|
23
|
+
payload = { :from => from, :to => to, :currency => currency, :currency_to => currency_to, :amount => amount }
|
24
|
+
authenticated_post("auth/w/transfer", params: payload).body
|
25
|
+
end
|
26
|
+
|
27
|
+
###
|
28
|
+
# Get the deposit address for the given currency
|
29
|
+
#
|
30
|
+
# @param wallet [string] wallet to transfer funds from (exchange, margin ect...)
|
31
|
+
# @param method [string] funds transfer protocol (bitcoin, tetherus ect...)
|
32
|
+
#
|
33
|
+
# @return [Array] Raw notification
|
34
|
+
###
|
35
|
+
def deposit_address (wallet, method)
|
36
|
+
payload = { :wallet => wallet, :method => method, :op_renew => 0 }
|
37
|
+
authenticated_post("auth/w/deposit/address", params: payload).body
|
38
|
+
end
|
39
|
+
|
40
|
+
###
|
41
|
+
# Regenerate the deposit address for the given currency. All previous addresses
|
42
|
+
# are still active and can receive funds.
|
43
|
+
#
|
44
|
+
# @param wallet [string] wallet to transfer funds from (exchange, margin ect...)
|
45
|
+
# @param method [string] funds transfer protocol (bitcoin, tetherus ect...)
|
46
|
+
#
|
47
|
+
# @return [Array] Raw notification
|
48
|
+
###
|
49
|
+
def create_deposit_address (wallet, method)
|
50
|
+
payload = { :wallet => wallet, :method => method, :op_renew => 1 }
|
51
|
+
authenticated_post("auth/w/deposit/address", params: payload).body
|
52
|
+
end
|
53
|
+
|
54
|
+
###
|
55
|
+
# Withdraw from the given bitfinex wallet to the given cryptocurrency address
|
56
|
+
#
|
57
|
+
# @param wallet [string] wallet to transfer funds from (exchange, margin ect...)
|
58
|
+
# @param method [string] funds transfer protocol (bitcoin, tetherus ect...)
|
59
|
+
# @param amount [number] amount of funds to withdraw
|
60
|
+
# @param address [string] public key destination address
|
61
|
+
#
|
62
|
+
# @return [Array] Raw notification
|
63
|
+
###
|
64
|
+
def withdraw (wallet, method, amount, address)
|
65
|
+
payload = { :wallet => wallet, :method => method, :amount => amount, :address => address }
|
66
|
+
authenticated_post("auth/w/withdraw", params: { :id => id }).body
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/ws/ws2.rb
CHANGED
@@ -52,6 +52,7 @@ module Bitfinex
|
|
52
52
|
#
|
53
53
|
# @param [Hash] params
|
54
54
|
# @param [string] params.url - connection URL
|
55
|
+
# @param [string] params.aff_code - optional affiliate code to be applied to all orders
|
55
56
|
# @param [string] params.api_key
|
56
57
|
# @param [string] params.api_secret
|
57
58
|
# @param [boolean] params.manage_order_books - if true, order books are persisted internally, allowing for automatic checksum verification
|
@@ -64,6 +65,7 @@ module Bitfinex
|
|
64
65
|
@l.progname = 'ws2'
|
65
66
|
|
66
67
|
@url = params[:url] || 'wss://api.bitfinex.com/ws/2'
|
68
|
+
@aff_code = params[:aff_code]
|
67
69
|
@api_key = params[:api_key]
|
68
70
|
@api_secret = params[:api_secret]
|
69
71
|
@manage_obs = params[:manage_order_books]
|
@@ -229,11 +231,12 @@ module Bitfinex
|
|
229
231
|
|
230
232
|
def handle_ticker_message (msg, chan) # :nodoc:
|
231
233
|
payload = msg[1]
|
234
|
+
payload_with_sym = [chan['symbol']].concat(payload)
|
232
235
|
|
233
236
|
if chan['symbol'][0] === 't'
|
234
|
-
emit(:ticker, chan['symbol'], @transform ? Models::TradingTicker.new(
|
237
|
+
emit(:ticker, chan['symbol'], @transform ? Models::TradingTicker.new(payload_with_sym) : payload)
|
235
238
|
else
|
236
|
-
emit(:ticker, chan['symbol'], @transform ? Models::FundingTicker.new(
|
239
|
+
emit(:ticker, chan['symbol'], @transform ? Models::FundingTicker.new(payload_with_sym) : payload)
|
237
240
|
end
|
238
241
|
end
|
239
242
|
|
@@ -721,6 +724,14 @@ module Bitfinex
|
|
721
724
|
raise Exception, 'tried to submit order of unkown type'
|
722
725
|
end
|
723
726
|
|
727
|
+
if !@aff_code.nil?
|
728
|
+
unless packet[:meta]
|
729
|
+
packet[:meta] = {}
|
730
|
+
end
|
731
|
+
|
732
|
+
packet[:meta][:aff_code] = @aff_code
|
733
|
+
end
|
734
|
+
|
724
735
|
@ws.send(JSON.generate([0, 'on', nil, packet]))
|
725
736
|
|
726
737
|
if packet.has_key?(:cid) && !cb.nil?
|
metadata
CHANGED
@@ -1,73 +1,73 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitfinex-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bitfinex
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.15.3
|
20
|
-
- - "
|
20
|
+
- - "~>"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: 0.15.3
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - "
|
27
|
+
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 0.15.3
|
30
|
-
- - "
|
30
|
+
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.15.3
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: eventmachine
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: 1.2.7
|
40
|
-
- - "
|
40
|
+
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: 1.2.7
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - "
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: 1.2.7
|
50
|
-
- - "
|
50
|
+
- - "~>"
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: 1.2.7
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: faraday-detailed_logger
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- - "
|
57
|
+
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: 2.1.2
|
60
|
-
- - "
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: 2.1.2
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - "
|
67
|
+
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: 2.1.2
|
70
|
-
- - "
|
70
|
+
- - "~>"
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: 2.1.2
|
73
73
|
- !ruby/object:Gem::Dependency
|
@@ -88,120 +88,120 @@ dependencies:
|
|
88
88
|
name: json
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- - "~>"
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 2.1.0
|
94
91
|
- - ">="
|
95
92
|
- !ruby/object:Gem::Version
|
96
|
-
version: 2.
|
93
|
+
version: 2.2.0
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.2.0
|
97
97
|
type: :runtime
|
98
98
|
prerelease: false
|
99
99
|
version_requirements: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 2.1.0
|
104
101
|
- - ">="
|
105
102
|
- !ruby/object:Gem::Version
|
106
|
-
version: 2.
|
103
|
+
version: 2.2.0
|
104
|
+
- - "~>"
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: 2.2.0
|
107
107
|
- !ruby/object:Gem::Dependency
|
108
108
|
name: faraday_middleware
|
109
109
|
requirement: !ruby/object:Gem::Requirement
|
110
110
|
requirements:
|
111
|
-
- - "
|
111
|
+
- - ">="
|
112
112
|
- !ruby/object:Gem::Version
|
113
113
|
version: 0.12.2
|
114
|
-
- - "
|
114
|
+
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: 0.12.2
|
117
117
|
type: :runtime
|
118
118
|
prerelease: false
|
119
119
|
version_requirements: !ruby/object:Gem::Requirement
|
120
120
|
requirements:
|
121
|
-
- - "
|
121
|
+
- - ">="
|
122
122
|
- !ruby/object:Gem::Version
|
123
123
|
version: 0.12.2
|
124
|
-
- - "
|
124
|
+
- - "~>"
|
125
125
|
- !ruby/object:Gem::Version
|
126
126
|
version: 0.12.2
|
127
127
|
- !ruby/object:Gem::Dependency
|
128
128
|
name: emittr
|
129
129
|
requirement: !ruby/object:Gem::Requirement
|
130
130
|
requirements:
|
131
|
-
- - "
|
131
|
+
- - ">="
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: 0.1.0
|
134
|
-
- - "
|
134
|
+
- - "~>"
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: 0.1.0
|
137
137
|
type: :runtime
|
138
138
|
prerelease: false
|
139
139
|
version_requirements: !ruby/object:Gem::Requirement
|
140
140
|
requirements:
|
141
|
-
- - "
|
141
|
+
- - ">="
|
142
142
|
- !ruby/object:Gem::Version
|
143
143
|
version: 0.1.0
|
144
|
-
- - "
|
144
|
+
- - "~>"
|
145
145
|
- !ruby/object:Gem::Version
|
146
146
|
version: 0.1.0
|
147
147
|
- !ruby/object:Gem::Dependency
|
148
148
|
name: dotenv
|
149
149
|
requirement: !ruby/object:Gem::Requirement
|
150
150
|
requirements:
|
151
|
-
- - "
|
151
|
+
- - ">="
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: 2.5.0
|
154
|
-
- - "
|
154
|
+
- - "~>"
|
155
155
|
- !ruby/object:Gem::Version
|
156
156
|
version: 2.5.0
|
157
157
|
type: :runtime
|
158
158
|
prerelease: false
|
159
159
|
version_requirements: !ruby/object:Gem::Requirement
|
160
160
|
requirements:
|
161
|
-
- - "
|
161
|
+
- - ">="
|
162
162
|
- !ruby/object:Gem::Version
|
163
163
|
version: 2.5.0
|
164
|
-
- - "
|
164
|
+
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: 2.5.0
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: faraday_adapter_socks
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
|
-
- - "
|
171
|
+
- - ">="
|
172
172
|
- !ruby/object:Gem::Version
|
173
173
|
version: 0.1.1
|
174
|
-
- - "
|
174
|
+
- - "~>"
|
175
175
|
- !ruby/object:Gem::Version
|
176
176
|
version: 0.1.1
|
177
177
|
type: :runtime
|
178
178
|
prerelease: false
|
179
179
|
version_requirements: !ruby/object:Gem::Requirement
|
180
180
|
requirements:
|
181
|
-
- - "
|
181
|
+
- - ">="
|
182
182
|
- !ruby/object:Gem::Version
|
183
183
|
version: 0.1.1
|
184
|
-
- - "
|
184
|
+
- - "~>"
|
185
185
|
- !ruby/object:Gem::Version
|
186
186
|
version: 0.1.1
|
187
187
|
- !ruby/object:Gem::Dependency
|
188
188
|
name: zlib
|
189
189
|
requirement: !ruby/object:Gem::Requirement
|
190
190
|
requirements:
|
191
|
-
- - "
|
191
|
+
- - ">="
|
192
192
|
- !ruby/object:Gem::Version
|
193
193
|
version: 1.0.0
|
194
|
-
- - "
|
194
|
+
- - "~>"
|
195
195
|
- !ruby/object:Gem::Version
|
196
196
|
version: 1.0.0
|
197
197
|
type: :runtime
|
198
198
|
prerelease: false
|
199
199
|
version_requirements: !ruby/object:Gem::Requirement
|
200
200
|
requirements:
|
201
|
-
- - "
|
201
|
+
- - ">="
|
202
202
|
- !ruby/object:Gem::Version
|
203
203
|
version: 1.0.0
|
204
|
-
- - "
|
204
|
+
- - "~>"
|
205
205
|
- !ruby/object:Gem::Version
|
206
206
|
version: 1.0.0
|
207
207
|
description: Official Bitfinex API ruby wrapper
|
@@ -253,12 +253,16 @@ files:
|
|
253
253
|
- lib/rest/v1/trades.rb
|
254
254
|
- lib/rest/v1/wallet.rb
|
255
255
|
- lib/rest/v2.rb
|
256
|
+
- lib/rest/v2/funding.rb
|
256
257
|
- lib/rest/v2/margin.rb
|
258
|
+
- lib/rest/v2/orders.rb
|
257
259
|
- lib/rest/v2/personal.rb
|
260
|
+
- lib/rest/v2/positions.rb
|
258
261
|
- lib/rest/v2/stats.rb
|
259
262
|
- lib/rest/v2/ticker.rb
|
260
263
|
- lib/rest/v2/trading.rb
|
261
264
|
- lib/rest/v2/utils.rb
|
265
|
+
- lib/rest/v2/wallet.rb
|
262
266
|
- lib/ws/ws2.rb
|
263
267
|
homepage: https://www.bitfinex.com/
|
264
268
|
licenses:
|
@@ -279,8 +283,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
279
283
|
- !ruby/object:Gem::Version
|
280
284
|
version: '0'
|
281
285
|
requirements: []
|
282
|
-
|
283
|
-
rubygems_version: 2.6.14
|
286
|
+
rubygems_version: 3.0.6
|
284
287
|
signing_key:
|
285
288
|
specification_version: 4
|
286
289
|
summary: Bitfinex API Wrapper
|