binance-ruby 1.0 → 1.2.1

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: 90f8673071ace387d77172b21b9066e11ea6613cf72275ca1090cfb94e7d8f65
4
- data.tar.gz: 860a8193bbb5c28877aa6e8ed6cac65c2680064a68be3bebc6913da1c74a51df
3
+ metadata.gz: 124f7e539a6f6e6003bf7c2619ba039a6a930037976815729398e34adb4686a1
4
+ data.tar.gz: a6dc10be4aa7629143663260ce33111b96b8a2f50b64ffef88bd219ed282ca12
5
5
  SHA512:
6
- metadata.gz: 73c5b120484d13c814f621784b3d8e255255a96ad98cad8f68494af778412ef6518e7ea0aaac69a42a1336dd1de93d640e7a040005360c08f35d2392242fa25b
7
- data.tar.gz: e1f8c8bc28eb9d12148fe3499842bf39a4d50d7b7a09bad69f740c20b040a912e71321eea4c9b08b8f5ffa1d66756e4ae0de4de4fe766a85432c36491f69503c
6
+ metadata.gz: 649dd4131cc420ae5b179616fdc4bc8d5b75e96ff864075c07ad47279b5a0819557f4f246a47a07e9367e1430fb8b48d063aa54ec7474397c065772be49d9481
7
+ data.tar.gz: 68c57f977409d0756df3a982c7a1c92a5b0af26b7c3c1fb3468bba855ac5057f9e0d925e5a81025edc1f78cdb27ac05df2b3d6a08d716e7f42d313014e5fb3db
data/lib/binance-ruby.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "active_support/core_ext/string"
2
2
  require "awrence"
3
3
  require "httparty"
4
+ require "faye/websocket"
4
5
 
5
6
  require "binance/api"
6
7
  require "binance/api/account"
@@ -13,3 +14,4 @@ require "binance/api/margin/order"
13
14
  require "binance/api/order"
14
15
  require "binance/api/request"
15
16
  require "binance/api/version"
17
+ require "binance/websocket"
@@ -19,6 +19,7 @@ module Binance
19
19
  when 1003 then TooManyRequests
20
20
  when 1006 then UnexpectedResponse
21
21
  when 1007 then Timeout
22
+ when 1013 then InvalidQuantity
22
23
  when 1014 then UnknownOrderComposition
23
24
  when 1015 then TooManyOrders
24
25
  when 1016 then ServiceShuttingDown
@@ -84,6 +85,7 @@ module Binance
84
85
  class TooManyRequests < Error; end
85
86
  class UnexpectedResponse < Error; end
86
87
  class Timeout < Error; end
88
+ class InvalidQuantity < Error; end
87
89
  class UnknownOrderComposition < Error; end
88
90
  class TooManyOrders < Error; end
89
91
  class ServiceShuttingDown < Error; end
@@ -0,0 +1,46 @@
1
+ module Binance
2
+ module Api
3
+ class MarketStream
4
+ class << self
5
+ def connect(api_key: nil, api_secret_key: nil)
6
+ EM.run {
7
+ ws = Faye::WebSocket::Client.new("wss://stream.binance.com:9443/stream?streams=<streamName1>/<streamName2>/<streamName3>")
8
+
9
+ ws.on :open do |event|
10
+ p [:open]
11
+ ws.send("Hello, world!")
12
+ end
13
+
14
+ ws.on :message do |event|
15
+ p [:message, event.data]
16
+ end
17
+
18
+ ws.on :close do |event|
19
+ p [:close, event.code, event.reason]
20
+ ws = nil
21
+ end
22
+ }
23
+ end
24
+
25
+ # It's recommended to send a ping about every 30 minutes.
26
+ def keepalive!(listen_key: nil, api_key: nil, api_secret_key: nil)
27
+ raise Error.new(message: "listen_key is required") if listen_key.nil?
28
+ Request.send!(api_key_type: :none, method: :put, path: "/api/v1/userDataStream",
29
+ params: { listenKey: listen_key }, security_type: :user_stream)
30
+ end
31
+
32
+ def start!(api_key: nil, api_secret_key: nil)
33
+ Request.send!(api_key_type: :none, method: :post, path: "/api/v1/userDataStream",
34
+ security_type: :user_stream, api_key: api_key, api_secret_key: api_secret_key)
35
+ end
36
+
37
+ def stop!(listen_key: nil, api_key: nil, api_secret_key: nil)
38
+ raise Error.new(message: "listen_key is required") if listen_key.nil?
39
+ Request.send!(api_key_type: :none, method: :delete, path: "/api/v1/userDataStream",
40
+ params: { listenKey: listen_key }, security_type: :user_stream,
41
+ api_key: api_key, api_secret_key: api_secret_key)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -37,12 +37,12 @@ module Binance
37
37
  end
38
38
 
39
39
  def create!(icebergQuantity: nil, newClientOrderId: nil, newOrderResponseType: nil,
40
- price: nil, quantity: nil, recvWindow: nil, stopPrice: nil, symbol: nil,
40
+ price: nil, quantity: nil, quoteOrderQty: nil, recvWindow: nil, stopPrice: nil, symbol: nil,
41
41
  side: nil, type: nil, timeInForce: nil, test: false, api_key: nil, api_secret_key: nil)
42
42
  timestamp = Configuration.timestamp
43
43
  params = {
44
44
  icebergQty: icebergQuantity, newClientOrderId: newClientOrderId,
45
- newOrderRespType: newOrderResponseType, price: price, quantity: quantity,
45
+ newOrderRespType: newOrderResponseType, price: price, quantity: quantity, quoteOrderQty: quoteOrderQty,
46
46
  recvWindow: recvWindow, stopPrice: stopPrice, symbol: symbol, side: side,
47
47
  type: type, timeInForce: timeInForce, timestamp: timestamp,
48
48
  }.delete_if { |key, value| value.nil? }
