binance-ruby 0.4 → 0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 187b7d39acf68364d1b7117bab98bcb580bfb7f771d9f8cc5e54108fc57545da
4
- data.tar.gz: bbfd2f1b1dc3df0ad9be8a5c6aa7c18aea49b44f56ff1e72da6ebc4e6a24d5a9
3
+ metadata.gz: bbd02bd36bb807895e727ed07261b63c4f8863862dd9016723b69e47d7033856
4
+ data.tar.gz: 64c57054923d757d07cbec602af8a6cc687a8646f65c8c62c63691e872a4e325
5
5
  SHA512:
6
- metadata.gz: 77e1563be39775bc8dbfc21f349571a17a08b87e81262fc6f90dc2164445088ffdb47672ac61f750fb73f92c318654f6b0e5b6a742fce24c03b662b31a540ebb
7
- data.tar.gz: 5524b974767756f2da4984c6d7dcdfafe1dbcd40a8b3781b8b7552c3cb070516061fef2821d6fd673bcebdff8be9999d5c8217159ac5c460d35a17fcb6b8c5c0
6
+ metadata.gz: 01de466a3ba9a8811493029f1eef4ee059f0934ea165854b842c2d655e78fcc3677806ea6fd562142143b8af51afa338fd0f98c5875696f33b75c57efd25b288
7
+ data.tar.gz: cf17dfb48360a3a3ee089fb1461f50660f63344666dab63e3a2e42eb575a28a3bad121499795bae01f1e4d300deb385ed8c5128046a4be42cd3580ca0a8a37c5
@@ -1,12 +1,13 @@
1
- require 'active_support/core_ext/string'
2
- require 'awrence'
3
- require 'httparty'
1
+ require "active_support/core_ext/string"
2
+ require "awrence"
3
+ require "httparty"
4
4
 
5
- require 'binance/api'
6
- require 'binance/api/account'
7
- require 'binance/api/configuration'
8
- require 'binance/api/data_stream'
9
- require 'binance/api/error'
10
- require 'binance/api/order'
11
- require 'binance/api/request'
5
+ require "binance/api"
6
+ require "binance/api/account"
7
+ require "binance/api/configuration"
8
+ require "binance/api/data_stream"
9
+ require "binance/api/error"
10
+ require "binance/api/margin/order"
11
+ require "binance/api/order"
12
+ require "binance/api/request"
12
13
  require "binance/api/version"
@@ -3,49 +3,49 @@ module Binance
3
3
  class << self
4
4
  # Valid limits:[5, 10, 20, 50, 100, 500, 1000]
5
5
  def candlesticks!(endTime: nil, interval: nil, limit: 500, startTime: nil, symbol: nil)
6
- raise Error.new(message: 'interval is required') unless interval
7
- raise Error.new(message: 'symbol is required') unless symbol
6
+ raise Error.new(message: "interval is required") unless interval
7
+ raise Error.new(message: "symbol is required") unless symbol
8
8
  params = { endTime: endTime, interval: interval, limit: limit, startTime: startTime, symbol: symbol }
9
- Request.send!(api_key_type: :read_info, path: '/api/v1/klines', params: params)
9
+ Request.send!(api_key_type: :read_info, path: "/api/v1/klines", params: params)
10
10
  end
11
11
 
12
12
  def compressed_aggregate_trades!(endTime: nil, fromId: nil, limit: 500, startTime: nil, symbol: nil)
13
13
  raise Error.new(message: "symbol is required") unless symbol
14
14
  params = {
15
- endTime: endTime, fromId: fromId, limit: limit, startTime: startTime, symbol: symbol
15
+ endTime: endTime, fromId: fromId, limit: limit, startTime: startTime, symbol: symbol,
16
16
  }.delete_if { |key, value| value.nil? }
17
- Request.send!(api_key_type: :read_info, path: '/api/v1/aggTrades', params: params)
17
+ Request.send!(api_key_type: :read_info, path: "/api/v1/aggTrades", params: params)
18
18
  end
19
19
 
20
20
  def depth!(symbol: nil, limit: 100)
21
21
  raise Error.new(message: "symbol is required") unless symbol
22
22
  params = { limit: limit, symbol: symbol }
