peatio_irix 1.0.1 → 1.1.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.
- checksums.yaml +4 -4
- data/.byebug_history +122 -0
- data/Gemfile.lock +1 -1
- data/lib/peatio_irix/binance.rb +0 -1
- data/lib/peatio_irix/crypto.rb +256 -0
- data/lib/peatio_irix/version.rb +1 -1
- data/lib/peatio_irix.rb +1 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7f7679ce62384f684174f8d14eb2f64604459bf36a5ea9c9dc3c8a820d7aaf9
|
4
|
+
data.tar.gz: e35cc6c8e2206bb4abc6fe400b4987aba889dc7def61443742fdbc20f77fdc44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c8374292232f8f62c36cf24c02c750ca1f309a41f23af775beb17135bcb63e3a4990c39c9a1188a8e1a0f8bec26453ecd434cd217537af8bf06ec1b1ea7dd63
|
7
|
+
data.tar.gz: 7193848048a3bab2ab24d89120812f8f667b8f0f1383579b3cab2b530f6bdbbefe66a59c3b378c57c1517ade3b7bca431c5220bb66fa2f858e2ccbcf44dbaf4a
|
data/.byebug_history
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
c
|
2
|
+
continue
|
3
|
+
msg
|
4
|
+
msg.dig("result", "data")
|
5
|
+
msg
|
6
|
+
c
|
7
|
+
channels
|
8
|
+
c
|
9
|
+
exit
|
10
|
+
"l": "0.0015",
|
11
|
+
"h": "0.0025",
|
12
|
+
"c": "0.0020",
|
13
|
+
"L": 200,
|
14
|
+
"i": "1m",
|
15
|
+
"s": "BNBBTC",
|
16
|
+
"T": 123460000,
|
17
|
+
"t": 123400000,
|
18
|
+
t = {
|
19
|
+
}
|
20
|
+
"B": "123456" // Ignore
|
21
|
+
"Q": "0.500", // Taker buy quote asset volume
|
22
|
+
"V": "500", // Taker buy base asset volume
|
23
|
+
"q": "1.0000", // Quote asset volume
|
24
|
+
"x": false, // Is this kline closed?
|
25
|
+
"n": 100, // Number of trades
|
26
|
+
"v": "1000", // Base asset volume
|
27
|
+
"l": "0.0015", // Low price
|
28
|
+
"h": "0.0025", // High price
|
29
|
+
"c": "0.0020", // Close price
|
30
|
+
"o": "0.0010", // Open price
|
31
|
+
"L": 200, // Last trade ID
|
32
|
+
"f": 100, // First trade ID
|
33
|
+
"i": "1m", // Interval
|
34
|
+
"s": "BNBBTC", // Symbol
|
35
|
+
"T": 123460000, // Kline close time
|
36
|
+
"t": 123400000, // Kline start time
|
37
|
+
hs = {
|
38
|
+
msg.dig("result1", "data1")
|
39
|
+
msg
|
40
|
+
msg.dig("result", "data")
|
41
|
+
msg.dig("result")
|
42
|
+
msg
|
43
|
+
c
|
44
|
+
msg
|
45
|
+
c
|
46
|
+
channels
|
47
|
+
continue
|
48
|
+
channels
|
49
|
+
c
|
50
|
+
msg.dig('result', 'data')
|
51
|
+
msg
|
52
|
+
c
|
53
|
+
msg
|
54
|
+
continue
|
55
|
+
msg
|
56
|
+
c
|
57
|
+
msg
|
58
|
+
c
|
59
|
+
msg
|
60
|
+
c
|
61
|
+
msg
|
62
|
+
c
|
63
|
+
msg
|
64
|
+
msg
|
65
|
+
c
|
66
|
+
msg
|
67
|
+
c
|
68
|
+
sub
|
69
|
+
n
|
70
|
+
ws
|
71
|
+
market
|
72
|
+
continue
|
73
|
+
msg.count
|
74
|
+
msg
|
75
|
+
c
|
76
|
+
msg
|
77
|
+
c
|
78
|
+
sub
|
79
|
+
c
|
80
|
+
sub
|
81
|
+
c
|
82
|
+
msg
|
83
|
+
c
|
84
|
+
msg
|
85
|
+
c
|
86
|
+
msg
|
87
|
+
c
|
88
|
+
msg
|
89
|
+
c
|
90
|
+
msg
|
91
|
+
c
|
92
|
+
msg
|
93
|
+
c
|
94
|
+
msg
|
95
|
+
c
|
96
|
+
msg
|
97
|
+
c
|
98
|
+
msg
|
99
|
+
c
|
100
|
+
market
|
101
|
+
continue
|
102
|
+
@target
|
103
|
+
c
|
104
|
+
msg
|
105
|
+
c
|
106
|
+
msg
|
107
|
+
c
|
108
|
+
msg
|
109
|
+
c
|
110
|
+
msg
|
111
|
+
c
|
112
|
+
market
|
113
|
+
c
|
114
|
+
n
|
115
|
+
ws
|
116
|
+
market
|
117
|
+
c
|
118
|
+
n
|
119
|
+
market
|
120
|
+
continue
|
121
|
+
ws
|
122
|
+
market
|
data/Gemfile.lock
CHANGED
data/lib/peatio_irix/binance.rb
CHANGED
@@ -0,0 +1,256 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'byebug'
|
3
|
+
|
4
|
+
module PeatioIrix
|
5
|
+
class Crypto < Peatio::Upstream::Base
|
6
|
+
require 'time'
|
7
|
+
|
8
|
+
MIN_INCREMENT_COUNT_TO_SNAPSHOT = 100
|
9
|
+
MIN_PERIOD_TO_SNAPSHOT = 5
|
10
|
+
MAX_PERIOD_TO_SNAPSHOT = 60
|
11
|
+
|
12
|
+
attr_accessor :snap, :snapshot_time, :increment_count, :sequence_number,
|
13
|
+
:asks, :bids
|
14
|
+
|
15
|
+
def initialize(config)
|
16
|
+
super
|
17
|
+
@connection = Faraday.new(url: (config['rest']).to_s) do |builder|
|
18
|
+
builder.response :json
|
19
|
+
builder.response :logger if config['debug']
|
20
|
+
builder.adapter(@adapter)
|
21
|
+
unless config['verify_ssl'].nil?
|
22
|
+
builder.ssl[:verify] = config['verify_ssl']
|
23
|
+
end
|
24
|
+
end
|
25
|
+
@ping_set = false
|
26
|
+
@rest = (config['rest']).to_s
|
27
|
+
@ws_url = (config['websocket']).to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def ws_read_public_message(msg)
|
31
|
+
if msg['result'].present?
|
32
|
+
case msg.dig('result','subscription')
|
33
|
+
when /trade\.#{@target}/
|
34
|
+
detect_trade(msg.dig('result', 'data'))
|
35
|
+
when /book\.#{@target}\.#{msg.dig('result', 'depth')}/
|
36
|
+
detect_order(msg.dig('result', 'data'))
|
37
|
+
# when /candlestick.#{msg.dig('result', 'interval')}.#{@target}/
|
38
|
+
# detect_kline(msg.dig('result', 'data'))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def detect_kline(msg)
|
44
|
+
p "msg => #{msg}"
|
45
|
+
# return if msg.empty?
|
46
|
+
#
|
47
|
+
# msg.dig("result", "data").each do |k_line|
|
48
|
+
# @peatio_mq.enqueue_event('public', market.id,
|
49
|
+
# event_name, point)
|
50
|
+
# end
|
51
|
+
end
|
52
|
+
|
53
|
+
def detect_order(msg)
|
54
|
+
if @increment_count < MIN_INCREMENT_COUNT_TO_SNAPSHOT && @snapshot_time <= Time.now - MAX_PERIOD_TO_SNAPSHOT
|
55
|
+
publish_snapshot
|
56
|
+
@increment_count = 0
|
57
|
+
elsif @increment_count >= MIN_INCREMENT_COUNT_TO_SNAPSHOT && @snapshot_time < Time.now - MIN_PERIOD_TO_SNAPSHOT
|
58
|
+
publish_snapshot
|
59
|
+
@increment_count = 0
|
60
|
+
end
|
61
|
+
fill_increment(msg)
|
62
|
+
end
|
63
|
+
|
64
|
+
def fill_increment(inc)
|
65
|
+
fill_side(inc[0], "bids")
|
66
|
+
fill_side(inc[0], "asks")
|
67
|
+
@increment_count += 1
|
68
|
+
end
|
69
|
+
|
70
|
+
def fill_side(inc, side)
|
71
|
+
inc[side].each do |price_point|
|
72
|
+
price = price_point[0]
|
73
|
+
amount = price_point[1]
|
74
|
+
if amount.zero?
|
75
|
+
@snap[side].delete_if { |point| point[0] == price.to_s }
|
76
|
+
else
|
77
|
+
@snap[side].delete_if { |point| point[0] == price.to_s }
|
78
|
+
@snap[side] << [price.to_s, amount.to_s]
|
79
|
+
end
|
80
|
+
if side == "bids"
|
81
|
+
@bids.delete_if { |point| point[0] == price }
|
82
|
+
@bids << [price.to_s, amount.to_s]
|
83
|
+
elsif side == "asks"
|
84
|
+
@asks.delete_if { |point| point[0] == price }
|
85
|
+
@asks << [price.to_s, amount.to_s]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def publish_increment
|
91
|
+
inc = {}
|
92
|
+
inc['bids'] = @bids.sort.reverse if @bids.present?
|
93
|
+
inc['asks'] = @asks.sort if @asks.present?
|
94
|
+
if inc.present?
|
95
|
+
@sequence_number += 1
|
96
|
+
@peatio_mq.enqueue_event('public', @market, 'ob-inc',
|
97
|
+
'bids' => inc['bids'], 'asks' => inc['asks'],
|
98
|
+
'sequence' => @sequence_number)
|
99
|
+
end
|
100
|
+
@bids = []
|
101
|
+
@asks = []
|
102
|
+
end
|
103
|
+
|
104
|
+
def publish_snapshot
|
105
|
+
@snapshot_time = Time.now
|
106
|
+
@peatio_mq.enqueue_event('public', @market, 'ob-snap',
|
107
|
+
'bids' => @snap['bids'].sort.reverse,
|
108
|
+
'asks' => @snap['asks'].sort,
|
109
|
+
'sequence' => @sequence_number)
|
110
|
+
end
|
111
|
+
|
112
|
+
def detect_trade(msg)
|
113
|
+
msg.map do |t|
|
114
|
+
trade = {
|
115
|
+
'tid' => t['d'],
|
116
|
+
'amount' => t['q'].to_d,
|
117
|
+
'price' => t['p'].to_d,
|
118
|
+
'date' => t['t'] / 1000,
|
119
|
+
'taker_type' => t['s']
|
120
|
+
}
|
121
|
+
notify_public_trade(trade)
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def ws_read_message(msg)
|
127
|
+
logger.info { "received websocket message: #{msg.data}" }
|
128
|
+
|
129
|
+
object = JSON.parse(msg.data)
|
130
|
+
ws_read_public_message(object)
|
131
|
+
end
|
132
|
+
|
133
|
+
def ws_connect
|
134
|
+
logger.info { "Websocket connecting to #{@ws_url}" }
|
135
|
+
raise "websocket url missing for account #{id}" unless @ws_url
|
136
|
+
|
137
|
+
@ws = Faye::WebSocket::Client.new(@ws_url)
|
138
|
+
|
139
|
+
@ws.on(:open) do |_e|
|
140
|
+
subscribe_channels(@target, @ws)
|
141
|
+
logger.info { "Websocket connected" }
|
142
|
+
end
|
143
|
+
|
144
|
+
@ws.on(:message) do |msg|
|
145
|
+
ws_read_message(msg)
|
146
|
+
end
|
147
|
+
|
148
|
+
@ws.on(:close) do |e|
|
149
|
+
@ws = nil
|
150
|
+
@ws_status = false
|
151
|
+
logger.error "Websocket disconnected: #{e.code} Reason: #{e.reason}"
|
152
|
+
Fiber.new do
|
153
|
+
EM::Synchrony.sleep(WEBSOCKET_CONNECTION_RETRY_DELAY)
|
154
|
+
ws_connect
|
155
|
+
end.resume
|
156
|
+
end
|
157
|
+
|
158
|
+
return if @ping_set
|
159
|
+
|
160
|
+
Fiber.new do
|
161
|
+
EM::Synchrony.add_periodic_timer(5) do
|
162
|
+
heart_beat(@ws)
|
163
|
+
end
|
164
|
+
end.resume
|
165
|
+
|
166
|
+
@ping_set = true
|
167
|
+
end
|
168
|
+
|
169
|
+
def subscribe_channels(market, ws)
|
170
|
+
@sequence_number = 0
|
171
|
+
@increment_count = 0
|
172
|
+
@snapshot_time = Time.now
|
173
|
+
@bids = []
|
174
|
+
@asks = []
|
175
|
+
@snap = { 'asks' => [], 'bids' => [] }
|
176
|
+
|
177
|
+
channels = []
|
178
|
+
|
179
|
+
channels += ["trade.#{market}"] if @config['trade_proxy']
|
180
|
+
channels += ["book.#{market}.150"] if @config['orderbook_proxy']
|
181
|
+
|
182
|
+
sub = {
|
183
|
+
id: 11,
|
184
|
+
method: 'subscribe',
|
185
|
+
params: {
|
186
|
+
channels: channels
|
187
|
+
},
|
188
|
+
nonce: Time.now.to_i * 1000
|
189
|
+
}
|
190
|
+
|
191
|
+
EM.next_tick do
|
192
|
+
ws.send(JSON.generate(sub))
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def subscribe_klines(market, ws)
|
197
|
+
return unless @config['trade_proxy']
|
198
|
+
|
199
|
+
sub = {
|
200
|
+
id: 11,
|
201
|
+
method: 'subscribe',
|
202
|
+
params: {
|
203
|
+
channels: ["candlestick.1m.#{market}"]
|
204
|
+
},
|
205
|
+
nonce: Time.now.to_i * 1000
|
206
|
+
}
|
207
|
+
|
208
|
+
EM.next_tick do
|
209
|
+
ws.send(JSON.generate(sub))
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def heart_beat(ws)
|
214
|
+
return unless @config['trade_proxy']
|
215
|
+
|
216
|
+
sub = {
|
217
|
+
id: Time.now.to_i * 1000,
|
218
|
+
method: 'public/respond-heartbeat'
|
219
|
+
}
|
220
|
+
|
221
|
+
EM.next_tick do
|
222
|
+
ws.send(JSON.generate(sub))
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def subscribe_orderbook(market, ws)
|
227
|
+
return unless @config['orderbook_proxy']
|
228
|
+
|
229
|
+
@sequence_number = 0
|
230
|
+
@increment_count = 0
|
231
|
+
@snapshot_time = Time.now
|
232
|
+
@bids = []
|
233
|
+
@asks = []
|
234
|
+
@snap = { 'asks' => [], 'bids' => [] }
|
235
|
+
|
236
|
+
sub = {
|
237
|
+
id: 11,
|
238
|
+
method: 'subscribe',
|
239
|
+
params: {
|
240
|
+
channels: ["book.#{market}.150"]
|
241
|
+
},
|
242
|
+
nonce: Time.now.to_i * 1000
|
243
|
+
}
|
244
|
+
|
245
|
+
EM.next_tick do
|
246
|
+
ws.send(JSON.generate(sub))
|
247
|
+
end
|
248
|
+
|
249
|
+
Fiber.new do
|
250
|
+
EM::Synchrony.add_periodic_timer(0.2) do
|
251
|
+
publish_increment
|
252
|
+
end
|
253
|
+
end.resume
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
data/lib/peatio_irix/version.rb
CHANGED
data/lib/peatio_irix.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: peatio_irix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anuj Dhiman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-synchrony
|
@@ -243,6 +243,7 @@ executables:
|
|
243
243
|
extensions: []
|
244
244
|
extra_rdoc_files: []
|
245
245
|
files:
|
246
|
+
- ".byebug_history"
|
246
247
|
- ".gitignore"
|
247
248
|
- ".gitlab-ci.yml"
|
248
249
|
- ".idea/.gitignore"
|
@@ -264,6 +265,7 @@ files:
|
|
264
265
|
- bin/setup
|
265
266
|
- lib/peatio_irix.rb
|
266
267
|
- lib/peatio_irix/binance.rb
|
268
|
+
- lib/peatio_irix/crypto.rb
|
267
269
|
- lib/peatio_irix/hooks.rb
|
268
270
|
- lib/peatio_irix/railtie.rb
|
269
271
|
- lib/peatio_irix/version.rb
|