@yuants/vendor-okx 0.16.8 → 0.17.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 (84) hide show
  1. package/dist/account.js +198 -0
  2. package/dist/account.js.map +1 -0
  3. package/dist/api.js +463 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/cli.js +3 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/cluster.js +80 -0
  8. package/dist/cluster.js.map +1 -0
  9. package/dist/extension.js +89 -0
  10. package/dist/extension.js.map +1 -0
  11. package/dist/index.js +7 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/interest_rate.js +133 -0
  14. package/dist/interest_rate.js.map +1 -0
  15. package/dist/legacy_index.js +554 -0
  16. package/dist/legacy_index.js.map +1 -0
  17. package/dist/logger.js +91 -0
  18. package/dist/logger.js.map +1 -0
  19. package/dist/ohlc.js +98 -0
  20. package/dist/ohlc.js.map +1 -0
  21. package/dist/order.js +96 -0
  22. package/dist/order.js.map +1 -0
  23. package/dist/product.js +85 -0
  24. package/dist/product.js.map +1 -0
  25. package/dist/quote.js +58 -0
  26. package/dist/quote.js.map +1 -0
  27. package/dist/vendor-okx.d.ts +1 -0
  28. package/lib/account.d.ts +102 -0
  29. package/lib/account.d.ts.map +1 -0
  30. package/lib/account.js +201 -0
  31. package/lib/account.js.map +1 -0
  32. package/lib/api.d.ts +1401 -0
  33. package/lib/api.d.ts.map +1 -0
  34. package/lib/api.js +470 -0
  35. package/lib/api.js.map +1 -0
  36. package/lib/cli.d.ts +3 -0
  37. package/lib/cli.d.ts.map +1 -0
  38. package/lib/cli.js +5 -0
  39. package/lib/cli.js.map +1 -0
  40. package/lib/cluster.d.ts +2 -0
  41. package/lib/cluster.d.ts.map +1 -0
  42. package/lib/cluster.js +108 -0
  43. package/lib/cluster.js.map +1 -0
  44. package/lib/extension.d.ts +4 -0
  45. package/lib/extension.d.ts.map +1 -0
  46. package/lib/extension.js +91 -0
  47. package/lib/extension.js.map +1 -0
  48. package/lib/index.d.ts +7 -0
  49. package/lib/index.d.ts.map +1 -0
  50. package/lib/index.js +9 -0
  51. package/lib/index.js.map +1 -0
  52. package/lib/interest_rate.d.ts +2 -0
  53. package/lib/interest_rate.d.ts.map +1 -0
  54. package/lib/interest_rate.js +135 -0
  55. package/lib/interest_rate.js.map +1 -0
  56. package/lib/legacy_index.d.ts +2 -0
  57. package/lib/legacy_index.d.ts.map +1 -0
  58. package/lib/legacy_index.js +556 -0
  59. package/lib/legacy_index.js.map +1 -0
  60. package/lib/logger.d.ts +21 -0
  61. package/lib/logger.d.ts.map +1 -0
  62. package/lib/logger.js +98 -0
  63. package/lib/logger.js.map +1 -0
  64. package/lib/ohlc.d.ts +2 -0
  65. package/lib/ohlc.d.ts.map +1 -0
  66. package/lib/ohlc.js +100 -0
  67. package/lib/ohlc.js.map +1 -0
  68. package/lib/order.d.ts +4 -0
  69. package/lib/order.d.ts.map +1 -0
  70. package/lib/order.js +99 -0
  71. package/lib/order.js.map +1 -0
  72. package/lib/product.d.ts +6 -0
  73. package/lib/product.d.ts.map +1 -0
  74. package/lib/product.js +88 -0
  75. package/lib/product.js.map +1 -0
  76. package/lib/quote.d.ts +42 -0
  77. package/lib/quote.d.ts.map +1 -0
  78. package/lib/quote.js +61 -0
  79. package/lib/quote.js.map +1 -0
  80. package/package.json +5 -2
  81. package/temp/image-tag +1 -0
  82. package/temp/package-deps.json +41 -0
  83. package/temp/vendor-okx.api.json +177 -0
  84. package/temp/vendor-okx.api.md +9 -0