23
- Request.send!(api_key_type: :read_info, path: '/api/v1/depth', params: params)
23
+ Request.send!(api_key_type: :read_info, path: "/api/v1/depth", params: params)
24
24
  end
25
25
 
26
26
  def exchange_info!
27
- Request.send!(api_key_type: :read_info, path: '/api/v1/exchangeInfo')
27
+ Request.send!(api_key_type: :read_info, path: "/api/v1/exchangeInfo")
28
28
  end
29
29
 
30
30
  def historical_trades!(symbol: nil, limit: 500, fromId: nil)
31
31
  raise Error.new(message: "symbol is required") unless symbol
32
32
  params = { fromId: fromId, limit: limit, symbol: symbol }
33
- Request.send!(api_key_type: :read_info, path: '/api/v1/historicalTrades', params: params, security_type: :market_data)
33
+ Request.send!(api_key_type: :read_info, path: "/api/v1/historicalTrades", params: params, security_type: :market_data)
34
34
  end
35
35
 
36
36
  def info!(recvWindow: nil)
37
37
  timestamp = Configuration.timestamp
38
38
  params = { recvWindow: recvWindow, timestamp: timestamp }.delete_if { |key, value| value.nil? }
39
- Request.send!(api_key_type: :read_info, path: '/api/v3/account', params: params, security_type: :user_data)
39
+ Request.send!(api_key_type: :read_info, path: "/api/v3/account", params: params, security_type: :user_data)
40
40
  end
41
41
 
42
42
  def ping!
43
- Request.send!(path: '/api/v1/ping')
43
+ Request.send!(path: "/api/v1/ping")
44
44
  end
45
45
 
46
46
  def ticker!(symbol: nil, type: nil)
47
47
  ticker_type = type&.to_sym
48
- error_message = "type must be one of: #{ticker_types.join(', ')}. #{type} was provided."
48
+ error_message = "type must be one of: #{ticker_types.join(", ")}. #{type} was provided."
49
49
  raise Error.new(message: error_message) unless ticker_types.include? ticker_type
50
50
  path = ticker_path(type: ticker_type)
51
51
  params = symbol ? { symbol: symbol } : {}
@@ -53,13 +53,13 @@ module Binance
53
53
  end
54
54
 
55
55
  def time!
56
- Request.send!(path: '/api/v1/time')
56
+ Request.send!(path: "/api/v1/time")
57
57
  end
58
58
 
59
59
  def trades!(symbol: nil, limit: 500)
60
60
  raise Error.new(message: "symbol is required") unless symbol
61
61
  params = { limit: limit, symbol: symbol }
62
- Request.send!(api_key_type: :read_info, path: '/api/v1/trades', params: params)
62
+ Request.send!(api_key_type: :read_info, path: "/api/v1/trades", params: params)
63
63
  end
64
64
 
65
65
  private
@@ -67,8 +67,8 @@ module Binance
67
67
  def ticker_path(type:)
68
68
  case type
69
69
  when :daily
70
- '/api/v1/ticker/24hr'
71
- when :price, :bookTicker
70
+ "/api/v1/ticker/24hr"
71
+ when :price, :bookTicker, :avgPrice
72
72
  "/api/v3/ticker/#{type.to_s.camelize(:lower)}"
73
73
  end
74
74
  end
@@ -1,43 +1,54 @@
1
- require 'openssl'
2
- require 'base64'
1
+ require "openssl"
2
+ require "base64"
3
3
 
4
4
  module Binance
5
5
  module Api
6
6
  class Configuration
7
7
  class << self
8
- attr_writer :api_key, :read_info_api_key, :trading_api_key, :withdrawals_api_key
9
- attr_writer :secret_key
10
-
8
+ attr_writer :api_key, :locale, :read_info_api_key, :secret_key,
9
+ :trading_api_key, :withdrawals_api_key
10
+
11
11
  def api_key(type: nil)
12
12
  raise Error.new(message: "invalid security_type type: #{type}.") unless type.nil? || api_key_types.include?(type)
13
13
  instance_api_key(type: type) || ENV["BINANCE_#{type.to_s.humanize.upcase}_API_KEY"] ||
