binance_ruby 0.0.0

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/binance_ruby.rb +184 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 549053c379a5e7fc68ff8c867a681b57876a4e6b
4
+ data.tar.gz: 2831f448da9bb5aca96ecbacb12ce447957d0333
5
+ SHA512:
6
+ metadata.gz: 15ad3e9016144d38c49636b0181ed0864245571c6c6524463158dcd68b745fce9ac23655a2a775c0bdc6f30b901b7e44e243250f76069a5c3ff857e854f2bc63
7
+ data.tar.gz: b584082a5fe4d7d392dd16f80880fa20fcb4f617794adb5de453c331cf215bdb21a7ffc2df005a9e18162be6d93bddeeacbaeced15f7a48a7c5140e544f37929
@@ -0,0 +1,184 @@
1
+ require 'httparty'
2
+ require 'json'
3
+ require 'date'
4
+ require "base64"
5
+ require 'openssl'
6
+
7
+ class Binance
8
+ include HTTParty
9
+ base_uri 'https://www.binance.com/api'
10
+
11
+ def initialize(api_key=nil, api_secret=nil, options={})
12
+ @api_key = api_key
13
+ @api_secret = api_secret
14
+ @base_uri = options[:base_uri] ||= 'https://www.binance.com/api'
15
+ end
16
+
17
+ ###########################
18
+ ###### Public Data ########
19
+ ###########################
20
+
21
+ def server_time
22
+ response = get_public('time')
23
+ response["serverTime"]
24
+ end
25
+
26
+ def order_book(pair)
27
+ opts = {'symbol' => pair}
28
+ response = get_public 'depth', opts
29
+ end
30
+
31
+ def aggregate_trade_list(pair)
32
+ opts = {'symbol' => pair}
33
+ response = get_public 'aggTrades', opts
34
+ end
35
+
36
+ def candles(pair, interval)
37
+ opts = {'symbol' => pair, 'interval' => interval}
38
+ response = get_public 'klines', opts
39
+ end
40
+
41
+ #interval list : 1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,1M
42
+
43
+ def ticker_day(pair)
44
+ opts = {'symbol' => pair}
45
+ response = get_public 'ticker/24hr', opts
46
+ end
47
+
48
+ def ticker_all
49
+ response = get_public 'ticker/allPrices'
50
+ end
51
+
52
+ def ticker_all_order_book
53
+ response = get_public '/ticker/allBookTickers'
54
+ end
55
+
56
+ def get_public(method, opts={})
57
+ url = @base_uri + '/v1/' + method
58
+ r = self.class.get(url, query: opts)
59
+ resp = JSON.parse(r.body)
60
+ end
61
+
62
+ ###########################
63
+ ###### Private Data #######
64
+ ###########################
65
+
66
+ def get_account(opts={})
67
+ response = get_private '/account?', opts
68
+ end
69
+
70
+ # Mandatory parameters for order : symbol side type timeInForce quantity price
71
+
72
+ def test_order(opts={})
73
+ opts[:type] == "MARKET" ? required_opts = %w{ symbol side type timeInForce quantity price } : required_opts = %w{ symbol side type quantity }
74
+ leftover = required_opts - opts.keys.map(&:to_s)
75
+ if leftover.length > 0
76
+ raise ArgumentError.new("Required options, not given. Input must include #{leftover}")
77
+ end
78
+ response = post_private '/order/test?', opts
79
+ end
80
+
81
+ def set_order(opts={})
82
+ opts[:type] == "MARKET" ? required_opts = %w{ symbol side type timeInForce quantity price } : required_opts = %w{ symbol side type quantity }
83
+ leftover = required_opts - opts.keys.map(&:to_s)
84
+ if leftover.length > 0
85
+ raise ArgumentError.new("Required options, not given. Input must include #{leftover}")
86
+ end
87
+ response = post_private '/order?', opts
88
+ end
89
+
90
+ def get_order(opts={})
91
+ required_opts = %w{ symbol }
92
+ leftover = required_opts - opts.keys.map(&:to_s)
93
+ if leftover.length > 0 || (opts["orderId"].nil? && opts["origClientOrderId"].nil?)
94
+ raise ArgumentError.new("Required options not given : symbol and either orderId or origClientOrderId}")
95
+ end
96
+ response = get_private '/order?', opts
97
+ end
98
+
99
+ def get_open_orders(opts={})
100
+ required_opts = %w{ symbol }
101
+ leftover = required_opts - opts.keys.map(&:to_s)
102
+ if leftover.length > 0
103
+ raise ArgumentError.new("Required options, not given. Input must include #{leftover}")
104
+ end
105
+ response = get_private '/openOrders?', opts
106
+ end
107
+
108
+ def get_all_orders(opts={})
109
+ required_opts = %w{ symbol }
110
+ leftover = required_opts - opts.keys.map(&:to_s)
111
+ if leftover.length > 0
112
+ raise ArgumentError.new("Required options, not given. Input must include #{leftover}")
113
+ end
114
+ response = get_private '/allOrders?', opts
115
+ end
116
+
117
+ def get_trades(opts={})
118
+ required_opts = %w{ symbol }
119
+ leftover = required_opts - opts.keys.map(&:to_s)
120
+ if leftover.length > 0
121
+ raise ArgumentError.new("Required options, not given. Input must include #{leftover}")
122
+ end
123
+ response = get_private '/myTrades?', opts
124
+ end
125
+
126
+ def cancel_order(opts={})
127
+ required_opts = %w{ symbol }
128
+ leftover = required_opts - opts.keys.map(&:to_s)
129
+ if leftover.length > 0 || (opts["orderId"].nil? && opts["origClientOrderId"].nil?)
130
+ raise ArgumentError.new("Required options not given : symbol and either orderId or origClientOrderId}")
131
+ end
132
+ response = delete_private '/order?', opts
133
+ end
134
+
135
+ private
136
+
137
+ ###########################
138
+ ###### Create request #####
139
+ ###########################
140
+
141
+ def get_private(method, opts={})
142
+ header = {"X-MBX-APIKEY":@api_key }
143
+ r = self.class.get(set_request(method, opts), headers: header)
144
+ resp = JSON.parse(r.body)
145
+ end
146
+
147
+ def post_private(method, opts={})
148
+ header = {"X-MBX-APIKEY":@api_key }
149
+ r = self.class.post(set_request(method, opts), headers: header)
150
+ resp = JSON.parse(r.body)
151
+ end
152
+
153
+ def delete_private(method, opts={})
154
+ header = {"X-MBX-APIKEY":@api_key }
155
+ r = self.class.delete(set_request(method, opts), headers: header)
156
+ resp = JSON.parse(r.body)
157
+ end
158
+
159
+ def set_request(method, opts={})
160
+ options = Array.new
161
+ unless opts.empty?
162
+ opts.each do |key, value|
163
+ options << key + "=" + value
164
+ end
165
+ data = options.join('&') + '&timestamp=' + DateTime.now.strftime('%Q').to_s
166
+ else
167
+ data = '&timestamp=' + DateTime.now.strftime('%Q').to_s
168
+ end
169
+
170
+ digest = OpenSSL::Digest.new('sha256')
171
+ signature = OpenSSL::HMAC.hexdigest(digest, @api_secret, data)
172
+
173
+ url = @base_uri + '/v3' + method + data + "&signature=" + signature
174
+ return url
175
+ end
176
+ end
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: binance_ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brieuc Lambert
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-27 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: a simple wrapper for binance api in ruby
14
+ email: lambert.brieuc@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/binance_ruby.rb
20
+ homepage: http://rubygems.org/gems/binance_ruby
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.6.14
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Binance!
44
+ test_files: []