max_exchange_api 0.0.1 → 1.1.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/.rubocop.yml +3 -3
- data/CHANGELOG.md +15 -1
- data/README.md +642 -1
- data/lib/max_exchange_api.rb +2 -0
- data/lib/max_exchange_api/base_api.rb +11 -3
- data/lib/max_exchange_api/config.rb +26 -0
- data/lib/max_exchange_api/helper.rb +21 -0
- data/lib/max_exchange_api/private_api.rb +225 -0
- data/lib/max_exchange_api/public_api.rb +53 -0
- data/lib/max_exchange_api/version.rb +1 -1
- 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: f8bceace151d12c20233b2cf113dc1ffaa07966ade671c8bdb368bfe93c32854
|
4
|
+
data.tar.gz: 4edcb0c3c6ffce922b56eeb75b7224b2640366a6068af71039a66fb33025c3d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1ee9f002c63318a0bf5653c7d372193ca7566fcef4b7da7b270b657a003bfcc35a91ff0e6b97acdaa952d77fe264d62f75daa972fd0cd2ba32d3ed5fd7242cc
|
7
|
+
data.tar.gz: 7cb308ff8fe60215816272108cbb0d3a4c0f29f1804648f42832d8699194c764c162326291314675bbb8d46a81d8863ed97368f4c54ddd3b11d3913c11a0b9e3
|
data/.rubocop.yml
CHANGED
@@ -243,7 +243,7 @@ Metrics/ModuleLength:
|
|
243
243
|
Metrics/ParameterLists:
|
244
244
|
Description: 'Avoid parameter lists longer than three or four parameters.'
|
245
245
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params'
|
246
|
-
Enabled:
|
246
|
+
Enabled: false
|
247
247
|
|
248
248
|
Metrics/PerceivedComplexity:
|
249
249
|
Description: >-
|
@@ -337,7 +337,7 @@ Rails/HasAndBelongsToMany:
|
|
337
337
|
|
338
338
|
Rails/Output:
|
339
339
|
Description: 'Checks for calls to puts, print, etc.'
|
340
|
-
Enabled:
|
340
|
+
Enabled: false
|
341
341
|
|
342
342
|
Rails/ReadWriteAttribute:
|
343
343
|
Description: >-
|
@@ -812,7 +812,7 @@ Style/NumericLiterals:
|
|
812
812
|
Add underscores to large numeric literals to improve their
|
813
813
|
readability.
|
814
814
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics'
|
815
|
-
Enabled:
|
815
|
+
Enabled: false
|
816
816
|
|
817
817
|
Style/OneLineConditional:
|
818
818
|
Description: >-
|
data/CHANGELOG.md
CHANGED
@@ -1 +1,15 @@
|
|
1
|
-
## Change Log
|
1
|
+
## Change Log
|
2
|
+
|
3
|
+
### [v1.1.0](https://github.com/khiav223577/max_exchange_api/compare/v1.0.0...v1.1.0) 2021/06/27
|
4
|
+
- [#6](https://github.com/khiav223577/max_exchange_api/pull/6) Allow every api instance to have custom config (@khiav223577)
|
5
|
+
|
6
|
+
### [v1.0.0](https://github.com/khiav223577/max_exchange_api/compare/v0.1.0...v1.0.0) 2021/06/27
|
7
|
+
- [#5](https://github.com/khiav223577/max_exchange_api/pull/5) Implement all v2 private APIs (@khiav223577)
|
8
|
+
- [#4](https://github.com/khiav223577/max_exchange_api/pull/4) Add logger config (@khiav223577)
|
9
|
+
|
10
|
+
### [v0.1.0](https://github.com/khiav223577/max_exchange_api/compare/v0.0.1...v0.1.0) 2021/06/26
|
11
|
+
- [#3](https://github.com/khiav223577/max_exchange_api/pull/3) Add default_timeout config (@khiav223577)
|
12
|
+
- [#2](https://github.com/khiav223577/max_exchange_api/pull/2) Implement all v2 public APIs (@khiav223577)
|
13
|
+
|
14
|
+
### v0.0.1 2021/06/23
|
15
|
+
- [#1](https://github.com/khiav223577/max_exchange_api/pull/1) Implement `/depth` API (@khiav223577)
|
data/README.md
CHANGED
@@ -35,16 +35,100 @@ Or install it yourself as:
|
|
35
35
|
|
36
36
|
$ gem install max_exchange_api
|
37
37
|
|
38
|
+
## Configuration
|
39
|
+
|
40
|
+
### Set timeout time
|
41
|
+
|
42
|
+
```rb
|
43
|
+
# default config
|
44
|
+
MaxExchangeApi.default_config.timeout = 3 # seconds
|
45
|
+
|
46
|
+
# custom config
|
47
|
+
MaxExchangeApi::PublicApi.new(config: { timeout: 12 })
|
48
|
+
MaxExchangeApi::PrivateApi.new(access_key, secret_key, config: { timeout: 12 })
|
49
|
+
```
|
50
|
+
|
51
|
+
### Logging
|
52
|
+
|
53
|
+
```rb
|
54
|
+
require 'logger'
|
55
|
+
|
56
|
+
# default config
|
57
|
+
MaxExchangeApi.default_config.logger = Logger.new(STDOUT) # print log to stdand output
|
58
|
+
MaxExchangeApi.default_config.logger = Logger.new('log/api.log')
|
59
|
+
|
60
|
+
# custom config
|
61
|
+
MaxExchangeApi::PublicApi.new(config: { logger: Logger.new(STDOUT) })
|
62
|
+
MaxExchangeApi::PrivateApi.new(access_key, secret_key, config: { logger: Logger.new(STDOUT) })
|
63
|
+
```
|
64
|
+
|
38
65
|
## Usage
|
39
66
|
|
40
|
-
### Public
|
67
|
+
### Public Api Examples
|
41
68
|
|
42
69
|
```rb
|
43
70
|
@api = MaxExchangeApi::PublicApi.new
|
44
71
|
```
|
45
72
|
|
73
|
+
#### [GET GET /api/v2/vip_levels](https://max.maicoin.com/documents/api_list#!/public/getApiV2VipLevels)
|
74
|
+
|
75
|
+
> Get all VIP level fees.
|
76
|
+
|
77
|
+
<details>
|
78
|
+
<summary>Show code</summary>
|
79
|
+
|
80
|
+
```rb
|
81
|
+
@api.vip_levels
|
82
|
+
```
|
83
|
+
</details>
|
84
|
+
|
85
|
+
#### [GET /api/v2/vip_levels/{level}](https://max.maicoin.com/documents/api_list#!/public/getApiV2VipLevelsLevel)
|
86
|
+
|
87
|
+
> Get VIP level fee by level.
|
88
|
+
|
89
|
+
<details>
|
90
|
+
<summary>Show code</summary>
|
91
|
+
|
92
|
+
```rb
|
93
|
+
@api.vip_levels(2)
|
94
|
+
```
|
95
|
+
</details>
|
96
|
+
|
97
|
+
#### [GET /api/v2/currencies](https://max.maicoin.com/documents/api_list#!/public/getApiV2Currencies)
|
98
|
+
|
99
|
+
> Get all available currencies.
|
100
|
+
|
101
|
+
<details>
|
102
|
+
<summary>Show code</summary>
|
103
|
+
|
104
|
+
```rb
|
105
|
+
@api.currencies
|
106
|
+
```
|
107
|
+
</details>
|
108
|
+
|
109
|
+
#### [GET /api/v2/k](https://max.maicoin.com/documents/api_list#!/public/getApiV2K)
|
110
|
+
|
111
|
+
> Get OHLC(k line) of a specific market.
|
112
|
+
|
113
|
+
<details>
|
114
|
+
<summary>Show code</summary>
|
115
|
+
|
116
|
+
```rb
|
117
|
+
# use default parameters
|
118
|
+
@api.k('btctwd')
|
119
|
+
|
120
|
+
# provide all possible parameters
|
121
|
+
@api.k('btctwd', limit: 30, period: 1, timestamp: 1624705402)
|
122
|
+
```
|
123
|
+
</details>
|
124
|
+
|
46
125
|
#### [GET /api/v2/depth](https://max.maicoin.com/documents/api_list#!/public/getApiV2Depth)
|
47
126
|
|
127
|
+
> Get depth of a specified market.
|
128
|
+
|
129
|
+
<details>
|
130
|
+
<summary>Show code</summary>
|
131
|
+
|
48
132
|
```rb
|
49
133
|
# use default parameters
|
50
134
|
@api.depth('maxtwd')
|
@@ -52,6 +136,563 @@ Or install it yourself as:
|
|
52
136
|
# provide all possible parameters
|
53
137
|
@api.depth('maxtwd', limit: 10, sort_by_price: true)
|
54
138
|
```
|
139
|
+
</details>
|
140
|
+
|
141
|
+
#### [GET /api/v2/trades](https://max.maicoin.com/documents/api_list#!/public/getApiV2Trades)
|
142
|
+
|
143
|
+
> Get recent trades on market, sorted in reverse creation order.
|
144
|
+
|
145
|
+
<details>
|
146
|
+
<summary>Show code</summary>
|
147
|
+
|
148
|
+
```rb
|
149
|
+
# use default parameters
|
150
|
+
@api.trades('btctwd')
|
151
|
+
|
152
|
+
# provide all possible parameters
|
153
|
+
@api.trades(
|
154
|
+
'maxtwd',
|
155
|
+
timestamp: 1624705402,
|
156
|
+
from: 68444,
|
157
|
+
to: 69444,
|
158
|
+
order_by: 'asc',
|
159
|
+
pagination: true,
|
160
|
+
page: 3,
|
161
|
+
limit: 15,
|
162
|
+
offset: 5,
|
163
|
+
)
|
164
|
+
```
|
165
|
+
</details>
|
166
|
+
|
167
|
+
#### [GET /api/v2/markets](https://max.maicoin.com/documents/api_list#!/public/getApiV2Markets)
|
168
|
+
|
169
|
+
> Get all available markets.
|
170
|
+
|
171
|
+
<details>
|
172
|
+
<summary>Show code</summary>
|
173
|
+
|
174
|
+
```rb
|
175
|
+
@api.markets
|
176
|
+
```
|
177
|
+
</details>
|
178
|
+
|
179
|
+
#### [GET /api/v2/summary](https://max.maicoin.com/documents/api_list#!/public/getApiV2Summary)
|
180
|
+
|
181
|
+
> Overview of market data for all tickers.
|
182
|
+
|
183
|
+
<details>
|
184
|
+
<summary>Show code</summary>
|
185
|
+
|
186
|
+
```rb
|
187
|
+
@api.summary
|
188
|
+
```
|
189
|
+
</details>
|
190
|
+
|
191
|
+
#### [GET /api/v2/tickers/{path_market}](https://max.maicoin.com/documents/api_list#!/public/getApiV2TickersPathMarket)
|
192
|
+
|
193
|
+
> Get ticker of specific market.
|
194
|
+
|
195
|
+
<details>
|
196
|
+
<summary>Show code</summary>
|
197
|
+
|
198
|
+
```rb
|
199
|
+
@api.tickers('btctwd')
|
200
|
+
```
|
201
|
+
</details>
|
202
|
+
|
203
|
+
#### [GET /api/v2/tickers](https://max.maicoin.com/documents/api_list#!/public/getApiV2Tickers)
|
204
|
+
|
205
|
+
> Get ticker of all markets.
|
206
|
+
|
207
|
+
<details>
|
208
|
+
<summary>Show code</summary>
|
209
|
+
|
210
|
+
```rb
|
211
|
+
@api.tickers
|
212
|
+
```
|
213
|
+
</details>
|
214
|
+
|
215
|
+
#### [GET /api/v2/timestamp](https://max.maicoin.com/documents/api_list#!/public/getApiV2Timestamp)
|
216
|
+
|
217
|
+
> Get server current time, in seconds since Unix epoch.
|
218
|
+
|
219
|
+
<details>
|
220
|
+
<summary>Show code</summary>
|
221
|
+
|
222
|
+
```rb
|
223
|
+
@api.timestamp
|
224
|
+
```
|
225
|
+
</details>
|
226
|
+
|
227
|
+
### Private Api Examples
|
228
|
+
|
229
|
+
```rb
|
230
|
+
access_key = 'YOUR_ACCESS_KEY'
|
231
|
+
secret_key = 'YOUR_SECRET_KEY'
|
232
|
+
|
233
|
+
@api = MaxExchangeApi::PrivateApi.new(access_key, secret_key)
|
234
|
+
```
|
235
|
+
|
236
|
+
### Trade
|
237
|
+
#### [GET /api/v2/trades/my/of_order](https://max.maicoin.com/documents/api_list#!/private/getApiV2TradesMyOfOrder)
|
238
|
+
|
239
|
+
> get your executed trades related to a order
|
240
|
+
|
241
|
+
<details>
|
242
|
+
<summary>Show code</summary>
|
243
|
+
|
244
|
+
```rb
|
245
|
+
# use max unique order id
|
246
|
+
@api.my_trades_of_order(123456)
|
247
|
+
|
248
|
+
# use user specified order id
|
249
|
+
@api.my_trades_of_order('MY_ORDER_123456', use_client_id: true)
|
250
|
+
```
|
251
|
+
</details>
|
252
|
+
|
253
|
+
#### [GET /api/v2/trades/my](https://max.maicoin.com/documents/api_list#!/private/getApiV2TradesMy)
|
254
|
+
|
255
|
+
> get your executed trades, sorted in reverse creation order
|
256
|
+
|
257
|
+
<details>
|
258
|
+
<summary>Show code</summary>
|
259
|
+
|
260
|
+
```rb
|
261
|
+
# use default parameters
|
262
|
+
@api.my_trades('btctwd')
|
263
|
+
|
264
|
+
# provide all possible parameters
|
265
|
+
@api.my_trades(
|
266
|
+
'maxtwd',
|
267
|
+
timestamp: 1624705402,
|
268
|
+
from: 68444,
|
269
|
+
to: 69444,
|
270
|
+
order_by: 'asc',
|
271
|
+
pagination: true,
|
272
|
+
page: 3,
|
273
|
+
limit: 15,
|
274
|
+
offset: 5,
|
275
|
+
)
|
276
|
+
```
|
277
|
+
</details>
|
278
|
+
|
279
|
+
### Withdrawal
|
280
|
+
#### [GET /api/v2/withdrawals](https://max.maicoin.com/documents/api_list#!/private/getApiV2Withdrawals)
|
281
|
+
|
282
|
+
> get your external withdrawals history
|
283
|
+
|
284
|
+
<details>
|
285
|
+
<summary>Show code</summary>
|
286
|
+
|
287
|
+
```rb
|
288
|
+
# use default parameters
|
289
|
+
@api.withdrawals('max')
|
290
|
+
|
291
|
+
# provide all possible parameters
|
292
|
+
@api.withdrawals(
|
293
|
+
'max',
|
294
|
+
'confirmed',
|
295
|
+
from: 68444,
|
296
|
+
to: 69444,
|
297
|
+
state: 'confirmed',
|
298
|
+
pagination: true,
|
299
|
+
page: 3,
|
300
|
+
limit: 15,
|
301
|
+
offset: 5,
|
302
|
+
)
|
303
|
+
```
|
304
|
+
</details>
|
305
|
+
|
306
|
+
#### [GET /api/v2/withdrawal](https://max.maicoin.com/documents/api_list#!/private/getApiV2Withdrawal)
|
307
|
+
|
308
|
+
> get details of a specific external withdraw
|
309
|
+
|
310
|
+
<details>
|
311
|
+
<summary>Show code</summary>
|
312
|
+
|
313
|
+
```rb
|
314
|
+
@api.withdrawal('withdraw_id')
|
315
|
+
```
|
316
|
+
</details>
|
317
|
+
|
318
|
+
#### [POST /api/v2/withdrawal](https://max.maicoin.com/documents/api_list#!/private/postApiV2Withdrawal)
|
319
|
+
|
320
|
+
> submit a withdrawal. IP whitelist for api token is required.
|
321
|
+
|
322
|
+
<details>
|
323
|
+
<summary>Show code</summary>
|
324
|
+
|
325
|
+
```rb
|
326
|
+
@api.create_withdrawal!('twd', 'withdraw_address_id', 100000)
|
327
|
+
```
|
328
|
+
</details>
|
329
|
+
|
330
|
+
### Profile
|
331
|
+
#### [GET /api/v2/members/profile](https://max.maicoin.com/documents/api_list#!/private/getApiV2MembersProfile)
|
332
|
+
|
333
|
+
> get personal profile information
|
334
|
+
|
335
|
+
<details>
|
336
|
+
<summary>Show code</summary>
|
337
|
+
|
338
|
+
```rb
|
339
|
+
@api.member_profile
|
340
|
+
```
|
341
|
+
</details>
|
342
|
+
|
343
|
+
#### [GET /api/v2/members/me](https://max.maicoin.com/documents/api_list#!/private/getApiV2MembersMe)
|
344
|
+
|
345
|
+
> get your profile and accounts information
|
346
|
+
|
347
|
+
<details>
|
348
|
+
<summary>Show code</summary>
|
349
|
+
|
350
|
+
```rb
|
351
|
+
@api.me
|
352
|
+
```
|
353
|
+
</details>
|
354
|
+
|
355
|
+
#### [GET /api/v2/members/vip_level](https://max.maicoin.com/documents/api_list#!/private/getApiV2MembersVipLevel)
|
356
|
+
|
357
|
+
> get VIP level info
|
358
|
+
|
359
|
+
<details>
|
360
|
+
<summary>Show code</summary>
|
361
|
+
|
362
|
+
```rb
|
363
|
+
@api.vip_level
|
364
|
+
```
|
365
|
+
</details>
|
366
|
+
|
367
|
+
### Account
|
368
|
+
#### [GET /api/v2/members/accounts](https://max.maicoin.com/documents/api_list#!/private/getApiV2MembersAccounts)
|
369
|
+
|
370
|
+
> get personal accounts information
|
371
|
+
|
372
|
+
<details>
|
373
|
+
<summary>Show code</summary>
|
374
|
+
|
375
|
+
```rb
|
376
|
+
@api.accounts
|
377
|
+
```
|
378
|
+
</details>
|
379
|
+
|
380
|
+
#### [GET /api/v2/members/accounts/{path_currency}](https://max.maicoin.com/documents/api_list#!/private/getApiV2MembersAccountsPathCurrency)
|
381
|
+
|
382
|
+
> get personal accounts information of a currency
|
383
|
+
|
384
|
+
<details>
|
385
|
+
<summary>Show code</summary>
|
386
|
+
|
387
|
+
```rb
|
388
|
+
@api.account(currnecy)
|
389
|
+
```
|
390
|
+
</details>
|
391
|
+
|
392
|
+
### Deposit
|
393
|
+
#### [GET /api/v2/deposits](https://max.maicoin.com/documents/api_list#!/private/getApiV2Deposits)
|
394
|
+
|
395
|
+
> get your deposits history
|
396
|
+
|
397
|
+
<details>
|
398
|
+
<summary>Show code</summary>
|
399
|
+
|
400
|
+
```rb
|
401
|
+
# use default parameters
|
402
|
+
@api.deposits('max')
|
403
|
+
|
404
|
+
# provide all possible parameters
|
405
|
+
@api.deposits(
|
406
|
+
'max',
|
407
|
+
'confirmed',
|
408
|
+
from: 68444,
|
409
|
+
to: 69444,
|
410
|
+
state: 'accepted',
|
411
|
+
pagination: true,
|
412
|
+
page: 3,
|
413
|
+
limit: 15,
|
414
|
+
offset: 5,
|
415
|
+
)
|
416
|
+
```
|
417
|
+
</details>
|
418
|
+
|
419
|
+
#### [GET /api/v2/deposit](https://max.maicoin.com/documents/api_list#!/private/getApiV2Deposit)
|
420
|
+
|
421
|
+
> get details of a specific deposit
|
422
|
+
|
423
|
+
<details>
|
424
|
+
<summary>Show code</summary>
|
425
|
+
|
426
|
+
```rb
|
427
|
+
@api.deposit('transaction_id')
|
428
|
+
```
|
429
|
+
</details>
|
430
|
+
|
431
|
+
### Address
|
432
|
+
#### [GET /api/v2/deposit_addresses](https://max.maicoin.com/documents/api_list#!/private/getApiV2DepositAddresses)
|
433
|
+
|
434
|
+
> The addresses could be empty before generated, please call POST /deposit_addresses in that case
|
435
|
+
|
436
|
+
<details>
|
437
|
+
<summary>Show code</summary>
|
438
|
+
|
439
|
+
```rb
|
440
|
+
# use default parameters
|
441
|
+
@api.deposit_addresses
|
442
|
+
|
443
|
+
# provide all possible parameters
|
444
|
+
@api.deposit_addresses(currency: 'twd', pagination: true, page: 3, limit: 15, offset: 5)
|
445
|
+
```
|
446
|
+
</details>
|
447
|
+
|
448
|
+
#### [POST /api/v2/deposit_addresses](https://max.maicoin.com/documents/api_list#!/private/postApiV2DepositAddresses)
|
449
|
+
|
450
|
+
> Address creation is asynchronous, please call GET /deposit_addresses later to get generated addresses
|
451
|
+
|
452
|
+
<details>
|
453
|
+
<summary>Show code</summary>
|
454
|
+
|
455
|
+
```rb
|
456
|
+
@api.create_deposit_addresses!('twd')
|
457
|
+
```
|
458
|
+
</details>
|
459
|
+
|
460
|
+
#### [GET /api/v2/withdraw_addresses](https://max.maicoin.com/documents/api_list#!/private/getApiV2WithdrawAddresses)
|
461
|
+
|
462
|
+
> get withdraw addresses
|
463
|
+
|
464
|
+
<details>
|
465
|
+
<summary>Show code</summary>
|
466
|
+
|
467
|
+
```rb
|
468
|
+
# use default parameters
|
469
|
+
@api.withdraw_addresses('twd')
|
470
|
+
|
471
|
+
# provide all possible parameters
|
472
|
+
@api.withdraw_addresses('usdt', pagination: true, page: 3, limit: 15, offset: 5)
|
473
|
+
```
|
474
|
+
</details>
|
475
|
+
|
476
|
+
### Internal Transfer
|
477
|
+
#### [GET /api/v2/internal_transfers](https://max.maicoin.com/documents/api_list#!/private/getApiV2InternalTransfers)
|
478
|
+
|
479
|
+
> get internal transfers history
|
480
|
+
|
481
|
+
<details>
|
482
|
+
<summary>Show code</summary>
|
483
|
+
|
484
|
+
```rb
|
485
|
+
# use default parameters
|
486
|
+
@api.internal_transfers
|
487
|
+
|
488
|
+
# provide all possible parameters
|
489
|
+
@api.internal_transfers(
|
490
|
+
currency: 'btc',
|
491
|
+
side: 'in',
|
492
|
+
from: 68444,
|
493
|
+
to: 69444,
|
494
|
+
pagination: true,
|
495
|
+
page: 3,
|
496
|
+
limit: 15,
|
497
|
+
offset: 5,
|
498
|
+
)
|
499
|
+
```
|
500
|
+
</details>
|
501
|
+
|
502
|
+
#### [GET /api/v2/internal_transfer](https://max.maicoin.com/documents/api_list#!/private/getApiV2InternalTransfer)
|
503
|
+
|
504
|
+
> get details of a specific internal transfer
|
505
|
+
|
506
|
+
<details>
|
507
|
+
<summary>Show code</summary>
|
508
|
+
|
509
|
+
```rb
|
510
|
+
@api.internal_transfer('internal_transfer_id')
|
511
|
+
```
|
512
|
+
</details>
|
513
|
+
|
514
|
+
### Reward
|
515
|
+
#### [GET /api/v2/rewards](https://max.maicoin.com/documents/api_list#!/private/getApiV2Rewards)
|
516
|
+
|
517
|
+
> get rewards history
|
518
|
+
|
519
|
+
<details>
|
520
|
+
<summary>Show code</summary>
|
521
|
+
|
522
|
+
```rb
|
523
|
+
# use default parameters
|
524
|
+
@api.rewards
|
525
|
+
|
526
|
+
# provide all possible parameters
|
527
|
+
@api.rewards(
|
528
|
+
currency: 'btc',
|
529
|
+
from: 68444,
|
530
|
+
to: 69444,
|
531
|
+
pagination: true,
|
532
|
+
page: 3,
|
533
|
+
limit: 15,
|
534
|
+
offset: 5,
|
535
|
+
)
|
536
|
+
```
|
537
|
+
</details>
|
538
|
+
|
539
|
+
#### [GET /api/v2/rewards/{path_reward_type}](https://max.maicoin.com/documents/api_list#!/private/getApiV2RewardsPathRewardType)
|
540
|
+
|
541
|
+
> get specific rewards history
|
542
|
+
|
543
|
+
<details>
|
544
|
+
<summary>Show code</summary>
|
545
|
+
|
546
|
+
```rb
|
547
|
+
# use default parameters
|
548
|
+
@api.rewards(reward_type: 'airdrop_rewards')
|
549
|
+
|
550
|
+
# provide all possible parameters
|
551
|
+
@api.rewards(
|
552
|
+
reward_type: 'airdrop_rewards',
|
553
|
+
currency: 'btc',
|
554
|
+
from: 68444,
|
555
|
+
to: 69444,
|
556
|
+
pagination: true,
|
557
|
+
page: 3,
|
558
|
+
limit: 15,
|
559
|
+
offset: 5,
|
560
|
+
)
|
561
|
+
```
|
562
|
+
</details>
|
563
|
+
|
564
|
+
#### [GET /api/v2/max_rewards/yesterday](https://max.maicoin.com/documents/api_list#!/private/getApiV2MaxRewardsYesterday)
|
565
|
+
|
566
|
+
> get max rewards yesterday
|
567
|
+
|
568
|
+
<details>
|
569
|
+
<summary>Show code</summary>
|
570
|
+
|
571
|
+
```rb
|
572
|
+
@api.max_rewards_yesterday
|
573
|
+
```
|
574
|
+
</details>
|
575
|
+
|
576
|
+
### Order
|
577
|
+
#### [GET /api/v2/orders](https://max.maicoin.com/documents/api_list#!/private/getApiV2Orders)
|
578
|
+
|
579
|
+
> get your orders, results is paginated.
|
580
|
+
|
581
|
+
<details>
|
582
|
+
<summary>Show code</summary>
|
583
|
+
|
584
|
+
```rb
|
585
|
+
# use default parameters
|
586
|
+
@api.orders('maxtwd')
|
587
|
+
|
588
|
+
# provide all possible parameters
|
589
|
+
@api.orders(
|
590
|
+
'maxtwd',
|
591
|
+
state: 'done',
|
592
|
+
order_by: 'desc',
|
593
|
+
group_id: 12345,
|
594
|
+
pagination: true,
|
595
|
+
page: 3,
|
596
|
+
limit: 15,
|
597
|
+
offset: 5,
|
598
|
+
)
|
599
|
+
```
|
600
|
+
</details>
|
601
|
+
|
602
|
+
#### [GET /api/v2/order](https://max.maicoin.com/documents/api_list#!/private/getApiV2Order)
|
603
|
+
|
604
|
+
> get a specific order.
|
605
|
+
|
606
|
+
<details>
|
607
|
+
<summary>Show code</summary>
|
608
|
+
|
609
|
+
```rb
|
610
|
+
# use max unique order id
|
611
|
+
@api.order(123456)
|
612
|
+
|
613
|
+
# use user specified order id
|
614
|
+
@api.order('MY_ORDER_123456', use_client_id: true)
|
615
|
+
```
|
616
|
+
</details>
|
617
|
+
|
618
|
+
#### [POST /api/v2/orders/clear](https://max.maicoin.com/documents/api_list#!/private/postApiV2OrdersClear)
|
619
|
+
|
620
|
+
> cancel all your orders with given market and side
|
621
|
+
|
622
|
+
<details>
|
623
|
+
<summary>Show code</summary>
|
624
|
+
|
625
|
+
```rb
|
626
|
+
# use default parameters
|
627
|
+
@api.cancel_orders!
|
628
|
+
|
629
|
+
# provide all possible parameters
|
630
|
+
@api.cancel_orders!(market: 'maxtwd', side: 'sell', group_id: '123456')
|
631
|
+
```
|
632
|
+
</details>
|
633
|
+
|
634
|
+
#### [POST /api/v2/order/delete](https://max.maicoin.com/documents/api_list#!/private/postApiV2OrderDelete)
|
635
|
+
|
636
|
+
> cancel an order
|
637
|
+
|
638
|
+
<details>
|
639
|
+
<summary>Show code</summary>
|
640
|
+
|
641
|
+
```rb
|
642
|
+
# use max unique order id
|
643
|
+
@api.cancel_order!(123456)
|
644
|
+
|
645
|
+
# use user specified order id
|
646
|
+
@api.cancel_order!('MY_ORDER_123456', use_client_id: true)
|
647
|
+
```
|
648
|
+
</details>
|
649
|
+
|
650
|
+
#### [POST /api/v2/orders](https://max.maicoin.com/documents/api_list#!/private/postApiV2Orders)
|
651
|
+
|
652
|
+
> create a sell/buy order
|
653
|
+
|
654
|
+
<details>
|
655
|
+
<summary>Show code</summary>
|
656
|
+
|
657
|
+
```rb
|
658
|
+
# use default parameters
|
659
|
+
@api.create_order!('maxtwd', 'buy', 1000, price: 7.5)
|
660
|
+
|
661
|
+
# provide all possible parameters
|
662
|
+
@api.create_order!(
|
663
|
+
'maxtwd',
|
664
|
+
'buy',
|
665
|
+
1000,
|
666
|
+
price: 7.5,
|
667
|
+
client_oid: 'MY_ORDER_ID_12345',
|
668
|
+
stop_price: 8,
|
669
|
+
ord_type: 'limit',
|
670
|
+
group_id: 12345678,
|
671
|
+
)
|
672
|
+
```
|
673
|
+
</details>
|
674
|
+
|
675
|
+
#### [POST /api/v2/orders/multi/onebyone](https://max.maicoin.com/documents/api_list#!/private/postApiV2OrdersMultiOnebyone)
|
676
|
+
|
677
|
+
> Create multiple sell/buy orders, orders may be partially accepted, please put your orders as an array in json body.
|
678
|
+
|
679
|
+
<details>
|
680
|
+
<summary>Show code</summary>
|
681
|
+
|
682
|
+
```rb
|
683
|
+
# use default parameters
|
684
|
+
@api.create_orders!('maxtwd', [
|
685
|
+
{ side: 'buy', volume: '1000', price: 7.5 },
|
686
|
+
{ side: 'buy', volume: '1500', price: 7.2 },
|
687
|
+
])
|
688
|
+
|
689
|
+
# provide all possible parameters
|
690
|
+
@api.create_orders!('maxtwd', [
|
691
|
+
{ side: 'buy', volume: '1000', price: 7.5, client_oid: 'MY_ORDER_ID_12345', stop_price: 8, ord_type: 'limit' },
|
692
|
+
{ side: 'buy', volume: '1500', price: 7.2, client_oid: 'MY_ORDER_ID_12346', stop_price: 8, ord_type: 'limit' },
|
693
|
+
], group_id: 12345)
|
694
|
+
```
|
695
|
+
</details>
|
55
696
|
|
56
697
|
## Development
|
57
698
|
|
data/lib/max_exchange_api.rb
CHANGED
@@ -7,6 +7,13 @@ module MaxExchangeApi
|
|
7
7
|
class BaseApi
|
8
8
|
include HTTParty
|
9
9
|
|
10
|
+
attr_reader :config
|
11
|
+
|
12
|
+
def initialize(config: nil)
|
13
|
+
@config = Config.new(config)
|
14
|
+
@config.reverse_merge!(MaxExchangeApi.default_config)
|
15
|
+
end
|
16
|
+
|
10
17
|
protected
|
11
18
|
|
12
19
|
def send_request(method, path, headers, query)
|
@@ -19,7 +26,7 @@ module MaxExchangeApi
|
|
19
26
|
path,
|
20
27
|
headers: headers,
|
21
28
|
query: query,
|
22
|
-
timeout:
|
29
|
+
timeout: @config.timeout,
|
23
30
|
).parsed_response
|
24
31
|
|
25
32
|
print_log(:info, "[API] #{uuid} response #{response}")
|
@@ -32,8 +39,9 @@ module MaxExchangeApi
|
|
32
39
|
|
33
40
|
private
|
34
41
|
|
35
|
-
def print_log(
|
36
|
-
|
42
|
+
def print_log(method, message)
|
43
|
+
logger = @config.logger
|
44
|
+
logger.send(method, message) if logger
|
37
45
|
end
|
38
46
|
end
|
39
47
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MaxExchangeApi
|
4
|
+
class Config
|
5
|
+
attr_accessor :timeout
|
6
|
+
attr_accessor :logger
|
7
|
+
|
8
|
+
def initialize(data = nil)
|
9
|
+
data ||= {}
|
10
|
+
@timeout = data[:timeout]
|
11
|
+
@logger = data[:logger]
|
12
|
+
end
|
13
|
+
|
14
|
+
def reverse_merge!(other)
|
15
|
+
@timeout ||= other.timeout
|
16
|
+
@logger ||= other.logger
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
@default_config = Config.new
|
21
|
+
@default_config.timeout = 3
|
22
|
+
|
23
|
+
class << self
|
24
|
+
attr_reader :default_config
|
25
|
+
end
|
26
|
+
end
|
@@ -2,5 +2,26 @@
|
|
2
2
|
|
3
3
|
module MaxExchangeApi
|
4
4
|
module Helper
|
5
|
+
class << self
|
6
|
+
def gen_headers(payload, access_key, secret_key)
|
7
|
+
encoded_payload = encode(payload)
|
8
|
+
|
9
|
+
return {
|
10
|
+
'X-MAX-ACCESSKEY' => access_key,
|
11
|
+
'X-MAX-PAYLOAD' => encoded_payload,
|
12
|
+
'X-MAX-SIGNATURE' => encrypt(encoded_payload, secret_key),
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def encode(data)
|
19
|
+
Base64.strict_encode64(data.to_json)
|
20
|
+
end
|
21
|
+
|
22
|
+
def encrypt(data, key)
|
23
|
+
OpenSSL::HMAC.digest('sha256', key, data).unpack('H*')[0]
|
24
|
+
end
|
25
|
+
end
|
5
26
|
end
|
6
27
|
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'max_exchange_api/base_api'
|
4
|
+
|
5
|
+
module MaxExchangeApi
|
6
|
+
class PrivateApi < BaseApi
|
7
|
+
base_uri 'https://max-api.maicoin.com/api/v2'
|
8
|
+
|
9
|
+
def initialize(access_key, secret_key, config: nil)
|
10
|
+
super(config: config)
|
11
|
+
|
12
|
+
@access_key = access_key
|
13
|
+
@secret_key = secret_key
|
14
|
+
end
|
15
|
+
|
16
|
+
def my_trades_of_order(order_id, use_client_id: false)
|
17
|
+
id_params_key = use_client_id ? :client_oid : :id
|
18
|
+
send_request(:get, '/trades/my/of_order', id_params_key => order_id)
|
19
|
+
end
|
20
|
+
|
21
|
+
def my_trades(market, timestamp: nil, from: nil, to: nil, order_by: 'desc', pagination: true, page: 1, limit: 50,
|
22
|
+
offset: 0)
|
23
|
+
send_request(
|
24
|
+
:get,
|
25
|
+
'/trades/my',
|
26
|
+
market: market,
|
27
|
+
timestamp: timestamp,
|
28
|
+
from: from,
|
29
|
+
to: to,
|
30
|
+
order_by: order_by,
|
31
|
+
pagination: pagination,
|
32
|
+
page: page,
|
33
|
+
limit: limit,
|
34
|
+
offset: offset,
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def member_profile
|
39
|
+
send_request(:get, '/members/profile', {})
|
40
|
+
end
|
41
|
+
|
42
|
+
def me
|
43
|
+
send_request(:get, '/members/me', {})
|
44
|
+
end
|
45
|
+
|
46
|
+
def vip_level
|
47
|
+
send_request(:get, '/members/vip_level', {})
|
48
|
+
end
|
49
|
+
|
50
|
+
def accounts
|
51
|
+
send_request(:get, '/members/accounts', {})
|
52
|
+
end
|
53
|
+
|
54
|
+
def account(currency)
|
55
|
+
send_request(:get, "/members/accounts/#{currency}", {})
|
56
|
+
end
|
57
|
+
|
58
|
+
def deposits(currency, from: nil, to: nil, state: nil, pagination: nil, page: 1, limit: 50,
|
59
|
+
offset: 0)
|
60
|
+
send_request(
|
61
|
+
:get,
|
62
|
+
'/deposits',
|
63
|
+
currency: currency,
|
64
|
+
from: from,
|
65
|
+
to: to,
|
66
|
+
state: state,
|
67
|
+
pagination: pagination,
|
68
|
+
page: page,
|
69
|
+
limit: limit,
|
70
|
+
offset: offset,
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
def deposit(transaction_id)
|
75
|
+
send_request(:get, '/deposit', txid: transaction_id)
|
76
|
+
end
|
77
|
+
|
78
|
+
def deposit_addresses(currency: nil, pagination: nil, page: 1, limit: 50, offset: 0)
|
79
|
+
send_request(
|
80
|
+
:get,
|
81
|
+
'/deposit_addresses',
|
82
|
+
currency: currency,
|
83
|
+
pagination: pagination,
|
84
|
+
page: page,
|
85
|
+
limit: limit,
|
86
|
+
offset: offset,
|
87
|
+
)
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_deposit_addresses!(currency)
|
91
|
+
send_request(:post, '/deposit_addresses', currency: currency)
|
92
|
+
end
|
93
|
+
|
94
|
+
def withdraw_addresses(currency, pagination: nil, page: 1, limit: 50, offset: 0)
|
95
|
+
send_request(
|
96
|
+
:get,
|
97
|
+
'/withdraw_addresses',
|
98
|
+
currency: currency,
|
99
|
+
pagination: pagination,
|
100
|
+
page: page,
|
101
|
+
limit: limit,
|
102
|
+
offset: offset,
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
def withdrawal(withdraw_id)
|
107
|
+
send_request(:get, '/withdrawal', uuid: withdraw_id)
|
108
|
+
end
|
109
|
+
|
110
|
+
def withdrawals(currency, from: nil, to: nil, state: nil, pagination: nil, page: 1, limit: 50,
|
111
|
+
offset: 0)
|
112
|
+
send_request(
|
113
|
+
:get,
|
114
|
+
'/withdrawals',
|
115
|
+
currency: currency,
|
116
|
+
from: from,
|
117
|
+
to: to,
|
118
|
+
state: state,
|
119
|
+
pagination: pagination,
|
120
|
+
page: page,
|
121
|
+
limit: limit,
|
122
|
+
offset: offset,
|
123
|
+
)
|
124
|
+
end
|
125
|
+
|
126
|
+
def create_withdrawal!(currency, withdraw_address_id, amount)
|
127
|
+
send_request(:post, '/withdrawal', currency: currency, withdraw_address_uuid: withdraw_address_id, amount: amount)
|
128
|
+
end
|
129
|
+
|
130
|
+
def internal_transfers(currency: nil, side: 'in', from: nil, to: nil, pagination: nil, page: 1, limit: 50,
|
131
|
+
offset: 0)
|
132
|
+
send_request(
|
133
|
+
:get,
|
134
|
+
'/internal_transfers',
|
135
|
+
currency: currency,
|
136
|
+
side: side,
|
137
|
+
from: from,
|
138
|
+
to: to,
|
139
|
+
pagination: pagination,
|
140
|
+
page: page,
|
141
|
+
limit: limit,
|
142
|
+
offset: offset,
|
143
|
+
)
|
144
|
+
end
|
145
|
+
|
146
|
+
def internal_transfer(internal_transfer_id)
|
147
|
+
send_request(:get, '/internal_transfer', uuid: internal_transfer_id)
|
148
|
+
end
|
149
|
+
|
150
|
+
def rewards(reward_type: nil, currency: nil, from: nil, to: nil, pagination: nil, page: 1, limit: 50, offset: 0)
|
151
|
+
path = reward_type ? "/rewards/#{reward_type}" : '/rewards'
|
152
|
+
send_request(
|
153
|
+
:get,
|
154
|
+
path,
|
155
|
+
currency: currency,
|
156
|
+
from: from,
|
157
|
+
to: to,
|
158
|
+
pagination: pagination,
|
159
|
+
page: page,
|
160
|
+
limit: limit,
|
161
|
+
offset: offset,
|
162
|
+
)
|
163
|
+
end
|
164
|
+
|
165
|
+
def max_rewards_yesterday
|
166
|
+
send_request(:get, '/max_rewards/yesterday', {})
|
167
|
+
end
|
168
|
+
|
169
|
+
def orders(market, state: nil, order_by: 'asc', group_id: nil, pagination: nil, page: 1, limit: 50, offset: 0)
|
170
|
+
send_request(
|
171
|
+
:get,
|
172
|
+
'/orders',
|
173
|
+
market: market,
|
174
|
+
state: state,
|
175
|
+
order_by: order_by,
|
176
|
+
group_id: group_id,
|
177
|
+
pagination: pagination,
|
178
|
+
page: page,
|
179
|
+
limit: limit,
|
180
|
+
offset: offset,
|
181
|
+
)
|
182
|
+
end
|
183
|
+
|
184
|
+
def order(order_id, use_client_id: false)
|
185
|
+
id_params_key = use_client_id ? :client_oid : :id
|
186
|
+
send_request(:get, '/order', id_params_key => order_id)
|
187
|
+
end
|
188
|
+
|
189
|
+
def cancel_orders!(market: nil, side: nil, group_id: nil)
|
190
|
+
send_request(:post, '/orders/clear', market: market, side: side, group_id: group_id)
|
191
|
+
end
|
192
|
+
|
193
|
+
def cancel_order!(order_id, use_client_id: false)
|
194
|
+
id_params_key = use_client_id ? :client_oid : :id
|
195
|
+
send_request(:post, '/order/delete', id_params_key => order_id)
|
196
|
+
end
|
197
|
+
|
198
|
+
def create_order!(market, side, volume, price: nil, client_oid: nil, stop_price: nil, ord_type: nil, group_id: nil)
|
199
|
+
send_request(
|
200
|
+
:post,
|
201
|
+
'/orders',
|
202
|
+
market: market,
|
203
|
+
side: side,
|
204
|
+
volume: volume,
|
205
|
+
price: price,
|
206
|
+
client_oid: client_oid,
|
207
|
+
stop_price: stop_price,
|
208
|
+
ord_type: ord_type,
|
209
|
+
group_id: group_id,
|
210
|
+
)
|
211
|
+
end
|
212
|
+
|
213
|
+
def create_orders!(market, orders, group_id: nil)
|
214
|
+
send_request(:post, '/orders/multi/onebyone', market: market, orders: orders, group_id: group_id)
|
215
|
+
end
|
216
|
+
|
217
|
+
protected
|
218
|
+
|
219
|
+
def send_request(method, path, query)
|
220
|
+
query = query.compact
|
221
|
+
query.merge!(path: "/api/v2#{path}", nonce: (Time.now.to_f * 1000).to_i)
|
222
|
+
return super(method, path, Helper.gen_headers(query, @access_key, @secret_key), query)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
@@ -6,10 +6,63 @@ module MaxExchangeApi
|
|
6
6
|
class PublicApi < BaseApi
|
7
7
|
base_uri 'https://max-api.maicoin.com/api/v2'
|
8
8
|
|
9
|
+
def vip_levels(level = nil)
|
10
|
+
if level
|
11
|
+
send_request(:get, "/vip_levels/#{level}", {})
|
12
|
+
else
|
13
|
+
send_request(:get, '/vip_levels', {})
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def currencies
|
18
|
+
send_request(:get, '/currencies', {})
|
19
|
+
end
|
20
|
+
|
21
|
+
def k(market, limit: 30, period: 1, timestamp: nil)
|
22
|
+
send_request(:get, '/k', market: market, limit: limit, period: period, timestamp: timestamp)
|
23
|
+
end
|
24
|
+
|
9
25
|
def depth(market, limit: 10, sort_by_price: true)
|
10
26
|
send_request(:get, '/depth', market: market, limit: limit, sort_by_price: sort_by_price)
|
11
27
|
end
|
12
28
|
|
29
|
+
def trades(market, timestamp: nil, from: nil, to: nil, order_by: 'desc', pagination: true, page: 1, limit: 50,
|
30
|
+
offset: 0)
|
31
|
+
send_request(
|
32
|
+
:get,
|
33
|
+
'/trades',
|
34
|
+
market: market,
|
35
|
+
timestamp: timestamp,
|
36
|
+
from: from,
|
37
|
+
to: to,
|
38
|
+
order_by: order_by,
|
39
|
+
pagination: pagination,
|
40
|
+
page: page,
|
41
|
+
limit: limit,
|
42
|
+
offset: offset,
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
def markets
|
47
|
+
send_request(:get, '/markets', {})
|
48
|
+
end
|
49
|
+
|
50
|
+
def summary
|
51
|
+
send_request(:get, '/summary', {})
|
52
|
+
end
|
53
|
+
|
54
|
+
def tickers(market = nil)
|
55
|
+
if market
|
56
|
+
send_request(:get, "/tickers/#{market}", {})
|
57
|
+
else
|
58
|
+
send_request(:get, '/tickers', {})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def timestamp
|
63
|
+
send_request(:get, '/timestamp', {})
|
64
|
+
end
|
65
|
+
|
13
66
|
protected
|
14
67
|
|
15
68
|
def send_request(method, path, query)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: max_exchange_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- khiav reoy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -106,7 +106,9 @@ files:
|
|
106
106
|
- gemfiles/Gemfile
|
107
107
|
- lib/max_exchange_api.rb
|
108
108
|
- lib/max_exchange_api/base_api.rb
|
109
|
+
- lib/max_exchange_api/config.rb
|
109
110
|
- lib/max_exchange_api/helper.rb
|
111
|
+
- lib/max_exchange_api/private_api.rb
|
110
112
|
- lib/max_exchange_api/public_api.rb
|
111
113
|
- lib/max_exchange_api/version.rb
|
112
114
|
- max_exchange_api.gemspec
|