14
- instance_api_key || ENV["BINANCE_API_KEY"]
14
+ instance_api_key || ENV["BINANCE_API_KEY"]
15
+ end
16
+
17
+ def tld
18
+ tld = ENV["BINANCE_TLD"]&.downcase&.to_sym || :com
19
+ error_message = "Invalid tld (top-level-domain): #{tld}. Use one of: #{allowed_tlds.join(", ")}."
20
+ raise Error.new(message: error_message) unless allowed_tlds.include?(tld)
21
+ tld
15
22
  end
16
-
23
+
17
24
  def secret_key
18
- instance_variable_get("@secret_key") || ENV['BINANCE_SECRET_KEY']
25
+ instance_variable_get("@secret_key") || ENV["BINANCE_SECRET_KEY"]
19
26
  end
20
27
 
21
28
  def signed_request_signature(payload:)
22
29
  raise Error.new(message: "environment variable 'BINANCE_SECRET_KEY' is required " \
23
- "for signed requests.") unless secret_key
30
+ "for signed requests.") unless secret_key
24
31
  digest = OpenSSL::Digest::SHA256.new
25
32
  OpenSSL::HMAC.hexdigest(digest, secret_key, payload)
26
33
  end
27
34
 
28
35
  def timestamp
29
- Time.now.utc.strftime('%s%3N')
36
+ Time.now.utc.strftime("%s%3N")
30
37
  end
31
38
 
32
39
  private
33
40
 
41
+ def allowed_tlds
42
+ [:com, :us]
43
+ end
44
+
34
45
  def api_key_types
35
46
  [:none, :read_info, :trading, :withdrawals].freeze
36
47
  end
37
48
 
38
49
  def instance_api_key(type: nil)
39
- var = "#{type.to_s.downcase}_api_key".sub(/^\_/, '')
40
- instance_variable_get('@' + var)
50
+ var = "#{type.to_s.downcase}_api_key".sub(/^\_/, "")
51
+ instance_variable_get("@" + var)
41
52
  end
42
53
  end
43
54
  end
@@ -0,0 +1,54 @@
1
+ module Binance
2
+ module Api
3
+ module Margin
4
+ class Order
5
+ class << self
6
+ def create!(symbol: nil, isIsolated: false, side: nil, type: nil, quantity: nil,
7
+ quoteOrderQty: nil, price: nil, stopPrice: nil, newClientOrderId: nil,
8
+ icebergQty: nil, newOrderRespType: nil, sideEffectType: nil, timeInForce: nil,
9
+ recvWindow: nil)
10
+ timestamp = Configuration.timestamp
11
+ params = {
12
+ symbol: symbol, isIsolated: isIsolated, side: side, type: type,
13
+ quantity: quantity, quoteOrderQty: quoteOrderQty, price: price,
14
+ stopPrice: stopPrice, newClientOrderId: newClientOrderId, icebergQty: icebergQty,
15
+ newOrderRespType: newOrderRespType, sideEffectType: sideEffectType,
16
+ timeInForce: timeInForce, recvWindow: recvWindow, timestamp: timestamp,
17
+ }.delete_if { |_, value| value.nil? }
18
+ ensure_required_create_keys!(params: params)
19
+ path = "/sapi/v1/margin/order"
20
+ Request.send!(api_key_type: :trading, method: :post, path: path,
21
+ params: params, security_type: :trade)
22
+ end
23
+
24
+ private
25
+
26
+ def additional_required_create_keys(type:)
27
+ case type
28
+ when :limit
29
+ [:price, :timeInForce].freeze
30
+ when :stop_loss, :take_profit
31
+ [:stopPrice].freeze
32
+ when :stop_loss_limit, :take_profit_limit
33
+ [:price, :stopPrice, :timeInForce].freeze
34
+ when :limit_maker
35
+ [:price].freeze
36
+ else
37
+ [].freeze
38
+ end
39
+ end
40
+
41
+ def ensure_required_create_keys!(params:)
42
+ keys = required_create_keys.dup.concat(additional_required_create_keys(type: params[:type]))
43
+ missing_keys = keys.select { |key| params[key].nil? }
44
+ raise Error.new(message: "required keys are missing: #{missing_keys.join(", ")}") unless missing_keys.empty?
45
+ end
46
+
47
+ def required_create_keys
48
+ [:symbol, :side, :type, :timestamp].freeze
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -16,14 +16,14 @@ module Binance
16
16
  def all_open!(recvWindow: 5000, symbol: nil)
