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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 158c1ff7cf175aee610f1dcd0a14b5ac961c425936d4c4baffeaac964a6c0369
4
- data.tar.gz: 6c5ab2139bdef3c83b21b64a768205329e500ffda8ed45ebc1b730407ce428c7
3
+ metadata.gz: c7f7679ce62384f684174f8d14eb2f64604459bf36a5ea9c9dc3c8a820d7aaf9
4
+ data.tar.gz: e35cc6c8e2206bb4abc6fe400b4987aba889dc7def61443742fdbc20f77fdc44
5
5
  SHA512:
6
- metadata.gz: ea712c0f9d6505edbd3191dae1ae0ab22071e4bf46a09d4bb429dfa283a62ab20ab37b5f605a3f45a16a772d0cefd4fee9d7b3d4a1a5f7d1dcdf734740d228d1
7
- data.tar.gz: 3c8f3dca3c502db2dc422d6c3ea6297eb9092eb57445f780ab1d56621f292511f1904038d772c30dc30ecccba235f7c8c21655963ae2346bb9112a21cd9c5eea
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- peatio_irix (1.0.0)
4
+ peatio_irix (1.0.1)
5
5
  em-synchrony (~> 1.0)
6
6
  em-websocket
7
7
  eventmachine
@@ -41,7 +41,6 @@ module PeatioIrix
41
41
  end
42
42
 
43
43
  def ws_read_public_message(msg)
44
-
45
44
  if msg['ping'].present?
46
45
  @ws.send(JSON.dump(pong: msg['ping']))
47
46
  return
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PeatioIrix
4
- VERSION = "1.0.1"
4
+ VERSION = "1.1.0"
5
5
  end
data/lib/peatio_irix.rb CHANGED
@@ -7,6 +7,7 @@ require "faraday_middleware"
7
7
  require "faye"
8
8
 
9
9
  module PeatioIrix
10
+ require "peatio_irix/crypto"
10
11
  require "peatio_irix/binance"
11
12
  require "peatio_irix/hooks"
12
13
  require "peatio_irix/version"
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.1
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-26 00:00:00.000000000 Z
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