ftx-api 0.2.4 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 798edaba47ec4e363488fe462aafc23a07600270944492e0df2de61bb3a0df39
4
- data.tar.gz: 76bf0b23ced4ce5dd444d83dba36a8703481b859f16f05501c52750ec9928522
3
+ metadata.gz: 034ffdddca45eba8aefa59494ee718e329324b637f50585412eea9500a17011f
4
+ data.tar.gz: 6a19fc208851effb64df469a145d6ac76a94ea3ad6b2b4c338f07d99b7de57dd
5
5
  SHA512:
6
- metadata.gz: f7ca004638de0447346204c8be75d8368c1d7208c70bcdaf02b35127e7d863c477abb03deb2a1b04c853ac28c7d229ba6a681a66afd9b978364134525379d254
7
- data.tar.gz: 94fa7cc56036cd1911d2a7faa93043359749e46c6be75975128dbc3342fcce4225babebcf98d5ba3260361bd499f2dd51e9c17c780edfe850c35ae74e6f000dd
6
+ metadata.gz: e04b01cdc2240f3a69d8f3f7d2751d02f932fca080ee118918444a63b33b498cef423a090eaeeb5537244cb0513107a82e88ab9dc120f0e738df1c6465359d06
7
+ data.tar.gz: e8edc6cceb16276c0803185f1f025256e5b419d880dffc8487f53a1195e1b715b00cccc391be790229b8ba49d3c403fb1e2e03e1a54a6848654c39a9abb0190d
data/CHANGELOG.md CHANGED
@@ -4,4 +4,28 @@
4
4
  - Initial release
5
5
 
6
6
  ## [0.2.0] - 2021-09-23
7
- - Implement public API covering Markets and Futures only
7
+ - Implement public API covering Markets and Futures only
8
+
9
+ ## [0.2.1] - 2021-09-23
10
+ - Empty
11
+
12
+ ## [0.2.2] - 2021-10-05
13
+ - Include private API endpoints with tests
14
+
15
+ ## [0.2.3] - 2021-10-05
16
+ - Include private API endpoints with tests - further updates
17
+
18
+ ## [0.2.4] - 2021-10-05
19
+ - Fix error compact_blank creates for rails db:migrate
20
+
21
+ ## [0.2.5] - 2021-10-06
22
+ - Fix issues with post methods and add Convert endpoint
23
+
24
+ ## [0.2.6] - 2021-10-06
25
+ - Implement Fills endpoint including tests
26
+
27
+ ## [0.2.7] - 2021-10-06
28
+ - Implement orders get_by_client_id endpoint
29
+
30
+ ## [0.2.8] - 2021-10-18
31
+ - Implement funding endpoints
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ftx-api (0.2.4)
4
+ ftx-api (0.2.8)
5
5
  httparty (~> 0.19)
6
6
  openssl (~> 2.2)
7
7
 
@@ -69,4 +69,4 @@ DEPENDENCIES
69
69
  simplecov (< 0.18)
70
70
 
71
71
  BUNDLED WITH
72
- 2.2.27
72
+ 2.2.29
data/README.md CHANGED
@@ -4,8 +4,6 @@ This gem is a ruby SDK for the FTX crypto exchange REST API.
4
4
 