17
17
  timestamp = Configuration.timestamp
18
18
  params = { recvWindow: recvWindow, symbol: symbol, timestamp: timestamp }
19
- Request.send!(api_key_type: :read_info, path: '/api/v3/openOrders',
19
+ Request.send!(api_key_type: :read_info, path: "/api/v3/openOrders",
20
20
  params: params, security_type: :user_data)
21
21
  end
22
22
 
23
23
  def cancel!(orderId: nil, originalClientOrderId: nil, newClientOrderId: nil, recvWindow: nil, symbol: nil)
24
24
  raise Error.new(message: "symbol is required") if symbol.nil?
25
25
  raise Error.new(message: "either orderid or originalclientorderid " \
26
- "is required") if orderId.nil? && originalClientOrderId.nil?
26
+ "is required") if orderId.nil? && originalClientOrderId.nil?
27
27
  timestamp = Configuration.timestamp
28
28
  params = { orderId: orderId, origClientOrderId: originalClientOrderId,
29
29
  newClientOrderId: newClientOrderId, recvWindow: recvWindow,
@@ -36,14 +36,14 @@ module Binance
36
36
  price: nil, quantity: nil, recvWindow: nil, stopPrice: nil, symbol: nil,
37
37
  side: nil, type: nil, timeInForce: nil, test: false)
38
38
  timestamp = Configuration.timestamp
39
- params = {
39
+ params = {
40
40
  icebergQty: icebergQuantity, newClientOrderId: newClientOrderId,
41
41
  newOrderRespType: newOrderResponseType, price: price, quantity: quantity,
42
42
  recvWindow: recvWindow, stopPrice: stopPrice, symbol: symbol, side: side,
43
- type: type, timeInForce: timeInForce, timestamp: timestamp
43
+ type: type, timeInForce: timeInForce, timestamp: timestamp,
44
44
  }.delete_if { |key, value| value.nil? }
45
45
  ensure_required_create_keys!(params: params)
46
- path = "/api/v3/order#{'/test' if test}"
46
+ path = "/api/v3/order#{"/test" if test}"
47
47
  Request.send!(api_key_type: :trading, method: :post, path: path,
48
48
  params: params, security_type: :trade)
49
49
  end
@@ -51,11 +51,11 @@ module Binance
51
51
  def status!(orderId: nil, originalClientOrderId: nil, recvWindow: nil, symbol: nil)
52
52
  raise Error.new(message: "symbol is required") if symbol.nil?
53
53
  raise Error.new(message: "either orderid or originalclientorderid " \
54
- "is required") if orderId.nil? && originalClientOrderId.nil?
54
+ "is required") if orderId.nil? && originalClientOrderId.nil?
55
55
  timestamp = Configuration.timestamp
56
56
  params = {
57
57
  orderId: orderId, origClientOrderId: originalClientOrderId, recvWindow: recvWindow,
58
- symbol: symbol, timestamp: timestamp
58
+ symbol: symbol, timestamp: timestamp,
59
59
  }.delete_if { |key, value| value.nil? }
60
60
  Request.send!(api_key_type: :trading, path: "/api/v3/order",
61
61
  params: params, security_type: :user_data)
@@ -81,7 +81,7 @@ module Binance
81
81
  def ensure_required_create_keys!(params:)
82
82
  keys = required_create_keys.dup.concat(additional_required_create_keys(type: params[:type]))
83
83
  missing_keys = keys.select { |key| params[key].nil? }
84
- raise Error.new(message: "required keys are missing: #{missing_keys.join(', ')}") unless missing_keys.empty?
84
+ raise Error.new(message: "required keys are missing: #{missing_keys.join(", ")}") unless missing_keys.empty?
85
85
  end
86
86
 
87
87
  def required_create_keys
@@ -2,16 +2,14 @@ module Binance
2
2
  module Api
3
3
  class Request
4
4
  include HTTParty
5
-
6
- base_uri 'https://api.binance.com'
7
-
8
5
  class << self
