peatio_irix 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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