5
5
  API docs can be found on the [FTX developer site](https://docs.ftx.com/)
6
6
 
7
- It is still under development and currently only covers the markets and futures endpoints.
8
-
9
7
 
10
8
  ## Installation
11
9
 
@@ -25,7 +23,7 @@ Or install it yourself as:
25
23
 
26
24
  ## Usage
27
25
 
28
- ### Markets
26
+ ### Markets (public)
29
27
 
30
28
  Initialize a markets session:
31
29
  ```ruby
@@ -53,9 +51,9 @@ markets.historic('BTC/USD', resolution: 86400*30)
53
51
  ```
54
52
  *Check the [FTX API docs](https://docs.ftx.com/?python#get-historical-prices) for additional parameters such as start_time and end_time*
55
53
 
56
- Note: resolution is in seconds so 86,400 would be the number of seconds in a day. As a default, the API responds with 12 months of historical prices.
54
+ > Note: resolution is in seconds so 86,400 would be the number of seconds in a day. As a default, the API responds with 12 months of historical prices.
57
55
 
58
- ### Futures
56
+ ### Futures (public)
59
57
 
60
58
  Initialize a futures session:
61
59
  ```ruby
@@ -72,6 +70,18 @@ Fetch a single market price:
72
70
  futures.get('BTC-PERP')
73
71
  ```
74
72
 
73
+ Fetch stats for a future:
74
+ ```ruby
75
+ futures.stats('BTC-PERP')
76
+ ```
77
+
78
+ Fetch all or one funding rates:
79
+ ```ruby
80
+ futures.funding_rates(future: 'BTC-PERP')
81
+ ```
82
+
83
+ > Note: future is optional, start_time and end_time are also accepted per the FTX API docs
84
+
75
85
  ### Account
76
86
 
77
87
  Initialize an account session:
@@ -128,9 +138,14 @@ Query for all historical orders:
128
138
  orders.history
129
139
  ```
130
140
 
131
- Fetch a specific order:
141
+ Fetch a specific order by FTX `orderId`:
142
+ ```ruby
143
+ orders.get(order_id)
144
+ ```
145
+
146
+ Fetch a specific order by `clientId`:
132
147
  ```ruby
133
- orders.get
148
+ orders.get_by_client_id(clientId)
134
149
  ```
135
150
 
136
151
  Create a new order:
@@ -150,10 +165,81 @@ args = {
150
165
  orders.create(args)
151
166
  ```
152
167
 
153
- Note: the create order method is not included as a test, because I have not been able to find FTX test keys and it seems a bit ridiculous to execute a live order for testing.
168
+ > Note: the create order method is not included as a test, because I have not been able to find FTX test keys and it seems a bit ridiculous to execute a live order for testing.
154
169
 
155
170
  *Check the [FTX API docs](https://docs.ftx.com/#orders) for all parameters*
156
171
 
172
+ ### Fills
173
+
174
+ Initialize a fills session:
175
+ ```ruby
176
+ fills = FXT::API::Fills.new(key: 'YOUR FTX KEY', secret: 'YOUR FTX SECRET')
177
+ ```
178
+
179
+ Query for all fills:
180
+ ```ruby
181
+ fills.list
182
+ ```
183
+ or
184
+
185
+ ```ruby
186
+ fills.list(market: 'BTC/USD')
187
+ ```
188
+
189
+ > Note: market is optional
190
+
191
+ ### Funding
192
+
193
+ Initialize a funding session:
194
+ ```ruby
195
+ funding = FXT::API::Funding.new(key: 'YOUR FTX KEY', secret: 'YOUR FTX SECRET')
196
+ ```
197
+
198
+ Query for all or one funding payments:
199
+ ```ruby
200
+ funding.payments(future: 'BTC-PERP')
201
+ ```
202
+
203
+ Query for all or one funding rates:
204
+ ```ruby
205
+ funding.rates(future: 'BTC-PERP')
206
+ ```
207
+
208
+ > Note: future is optional, start_time and end_time are also accepted per the FTX API docs
209
+
210
+ ### Convert Coins
211
+
212
+ Initialize an convert session:
213
+ ```ruby
214
+ convert = FXT::API::Convert.new(key: 'YOUR FTX KEY', secret: 'YOUR FTX SECRET')
215
+ ```
216
+
217
+ Create a new quote:
218
+ ```ruby
219
+ args = {
220
+ size: 0.01, # 0.01 is the smallest increment
221
+ fromCoin: "USD",
222
+ toCoin: "BTC",
223
+ }
224
+
225
+ convert.new_quote(args)
226
+ ```
227
+
228
+ Response:
229
+ ```ruby
230
+ {:quoteId=>2*******3}
231
+ ```
232
+
233
+ Fetch a quote:
234
+ ```ruby
235
+ convert.get_quote('quoteId')
236
+ ```
237
+
238
+ Accept a quote:
239
+ ```ruby
240
+ convert.accept_quote('quoteId')
241
+ ```
242
+
157
243
  ## Development
158
244
 
159
245
  After checking out the repo, run `bin/setup` to install dependencies.
data/lib/ftx/api/base.rb CHANGED
@@ -4,15 +4,15 @@ require 'httparty'
4
4
 
5
5
  class FTX::API::Base
6
6
 
7
+ attr_reader :config, :key, :secret
8
+
7
9
  include HTTParty
8
10
  base_uri 'https://ftx.com/api'
9
11
 
10
- attr_reader :config, :key, :secret
11
-
12
12
  def initialize(args = {})
13
13
  @config = FTX::API::Config.new(args.dig(:config))
14
- @key = args.dig(:key)
15
- @secret = args.dig(:secret)
14
+ @key = args.fetch(:key, ENV['FTX_KEY'])
15
+ @secret = args.fetch(:secret, ENV['FTX_SECRET'])
16
16
  end
17
17
 
18
18
  protected
@@ -21,16 +21,21 @@ class FTX::API::Base
21
21
  uuid = SecureRandom.uuid
22
22
  print_log(:info, "[API] #{uuid} #{method.upcase} '#{path}' query = #{query}")
23
23
 
24
- body_or_query = method == :get ? :query : :body
24
+ if method == :get
25
+ body_or_query = :query
26
+ else
27
+ body_or_query = :body
28
+ query = query.to_json
29
+ end
25
30
 
26
31
  begin
27
32
  response = self.class.send(
28
- method,
29
- path,
33
+ method,
34
+ path,
30
35
  headers: headers,
31
36
  timeout: @config.timeout,
32
- body_or_query => query,
33
- ).parsed_response
37
+ body_or_query.to_sym => query
38
+ )
34
39
 
35
40
  print_log(:info, "[API] #{uuid} response #{response}")
36
41
  return parse_response(response)
@@ -43,6 +48,7 @@ class FTX::API::Base
43
48
  private
44
49
 
45
50
  def parse_response(response)
51
+ response = response.parsed_response
46
52
  if response.dig("success")
47
53
  response.dig("result").symbolize_keys
48
54
  else
@@ -54,7 +60,6 @@ class FTX::API::Base
54
60
  logger = @config.logger
55
61
  if logger
56
62
  puts "#{method}: #{message}"
57
- # logger[method] = message
58
63
  end
59
64
  end
60
65
 
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'private'
4
+
5
+ class FTX::API::Convert < FTX::API::Private
6
+
7
+ def new_quote(query = {})
8
+ raise ArgumentError.new(
9
+ "Size, fromCoin, toCoin params required"
10
+ ) unless [:fromCoin, :toCoin, :size].all? { |i| query.include? i }
11
+
12
+ send_request(:post, "/otc/quotes", query)
13
+ end
14
+
15
+ def get_quote(quote_id)
16
+ send_request(:get, "/otc/quotes/#{quote_id}", {})
17
+ end
18
+
19
+ def accept_quote(quote_id)
20
+ send_request(:post, "/otc/quotes/#{quote_id}/accept", {})
21
+ end
22
+
23
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'private'
4
+
5
+ class FTX::API::Fills < FTX::API::Private
6
+
7
+ def list(query = {})
8
+ send_request(:get, "/fills", query)
9
+ end
10
+
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'private'
4
+
5
+ class FTX::API::Funding < FTX::API::Private
6
+
7
+ def payments(query = {})
8
+ send_request(:get, '/funding_payments', query)
9
+ end
10
+
11
+ def rates(query = {})
12
+ send_request(:get, '/funding_rates', query)
13
+ end
14
+
15
+ end
@@ -11,5 +11,13 @@ class FTX::API::Futures < FTX::API::Public
11
11
  def get(futures_name)
12
12
  send_request(:get, "/futures/#{futures_name}", {})
13
13
  end
14
+
15
+ def stats(futures_name)
16
+ send_request(:get, "/futures/#{futures_name}/stats", {})
17
+ end
18
+
19
+ def funding_rates(query = {})
20
+ send_request(:get, '/funding_rates', query)
21
+ end
14
22
 
15
23
  end
@@ -16,6 +16,10 @@ class FTX::API::Orders < FTX::API::Private
16
16
  send_request(:get, "/orders/#{order_id}", {})
17
17
  end
18
18
 
19
+ def get_by_client_id(client_id)
20
+ send_request(:get, "/orders/by_client_id/#{client_id}", {})
21
+ end
22
+
19
23
  def create(query = {})
20
24
  raise ArgumentError.new(
21
25
  "Market, side, price (can be nil), tupe and size params required"
@@ -15,6 +15,8 @@ class FTX::API::Private < FTX::API::Base
15
15
  'FTX-KEY' => key,
16
16
  'FTX-SIGN' => signature(*args),
17
17
  'FTX-TS' => ts.to_s,
18
+ 'Content-Type' => 'application/json',
19
+ 'Accepts' => 'application/json',
18
20
  }
19
21
  end
20
22
 
@@ -26,12 +28,12 @@ class FTX::API::Private < FTX::API::Base
26
28
  payload = [ts, method.to_s.upcase, "/api", path].compact_empty
27
29
 
28
30
  if method==:post
29
- payload.push(query.to_json)
31
+ payload << query.to_json
30
32
  elsif method==:get
31
- payload.push("?" + URI.encode_www_form(query))
33
+ payload << ("?" + URI.encode_www_form(query))
32
34
  end unless query.empty?
33
35
 
34
- "#{payload.join}".encode("UTF-8")
36
+ payload.join.encode("UTF-8")
35
37
  end
36
38
 
37
39
  def ts
@@ -2,6 +2,6 @@
2
2
 
3
3
  module FTX
4
4
  module API
5
- VERSION = "0.2.4"
5
+ VERSION = "0.2.8"
6
6
  end
7
7
  end
data/lib/ftx/api.rb CHANGED
@@ -3,7 +3,10 @@ require_relative "../ext/base"
3
3
  require_relative "api/version"
4
4
  require_relative "api/config"
5
5
  require_relative "api/markets"
6
+ require_relative "api/futures"
6
7
  require_relative "api/account"
7
8
  require_relative "api/wallet"
8
9
  require_relative "api/orders"
9
- require_relative "api/futures"
10
+ require_relative "api/fills"
11
+ require_relative "api/funding"
12
+ require_relative "api/convert"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ftx-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - benrs44
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-05 00:00:00.000000000 Z
11
+ date: 2021-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -63,6 +63,9 @@ files:
63
63
  - lib/ftx/api/account.rb
64
64
  - lib/ftx/api/base.rb
65
65
  - lib/ftx/api/config.rb
66
+ - lib/ftx/api/convert.rb
67
+ - lib/ftx/api/fills.rb
68
+ - lib/ftx/api/funding.rb
66
69
  - lib/ftx/api/futures.rb
67
70
  - lib/ftx/api/markets.rb
68
71
  - lib/ftx/api/orders.rb