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 +4 -4
- data/lib/binance-ruby.rb +2 -0
- data/lib/binance/api/error.rb +2 -0
- data/lib/binance/api/market_stream.rb +46 -0
- data/lib/binance/api/order.rb +3 -3
- data/lib/binance/api/request.rb +1 -1
- data/lib/binance/api/version.rb +1 -1
- data/lib/binance/websocket.rb +89 -0
- metadata +33 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 124f7e539a6f6e6003bf7c2619ba039a6a930037976815729398e34adb4686a1
|
4
|
+
data.tar.gz: a6dc10be4aa7629143663260ce33111b96b8a2f50b64ffef88bd219ed282ca12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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"
|
data/lib/binance/api/error.rb
CHANGED
@@ -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
|
data/lib/binance/api/order.rb
CHANGED
@@ -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, :
|
95
|
+
[:symbol, :side, :type, :timestamp].freeze
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
data/lib/binance/api/request.rb
CHANGED
@@ -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:
|
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
|
|
data/lib/binance/api/version.rb
CHANGED
@@ -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:
|
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
|
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.
|
239
|
+
summary: binance-ruby-1.2.1
|
210
240
|
test_files: []
|