@@ -92,7 +92,7 @@ module Binance
92
92
  end
93
93
 
94
94
  def required_create_keys
95
- [:symbol, :side, :type, :quantity, :timestamp].freeze
95
+ [:symbol, :side, :type, :timestamp].freeze
96
96
  end
97
97
  end
98
98
  end
@@ -3,7 +3,7 @@ module Binance
3
3
  class Request
4
4
  include HTTParty
5
5
  class << self
6
- def send!(api_key_type: :none, headers: {}, method: :get, path: "/", params: {}, security_type: :none, tld: :com, api_key: nil, api_secret_key: nil)
6
+ def send!(api_key_type: :none, headers: {}, method: :get, path: "/", params: {}, security_type: :none, tld: Configuration.tld, api_key: nil, api_secret_key: nil)
7
7
  Configuration.validate_tld!(tld)
8
8
  self.base_uri "https://api.binance.#{tld}"
9
9
 
@@ -1,5 +1,5 @@
1
1
  module Binance
2
2
  module Api
3
- VERSION = "1.0"
3
+ VERSION = "1.2.1"
4
4
  end
5
5
  end
@@ -0,0 +1,89 @@
1
+ module Binance
2
+ class WebSocket < Faye::WebSocket::Client
3
+ def initialize(on_open: nil, on_close: nil)
4
+ super "wss://stream.binance.com:9443/stream", nil, ping: 180
5
+
6
+ @request_id_inc = 0
7
+
8
+ on :open do |event|
9
+ on_open&.call(event)
10
+ end
11
+
12
+ on :message do |event|
13
+ process_data(event.data)
14
+ end
15
+
16
+ on :close do |event|
17
+ on_close&.call(event)
18
+ end
19
+ end
20
+
21
+ # stream name: <symbol>@kline_<interval>
22
+ #
23
+ # {
24
+ # "e": "kline", // Event type
25
+ # "E": 123456789, // Event time
26
+ # "s": "BNBBTC", // Symbol
27
+ # "k": {
28
+ # "t": 123400000, // Kline start time
29
+ # "T": 123460000, // Kline close time
30
+ # "s": "BNBBTC", // Symbol
31
+ # "i": "1m", // Interval
32
+ # "f": 100, // First trade ID
33
+ # "L": 200, // Last trade ID
34
+ # "o": "0.0010", // Open price
35
+ # "c": "0.0020", // Close price
36
+ # "h": "0.0025", // High price
37
+ # "l": "0.0015", // Low price
38
+ # "v": "1000", // Base asset volume
39
+ # "n": 100, // Number of trades
40
+ # "x": false, // Is this kline closed?
41
+ # "q": "1.0000", // Quote asset volume
42
+ # "V": "500", // Taker buy base asset volume
43
+ # "Q": "0.500", // Taker buy quote asset volume
44
+ # "B": "123456" // Ignore
45
+ # }
46
+ # }
47
+ def candlesticks!(symbols, interval, &on_receive)
48
+ symbols_fmt = symbols.is_a?(String) ? [symbols] : symbols
49
+ @candlesticks_handler = on_receive
50
+ subscribe(symbols_fmt.map { |s| "#{s.downcase}@kline_#{interval}" })
51
+ end
52
+
53
+ private
54
+
55
+ def process_data(data)
56
+ json = JSON.parse(data, symbolize_names: true)
57
+ if json[:error]
58
+ raise Error.new("(#{json[:code]}) #{json[:msg]}")
59
+ elsif json.key?(:result)
60
+ # Binance stream connected successfully
61
+ else
62
+ case json[:data][:e]&.to_sym
63
+ when :kline
64
+ @candlesticks_handler&.call(json[:stream], json[:data])
65
+ end
66
+ end
67
+ end
68
+
69
+ def request_id
70
+ @request_id_inc += 1
71
+ end
72
+
73
+ def subscribe(streams)
74
+ send({
75
+ method: "SUBSCRIBE",
76
+ params: streams,
77
+ id: request_id,
78
+ }.to_json)
79
+ end
80
+
81
+ def unsubscribe(streams)
82
+ send({
83
+ method: "UNSUBSCRIBE",
84
+ params: streams,
85
+ id: request_id,
86
+ }.to_json)
87
+ end
88
+ end
89
+ 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: '1.0'
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Peterson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-20 00:00:00.000000000 Z
11
+ date: 2021-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: codecov
@@ -164,6 +164,34 @@ dependencies:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0.15'
167
+ - !ruby/object:Gem::Dependency
168
+ name: faye-websocket
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.11'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.11'
181
+ - !ruby/object:Gem::Dependency
182
+ name: eventmachine
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1.2'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.2'
167
195
  description: Ruby wrapper for the Binance API.
168
196
  email:
169
197
  - hello@jakenberg.io
@@ -180,9 +208,11 @@ files:
180
208
  - lib/binance/api/margin.rb
181
209
  - lib/binance/api/margin/account.rb
182
210
  - lib/binance/api/margin/order.rb
211
+ - lib/binance/api/market_stream.rb
183
212
  - lib/binance/api/order.rb
184
213
  - lib/binance/api/request.rb
185
214
  - lib/binance/api/version.rb
215
+ - lib/binance/websocket.rb
186
216
  homepage: https://github.com/jakenberg/binance-ruby
187
217
  licenses:
188
218
  - MIT
@@ -206,5 +236,5 @@ requirements: []
206
236
  rubygems_version: 3.1.6
207
237
  signing_key:
208
238
  specification_version: 4
209
- summary: binance-ruby-1.0
239
+ summary: binance-ruby-1.2.1
210
240
  test_files: []