9
- def send!(api_key_type: :none, headers: {}, method: :get, path: '/', params: {}, security_type: :none)
6
+ def send!(api_key_type: :none, headers: {}, method: :get, path: "/", params: {}, security_type: :none)
7
+ self.base_uri "https://api.binance.#{Configuration.tld}"
8
+
10
9
  raise Error.new(message: "invalid security type #{security_type}") unless security_types.include?(security_type)
11
10
  all_headers = default_headers(api_key_type: api_key_type, security_type: security_type)
12
11
  params.delete_if { |k, v| v.nil? }
13
- params.merge!(signature: signed_request_signature(params: params)) \
14
- if [:trade, :user_data].include?(security_type)
12
+ params.merge!(signature: signed_request_signature(params: params)) if [:trade, :user_data].include?(security_type)
15
13
  # send() is insecure so don't use it.
16
14
  case method
17
15
  when :get
@@ -25,15 +23,15 @@ module Binance
25
23
  else
26
24
  raise Error.new(message: "invalid http method used: #{method}")
27
25
  end
28
- process!(response: response || '{}')
26
+ process!(response: response || "{}")
29
27
  end
30
28
 
31
29
  private
32
30
 
33
31
  def default_headers(api_key_type:, security_type:)
34
32
  headers = {}
35
- headers['Content-Type'] = 'application/json; charset=utf-8'
36
- headers['X-MBX-APIKEY'] = Configuration.api_key(type: api_key_type) unless security_type == :none
33
+ headers["Content-Type"] = "application/json; charset=utf-8"
34
+ headers["X-MBX-APIKEY"] = Configuration.api_key(type: api_key_type) unless security_type == :none
37
35
  headers
38
36
  end
39
37
 
@@ -48,7 +46,7 @@ module Binance
48
46
  end
49
47
 
50
48
  def signed_request_signature(params:)
51
- payload = params.map { |key, value| "#{key}=#{value}" }.join('&')
49
+ payload = params.map { |key, value| "#{key}=#{value}" }.join("&")
52
50
  Configuration.signed_request_signature(payload: payload)
53
51
  end
54
52
  end
@@ -1,5 +1,5 @@
1
1
  module Binance
2
2
  module Api
3
- VERSION = "0.4"
3
+ VERSION = "0.5"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binance-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Peterson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-30 00:00:00.000000000 Z
11
+ date: 2021-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: codecov
@@ -109,19 +109,39 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.11.3
111
111
  - !ruby/object:Gem::Dependency
112
- name: activesupport
112
+ name: simplecov
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '5.1'
118
- type: :runtime
117
+ version: 0.20.0
118
+ type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '5.1'
124
+ version: 0.20.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: activesupport
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 5.1.0
132
+ - - "<"
133
+ - !ruby/object:Gem::Version
134
+ version: 7.0.0
135
+ type: :runtime
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: 5.1.0
142
+ - - "<"
143
+ - !ruby/object:Gem::Version
144
+ version: 7.0.0
125
145
  - !ruby/object:Gem::Dependency
126
146
  name: awrence
127
147
  requirement: !ruby/object:Gem::Requirement
@@ -163,6 +183,7 @@ files:
163
183
  - lib/binance/api/configuration.rb
164
184
  - lib/binance/api/data_stream.rb
165
185
  - lib/binance/api/error.rb
186
+ - lib/binance/api/margin/order.rb
166
187
  - lib/binance/api/order.rb
167
188
  - lib/binance/api/request.rb
168
189
  - lib/binance/api/version.rb
@@ -171,7 +192,7 @@ licenses:
171
192
  - MIT
172
193
  metadata:
173
194
  allowed_push_host: https://rubygems.org
174
- post_install_message:
195
+ post_install_message:
175
196
  rdoc_options: []
176
197
  require_paths:
177
198
  - lib
@@ -186,8 +207,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
207
  - !ruby/object:Gem::Version
187
208
  version: '0'
188
209
  requirements: []
189
- rubygems_version: 3.0.6
190
- signing_key:
210
+ rubygems_version: 3.0.8
211
+ signing_key:
191
212
  specification_version: 4
192
- summary: binance-ruby-0.4
213
+ summary: binance-ruby-0.5
193
214
  test_files: []