package/dist/api.js ADDED
@@ -0,0 +1,463 @@
1
+ import { formatTime } from '@yuants/utils';
2
+ // @ts-ignore
3
+ import CryptoJS from 'crypto-js';
4
+ /**
5
+ * API v5: https://www.okx.com/docs-v5/#overview
6
+ */
7
+ export class OkxClient {
8
+ constructor(config) {
9
+ this.config = config;
10
+ this.noAuth = true;
11
+ /**
12
+ * 获取所有产品行情信息
13
+ *
14
+ * 获取产品行情信息
15
+ *
16
+ * 限速:20次/2s
17
+ * 限速规则:IP
18
+ *
19
+ * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-tickers
20
+ */
21
+ this.getMarketTickers = (params) => this.request('GET', '/api/v5/market/tickers', params);
22
+ /**
23
+ * 获取账户资产估值
24
+ *
25
+ * 查看账户资产估值
26
+ *
27
+ * 限速:1次/s
28
+ * 限速规则:UserID
29
+ *
30
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-account-asset-valuation
31
+ */
32
+ this.getAssetValuation = (params) => this.request('GET', '/api/v5/asset/asset-valuation', params);
33
+ /**
34
+ * 获取持仓总量
35
+ *
36
+ * 查询单个交易产品的市场的持仓总量
37
+ *
38
+ * 限速:20次/2s
39
+ * 限速规则:IP + instrumentID
40
+ *
41
+ * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-open-interest
42
+ */
43
+ this.getOpenInterest = (params) => this.request('GET', '/api/v5/public/open-interest', params);
44
+ /**
45
+ * 查看账户配置
46
+ * 查看当前账户的配置信息。
47
+ *
48
+ * 限速:5次/2s
49
+ * 限速规则:UserID
50
+ *
51
+ * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-account-configuration
52
+ */
53
+ this.getAccountConfig = () => this.request('GET', '/api/v5/account/config');
54
+ /**
55
+ * 获取市场借币杠杆利率和借币限额
56
+ *
57
+ * 限速:2次/2s
58
+ * 限速规则:IP
59
+ *
60
+ * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-interest-rate-and-loan-quota
61
+ */
62
+ this.getInterestRateLoanQuota = () => this.request('GET', '/api/v5/public/interest-rate-loan-quota');
63
+ /**
64
+ * 获取交易产品基础信息
65
+ *
66
+ * 获取所有可交易产品的信息列表。
67
+ *
68
+ * 限速:20次/2s
69
+ * 限速规则:IP +instType
70
+ *
71
+ * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-instruments
72
+ */
73
+ this.getInstruments = (params) => this.request('GET', '/api/v5/public/instruments', params);
74
+ /**
75
+ * 获取永续合约当前资金费率
76
+ * 获取当前资金费率
77
+ *
78
+ * 限速:20次/2s
79
+ * 限速规则:IP +instrumentID
80
+ *
81
+ * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate
82
+ */
83
+ this.getFundingRate = (params) => this.request('GET', '/api/v5/public/funding-rate', params);
84
+ /**
85
+ * 获取永续合约历史资金费率
86
+ *
87
+ * 获取最近3个月的历史资金费率
88
+ *
89
+ * 限速:10次/2s
90
+ * 限速规则:IP +instrumentID
91
+ *
92
+ * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate-history
93
+ */
94
+ this.getFundingRateHistory = (params) => this.request('GET', '/api/v5/public/funding-rate-history', params);
95
+ /**
96
+ * 获取标记价格历史K线数据
97
+ *
98
+ * 获取最近几年的标记价格K线数据
99
+ *
100
+ * 限速:10次/2s
101
+ * 限速规则:IP
102
+ *
103
+ * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-mark-price-candlesticks-history
104
+ */
105
+ this.getHistoryMarkPriceCandles = (params) => this.request('GET', '/api/v5/market/history-mark-price-candles', params);
106
+ /**
107
+ * GET / 获取交易产品历史K线数据
108
+ *
109
+ * 获取最近几年的历史k线数据(1s k线支持查询最近3个月的数据)
110
+ *
111
+ * 限速:20次/2s
112
+ *
113
+ * 限速规则:IP
114
+ *
115
+ * 期权不支持 1s K线, 其他业务线 (币币, 杠杆, 交割和永续)支持
116
+ */
117
+ this.getHistoryCandles = (params) => this.request('GET', '/api/v5/market/history-candles', params);
118
+ /**
119
+ * 获取余币宝余额
120
+ *
121
+ * 限速:6次/s
122
+ * 限速规则:UserID
123
+ *
124
+ * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-saving-balance
125
+ */
126
+ this.getFinanceSavingsBalance = (params) => this.request('GET', '/api/v5/finance/savings/balance', params);
127
+ /**
128
+ * 余币宝申购/赎回
129
+ *
130
+ * 仅资金账户中的资产支持余币宝申购。
131
+ *
132
+ * 限速:6次/s
133
+ *
134
+ * 限速规则:UserID
135
+ *
136
+ * https://www.okx.com/docs-v5/zh/#financial-product-savings-post-savings-purchase-redemption
137
+ */
138
+ this.postFinanceSavingsPurchaseRedempt = (params) => this.request('POST', '/api/v5/finance/savings/purchase-redempt', params);
139
+ /**
140
+ * GET / 获取市场借贷历史(公共)
141
+ *
142
+ * 公共接口无须鉴权
143
+ *
144
+ * 返回2021年12月14日后的记录
145
+ *
146
+ * 限速:6次/s
147
+ * 限速规则:IP
148
+ *
149
+ * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-public-borrow-history-public
150
+ */
151
+ this.getLendingRateHistory = (params) => this.request('GET', '/api/v5/finance/savings/lending-rate-history', params);
152
+ /**
153
+ * 提币
154
+ *
155
+ * 用户提币。普通子账户不支持提币。
156
+ *
157
+ * API只能提币到免认证地址/账户上,通过 WEB/APP 可以设置免认证地址。
158
+ *
159
+ * 关于标签:某些币种如XRP充币时同时需要一个充值地址和标签(又名memo/payment_id),标签是一种保证您的充币地址唯一性的数字串,与充币地址成对出现并一一对应。请您务必遵守正确的充值步骤,在提币时输入完整信息,否则将面临丢失币的风险!
160
+ * 对于有标签的币种,如果是OKX用户间的提币,请走内部转账不要走链上提币。
161
+ *
162
+ * 限速:6次/s
163
+ * 限速规则:UserID
164
+ *
165
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-withdrawal
166
+ */
167
+ this.postAssetWithdrawal = (params) => this.request('POST', '/api/v5/asset/withdrawal', params);
168
+ /**
169
+ * 获取充值地址信息
170
+ *
171
+ * 获取各个币种的充值地址,包括曾使用过的老地址。
172
+ *
173
+ * 限速:6次/s
174
+ * 限速规则:UserID
175
+ *
176
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-address
177
+ */
178
+ this.getAssetDepositAddress = (params) => this.request('GET', '/api/v5/asset/deposit-address', params);
179
+ /**
180
+ * 获取提币记录
181
+ *
182
+ * 根据币种,提币状态,时间范围获取提币记录,按照时间倒序排列,默认返回100条数据。
183
+ * 支持Websocket订阅,参考 提币信息频道。
184
+ *
185
+ * 限速:6 次/s
186
+ * 限速规则:UserID
187
+ *
188
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-withdrawal-history
189
+ */
190
+ this.getAssetWithdrawalHistory = (params) => this.request('GET', '/api/v5/asset/withdrawal-history', params);
191
+ /**
192
+ * 获取充值记录
193
+ *
194
+ * 根据币种,充值状态,时间范围获取充值记录,按照时间倒序排列,默认返回 100 条数据。
195
+ * 支持Websocket订阅,参考 充值信息频道。
196
+ *
197
+ * 限速:6次/s
198
+ * 限速规则:UserID
199
+ *
200
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-history
201
+ */
202
+ this.getAssetDepositHistory = (params) => this.request('GET', '/api/v5/asset/deposit-history', params);
203
+ /**
204
+ * 获取资金账户余额
205
+ *
206
+ * 获取资金账户所有资产列表,查询各币种的余额、冻结和可用等信息。
207
+ *
208
+ * 只返回余额大于0的币资产信息。
209
+ *
210
+ * 限速:6次/s
211
+ * 限速规则:UserID
212
+ *
213
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-balance
214
+ */
215
+ this.getAssetBalances = (params) => this.request('GET', '/api/v5/asset/balances', params);
216
+ /**
217
+ * 资金划转
218
+ *
219
+ * 调用时,API Key 需要有交易权限。
220
+ *
221
+ * 支持母账户的资金账户划转到交易账户,母账户到子账户的资金账户和交易账户划转。
222
+ *
223
+ * 子账户默认可转出至母账户,划转到同一母账户下的其他子账户,需要先调用 设置子账户主动转出权限 接口进行授权。
224
+ *
225
+ * 请求失败不代表划转失败,建议以获取资金划转状态接口返回的状态为准。
226
+ *
227
+ * 限速:2 次/s
228
+ * 限速规则:UserID + Currency
229
+ *
230
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-funds-transfer
231
+ */
232
+ this.postAssetTransfer = (params) => this.request('POST', '/api/v5/asset/transfer', params);
233
+ /**
234
+ * 查看账户余额
235
+ *
236
+ * 获取交易账户中资金余额信息。
237
+ *
238
+ * 免息额度和折算率都是公共数据,不在账户接口内展示
239
+ *
240
+ * 限速:10次/2s
241
+ * 限速规则:UserID
242
+ *
243
+ * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-balance
244
+ */
245
+ this.getAccountBalance = (params) => this.request('GET', '/api/v5/account/balance', params);
246
+ /**
247
+ * 查看持仓信息
248
+ *
249
+ * 获取该账户下拥有实际持仓的信息。账户为买卖模式会显示净持仓(net),账户为开平仓模式下会分别返回开多(long)或开空(short)的仓位。按照仓位创建时间倒序排列。
250
+ *
251
+ * 如果该 instId 拥有过仓位且当前持仓量为0,传 instId 时,如果当前存在有效的posId,会返回仓位信息,如果当前不存在有效的 posId 时,不会返回仓位信息;不传 instId 时,仓位信息不返回。
252
+ *
253
+ * 逐仓交易设置中,如果设置为自主划转模式,逐仓转入保证金后,会生成一个持仓量为0的仓位
254
+ *
255
+ * 限速:10次/2s
256
+ * 限速规则:UserID
257
+ *
258
+ * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-positions
259
+ */
260
+ this.getAccountPositions = (params) => this.request('GET', '/api/v5/account/positions', params);
261
+ /**
262
+ * 赚币
263
+ * GET / 查看项目
264
+ *
265
+ * 限速:3次/s
266
+ * 限速规则:UserID
267
+ */
268
+ this.getFinanceStakingDeFiOffers = (params) => this.request('GET', '/api/v5/finance/staking-defi/offers', params);
269
+ /**
270
+ * 赚币
271
+ * GET / 查看活跃订单
272
+ *
273
+ * 限速:3次/s
274
+ * 限速规则:UserID
275
+ */
276
+ this.getFinanceStakingDeFiOrdersActive = (params) => this.request('GET', '/api/v5/finance/staking-defi/orders-active', params);
277
+ /**
278
+ * 下单
279
+ *
280
+ * 只有当您的账户有足够的资金才能下单。
281
+ *
282
+ * 限速:60次/2s
283
+ *
284
+ * 跟单交易带单产品的限速:4次/2s
285
+ *
286
+ * 限速规则(期权以外):UserID + Instrument ID
287
+ *
288
+ * 限速规则(只限期权):UserID + Instrument Family
289
+ *
290
+ * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-place-order
291
+ */
292
+ this.postTradeOrder = (params) => this.request('POST', '/api/v5/trade/order', params);
293
+ /**
294
+ * 修改订单
295
+ *
296
+ * 修改当前未成交的挂单
297
+ *
298
+ * 限速:60次/2s
299
+ *
300
+ * 跟单交易带单员带单产品的限速:4个/2s
301
+ *
302
+ * 限速规则:User ID + Instrument ID
303
+ *
304
+ * 权限:交易
305
+ *
306
+ * 该接口限速同时受到 子账户限速 及 基于成交比率的子账户限速 限速规则的影响。
307
+ */
308
+ this.postTradeAmendOrder = (params) => this.request('POST', '/api/v5/trade/amend-order', params);
309
+ /**
310
+ * 获取未成交订单列表
311
+ *
312
+ * 获取当前账户下所有未成交订单信息
313
+ *
314
+ * 限速:60次/2s
315
+ * 限速规则:UserID
316
+ *
317
+ * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-get-order-list
318
+ */
319
+ this.getTradeOrdersPending = (params) => this.request('GET', '/api/v5/trade/orders-pending', params);
320
+ /**
321
+ * 获取历史订单记录(近七天)
322
+ *
323
+ * 获取最近7天挂单,且完成的订单数据,包括7天以前挂单,但近7天才成交的订单数据。按照订单创建时间倒序排序。
324
+ *
325
+ * 已经撤销的未成交单 只保留2小时
326
+ * 限速:40次/2s
327
+ * 限速规则:User ID
328
+ */
329
+ this.getTradeOrdersHistory = (params) => this.request('GET', '/api/v5/trade/orders-history', params);
330
+ /**
331
+ * 撤单
332
+ *
333
+ * 撤销之前下的未完成订单。
334
+ *
335
+ * 限速:60次/2s
336
+ *
337
+ * 限速规则(期权以外):UserID + Instrument ID
338
+ *
339
+ * 限速规则(只限期权):UserID + Instrument Family
340
+ *
341
+ * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-cancel-order
342
+ */
343
+ this.postTradeCancelOrder = (params) => this.request('POST', '/api/v5/trade/cancel-order', params);
344
+ /**
345
+ * 查看子账户列表
346
+ *
347
+ * 仅适用于母账户。
348
+ *
349
+ * 限速:2次/2s
350
+ *
351
+ * 限速规则:UserID
352
+ */
353
+ this.getSubAccountList = (params) => this.request('GET', '/api/v5/users/subaccount/list', params);
354
+ /**
355
+ * 设置子账户主动转出权限
356
+ *
357
+ * 设置子账户转出权限(仅适用于母账户),默认可转出至母账户。
358
+ *
359
+ * 限速:1次/s
360
+ *
361
+ * 限速规则:UserID
362
+ */
363
+ this.postSetSubAccountTransferOut = (params) => this.request('POST', '/api/v5/users/subaccount/set-transfer-out', params);
364
+ /**
365
+ * 获取资金划转状态
366
+ *
367
+ * 获取最近2个星期内的资金划转状态数据
368
+ *
369
+ * 限速:10 次/s
370
+ *
371
+ * 限速规则:UserID
372
+ *
373
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-funds-transfer-state
374
+ */
375
+ this.getAssetTransferState = (params) => this.request('GET', '/api/v5/asset/transfer-state', params);
376
+ /**
377
+ * 获取币种列表
378
+ *
379
+ * 获取当前用户KYC实体支持的币种列表。
380
+ *
381
+ * 限速:6 次/s
382
+ *
383
+ * 限速规则:UserID
384
+ *
385
+ * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-currencies
386
+ */
387
+ this.getAssetCurrencies = (params) => this.request('GET', '/api/v5/asset/currencies', params);
388
+ /**
389
+ * 获取指数行情数据
390
+ *
391
+ *
392
+ * 限速:20 次/2s
393
+ *
394
+ *
395
+ * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-index-tickers
396
+ */
397
+ this.getMarketIndexTicker = (params) => this.request('GET', '/api/v5/market/index-tickers', params);
398
+ /**
399
+ * 账单流水查询(近七天)
400
+ *
401
+ *
402
+ * 限速:5次/s
403
+ *
404
+ *
405
+ * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-7-days
406
+ */
407
+ this.getAccountBills = (params) => this.request('GET', '/api/v5/account/bills', params);
408
+ /**
409
+ * 账单流水查询(近三个月)
410
+ *
411
+ *
412
+ * 限速:5次/2s
413
+ *
414
+ *
415
+ * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-3-months
416
+ */
417
+ this.getAccountBillsArchive = (params) => this.request('GET', '/api/v5/account/bills-archive', params);
418
+ if (config.auth.public_key && config.auth.secret_key && config.auth.passphrase) {
419
+ this.noAuth = false;
420
+ }
421
+ }
422
+ async request(method, path, params) {
423
+ const url = new URL('https://www.okx.com');
424
+ url.pathname = path;
425
+ if (method === 'GET') {
426
+ for (const key in params) {
427
+ url.searchParams.set(key, params[key]);
428
+ }
429
+ }
430
+ if (this.noAuth) {
431
+ console.info(formatTime(Date.now()), method, url.href);
432
+ const res = await fetch(url.href, { method });
433
+ return res.json();
434
+ }
435
+ const timestamp = formatTime(Date.now(), 'UTC').replace(' ', 'T');
436
+ const secret_key = this.config.auth.secret_key;
437
+ const body = method === 'GET' ? '' : JSON.stringify(params);
438
+ const signData = timestamp + method + url.pathname + url.search + body;
439
+ const str = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(signData, secret_key));
440
+ const headers = {
441
+ 'Content-Type': 'application/json',
442
+ 'OK-ACCESS-KEY': this.config.auth.public_key,
443
+ 'OK-ACCESS-SIGN': str,
444
+ 'OK-ACCESS-TIMESTAMP': timestamp,
445
+ 'OK-ACCESS-PASSPHRASE': this.config.auth.passphrase,
446
+ };
447
+ console.info(formatTime(Date.now()), method, url.href, JSON.stringify(headers), body, signData);
448
+ const res = await fetch(url.href, {
449
+ method,
450
+ headers,
451
+ body: body || undefined,
452
+ });
453
+ return res.json();
454
+ }
455
+ }
456
+ export const client = new OkxClient({
457
+ auth: {
458
+ public_key: process.env.ACCESS_KEY,
459
+ secret_key: process.env.SECRET_KEY,
460
+ passphrase: process.env.PASSPHRASE,
461
+ },
462
+ });
463
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatTime } from '@yuants/utils';\n// @ts-ignore\nimport CryptoJS from 'crypto-js';\n\n/**\n * API v5: https://www.okx.com/docs-v5/#overview\n */\nexport class OkxClient {\n noAuth = true;\n constructor(\n public config: {\n auth: {\n public_key: string;\n secret_key: string;\n passphrase: string;\n };\n },\n ) {\n if (config.auth.public_key && config.auth.secret_key && config.auth.passphrase) {\n this.noAuth = false;\n }\n }\n\n async request(method: string, path: string, params?: any) {\n const url = new URL('https://www.okx.com');\n url.pathname = path;\n if (method === 'GET') {\n for (const key in params) {\n url.searchParams.set(key, params[key]);\n }\n }\n if (this.noAuth) {\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n return res.json();\n }\n const timestamp = formatTime(Date.now(), 'UTC').replace(' ', 'T');\n const secret_key = this.config.auth.secret_key;\n const body = method === 'GET' ? '' : JSON.stringify(params);\n const signData = timestamp + method + url.pathname + url.search + body;\n const str = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(signData, secret_key));\n\n const headers = {\n 'Content-Type': 'application/json',\n 'OK-ACCESS-KEY': this.config.auth.public_key!,\n 'OK-ACCESS-SIGN': str,\n 'OK-ACCESS-TIMESTAMP': timestamp,\n 'OK-ACCESS-PASSPHRASE': this.config.auth.passphrase,\n };\n\n console.info(formatTime(Date.now()), method, url.href, JSON.stringify(headers), body, signData);\n const res = await fetch(url.href, {\n method,\n headers,\n body: body || undefined,\n });\n return res.json();\n }\n\n /**\n * 获取所有产品行情信息\n *\n * 获取产品行情信息\n *\n * 限速:20次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-tickers\n */\n getMarketTickers = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instType: string;\n instId: string;\n last: string;\n lastSz: string;\n askPx: string;\n askSz: string;\n bidPx: string;\n bidSz: string;\n open24h: string;\n high24h: string;\n low24h: string;\n volCcy24h: string;\n vol24h: string;\n sodUtc0: string;\n sodUtc8: string;\n ts: string;\n }>;\n }> => this.request('GET', '/api/v5/market/tickers', params);\n\n /**\n * 获取账户资产估值\n *\n * 查看账户资产估值\n *\n * 限速:1次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-account-asset-valuation\n */\n getAssetValuation = (params?: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n details: {\n classic: string;\n earn: string;\n funding: string;\n trading: string;\n };\n totalBal: string;\n ts: string;\n }>;\n }> => this.request('GET', '/api/v5/asset/asset-valuation', params);\n\n /**\n * 获取持仓总量\n *\n * 查询单个交易产品的市场的持仓总量\n *\n * 限速:20次/2s\n * 限速规则:IP + instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-open-interest\n */\n getOpenInterest = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n instId: string;\n oi: string;\n oiCcy: string;\n ts: string;\n }[];\n }> => this.request('GET', '/api/v5/public/open-interest', params);\n\n /**\n * 查看账户配置\n * 查看当前账户的配置信息。\n *\n * 限速:5次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-account-configuration\n */\n getAccountConfig = (): Promise<{\n code: string;\n data: Array<{\n acctLv: string;\n autoLoan: boolean;\n ctIsoMode: string;\n greeksType: string;\n level: string;\n levelTmp: string;\n mgnIsoMode: string;\n posMode: string;\n spotOffsetType: string;\n uid: string;\n label: string;\n roleType: string;\n traderInsts: any[];\n spotRoleType: string;\n spotTraderInsts: any[];\n opAuth: string;\n kycLv: string;\n ip: string;\n perm: string;\n mainUid: string;\n }>;\n msg: string;\n }> => this.request('GET', '/api/v5/account/config');\n\n /**\n * 获取市场借币杠杆利率和借币限额\n *\n * 限速:2次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-interest-rate-and-loan-quota\n */\n getInterestRateLoanQuota = (): Promise<{\n code: string;\n data?: Array<{\n basic: Array<{\n ccy: string;\n rate: string;\n quota: string;\n }>;\n vip: Array<{\n loanQuotaCoef: string;\n level: string;\n }>;\n regular: Array<{\n loanQuotaCoef: string;\n level: string;\n }>;\n }>;\n }> => this.request('GET', '/api/v5/public/interest-rate-loan-quota');\n\n /**\n * 获取交易产品基础信息\n *\n * 获取所有可交易产品的信息列表。\n *\n * 限速:20次/2s\n * 限速规则:IP +instType\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-instruments\n */\n getInstruments = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n alias: string;\n baseCcy: string;\n category: string;\n ctMult: string;\n ctType: string;\n ctVal: string;\n ctValCcy: string;\n expTime: string;\n instFamily: string;\n instId: string;\n instType: string;\n lever: string;\n listTime: string;\n lotSz: string;\n maxIcebergSz: string;\n maxLmtAmt: string;\n maxLmtSz: string;\n maxMktAmt: string;\n maxMktSz: string;\n maxStopSz: string;\n maxTriggerSz: string;\n maxTwapSz: string;\n minSz: string;\n optType: string;\n quoteCcy: string;\n settleCcy: string;\n state: string;\n stk: string;\n tickSz: string;\n uly: string;\n }>;\n }> => this.request('GET', '/api/v5/public/instruments', params);\n\n /**\n * 获取永续合约当前资金费率\n * 获取当前资金费率\n *\n * 限速:20次/2s\n * 限速规则:IP +instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate\n */\n getFundingRate = (params: {\n instId: string;\n }): Promise<{\n code: string;\n data: Array<{\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n maxFundingRate: string;\n minFundingRate: string;\n nextFundingRate: string;\n nextFundingTime: string;\n premium: string;\n settFundingRate: string;\n settState: string;\n ts: string;\n }>;\n msg: string;\n }> => this.request('GET', '/api/v5/public/funding-rate', params);\n\n /**\n * 获取永续合约历史资金费率\n *\n * 获取最近3个月的历史资金费率\n *\n * 限速:10次/2s\n * 限速规则:IP +instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate-history\n */\n getFundingRateHistory = (params: {\n instId: string;\n before?: string;\n after?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n realizedRate: string;\n }>;\n }> => this.request('GET', '/api/v5/public/funding-rate-history', params);\n\n /**\n * 获取标记价格历史K线数据\n *\n * 获取最近几年的标记价格K线数据\n *\n * 限速:10次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-mark-price-candlesticks-history\n */\n getHistoryMarkPriceCandles = (params: {\n instId: string;\n bar?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<[ts: string, o: string, h: string, l: string, c: string, confirm: string]>;\n }> => this.request('GET', '/api/v5/market/history-mark-price-candles', params);\n\n /**\n * GET / 获取交易产品历史K线数据\n *\n * 获取最近几年的历史k线数据(1s k线支持查询最近3个月的数据)\n *\n * 限速:20次/2s\n *\n * 限速规则:IP\n *\n * 期权不支持 1s K线, 其他业务线 (币币, 杠杆, 交割和永续)支持\n */\n getHistoryCandles = (params: {\n instId: string;\n bar?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<\n [\n ts: string,\n o: string,\n h: string,\n l: string,\n c: string,\n vol: string,\n volCcy: string,\n volCcyQuote: string,\n confirm: string,\n ]\n >;\n }> => this.request('GET', '/api/v5/market/history-candles', params);\n\n /**\n * 获取余币宝余额\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-saving-balance\n */\n getFinanceSavingsBalance = (params: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n earnings: string;\n redemptAmt: string;\n rate: string;\n ccy: string;\n amt: string;\n loanAmt: string;\n pendingAmt: string;\n }[];\n }> => this.request('GET', '/api/v5/finance/savings/balance', params);\n\n /**\n * 余币宝申购/赎回\n *\n * 仅资金账户中的资产支持余币宝申购。\n *\n * 限速:6次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-post-savings-purchase-redemption\n */\n postFinanceSavingsPurchaseRedempt = (params: {\n ccy: string;\n amt: string;\n side: string;\n rate: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n amt: string;\n side: string;\n rate: string;\n }[];\n }> => this.request('POST', '/api/v5/finance/savings/purchase-redempt', params);\n\n /**\n * GET / 获取市场借贷历史(公共)\n *\n * 公共接口无须鉴权\n *\n * 返回2021年12月14日后的记录\n *\n * 限速:6次/s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-public-borrow-history-public\n */\n getLendingRateHistory = (params: {\n ccy?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n ccy: string;\n amt: string;\n rate: string;\n ts: string;\n }>;\n }> => this.request('GET', '/api/v5/finance/savings/lending-rate-history', params);\n\n /**\n * 提币\n *\n * 用户提币。普通子账户不支持提币。\n *\n * API只能提币到免认证地址/账户上,通过 WEB/APP 可以设置免认证地址。\n *\n * 关于标签:某些币种如XRP充币时同时需要一个充值地址和标签(又名memo/payment_id),标签是一种保证您的充币地址唯一性的数字串,与充币地址成对出现并一一对应。请您务必遵守正确的充值步骤,在提币时输入完整信息,否则将面临丢失币的风险!\n * 对于有标签的币种,如果是OKX用户间的提币,请走内部转账不要走链上提币。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-withdrawal\n */\n postAssetWithdrawal = (params: {\n amt: string;\n fee: string;\n dest: string;\n ccy: string;\n chain?: string;\n toAddr: string;\n clientId?: string;\n rcvrInfo?: {\n walletType: string;\n exchId: string;\n rcvrFirstName: string;\n rcvrLastName: string;\n };\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n amt: string;\n wdId: string;\n ccy: string;\n clientId: string;\n chain: string;\n }>;\n }> => this.request('POST', '/api/v5/asset/withdrawal', params);\n\n /**\n * 获取充值地址信息\n *\n * 获取各个币种的充值地址,包括曾使用过的老地址。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-address\n */\n getAssetDepositAddress = (params: {\n ccy: string;\n }): Promise<{\n code: string;\n data: {\n chain: string;\n ctAddr: string;\n ccy: string;\n to: string;\n addr: string;\n verifiedName: string;\n selected: boolean;\n }[];\n msg: string;\n }> => this.request('GET', '/api/v5/asset/deposit-address', params);\n\n /**\n * 获取提币记录\n *\n * 根据币种,提币状态,时间范围获取提币记录,按照时间倒序排列,默认返回100条数据。\n * 支持Websocket订阅,参考 提币信息频道。\n *\n * 限速:6 次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-withdrawal-history\n */\n getAssetWithdrawalHistory = (params: {\n ccy?: string;\n wdId?: string;\n clientId?: string;\n txId?: string;\n type?: string;\n state?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n chain: string;\n fee: string;\n feeCcy: string;\n ccy: string;\n clientId: string;\n amt: string;\n txId: string;\n from: string;\n areaCodeFrom: string;\n to: string;\n areaCodeTo: string;\n state: string;\n ts: string;\n nonTradableAsset: boolean;\n wdId: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/withdrawal-history', params);\n\n /**\n * 获取充值记录\n *\n * 根据币种,充值状态,时间范围获取充值记录,按照时间倒序排列,默认返回 100 条数据。\n * 支持Websocket订阅,参考 充值信息频道。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-history\n */\n getAssetDepositHistory = (params: {\n ccy?: string;\n depId?: string;\n state?: string;\n fromWdId?: string;\n txId?: string;\n type?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n actualDepBlkConfirm: string;\n amt: string;\n areaCodeFrom: string;\n ccy: string;\n chain: string;\n depId: string;\n from: string;\n fromWdId: string;\n state: string;\n to: string;\n ts: string;\n txId: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/deposit-history', params);\n\n /**\n * 获取资金账户余额\n *\n * 获取资金账户所有资产列表,查询各币种的余额、冻结和可用等信息。\n *\n * 只返回余额大于0的币资产信息。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-balance\n */\n getAssetBalances = (params: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n availBal: string;\n bal: string;\n ccy: string;\n frozenBal: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/balances', params);\n\n /**\n * 资金划转\n *\n * 调用时,API Key 需要有交易权限。\n *\n * 支持母账户的资金账户划转到交易账户,母账户到子账户的资金账户和交易账户划转。\n *\n * 子账户默认可转出至母账户,划转到同一母账户下的其他子账户,需要先调用 设置子账户主动转出权限 接口进行授权。\n *\n * 请求失败不代表划转失败,建议以获取资金划转状态接口返回的状态为准。\n *\n * 限速:2 次/s\n * 限速规则:UserID + Currency\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-funds-transfer\n */\n postAssetTransfer = (params: {\n ccy: string;\n type?: string;\n amt: string;\n from: string;\n to: string;\n subAcct?: string;\n loanTrans?: boolean;\n omitPosRisk?: string;\n clientId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n transId: string;\n ccy: string;\n clientId: string;\n from: string;\n amt: string;\n to: string;\n }[];\n }> => this.request('POST', '/api/v5/asset/transfer', params);\n\n /**\n * 查看账户余额\n *\n * 获取交易账户中资金余额信息。\n *\n * 免息额度和折算率都是公共数据,不在账户接口内展示\n *\n * 限速:10次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-balance\n */\n getAccountBalance = (params: {\n ccy?: string;\n }): Promise<{\n code: string;\n data: {\n adjEq: string;\n borrowFroz: string;\n details: {\n availBal: string;\n availEq: string;\n borrowFroz: string;\n cashBal: string;\n ccy: string;\n crossLiab: string;\n disEq: string;\n eq: string;\n eqUsd: string;\n fixedBal: string;\n frozenBal: string;\n imr: string;\n interest: string;\n isoEq: string;\n isoLiab: string;\n isoUpl: string;\n liab: string;\n maxLoan: string;\n mgnRatio: string;\n mmr: string;\n notionalLever: string;\n ordFrozen: string;\n rewardBal: string;\n spotInUseAmt: string;\n spotIsoBal: string;\n stgyEq: string;\n twap: string;\n uTime: string;\n upl: string;\n uplLiab: string;\n openAvgPx: string;\n spotUpl: string;\n accAvgPx: string;\n totalPnl: string;\n spotBal: string;\n }[];\n imr: string;\n isoEq: string;\n mgnRatio: string;\n mmr: string;\n notionalUsd: string;\n ordFroz: string;\n totalEq: string;\n uTime: string;\n upl: string;\n }[];\n msg: string;\n }> => this.request('GET', '/api/v5/account/balance', params);\n\n /**\n * 查看持仓信息\n *\n * 获取该账户下拥有实际持仓的信息。账户为买卖模式会显示净持仓(net),账户为开平仓模式下会分别返回开多(long)或开空(short)的仓位。按照仓位创建时间倒序排列。\n *\n * 如果该 instId 拥有过仓位且当前持仓量为0,传 instId 时,如果当前存在有效的posId,会返回仓位信息,如果当前不存在有效的 posId 时,不会返回仓位信息;不传 instId 时,仓位信息不返回。\n *\n * 逐仓交易设置中,如果设置为自主划转模式,逐仓转入保证金后,会生成一个持仓量为0的仓位\n *\n * 限速:10次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-positions\n */\n getAccountPositions = (params: {\n instType?: string;\n instId?: string;\n posId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n adl: string;\n availPos: string;\n avgPx: string;\n cTime: string;\n ccy: string;\n deltaBS: string;\n deltaPA: string;\n gammaBS: string;\n gammaPA: string;\n imr: string;\n instId: string;\n instType: string;\n interest: string;\n idxPx: string;\n last: string;\n usdPx: string;\n bePx: string;\n lever: string;\n liab: string;\n liabCcy: string;\n liqPx: string;\n markPx: string;\n margin: string;\n mgnMode: string;\n mgnRatio: string;\n mmr: string;\n notionalUsd: string;\n optVal: string;\n pTime: string;\n pos: string;\n posCcy: string;\n posId: string;\n posSide: string;\n spotInUseAmt: string;\n spotInUseCcy: string;\n thetaBS: string;\n thetaPA: string;\n tradeId: string;\n bizRefId: string;\n bizRefType: string;\n quoteBal: string;\n baseBal: string;\n baseBorrowed: string;\n baseInterest: string;\n quoteBorrowed: string;\n quoteInterest: string;\n uTime: string;\n upl: string;\n uplLastPx: string;\n uplRatio: string;\n uplRatioLastPx: string;\n vegaBS: string;\n vegaPA: string;\n realizedPnl: string;\n pnl: string;\n fee: string;\n fundingFee: string;\n liqPenalty: string;\n closeOrderAlgo: {\n algoId: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n closeFraction: string;\n }[];\n }[];\n }> => this.request('GET', '/api/v5/account/positions', params);\n\n /**\n * 赚币\n * GET / 查看项目\n *\n * 限速:3次/s\n * 限速规则:UserID\n */\n getFinanceStakingDeFiOffers = (params: {\n productId?: string;\n protocolType?: string;\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n productId: string;\n protocol: string;\n protocolType: string;\n term: string;\n apy: string;\n earlyRedeem: boolean;\n investData: {\n ccy: string;\n bal: string;\n minAmt: string;\n maxAmt: string;\n }[];\n earningData: {\n ccy: string;\n earningType: string;\n }[];\n state: string;\n earningCcy?: string[];\n }[];\n }> => this.request('GET', '/api/v5/finance/staking-defi/offers', params);\n\n /**\n * 赚币\n * GET / 查看活跃订单\n *\n * 限速:3次/s\n * 限速规则:UserID\n */\n getFinanceStakingDeFiOrdersActive = (params: {\n productId?: string;\n protocolType?: string;\n ccy?: string;\n state?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ordId: string;\n state: string;\n ccy: string;\n protocol: string;\n protocolType: string;\n term: string;\n apy: string;\n investData: {\n ccy: string;\n amt: string;\n minAmt?: string;\n maxAmt?: string;\n }[];\n earningData: {\n ccy: string;\n earningType: string;\n earnings: string;\n }[];\n purchasedTime: string;\n estSettlementTime: string;\n cancelRedemptionDeadline: string;\n tag: string;\n earningCcy?: string[];\n }[];\n }> => this.request('GET', '/api/v5/finance/staking-defi/orders-active', params);\n\n /**\n * 下单\n *\n * 只有当您的账户有足够的资金才能下单。\n *\n * 限速:60次/2s\n *\n * 跟单交易带单产品的限速:4次/2s\n *\n * 限速规则(期权以外):UserID + Instrument ID\n *\n * 限速规则(只限期权):UserID + Instrument Family\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-place-order\n */\n postTradeOrder = (params: {\n instId: string;\n tdMode: string;\n ccy?: string;\n clOrdId?: string;\n tag?: string;\n side: string;\n posSide?: string;\n ordType: string;\n sz: string;\n px?: string;\n pxUsd?: string;\n pxVol?: string;\n reduceOnly?: string;\n tgtCcy?: string;\n banAmend?: string;\n quickMgnType?: string;\n stpId?: string;\n stpMode?: string;\n attachAlgoOrds?: Array<{\n attachAlgoClOrdId?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n tpOrdKind?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n tpTriggerPxType?: string;\n slTriggerPxType?: string;\n sz?: string;\n amendPxOnTriggerType?: string;\n }>;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n tag: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n }> => this.request('POST', '/api/v5/trade/order', params);\n\n /**\n * 修改订单\n *\n * 修改当前未成交的挂单\n *\n * 限速:60次/2s\n *\n * 跟单交易带单员带单产品的限速:4个/2s\n *\n * 限速规则:User ID + Instrument ID\n *\n * 权限:交易\n *\n * 该接口限速同时受到 子账户限速 及 基于成交比率的子账户限速 限速规则的影响。\n */\n postTradeAmendOrder = (params: {\n instId: string;\n cxIOnFail?: boolean;\n ordId?: string;\n clOrdId?: string;\n reqId?: string;\n newSz?: string;\n newPx?: string;\n newPxUsd?: string;\n newPxVol?: string;\n attachAlgoOrds?: Array<{\n attachAlgoId?: string;\n attachAlgoClOrdId?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newTpOrdKind?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n newTpTriggerPxType?: string;\n newSlTriggerPxType?: string;\n sz?: string;\n amendPxOnTriggerType?: string;\n }>;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n ts: string;\n reqId: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n }> => this.request('POST', '/api/v5/trade/amend-order', params);\n\n /**\n * 获取未成交订单列表\n *\n * 获取当前账户下所有未成交订单信息\n *\n * 限速:60次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-get-order-list\n */\n getTradeOrdersPending = (params: {\n instType?: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n ordType?: string;\n state?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n accFillSz: string;\n avgPx: string;\n cTime: string;\n category: string;\n ccy: string;\n clOrdId: string;\n fee: string;\n feeCcy: string;\n fillPx: string;\n fillSz: string;\n fillTime: string;\n instId: string;\n instType: string;\n lever: string;\n ordId: string;\n ordType: string;\n pnl: string;\n posSide: string;\n px: string;\n pxUsd: string;\n pxVol: string;\n pxType: string;\n rebate: string;\n rebateCcy: string;\n side: string;\n attachAlgoClOrdId: string;\n slOrdPx: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n attachAlgoOrds: any[];\n source: string;\n state: string;\n stpId: string;\n stpMode: string;\n sz: string;\n tag: string;\n tdMode: string;\n tgtCcy: string;\n tpOrdPx: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n tradeId: string;\n reduceOnly: string;\n quickMgnType: string;\n algoClOrdId: string;\n algoId: string;\n isTpLimit: string;\n uTime: string;\n }[];\n }> => this.request('GET', '/api/v5/trade/orders-pending', params);\n\n /**\n * 获取历史订单记录(近七天)\n *\n * 获取最近7天挂单,且完成的订单数据,包括7天以前挂单,但近7天才成交的订单数据。按照订单创建时间倒序排序。\n *\n * 已经撤销的未成交单 只保留2小时\n * 限速:40次/2s\n * 限速规则:User ID\n */\n getTradeOrdersHistory = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n ordType?: string;\n state?: string;\n category?: string;\n after?: string;\n before?: string;\n begin?: string;\n end?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instType: string;\n instId: string;\n tgtCcy: string;\n ccy: string;\n ordId: string;\n clOrdId: string;\n tag: string;\n px: string;\n pxUsd: string;\n pxVol: string;\n pxType: string;\n sz: string;\n ordType: string;\n side: string;\n posSide: string;\n tdMode: string;\n accFillSz: string;\n fillPx: string;\n tradeId: string;\n fillSz: string;\n fillTime: string;\n avgPx: string;\n state: string;\n lever: string;\n attachAlgoClOrdId: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n tpOrdPx: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n slOrdPx: string;\n attachAlgoOrds: any[];\n linkedAlgoOrd: any[];\n stpId: string;\n stpMode: string;\n feeCcy: string;\n fee: string;\n rebateCcy: string;\n source: string;\n rebate: string;\n pnl: string;\n category: string;\n reduceOnly: string;\n cancelSource: string;\n cancelSourceReason: string;\n algoClOrdId: string;\n algoId: string;\n isTpLimit: string;\n uTime: string;\n cTime: string;\n tradeQuoteCcy: string;\n }>;\n }> => this.request('GET', '/api/v5/trade/orders-history', params);\n\n /**\n * 撤单\n *\n * 撤销之前下的未完成订单。\n *\n * 限速:60次/2s\n *\n * 限速规则(期权以外):UserID + Instrument ID\n *\n * 限速规则(只限期权):UserID + Instrument Family\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-cancel-order\n */\n postTradeCancelOrder = (params: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n }> => this.request('POST', '/api/v5/trade/cancel-order', params);\n\n /**\n * 查看子账户列表\n *\n * 仅适用于母账户。\n *\n * 限速:2次/2s\n *\n * 限速规则:UserID\n */\n getSubAccountList = (params?: {\n enable?: string;\n subAct?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n data: {\n type: string;\n enable: string;\n subAcct: string;\n uid: string;\n label: string;\n mobile: string;\n gAuth: boolean;\n frozenFunc: string[];\n canTransOut: boolean;\n ts: string;\n }[];\n code: string;\n msg: string;\n }> => this.request('GET', '/api/v5/users/subaccount/list', params);\n\n /**\n * 设置子账户主动转出权限\n *\n * 设置子账户转出权限(仅适用于母账户),默认可转出至母账户。\n *\n * 限速:1次/s\n *\n * 限速规则:UserID\n */\n postSetSubAccountTransferOut = (params: {\n subAcct: string;\n canTransOut: boolean;\n }): Promise<{\n subAcct: string;\n canTransOut: boolean;\n }> => this.request('POST', '/api/v5/users/subaccount/set-transfer-out', params);\n\n /**\n * 获取资金划转状态\n *\n * 获取最近2个星期内的资金划转状态数据\n *\n * 限速:10 次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-funds-transfer-state\n */\n getAssetTransferState = (params: {\n transId?: string;\n clientId?: string;\n type?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n transId: string;\n clientId: string;\n ccy: string;\n amt: string;\n type: string;\n from: string;\n to: string;\n subAcct: string;\n // success | pending | failed\n state: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/transfer-state', params);\n\n /**\n * 获取币种列表\n *\n * 获取当前用户KYC实体支持的币种列表。\n *\n * 限速:6 次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-currencies\n */\n getAssetCurrencies = (params?: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n name: string;\n chain: string;\n canWd: boolean;\n canInternal: boolean;\n minWd: string;\n maxWd: string;\n wdTickSz: string;\n wdQuota: string;\n usedWdQuota: string;\n minFee: string;\n maxFee: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/currencies', params);\n\n /**\n * 获取指数行情数据\n *\n *\n * 限速:20 次/2s\n *\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-index-tickers\n */\n getMarketIndexTicker = (params?: {\n quoteCcy?: string;\n instId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n instId: string;\n idxPx: string;\n high24h: string;\n sodUtc0: string;\n open24h: string;\n low24h: string;\n sodUtc8: string;\n ts: string;\n }[];\n }> => this.request('GET', '/api/v5/market/index-tickers', params);\n\n /**\n * 账单流水查询(近七天)\n *\n *\n * 限速:5次/s\n *\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-7-days\n */\n getAccountBills = (params?: {\n instType?: string;\n instId?: string;\n ccy?: string;\n mgnMode?: 'isolated' | 'cross';\n ctType?: 'linear' | 'inverse';\n type?: AccountBillType;\n subType?: string;\n after?: string; //请求此id之前(更旧的数据)的分页内容,传的值为对应接口的billId\n before?: string; //请求此id之后(更新的数据)的分页内容,传的值为对应接口的billId\n begin?: string; //筛选的开始时间戳 ts,Unix 时间戳为毫秒数格式,如 1597026383085\n end?: string;\n limit?: string; //分页返回的结果集数量,最大为100,不填默认返回100条\n }): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n billId: string;\n type: string;\n subType: string;\n ts: string;\n balChg: string;\n posBalChg: string;\n bal: string;\n posBal: string;\n sz: string;\n px: string;\n ccy: string;\n pnl: string;\n fee: string;\n mgnMode: 'isolated' | 'cross' | 'cash' | '';\n instId: string;\n ordId: string;\n execType: string;\n from: string;\n to: string;\n notes: string;\n interest: string;\n tag: string;\n fillTime: string;\n tradeId: string;\n clOrdId: string;\n fillIdxPx: string;\n fillMarkPx: string;\n fillPxVol: string;\n fillPxUsd: string;\n fillMarkVol: string;\n fillFwdPx: string;\n }[];\n }> => this.request('GET', '/api/v5/account/bills', params);\n\n /**\n * 账单流水查询(近三个月)\n *\n *\n * 限速:5次/2s\n *\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-3-months\n */\n getAccountBillsArchive = (params?: {\n instType?: string;\n instId?: string;\n ccy?: string;\n mgnMode?: 'isolated' | 'cross';\n ctType?: 'linear' | 'inverse';\n type?: AccountBillType;\n subType?: string;\n after?: string; //请求此id之前(更旧的数据)的分页内容,传的值为对应接口的billId\n before?: string; //请求此id之后(更新的数据)的分页内容,传的值为对应接口的billId\n begin?: string; //筛选的开始时间戳 ts,Unix 时间戳为毫秒数格式,如 1597026383085\n end?: string;\n limit?: string; //分页返回的结果集数量,最大为100,不填默认返回100条\n }): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n billId: string;\n type: string;\n subType: string;\n ts: string;\n balChg: string;\n posBalChg: string;\n bal: string;\n posBal: string;\n sz: string;\n px: string;\n ccy: string;\n pnl: string;\n fee: string;\n mgnMode: 'isolated' | 'cross' | 'cash' | '';\n instId: string;\n ordId: string;\n execType: string;\n from: string;\n to: string;\n notes: string;\n interest: string;\n tag: string;\n fillTime: string;\n tradeId: string;\n clOrdId: string;\n fillIdxPx: string;\n fillMarkPx: string;\n fillPxVol: string;\n fillPxUsd: string;\n fillMarkVol: string;\n fillFwdPx: string;\n }[];\n }> => this.request('GET', '/api/v5/account/bills-archive', params);\n}\n\ntype AccountBillType =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | '10'\n | '11'\n | '12'\n | '13'\n | '14'\n | '15'\n | '16'\n | '22'\n | '24'\n | '26'\n | '27'\n | '28'\n | '29'\n | '30'\n | '32'\n | '33'\n | '34'\n | '250'\n | '251';\n\nexport const client = new OkxClient({\n auth: {\n public_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n passphrase: process.env.PASSPHRASE!,\n },\n});\n"]}
package/dist/cli.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import './index';
3
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,CAAC","sourcesContent":["#!/usr/bin/env node\nimport './index';\n"]}
@@ -0,0 +1,80 @@
1
+ import { Terminal } from '@yuants/protocol';
2
+ import { loadSecrets } from '@yuants/secret';
3
+ import { formatTime, listWatch } from '@yuants/utils';
4
+ import cluster from 'cluster';
5
+ import { bufferTime, defer, filter, map, Observable, repeat, retry, Subject, tap } from 'rxjs';
6
+ import { overrideConsole } from './logger';
7
+ overrideConsole();
8
+ if (cluster.isPrimary) {
9
+ console.info(`[Primary] ${formatTime(Date.now())} This is the primary process`);
10
+ const logBuffer = new Subject();
11
+ logBuffer
12
+ .pipe(
13
+ //
14
+ bufferTime(100), map((v) => v.join('\n')), filter((v) => v.trim() !== ''))
15
+ .subscribe((message) => {
16
+ console.info(message);
17
+ });
18
+ defer(() => loadSecrets({
19
+ terminal: Terminal.fromNodeEnv(),
20
+ encryption_key_base58: process.env.ENCRYPTION_KEY_BASE58,
21
+ }))
22
+ .pipe(
23
+ //
24
+ tap({
25
+ error: (e) => {
26
+ console.error(`[Primary] ${formatTime(Date.now())} Failed to load secrets`, e);
27
+ },
28
+ }), retry({ delay: 5000 }), repeat({ delay: 5000 }))
29
+ .pipe(listWatch((x) => x.secret.id, (account) => defer(() => new Observable((subscriber) => {
30
+ console.info(formatTime(Date.now()), `[Primary] ${formatTime(Date.now())} Starting worker for account ${account.secret.public_data.name} (${account.secret.id})`);
31
+ if (account.secret.public_data.type !== 'api_key_okx')
32
+ return;
33
+ if (!account.secret.public_data.name)
34
+ return;
35
+ if (!account.decrypted_data)
36
+ return;
37
+ if (!account.decrypted_data.access_key)
38
+ return;
39
+ if (!account.decrypted_data.secret_key)
40
+ return;
41
+ if (!account.decrypted_data.passphrase)
42
+ return;
43
+ const worker = cluster.fork({
44
+ ENCRYPTION_KEY_BASE58: '',
45
+ ACCESS_KEY: account.decrypted_data.access_key,
46
+ SECRET_KEY: account.decrypted_data.secret_key,
47
+ PASSPHRASE: account.decrypted_data.passphrase,
48
+ WRITE_QUOTE_TO_SQL: account.secret.public_data.write_quote_to_sql ? 'true' : 'false',
49
+ TERMINAL_ID: `@yuants/vendor-okx/worker/${account.secret.public_data.name}`,
50
+ WORKER_LABEL: account.secret.public_data.name,
51
+ });
52
+ worker.on('message', (message) => {
53
+ if (message.type === 'log') {
54
+ logBuffer.next(`[Worker ${worker.process.pid} ${message.label}] ${message.level}: ${message.message}`);
55
+ }
56
+ });
57
+ worker.on('exit', (code, signal) => {
58
+ if (code === 0) {
59
+ console.info(`[Primary] ${formatTime(Date.now())} Worker ${worker.process.pid} exited gracefully`);
60
+ subscriber.complete();
61
+ }
62
+ else {
63
+ console.error(`[Primary] ${formatTime(Date.now())} Worker ${worker.process.pid} exited with code ${code} and signal ${signal}`);
64
+ subscriber.error(new Error(`Worker ${worker.process.pid} exited with code ${code} and signal ${signal}`));
65
+ }
66
+ });
67
+ return () => {
68
+ worker.kill();
69
+ console.info(`[Primary] ${formatTime(Date.now())} Worker ${worker.process.pid} killed`);
70
+ };
71
+ })).pipe(
72
+ //
73
+ retry({ delay: 1000 }), repeat({ delay: 1000 })), (a, b) => a.secret.updated_at === b.secret.updated_at))
74
+ .subscribe();
75
+ }
76
+ else {
77
+ console.info(`${formatTime(Date.now())} This is the worker process`, process.pid, process.env);
78
+ import('./index');
79
+ }
80
+ //# sourceMappingURL=cluster.js.map