@yuants/vendor-binance 0.8.6 → 0.9.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 (65) hide show
  1. package/dist/api/client.js +2 -4
  2. package/dist/api/client.js.map +1 -1
  3. package/dist/legacy_index.js +11 -214
  4. package/dist/legacy_index.js.map +1 -1
  5. package/dist/public-data/interest_rate.js +5 -3
  6. package/dist/public-data/interest_rate.js.map +1 -1
  7. package/dist/public-data/ohlc.js +1 -1
  8. package/dist/public-data/ohlc.js.map +1 -1
  9. package/dist/public-data/product.js +1 -1
  10. package/dist/public-data/product.js.map +1 -1
  11. package/dist/public-data/quote.js +5 -5
  12. package/dist/public-data/quote.js.map +1 -1
  13. package/dist/services/accounts/spot.js +1 -1
  14. package/dist/services/accounts/spot.js.map +1 -1
  15. package/dist/services/accounts/unified.js +1 -1
  16. package/dist/services/accounts/unified.js.map +1 -1
  17. package/dist/services/orders/cancelOrder.js +5 -3
  18. package/dist/services/orders/cancelOrder.js.map +1 -1
  19. package/dist/services/orders/listOrders.js +2 -2
  20. package/dist/services/orders/listOrders.js.map +1 -1
  21. package/dist/services/orders/modifyOrder.js +6 -3
  22. package/dist/services/orders/modifyOrder.js.map +1 -1
  23. package/dist/services/orders/order-utils.js +29 -7
  24. package/dist/services/orders/order-utils.js.map +1 -1
  25. package/dist/services/orders/submitOrder.js +5 -3
  26. package/dist/services/orders/submitOrder.js.map +1 -1
  27. package/lib/api/client.d.ts.map +1 -1
  28. package/lib/api/client.js +1 -6
  29. package/lib/api/client.js.map +1 -1
  30. package/lib/legacy_index.js +10 -213
  31. package/lib/legacy_index.js.map +1 -1
  32. package/lib/public-data/interest_rate.js +5 -3
  33. package/lib/public-data/interest_rate.js.map +1 -1
  34. package/lib/public-data/ohlc.js +1 -1
  35. package/lib/public-data/ohlc.js.map +1 -1
  36. package/lib/public-data/product.js +1 -1
  37. package/lib/public-data/product.js.map +1 -1
  38. package/lib/public-data/quote.js +5 -5
  39. package/lib/public-data/quote.js.map +1 -1
  40. package/lib/services/accounts/spot.js +1 -1
  41. package/lib/services/accounts/spot.js.map +1 -1
  42. package/lib/services/accounts/unified.js +1 -1
  43. package/lib/services/accounts/unified.js.map +1 -1
  44. package/lib/services/orders/cancelOrder.d.ts.map +1 -1
  45. package/lib/services/orders/cancelOrder.js +5 -3
  46. package/lib/services/orders/cancelOrder.js.map +1 -1
  47. package/lib/services/orders/listOrders.js +2 -2
  48. package/lib/services/orders/listOrders.js.map +1 -1
  49. package/lib/services/orders/modifyOrder.d.ts.map +1 -1
  50. package/lib/services/orders/modifyOrder.js +6 -3
  51. package/lib/services/orders/modifyOrder.js.map +1 -1
  52. package/lib/services/orders/order-utils.d.ts.map +1 -1
  53. package/lib/services/orders/order-utils.js +29 -7
  54. package/lib/services/orders/order-utils.js.map +1 -1
  55. package/lib/services/orders/submitOrder.d.ts.map +1 -1
  56. package/lib/services/orders/submitOrder.js +5 -3
  57. package/lib/services/orders/submitOrder.js.map +1 -1
  58. package/package.json +14 -14
  59. package/temp/package-deps.json +29 -30
  60. package/dist/cli.js +0 -3
  61. package/dist/cli.js.map +0 -1
  62. package/lib/cli.d.ts +0 -3
  63. package/lib/cli.d.ts.map +0 -1
  64. package/lib/cli.js +0 -5
  65. package/lib/cli.js.map +0 -1
@@ -4,95 +4,14 @@ const data_account_1 = require("@yuants/data-account");
4
4
  const data_order_1 = require("@yuants/data-order");
5
5
  const protocol_1 = require("@yuants/protocol");
6
6
  const transfer_1 = require("@yuants/transfer");
7
- const utils_1 = require("@yuants/utils");
8
- const crypto_1 = require("crypto");
9
7
  const client_1 = require("./api/client");
10
8
  const private_api_1 = require("./api/private-api");
11
- const public_api_1 = require("./api/public-api");
9
+ const spot_1 = require("./services/accounts/spot");
10
+ const unified_1 = require("./services/accounts/unified");
11
+ const cancelOrder_1 = require("./services/orders/cancelOrder");
12
+ const listOrders_1 = require("./services/orders/listOrders");
13
+ const submitOrder_1 = require("./services/orders/submitOrder");
12
14
  const terminal = protocol_1.Terminal.fromNodeEnv();
13
- const _mapSymbolToOpenInterest = {};
14
- const getOpenInterest = async (symbol) => {
15
- const expired_at = Date.now() - 600000; // 10min expired
16
- const cache = _mapSymbolToOpenInterest[symbol];
17
- if (cache) {
18
- if (cache.updated_at > expired_at) {
19
- return cache.value;
20
- }
21
- }
22
- const data = await (0, public_api_1.getFutureOpenInterest)({ symbol });
23
- const value = +data.openInterest || 0;
24
- _mapSymbolToOpenInterest[symbol] = { value, updated_at: Date.now() };
25
- return value;
26
- };
27
- const mapOrderDirectionToSide = (direction) => {
28
- switch (direction) {
29
- case 'OPEN_LONG':
30
- case 'CLOSE_SHORT':
31
- return 'BUY';
32
- case 'OPEN_SHORT':
33
- case 'CLOSE_LONG':
34
- return 'SELL';
35
- }
36
- throw new Error(`Unknown direction: ${direction}`);
37
- };
38
- const mapOrderDirectionToPosSide = (direction) => {
39
- switch (direction) {
40
- case 'OPEN_LONG':
41
- case 'CLOSE_LONG':
42
- return 'LONG';
43
- case 'OPEN_SHORT':
44
- case 'CLOSE_SHORT':
45
- return 'SHORT';
46
- }
47
- throw new Error(`Unknown direction: ${direction}`);
48
- };
49
- const mapOrderTypeToOrdType = (order_type) => {
50
- switch (order_type) {
51
- case 'LIMIT':
52
- case 'MAKER':
53
- return 'LIMIT';
54
- case 'MARKET':
55
- return 'MARKET';
56
- }
57
- throw new Error(`Unknown order type: ${order_type}`);
58
- };
59
- const mapBinanceOrderTypeToYuants = (binanceType) => {
60
- switch (binanceType) {
61
- case 'LIMIT':
62
- return 'LIMIT';
63
- case 'MARKET':
64
- return 'MARKET';
65
- default:
66
- return 'LIMIT';
67
- }
68
- };
69
- const mapBinanceSideToYuantsDirection = (side, positionSide) => {
70
- if (!side || !positionSide) {
71
- return undefined;
72
- }
73
- if (positionSide === 'LONG') {
74
- return side === 'BUY' ? 'OPEN_LONG' : 'CLOSE_LONG';
75
- }
76
- if (positionSide === 'SHORT') {
77
- return side === 'SELL' ? 'OPEN_SHORT' : 'CLOSE_SHORT';
78
- }
79
- return undefined;
80
- };
81
- const deriveClientOrderId = (order) => {
82
- if (order.order_id)
83
- return `${order.order_id}`;
84
- if (order.comment)
85
- return order.comment;
86
- const payload = JSON.stringify({
87
- account_id: order.account_id,
88
- product_id: order.product_id,
89
- order_direction: order.order_direction,
90
- order_type: order.order_type,
91
- price: order.price,
92
- volume: order.volume,
93
- });
94
- return `YUANTS${(0, crypto_1.createHash)('sha256').update(payload).digest('hex').slice(0, 24)}`;
95
- };
96
15
  const isPublicOnly = process.env.PUBLIC_ONLY === 'true';
97
16
  // provideTicks(terminal, 'binance', (product_id) => {
98
17
  // const [instType, symbol] = decodePath(product_id);
@@ -140,79 +59,12 @@ else {
140
59
  const UNIFIED_ACCOUNT_ID = `binance/${uid}/unified/usdt`;
141
60
  {
142
61
  // unified accountInfo
143
- (0, data_account_1.provideAccountInfoService)(terminal, UNIFIED_ACCOUNT_ID, async () => {
144
- const [accountResult, umAccountResult] = await Promise.all([
145
- (0, private_api_1.getUnifiedAccountBalance)(credential),
146
- (0, private_api_1.getUnifiedUmAccount)(credential),
147
- ]);
148
- if ((0, client_1.isApiError)(accountResult)) {
149
- throw new Error(accountResult.msg);
150
- }
151
- const usdtAssets = accountResult.find((v) => v.asset === 'USDT');
152
- if (!usdtAssets) {
153
- throw new Error('USDT not found');
154
- }
155
- if ((0, client_1.isApiError)(umAccountResult)) {
156
- throw new Error(umAccountResult.msg);
157
- }
158
- const usdtUmAssets = umAccountResult.assets.find((v) => v.asset === 'USDT');
159
- if (!usdtUmAssets) {
160
- throw new Error('um USDT not found');
161
- }
162
- const equity = +usdtAssets.totalWalletBalance + +usdtAssets.umUnrealizedPNL;
163
- const free = equity - +usdtUmAssets.initialMargin;
164
- const positions = umAccountResult.positions
165
- .filter((v) => +v.positionAmt !== 0)
166
- .map((v) => {
167
- return {
168
- position_id: `${v.symbol}/${v.positionSide}`,
169
- datasource_id: 'BINANCE',
170
- product_id: (0, utils_1.encodePath)('usdt-future', v.symbol),
171
- direction: v.positionSide,
172
- volume: +v.positionAmt,
173
- free_volume: +v.positionAmt,
174
- position_price: +v.entryPrice,
175
- closable_price: +v.entryPrice + +v.unrealizedProfit / +v.positionAmt,
176
- floating_profit: +v.unrealizedProfit,
177
- valuation: +v.positionAmt * (+v.entryPrice + +v.unrealizedProfit / +v.positionAmt),
178
- };
179
- });
180
- return positions;
181
- }, { auto_refresh_interval: 1000 });
62
+ (0, data_account_1.provideAccountInfoService)(terminal, UNIFIED_ACCOUNT_ID, async () => (0, unified_1.getUnifiedAccountInfo)(credential, UNIFIED_ACCOUNT_ID), { auto_refresh_interval: 1000 });
182
63
  (0, data_account_1.addAccountMarket)(terminal, { account_id: UNIFIED_ACCOUNT_ID, market_id: 'BINANCE/UNIFIED' });
183
64
  }
184
65
  {
185
66
  // spot account info
186
- (0, data_account_1.provideAccountInfoService)(terminal, SPOT_ACCOUNT_ID, async () => {
187
- const spotAccountResult = await (0, private_api_1.getSpotAccountInfo)(credential, { omitZeroBalances: true });
188
- if ((0, client_1.isApiError)(spotAccountResult)) {
189
- throw new Error(spotAccountResult.msg);
190
- }
191
- const usdtAssets = spotAccountResult.balances.find((v) => v.asset === 'USDT');
192
- const positions = spotAccountResult.balances
193
- .filter((balance) => balance.asset !== 'USDT')
194
- .map((balance) => {
195
- const volume = +balance.free + +balance.locked;
196
- if (!volume) {
197
- return undefined;
198
- }
199
- const position = {
200
- position_id: `spot/${balance.asset}`,
201
- datasource_id: 'BINANCE',
202
- product_id: (0, utils_1.encodePath)('spot', `${balance.asset}USDT`),
203
- direction: 'LONG',
204
- volume,
205
- free_volume: +balance.free,
206
- position_price: 0,
207
- closable_price: 0,
208
- floating_profit: 0,
209
- valuation: 0,
210
- };
211
- return position;
212
- })
213
- .filter((position) => Boolean(position));
214
- return positions;
215
- }, {
67
+ (0, data_account_1.provideAccountInfoService)(terminal, SPOT_ACCOUNT_ID, async () => (0, spot_1.getSpotAccountInfoSnapshot)(credential, SPOT_ACCOUNT_ID), {
216
68
  auto_refresh_interval: 5000,
217
69
  });
218
70
  (0, data_account_1.addAccountMarket)(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'BINANCE/SPOT' });
@@ -323,54 +175,14 @@ else {
323
175
  }
324
176
  // order related
325
177
  {
326
- (0, data_order_1.providePendingOrdersService)(terminal, UNIFIED_ACCOUNT_ID, async () => {
327
- const openOrders = await (0, private_api_1.getUnifiedUmOpenOrders)(credential);
328
- return openOrders.map((order) => {
329
- var _a;
330
- const order_direction = (_a = mapBinanceSideToYuantsDirection(order.side, order.positionSide)) !== null && _a !== void 0 ? _a : 'OPEN_LONG';
331
- return {
332
- order_id: `${order.orderId}`,
333
- account_id: UNIFIED_ACCOUNT_ID,
334
- product_id: (0, utils_1.encodePath)('usdt-future', order.symbol),
335
- order_type: mapBinanceOrderTypeToYuants(order.type),
336
- order_direction,
337
- volume: +order.origQty,
338
- traded_volume: +order.executedQty,
339
- price: order.price === undefined ? undefined : +order.price,
340
- submit_at: order.time,
341
- updated_at: new Date(order.updateTime).toISOString(),
342
- order_status: order.status,
343
- };
344
- });
345
- }, { auto_refresh_interval: 1000 });
178
+ (0, data_order_1.providePendingOrdersService)(terminal, UNIFIED_ACCOUNT_ID, async () => (0, listOrders_1.listOrders)(credential, UNIFIED_ACCOUNT_ID), { auto_refresh_interval: 1000 });
346
179
  terminal.server.provideService('SubmitOrder', {
347
180
  required: ['account_id'],
348
181
  properties: {
349
182
  account_id: { const: UNIFIED_ACCOUNT_ID },
350
183
  },
351
184
  }, async (msg) => {
352
- console.info((0, utils_1.formatTime)(Date.now()), 'SubmitOrder', msg.req);
353
- const order = msg.req;
354
- const [instType, symbol] = (0, utils_1.decodePath)(order.product_id);
355
- if (instType === 'usdt-future') {
356
- const params = {
357
- symbol,
358
- side: mapOrderDirectionToSide(order.order_direction),
359
- positionSide: mapOrderDirectionToPosSide(order.order_direction),
360
- type: mapOrderTypeToOrdType(order.order_type),
361
- timeInForce: order.order_type === 'MAKER' ? 'GTX' : order.order_type === 'LIMIT' ? 'GTC' : undefined,
362
- quantity: order.volume,
363
- price: order.price,
364
- newClientOrderId: deriveClientOrderId(order),
365
- };
366
- console.info((0, utils_1.formatTime)(Date.now()), 'SubmitOrder', 'params', JSON.stringify(params));
367
- const orderResult = await (0, private_api_1.postUmOrder)(credential, params);
368
- if ((0, client_1.isApiError)(orderResult)) {
369
- return { res: { code: orderResult.code, message: orderResult.msg } };
370
- }
371
- return { res: { code: 0, message: 'OK', order_id: orderResult.orderId } };
372
- }
373
- return { res: { code: 400, message: `unsupported type: ${instType}` } };
185
+ return { res: { code: 0, message: 'OK', order_id: await (0, submitOrder_1.submitOrder)(credential, msg.req) } };
374
186
  });
375
187
  }
376
188
  {
@@ -380,22 +192,7 @@ else {
380
192
  account_id: { const: UNIFIED_ACCOUNT_ID },
381
193
  },
382
194
  }, async (msg) => {
383
- const order = msg.req;
384
- if (!order.order_id) {
385
- return { res: { code: 400, message: 'order_id is required' } };
386
- }
387
- const [instType, symbol] = (0, utils_1.decodePath)(order.product_id);
388
- if (instType !== 'usdt-future') {
389
- return { res: { code: 400, message: `unsupported type: ${instType}` } };
390
- }
391
- const cancelResult = await (0, private_api_1.deleteUmOrder)(credential, {
392
- symbol,
393
- orderId: order.order_id,
394
- });
395
- if ((0, client_1.isApiError)(cancelResult)) {
396
- return { res: { code: cancelResult.code, message: cancelResult.msg } };
397
- }
398
- return { res: { code: 0, message: 'OK' } };
195
+ return { res: { code: 0, message: 'OK', data: await (0, cancelOrder_1.cancelOrder)(credential, msg.req) } };
399
196
  });
400
197
  }
401
198
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"legacy_index.js","sourceRoot":"","sources":["../src/legacy_index.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { IOrder, providePendingOrdersService } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { decodePath, encodePath, formatTime } from '@yuants/utils';\nimport { createHash } from 'crypto';\nimport { getDefaultCredential, isApiError } from './api/client';\nimport {\n deleteUmOrder,\n getDepositAddress,\n getDepositHistory,\n getSpotAccountInfo,\n getSubAccountList,\n getUnifiedAccountBalance,\n getUnifiedUmAccount,\n getUnifiedUmOpenOrders,\n getWithdrawHistory,\n postAssetTransfer,\n postUmOrder,\n postWithdraw,\n} from './api/private-api';\nimport { getFutureOpenInterest } from './api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst _mapSymbolToOpenInterest: Record<string, { value: number; updated_at: number }> = {};\nconst getOpenInterest = async (symbol: string) => {\n const expired_at = Date.now() - 600_000; // 10min expired\n const cache = _mapSymbolToOpenInterest[symbol];\n if (cache) {\n if (cache.updated_at > expired_at) {\n return cache.value;\n }\n }\n const data = await getFutureOpenInterest({ symbol });\n const value = +data.openInterest || 0;\n _mapSymbolToOpenInterest[symbol] = { value, updated_at: Date.now() };\n return value;\n};\n\nconst mapOrderDirectionToSide = (direction?: string) => {\n switch (direction) {\n case 'OPEN_LONG':\n case 'CLOSE_SHORT':\n return 'BUY';\n case 'OPEN_SHORT':\n case 'CLOSE_LONG':\n return 'SELL';\n }\n throw new Error(`Unknown direction: ${direction}`);\n};\n\nconst mapOrderDirectionToPosSide = (direction?: string) => {\n switch (direction) {\n case 'OPEN_LONG':\n case 'CLOSE_LONG':\n return 'LONG';\n case 'OPEN_SHORT':\n case 'CLOSE_SHORT':\n return 'SHORT';\n }\n throw new Error(`Unknown direction: ${direction}`);\n};\n\nconst mapOrderTypeToOrdType = (order_type?: string) => {\n switch (order_type) {\n case 'LIMIT':\n case 'MAKER':\n return 'LIMIT';\n case 'MARKET':\n return 'MARKET';\n }\n throw new Error(`Unknown order type: ${order_type}`);\n};\n\nconst mapBinanceOrderTypeToYuants = (binanceType?: string): IOrder['order_type'] => {\n switch (binanceType) {\n case 'LIMIT':\n return 'LIMIT';\n case 'MARKET':\n return 'MARKET';\n default:\n return 'LIMIT';\n }\n};\n\nconst mapBinanceSideToYuantsDirection = (\n side?: string,\n positionSide?: string,\n): IOrder['order_direction'] | undefined => {\n if (!side || !positionSide) {\n return undefined;\n }\n if (positionSide === 'LONG') {\n return side === 'BUY' ? 'OPEN_LONG' : 'CLOSE_LONG';\n }\n if (positionSide === 'SHORT') {\n return side === 'SELL' ? 'OPEN_SHORT' : 'CLOSE_SHORT';\n }\n return undefined;\n};\n\nconst deriveClientOrderId = (order: IOrder) => {\n if (order.order_id) return `${order.order_id}`;\n if (order.comment) return order.comment;\n const payload = JSON.stringify({\n account_id: order.account_id,\n product_id: order.product_id,\n order_direction: order.order_direction,\n order_type: order.order_type,\n price: order.price,\n volume: order.volume,\n });\n return `YUANTS${createHash('sha256').update(payload).digest('hex').slice(0, 24)}`;\n};\n\nconst isPublicOnly = process.env.PUBLIC_ONLY === 'true';\n\n// provideTicks(terminal, 'binance', (product_id) => {\n// const [instType, symbol] = decodePath(product_id);\n// if (instType === 'usdt-future') {\n// return combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(\n// combineLatestWith(defer(() => getOpenInterest(symbol))),\n// map(([[mapSymbolToFuturePremiumIndex, mapSymbolToFutureBookTicker], openInterestVolume]): ITick => {\n// const premiumIndex = mapSymbolToFuturePremiumIndex.get(symbol);\n// const bookTicker = mapSymbolToFutureBookTicker.get(symbol);\n// if (!premiumIndex) {\n// throw new Error(`Premium Index Not Found: ${symbol}`);\n// }\n// if (!bookTicker) {\n// throw new Error(`Book Ticker Not Found: ${symbol}`);\n// }\n// return {\n// datasource_id: 'binance',\n// product_id,\n// updated_at: Date.now(),\n// price: +premiumIndex.markPrice,\n// ask: +bookTicker.askPrice,\n// bid: +bookTicker.bidPrice,\n// interest_rate_for_long: -+premiumIndex.lastFundingRate,\n// interest_rate_for_short: +premiumIndex.lastFundingRate,\n// settlement_scheduled_at: premiumIndex.nextFundingTime,\n// open_interest: openInterestVolume,\n// };\n// }),\n// );\n// }\n// return EMPTY;\n// });\n\nif (isPublicOnly) {\n console.info('PUBLIC_ONLY=1, skip Binance legacy services');\n} else {\n const credential = getDefaultCredential();\n (async () => {\n const spotAccountInfo = await getSpotAccountInfo(credential);\n if (isApiError(spotAccountInfo)) {\n throw new Error(spotAccountInfo.msg);\n }\n const uid = spotAccountInfo.uid;\n\n const SPOT_ACCOUNT_ID = `binance/${uid}/spot/usdt`;\n const UNIFIED_ACCOUNT_ID = `binance/${uid}/unified/usdt`;\n\n {\n // unified accountInfo\n\n provideAccountInfoService(\n terminal,\n UNIFIED_ACCOUNT_ID,\n async () => {\n const [accountResult, umAccountResult] = await Promise.all([\n getUnifiedAccountBalance(credential),\n getUnifiedUmAccount(credential),\n ]);\n if (isApiError(accountResult)) {\n throw new Error(accountResult.msg);\n }\n const usdtAssets = accountResult.find((v) => v.asset === 'USDT');\n if (!usdtAssets) {\n throw new Error('USDT not found');\n }\n if (isApiError(umAccountResult)) {\n throw new Error(umAccountResult.msg);\n }\n const usdtUmAssets = umAccountResult.assets.find((v) => v.asset === 'USDT');\n if (!usdtUmAssets) {\n throw new Error('um USDT not found');\n }\n const equity = +usdtAssets.totalWalletBalance + +usdtAssets.umUnrealizedPNL;\n const free = equity - +usdtUmAssets.initialMargin;\n\n const positions = umAccountResult.positions\n .filter((v) => +v.positionAmt !== 0)\n .map((v): IPosition => {\n return {\n position_id: `${v.symbol}/${v.positionSide}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('usdt-future', v.symbol),\n direction: v.positionSide,\n volume: +v.positionAmt,\n free_volume: +v.positionAmt,\n position_price: +v.entryPrice,\n closable_price: +v.entryPrice + +v.unrealizedProfit / +v.positionAmt,\n floating_profit: +v.unrealizedProfit,\n valuation: +v.positionAmt * (+v.entryPrice + +v.unrealizedProfit / +v.positionAmt),\n };\n });\n\n return positions;\n },\n { auto_refresh_interval: 1000 },\n );\n\n addAccountMarket(terminal, { account_id: UNIFIED_ACCOUNT_ID, market_id: 'BINANCE/UNIFIED' });\n }\n\n {\n // spot account info\n\n provideAccountInfoService(\n terminal,\n SPOT_ACCOUNT_ID,\n async () => {\n const spotAccountResult = await getSpotAccountInfo(credential, { omitZeroBalances: true });\n if (isApiError(spotAccountResult)) {\n throw new Error(spotAccountResult.msg);\n }\n const usdtAssets = spotAccountResult.balances.find((v) => v.asset === 'USDT');\n const positions = spotAccountResult.balances\n .filter((balance) => balance.asset !== 'USDT')\n .map((balance) => {\n const volume = +balance.free + +balance.locked;\n if (!volume) {\n return undefined;\n }\n const position: IPosition = {\n position_id: `spot/${balance.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('spot', `${balance.asset}USDT`),\n direction: 'LONG',\n volume,\n free_volume: +balance.free,\n position_price: 0,\n closable_price: 0,\n floating_profit: 0,\n valuation: 0,\n };\n return position;\n })\n .filter((position): position is IPosition => Boolean(position));\n return positions;\n },\n {\n auto_refresh_interval: 5_000,\n },\n );\n\n addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'BINANCE/SPOT' });\n }\n\n // transfer\n {\n // spot -> unified\n const SPOT_UNIFIED_NETWORK_ID = `binance/${uid}/spot/unified`;\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n network_id: SPOT_UNIFIED_NETWORK_ID,\n currency: 'USDT',\n address: `unified`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: 'MAIN_PORTFOLIO_MARGIN',\n asset: 'USDT',\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n },\n },\n onEval: async (order) => {\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n\n // unified -> spot\n addAccountTransferAddress({\n terminal,\n account_id: UNIFIED_ACCOUNT_ID,\n network_id: SPOT_UNIFIED_NETWORK_ID,\n currency: 'USDT',\n address: `spot`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: 'PORTFOLIO_MARGIN_MAIN',\n asset: 'USDT',\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n },\n },\n onEval: async (order) => {\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n\n const subAccountsResult = await getSubAccountList(credential);\n const isMain = !isApiError(subAccountsResult);\n // main -> sub\n // TODO...\n\n // blockchain\n if (isMain) {\n const depositAddressResult = await getDepositAddress(credential, { coin: 'USDT', network: 'TRX' });\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n network_id: 'TRC20',\n currency: 'USDT',\n address: depositAddressResult.address,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postWithdraw(credential, {\n coin: 'USDT',\n network: 'TRX',\n address: order.current_rx_address!,\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'ERROR', message: transferResult.msg };\n }\n const wdId = transferResult.id;\n return { state: 'PENDING', context: wdId };\n },\n PENDING: async (order) => {\n const wdId = order.current_tx_context;\n const withdrawResult = await getWithdrawHistory(credential, { coin: 'USDT' });\n const record = withdrawResult?.find((v) => v.id === wdId);\n const txId = record?.txId;\n if (!txId) {\n return { state: 'PENDING', context: wdId };\n }\n return { state: 'COMPLETE', transaction_id: txId };\n },\n },\n onEval: async (order) => {\n const checkResult = await getDepositHistory(credential, {\n coin: 'USDT',\n txId: order.current_transaction_id,\n });\n if (checkResult?.[0]?.status !== 1) {\n return { state: 'PENDING' };\n }\n const received_amount = +checkResult[0].amount;\n return { state: 'COMPLETE', received_amount };\n },\n });\n }\n }\n\n // order related\n {\n providePendingOrdersService(\n terminal,\n UNIFIED_ACCOUNT_ID,\n async () => {\n const openOrders = await getUnifiedUmOpenOrders(credential);\n return openOrders.map((order): IOrder => {\n const order_direction =\n mapBinanceSideToYuantsDirection(order.side, order.positionSide) ?? 'OPEN_LONG';\n return {\n order_id: `${order.orderId}`,\n account_id: UNIFIED_ACCOUNT_ID,\n product_id: encodePath('usdt-future', order.symbol),\n order_type: mapBinanceOrderTypeToYuants(order.type),\n order_direction,\n volume: +order.origQty,\n traded_volume: +order.executedQty,\n price: order.price === undefined ? undefined : +order.price,\n submit_at: order.time,\n updated_at: new Date(order.updateTime).toISOString(),\n order_status: order.status,\n };\n });\n },\n { auto_refresh_interval: 1000 },\n );\n\n terminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: UNIFIED_ACCOUNT_ID },\n },\n },\n async (msg) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', msg.req);\n const order = msg.req;\n const [instType, symbol] = decodePath(order.product_id);\n if (instType === 'usdt-future') {\n const params = {\n symbol,\n side: mapOrderDirectionToSide(order.order_direction),\n positionSide: mapOrderDirectionToPosSide(order.order_direction),\n type: mapOrderTypeToOrdType(order.order_type),\n timeInForce:\n order.order_type === 'MAKER' ? 'GTX' : order.order_type === 'LIMIT' ? 'GTC' : undefined,\n quantity: order.volume,\n price: order.price,\n newClientOrderId: deriveClientOrderId(order),\n };\n\n console.info(formatTime(Date.now()), 'SubmitOrder', 'params', JSON.stringify(params));\n const orderResult = await postUmOrder(credential, params);\n if (isApiError(orderResult)) {\n return { res: { code: orderResult.code, message: orderResult.msg } };\n }\n return { res: { code: 0, message: 'OK', order_id: orderResult.orderId } };\n }\n return { res: { code: 400, message: `unsupported type: ${instType}` } };\n },\n );\n }\n\n {\n terminal.server.provideService<IOrder>(\n 'CancelOrder',\n {\n required: ['account_id', 'order_id', 'product_id'],\n properties: {\n account_id: { const: UNIFIED_ACCOUNT_ID },\n },\n },\n async (msg) => {\n const order = msg.req;\n if (!order.order_id) {\n return { res: { code: 400, message: 'order_id is required' } };\n }\n const [instType, symbol] = decodePath(order.product_id);\n if (instType !== 'usdt-future') {\n return { res: { code: 400, message: `unsupported type: ${instType}` } };\n }\n const cancelResult = await deleteUmOrder(credential, {\n symbol,\n orderId: order.order_id,\n });\n if (isApiError(cancelResult)) {\n return { res: { code: cancelResult.code, message: cancelResult.msg } };\n }\n return { res: { code: 0, message: 'OK' } };\n },\n );\n }\n })();\n}\n"]}
1
+ {"version":3,"file":"legacy_index.js","sourceRoot":"","sources":["../src/legacy_index.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';\nimport { IOrder, providePendingOrdersService } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { getDefaultCredential, isApiError } from './api/client';\nimport {\n getDepositAddress,\n getDepositHistory,\n getSpotAccountInfo,\n getSubAccountList,\n getWithdrawHistory,\n postAssetTransfer,\n postWithdraw,\n} from './api/private-api';\nimport { getSpotAccountInfoSnapshot } from './services/accounts/spot';\nimport { getUnifiedAccountInfo } from './services/accounts/unified';\nimport { cancelOrder } from './services/orders/cancelOrder';\nimport { listOrders } from './services/orders/listOrders';\nimport { submitOrder } from './services/orders/submitOrder';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst isPublicOnly = process.env.PUBLIC_ONLY === 'true';\n\n// provideTicks(terminal, 'binance', (product_id) => {\n// const [instType, symbol] = decodePath(product_id);\n// if (instType === 'usdt-future') {\n// return combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(\n// combineLatestWith(defer(() => getOpenInterest(symbol))),\n// map(([[mapSymbolToFuturePremiumIndex, mapSymbolToFutureBookTicker], openInterestVolume]): ITick => {\n// const premiumIndex = mapSymbolToFuturePremiumIndex.get(symbol);\n// const bookTicker = mapSymbolToFutureBookTicker.get(symbol);\n// if (!premiumIndex) {\n// throw new Error(`Premium Index Not Found: ${symbol}`);\n// }\n// if (!bookTicker) {\n// throw new Error(`Book Ticker Not Found: ${symbol}`);\n// }\n// return {\n// datasource_id: 'binance',\n// product_id,\n// updated_at: Date.now(),\n// price: +premiumIndex.markPrice,\n// ask: +bookTicker.askPrice,\n// bid: +bookTicker.bidPrice,\n// interest_rate_for_long: -+premiumIndex.lastFundingRate,\n// interest_rate_for_short: +premiumIndex.lastFundingRate,\n// settlement_scheduled_at: premiumIndex.nextFundingTime,\n// open_interest: openInterestVolume,\n// };\n// }),\n// );\n// }\n// return EMPTY;\n// });\n\nif (isPublicOnly) {\n console.info('PUBLIC_ONLY=1, skip Binance legacy services');\n} else {\n const credential = getDefaultCredential();\n (async () => {\n const spotAccountInfo = await getSpotAccountInfo(credential);\n if (isApiError(spotAccountInfo)) {\n throw new Error(spotAccountInfo.msg);\n }\n const uid = spotAccountInfo.uid;\n\n const SPOT_ACCOUNT_ID = `binance/${uid}/spot/usdt`;\n const UNIFIED_ACCOUNT_ID = `binance/${uid}/unified/usdt`;\n\n {\n // unified accountInfo\n\n provideAccountInfoService(\n terminal,\n UNIFIED_ACCOUNT_ID,\n async () => getUnifiedAccountInfo(credential, UNIFIED_ACCOUNT_ID),\n { auto_refresh_interval: 1000 },\n );\n\n addAccountMarket(terminal, { account_id: UNIFIED_ACCOUNT_ID, market_id: 'BINANCE/UNIFIED' });\n }\n\n {\n // spot account info\n\n provideAccountInfoService(\n terminal,\n SPOT_ACCOUNT_ID,\n async () => getSpotAccountInfoSnapshot(credential, SPOT_ACCOUNT_ID),\n {\n auto_refresh_interval: 5_000,\n },\n );\n\n addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'BINANCE/SPOT' });\n }\n\n // transfer\n {\n // spot -> unified\n const SPOT_UNIFIED_NETWORK_ID = `binance/${uid}/spot/unified`;\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n network_id: SPOT_UNIFIED_NETWORK_ID,\n currency: 'USDT',\n address: `unified`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: 'MAIN_PORTFOLIO_MARGIN',\n asset: 'USDT',\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n },\n },\n onEval: async (order) => {\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n\n // unified -> spot\n addAccountTransferAddress({\n terminal,\n account_id: UNIFIED_ACCOUNT_ID,\n network_id: SPOT_UNIFIED_NETWORK_ID,\n currency: 'USDT',\n address: `spot`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: 'PORTFOLIO_MARGIN_MAIN',\n asset: 'USDT',\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n },\n },\n onEval: async (order) => {\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n\n const subAccountsResult = await getSubAccountList(credential);\n const isMain = !isApiError(subAccountsResult);\n // main -> sub\n // TODO...\n\n // blockchain\n if (isMain) {\n const depositAddressResult = await getDepositAddress(credential, { coin: 'USDT', network: 'TRX' });\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n network_id: 'TRC20',\n currency: 'USDT',\n address: depositAddressResult.address,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postWithdraw(credential, {\n coin: 'USDT',\n network: 'TRX',\n address: order.current_rx_address!,\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'ERROR', message: transferResult.msg };\n }\n const wdId = transferResult.id;\n return { state: 'PENDING', context: wdId };\n },\n PENDING: async (order) => {\n const wdId = order.current_tx_context;\n const withdrawResult = await getWithdrawHistory(credential, { coin: 'USDT' });\n const record = withdrawResult?.find((v) => v.id === wdId);\n const txId = record?.txId;\n if (!txId) {\n return { state: 'PENDING', context: wdId };\n }\n return { state: 'COMPLETE', transaction_id: txId };\n },\n },\n onEval: async (order) => {\n const checkResult = await getDepositHistory(credential, {\n coin: 'USDT',\n txId: order.current_transaction_id,\n });\n if (checkResult?.[0]?.status !== 1) {\n return { state: 'PENDING' };\n }\n const received_amount = +checkResult[0].amount;\n return { state: 'COMPLETE', received_amount };\n },\n });\n }\n }\n\n // order related\n {\n providePendingOrdersService(\n terminal,\n UNIFIED_ACCOUNT_ID,\n async () => listOrders(credential, UNIFIED_ACCOUNT_ID),\n { auto_refresh_interval: 1000 },\n );\n\n terminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: UNIFIED_ACCOUNT_ID },\n },\n },\n async (msg) => {\n return { res: { code: 0, message: 'OK', order_id: await submitOrder(credential, msg.req) } };\n },\n );\n }\n\n {\n terminal.server.provideService<IOrder>(\n 'CancelOrder',\n {\n required: ['account_id', 'order_id', 'product_id'],\n properties: {\n account_id: { const: UNIFIED_ACCOUNT_ID },\n },\n },\n async (msg) => {\n return { res: { code: 0, message: 'OK', data: await cancelOrder(credential, msg.req) } };\n },\n );\n }\n })();\n}\n"]}
@@ -28,8 +28,8 @@ const terminal = protocol_1.Terminal.fromNodeEnv();
28
28
  return __asyncGenerator(this, arguments, function* () {
29
29
  const [datasource_id, product_id] = (0, utils_1.decodePath)(series_id);
30
30
  let current_start = started_at;
31
- const [instType, symbol] = (0, utils_1.decodePath)(product_id);
32
- if (instType === 'usdt-future') {
31
+ const [, instType, symbol] = (0, utils_1.decodePath)(product_id);
32
+ if (instType === 'USDT-FUTURE') {
33
33
  while (true) {
34
34
  // 向前翻页,时间降序
35
35
  const res = yield __await((0, public_api_1.getFutureFundingRate)({
@@ -53,8 +53,9 @@ const terminal = protocol_1.Terminal.fromNodeEnv();
53
53
  current_start = +res[res.length - 1].fundingTime;
54
54
  yield __await((0, rxjs_1.firstValueFrom)((0, rxjs_1.timer)(1000)));
55
55
  }
56
+ return yield __await(void 0);
56
57
  }
57
- else if (instType === 'margin') {
58
+ if (instType === 'MARGIN') {
58
59
  while (true) {
59
60
  const res = yield __await((0, private_api_1.getMarginInterestRateHistory)({
60
61
  asset: symbol,
@@ -78,6 +79,7 @@ const terminal = protocol_1.Terminal.fromNodeEnv();
78
79
  yield __await((0, rxjs_1.firstValueFrom)((0, rxjs_1.timer)(1000)));
79
80
  }
80
81
  }
82
+ return yield __await(void 0);
81
83
  });
82
84
  },
83
85
  });
@@ -1 +1 @@
1
- {"version":3,"file":"interest_rate.js","sourceRoot":"","sources":["../../src/public-data/interest_rate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,qDAA2D;AAC3D,+CAA4C;AAC5C,yCAAuD;AACvD,+BAA6C;AAC7C,kDAAyD;AACzD,oDAAkE;AAElE,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,IAAA,kCAAoB,EAAgB,QAAQ,EAAE;IAC5C,SAAS,EAAE,eAAe;IAC1B,sBAAsB,EAAE,CAAC,SAAS,CAAC;IACnC,QAAQ,EAAE,IAAI;IACd,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;IACjC,OAAO,EAAE,UAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE;;YAC3D,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,IAAA,kBAAU,EAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,aAAa,GAAG,UAAU,CAAC;YAC/B,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,UAAU,CAAC,CAAC;YAClD,IAAI,QAAQ,KAAK,aAAa,EAAE;gBAC9B,OAAO,IAAI,EAAE;oBACX,YAAY;oBACZ,MAAM,GAAG,GAAG,cAAM,IAAA,iCAAoB,EAAC;wBACrC,MAAM,EAAE,MAAM;wBACd,SAAS,EAAE,aAAa;wBACxB,OAAO,EAAE,QAAQ;wBACjB,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAA,CAAC;oBACH,oBAAM,GAAG,CAAC,GAAG,CACX,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC;wBACrB,SAAS;wBACT,UAAU,EAAE,IAAA,kBAAU,EAAC,CAAC,CAAC,WAAW,CAAC;wBACrC,aAAa;wBACb,UAAU;wBACV,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;wBAC9B,UAAU,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;wBAC9B,gBAAgB,EAAE,EAAE;qBACrB,CAAC,CACH,CAAA,CAAC;oBACF,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE;wBACrB,MAAM;qBACP;oBACD,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;oBACjD,cAAM,IAAA,qBAAc,EAAC,IAAA,YAAK,EAAC,IAAI,CAAC,CAAC,CAAA,CAAC;iBACnC;aACF;iBAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE;gBAChC,OAAO,IAAI,EAAE;oBACX,MAAM,GAAG,GAAG,cAAM,IAAA,0CAA4B,EAAC;wBAC7C,KAAK,EAAE,MAAM;wBACb,SAAS,EAAE,aAAa;wBACxB,OAAO,EAAE,QAAQ;wBACjB,KAAK,EAAE,GAAG;qBACX,CAAC,CAAA,CAAC;oBACH,oBAAM,GAAG,CAAC,GAAG,CACX,CAAC,CAKA,EAAiB,EAAE,CAAC,CAAC;wBACpB,SAAS;wBACT,UAAU,EAAE,IAAA,kBAAU,EAAC,CAAC,CAAC,SAAS,CAAC;wBACnC,aAAa;wBACb,UAAU;wBACV,SAAS,EAAE,CAAC,CAAC,iBAAiB;wBAC9B,UAAU,EAAE,GAAG;wBACf,gBAAgB,EAAE,EAAE;qBACrB,CAAC,CACH,CAAA,CAAC;oBACF,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;wBACpB,MAAM;qBACP;oBACD,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC/C,cAAM,IAAA,qBAAc,EAAC,IAAA,YAAK,EAAC,IAAI,CAAC,CAAC,CAAA,CAAC;iBACnC;aACF;QACH,CAAC;KAAA;CACF,CAAC,CAAC","sourcesContent":["import { IInterestRate } from '@yuants/data-interest-rate';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { decodePath, formatTime } from '@yuants/utils';\nimport { firstValueFrom, timer } from 'rxjs';\nimport { getFutureFundingRate } from '../api/public-api';\nimport { getMarginInterestRateHistory } from '../api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\ncreateSeriesProvider<IInterestRate>(terminal, {\n tableName: 'interest_rate',\n series_id_prefix_parts: ['BINANCE'],\n reversed: true,\n serviceOptions: { concurrent: 1 },\n queryFn: async function* ({ series_id, started_at, ended_at }) {\n const [datasource_id, product_id] = decodePath(series_id);\n let current_start = started_at;\n const [instType, symbol] = decodePath(product_id);\n if (instType === 'usdt-future') {\n while (true) {\n // 向前翻页,时间降序\n const res = await getFutureFundingRate({\n symbol: symbol,\n startTime: current_start,\n endTime: ended_at,\n limit: 1000,\n });\n yield res.map(\n (v): IInterestRate => ({\n series_id,\n created_at: formatTime(v.fundingTime),\n datasource_id,\n product_id,\n long_rate: `${-v.fundingRate}`,\n short_rate: `${v.fundingRate}`,\n settlement_price: '',\n }),\n );\n if (res.length < 1000) {\n break;\n }\n current_start = +res[res.length - 1].fundingTime;\n await firstValueFrom(timer(1000));\n }\n } else if (instType === 'margin') {\n while (true) {\n const res = await getMarginInterestRateHistory({\n asset: symbol,\n startTime: current_start,\n endTime: ended_at,\n limit: 100,\n });\n yield res.map(\n (v: {\n asset: string;\n dailyInterestRate: string;\n timestamp: number;\n vipLevel: number;\n }): IInterestRate => ({\n series_id,\n created_at: formatTime(v.timestamp),\n datasource_id,\n product_id,\n long_rate: v.dailyInterestRate,\n short_rate: '0',\n settlement_price: '',\n }),\n );\n if (res.length < 100) {\n break;\n }\n current_start = +res[res.length - 1].timestamp;\n await firstValueFrom(timer(1000));\n }\n }\n },\n});\n"]}
1
+ {"version":3,"file":"interest_rate.js","sourceRoot":"","sources":["../../src/public-data/interest_rate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,qDAA2D;AAC3D,+CAA4C;AAC5C,yCAAuD;AACvD,+BAA6C;AAC7C,kDAAyD;AACzD,oDAAkE;AAElE,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,IAAA,kCAAoB,EAAgB,QAAQ,EAAE;IAC5C,SAAS,EAAE,eAAe;IAC1B,sBAAsB,EAAE,CAAC,SAAS,CAAC;IACnC,QAAQ,EAAE,IAAI;IACd,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;IACjC,OAAO,EAAE,UAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE;;YAC3D,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,IAAA,kBAAU,EAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,aAAa,GAAG,UAAU,CAAC;YAC/B,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,UAAU,CAAC,CAAC;YACpD,IAAI,QAAQ,KAAK,aAAa,EAAE;gBAC9B,OAAO,IAAI,EAAE;oBACX,YAAY;oBACZ,MAAM,GAAG,GAAG,cAAM,IAAA,iCAAoB,EAAC;wBACrC,MAAM,EAAE,MAAM;wBACd,SAAS,EAAE,aAAa;wBACxB,OAAO,EAAE,QAAQ;wBACjB,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAA,CAAC;oBACH,oBAAM,GAAG,CAAC,GAAG,CACX,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC;wBACrB,SAAS;wBACT,UAAU,EAAE,IAAA,kBAAU,EAAC,CAAC,CAAC,WAAW,CAAC;wBACrC,aAAa;wBACb,UAAU;wBACV,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;wBAC9B,UAAU,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;wBAC9B,gBAAgB,EAAE,EAAE;qBACrB,CAAC,CACH,CAAA,CAAC;oBACF,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE;wBACrB,MAAM;qBACP;oBACD,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;oBACjD,cAAM,IAAA,qBAAc,EAAC,IAAA,YAAK,EAAC,IAAI,CAAC,CAAC,CAAA,CAAC;iBACnC;gBACD,6BAAO;aACR;YACD,IAAI,QAAQ,KAAK,QAAQ,EAAE;gBACzB,OAAO,IAAI,EAAE;oBACX,MAAM,GAAG,GAAG,cAAM,IAAA,0CAA4B,EAAC;wBAC7C,KAAK,EAAE,MAAM;wBACb,SAAS,EAAE,aAAa;wBACxB,OAAO,EAAE,QAAQ;wBACjB,KAAK,EAAE,GAAG;qBACX,CAAC,CAAA,CAAC;oBACH,oBAAM,GAAG,CAAC,GAAG,CACX,CAAC,CAKA,EAAiB,EAAE,CAAC,CAAC;wBACpB,SAAS;wBACT,UAAU,EAAE,IAAA,kBAAU,EAAC,CAAC,CAAC,SAAS,CAAC;wBACnC,aAAa;wBACb,UAAU;wBACV,SAAS,EAAE,CAAC,CAAC,iBAAiB;wBAC9B,UAAU,EAAE,GAAG;wBACf,gBAAgB,EAAE,EAAE;qBACrB,CAAC,CACH,CAAA,CAAC;oBACF,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;wBACpB,MAAM;qBACP;oBACD,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC/C,cAAM,IAAA,qBAAc,EAAC,IAAA,YAAK,EAAC,IAAI,CAAC,CAAC,CAAA,CAAC;iBACnC;aACF;YACD,6BAAO;QACT,CAAC;KAAA;CACF,CAAC,CAAC","sourcesContent":["import { IInterestRate } from '@yuants/data-interest-rate';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { decodePath, formatTime } from '@yuants/utils';\nimport { firstValueFrom, timer } from 'rxjs';\nimport { getFutureFundingRate } from '../api/public-api';\nimport { getMarginInterestRateHistory } from '../api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\ncreateSeriesProvider<IInterestRate>(terminal, {\n tableName: 'interest_rate',\n series_id_prefix_parts: ['BINANCE'],\n reversed: true,\n serviceOptions: { concurrent: 1 },\n queryFn: async function* ({ series_id, started_at, ended_at }) {\n const [datasource_id, product_id] = decodePath(series_id);\n let current_start = started_at;\n const [, instType, symbol] = decodePath(product_id);\n if (instType === 'USDT-FUTURE') {\n while (true) {\n // 向前翻页,时间降序\n const res = await getFutureFundingRate({\n symbol: symbol,\n startTime: current_start,\n endTime: ended_at,\n limit: 1000,\n });\n yield res.map(\n (v): IInterestRate => ({\n series_id,\n created_at: formatTime(v.fundingTime),\n datasource_id,\n product_id,\n long_rate: `${-v.fundingRate}`,\n short_rate: `${v.fundingRate}`,\n settlement_price: '',\n }),\n );\n if (res.length < 1000) {\n break;\n }\n current_start = +res[res.length - 1].fundingTime;\n await firstValueFrom(timer(1000));\n }\n return;\n }\n if (instType === 'MARGIN') {\n while (true) {\n const res = await getMarginInterestRateHistory({\n asset: symbol,\n startTime: current_start,\n endTime: ended_at,\n limit: 100,\n });\n yield res.map(\n (v: {\n asset: string;\n dailyInterestRate: string;\n timestamp: number;\n vipLevel: number;\n }): IInterestRate => ({\n series_id,\n created_at: formatTime(v.timestamp),\n datasource_id,\n product_id,\n long_rate: v.dailyInterestRate,\n short_rate: '0',\n settlement_price: '',\n }),\n );\n if (res.length < 100) {\n break;\n }\n current_start = +res[res.length - 1].timestamp;\n await firstValueFrom(timer(1000));\n }\n }\n return;\n },\n});\n"]}
@@ -48,7 +48,7 @@ const DURATION_TO_BINANCE_INTERVAL = {
48
48
  throw new Error(`Unsupported duration: ${duration}`);
49
49
  }
50
50
  const offset = (0, utils_1.convertDurationToOffset)(duration);
51
- const [instType, symbol] = (0, utils_1.decodePath)(product_id);
51
+ const [, instType, symbol] = (0, utils_1.decodePath)(product_id);
52
52
  let current_end = ended_at || Date.now();
53
53
  const start = started_at || 0;
54
54
  const baseUrl = instType === 'usdt-future'
@@ -1 +1 @@
1
- {"version":3,"file":"ohlc.js","sourceRoot":"","sources":["../../src/public-data/ohlc.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOHLC } from '@yuants/data-ohlc';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { firstValueFrom, timer } from 'rxjs';\nimport { requestPublic } from '../api/client';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_BINANCE_INTERVAL: Record<string, string> = {\n PT1M: '1m',\n PT3M: '3m',\n PT5M: '5m',\n PT15M: '15m',\n PT30M: '30m',\n PT1H: '1h',\n PT2H: '2h',\n PT4H: '4h',\n PT6H: '6h',\n PT8H: '8h',\n PT12H: '12h',\n P1D: '1d',\n P3D: '3d',\n P1W: '1w',\n P1M: '1M',\n};\n\ncreateSeriesProvider<IOHLC>(terminal, {\n tableName: 'ohlc',\n series_id_prefix_parts: ['BINANCE'],\n reversed: true,\n serviceOptions: { concurrent: 10 },\n queryFn: async function* ({ series_id, started_at, ended_at }) {\n const [datasource_id, product_id, duration] = decodePath(series_id);\n const interval = DURATION_TO_BINANCE_INTERVAL[duration];\n if (!interval) {\n throw new Error(`Unsupported duration: ${duration}`);\n }\n const offset = convertDurationToOffset(duration);\n const [instType, symbol] = decodePath(product_id);\n\n let current_end = ended_at || Date.now();\n const start = started_at || 0;\n\n const baseUrl =\n instType === 'usdt-future'\n ? 'https://fapi.binance.com/fapi/v1/klines'\n : 'https://api.binance.com/api/v3/klines';\n\n type IBinanceKline = [\n number, // Open time\n string, // Open\n string, // High\n string, // Low\n string, // Close\n string, // Volume\n number, // Close time\n string, // Quote asset volume\n number, // Number of trades\n string, // Taker buy base asset volume\n string, // Taker buy quote asset volume\n string, // Ignore\n ];\n\n while (true) {\n const res = await requestPublic<IBinanceKline[]>('GET', baseUrl, {\n symbol,\n interval,\n endTime: current_end,\n limit: 1000,\n });\n\n if (res.length === 0) break;\n\n const periods: IOHLC[] = res.map((k) => ({\n datasource_id,\n product_id,\n duration,\n created_at: formatTime(k[0]),\n closed_at: formatTime(k[0] + offset),\n open: `${k[1]}`,\n high: `${k[2]}`,\n low: `${k[3]}`,\n close: `${k[4]}`,\n volume: `${k[5]}`,\n open_interest: '0',\n series_id,\n }));\n\n yield periods;\n\n const oldest = periods[0];\n current_end = new Date(oldest.created_at).getTime() - 1;\n\n if (current_end < start) break;\n\n await firstValueFrom(timer(200));\n }\n },\n});\n"]}
1
+ {"version":3,"file":"ohlc.js","sourceRoot":"","sources":["../../src/public-data/ohlc.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOHLC } from '@yuants/data-ohlc';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { firstValueFrom, timer } from 'rxjs';\nimport { requestPublic } from '../api/client';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_BINANCE_INTERVAL: Record<string, string> = {\n PT1M: '1m',\n PT3M: '3m',\n PT5M: '5m',\n PT15M: '15m',\n PT30M: '30m',\n PT1H: '1h',\n PT2H: '2h',\n PT4H: '4h',\n PT6H: '6h',\n PT8H: '8h',\n PT12H: '12h',\n P1D: '1d',\n P3D: '3d',\n P1W: '1w',\n P1M: '1M',\n};\n\ncreateSeriesProvider<IOHLC>(terminal, {\n tableName: 'ohlc',\n series_id_prefix_parts: ['BINANCE'],\n reversed: true,\n serviceOptions: { concurrent: 10 },\n queryFn: async function* ({ series_id, started_at, ended_at }) {\n const [datasource_id, product_id, duration] = decodePath(series_id);\n const interval = DURATION_TO_BINANCE_INTERVAL[duration];\n if (!interval) {\n throw new Error(`Unsupported duration: ${duration}`);\n }\n const offset = convertDurationToOffset(duration);\n const [, instType, symbol] = decodePath(product_id);\n\n let current_end = ended_at || Date.now();\n const start = started_at || 0;\n\n const baseUrl =\n instType === 'usdt-future'\n ? 'https://fapi.binance.com/fapi/v1/klines'\n : 'https://api.binance.com/api/v3/klines';\n\n type IBinanceKline = [\n number, // Open time\n string, // Open\n string, // High\n string, // Low\n string, // Close\n string, // Volume\n number, // Close time\n string, // Quote asset volume\n number, // Number of trades\n string, // Taker buy base asset volume\n string, // Taker buy quote asset volume\n string, // Ignore\n ];\n\n while (true) {\n const res = await requestPublic<IBinanceKline[]>('GET', baseUrl, {\n symbol,\n interval,\n endTime: current_end,\n limit: 1000,\n });\n\n if (res.length === 0) break;\n\n const periods: IOHLC[] = res.map((k) => ({\n datasource_id,\n product_id,\n duration,\n created_at: formatTime(k[0]),\n closed_at: formatTime(k[0] + offset),\n open: `${k[1]}`,\n high: `${k[2]}`,\n low: `${k[3]}`,\n close: `${k[4]}`,\n volume: `${k[5]}`,\n open_interest: '0',\n series_id,\n }));\n\n yield periods;\n\n const oldest = periods[0];\n current_end = new Date(oldest.created_at).getTime() - 1;\n\n if (current_end < start) break;\n\n await firstValueFrom(timer(200));\n }\n },\n});\n"]}
@@ -13,7 +13,7 @@ const cache = (0, data_product_1.provideQueryProductsService)(terminal, 'BINANCE
13
13
  return exchangeInfo.symbols.map((symbol) => {
14
14
  return {
15
15
  datasource_id: 'BINANCE',
16
- product_id: (0, utils_1.encodePath)('usdt-future', symbol.symbol),
16
+ product_id: (0, utils_1.encodePath)('BINANCE', 'USDT-FUTURE', symbol.symbol),
17
17
  base_currency: symbol.baseAsset,
18
18
  quote_currency: symbol.quoteAsset,
19
19
  price_step: +`1e-${symbol.pricePrecision}`,
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/public-data/product.ts"],"names":[],"mappings":";;AAAA,uDAAoG;AACpG,+CAA4C;AAC5C,yCAA2C;AAC3C,kDAA0D;AAE1D,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,oDAAoD;AACpD,MAAM,KAAK,GAAG,IAAA,0CAA2B,EACvC,QAAQ,EACR,SAAS,EACT,KAAK,EAAE,GAA0B,EAAuB,EAAE;IACxD,sDAAsD;IACtD,MAAM,YAAY,GAAG,MAAM,IAAA,kCAAqB,GAAE,CAAC;IAEnD,qCAAqC;IACrC,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAY,EAAE;QACnD,OAAO;YACL,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,IAAA,kBAAU,EAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC;YACpD,aAAa,EAAE,MAAM,CAAC,SAAS;YAC/B,cAAc,EAAE,MAAM,CAAC,UAAU;YACjC,UAAU,EAAE,CAAC,MAAM,MAAM,CAAC,cAAc,EAAE;YAC1C,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC,MAAM,MAAM,CAAC,iBAAiB,EAAE;YAC9C,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,OAAO;YACrD,gBAAgB,EAAE,EAAE;YACpB,WAAW,EAAE,CAAC,MAAM,CAAC,qBAAqB,GAAG,GAAG;YAChD,gBAAgB,EAAE,CAAC;YACnB,iBAAiB,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,qBAAqB;YAChC,gBAAgB,EAAE,KAAK;SACxB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,EACD;IACE,qBAAqB,EAAE,OAAQ;CAChC,CACF,CAAC","sourcesContent":["import { IProduct, IQueryProductsRequest, provideQueryProductsService } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { getFutureExchangeInfo } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\n// Provide QueryProducts service with the new design\nconst cache = provideQueryProductsService(\n terminal,\n 'BINANCE',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n // Directly call the external API to get exchange info\n const exchangeInfo = await getFutureExchangeInfo();\n\n // Convert symbols to IProduct format\n return exchangeInfo.symbols.map((symbol): IProduct => {\n return {\n datasource_id: 'BINANCE',\n product_id: encodePath('usdt-future', symbol.symbol),\n base_currency: symbol.baseAsset,\n quote_currency: symbol.quoteAsset,\n price_step: +`1e-${symbol.pricePrecision}`,\n value_scale: 1,\n volume_step: +`1e-${symbol.quantityPrecision}`,\n name: `${symbol.baseAsset}/${symbol.quoteAsset} PERP`,\n value_scale_unit: '',\n margin_rate: +symbol.requiredMarginPercent / 100,\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: true,\n market_id: 'BINANCE/USDT-FUTURE',\n no_interest_rate: false,\n };\n });\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n"]}
1
+ {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/public-data/product.ts"],"names":[],"mappings":";;AAAA,uDAAoG;AACpG,+CAA4C;AAC5C,yCAA2C;AAC3C,kDAA0D;AAE1D,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,oDAAoD;AACpD,MAAM,KAAK,GAAG,IAAA,0CAA2B,EACvC,QAAQ,EACR,SAAS,EACT,KAAK,EAAE,GAA0B,EAAuB,EAAE;IACxD,sDAAsD;IACtD,MAAM,YAAY,GAAG,MAAM,IAAA,kCAAqB,GAAE,CAAC;IAEnD,qCAAqC;IACrC,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAY,EAAE;QACnD,OAAO;YACL,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,IAAA,kBAAU,EAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC;YAC/D,aAAa,EAAE,MAAM,CAAC,SAAS;YAC/B,cAAc,EAAE,MAAM,CAAC,UAAU;YACjC,UAAU,EAAE,CAAC,MAAM,MAAM,CAAC,cAAc,EAAE;YAC1C,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC,MAAM,MAAM,CAAC,iBAAiB,EAAE;YAC9C,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,OAAO;YACrD,gBAAgB,EAAE,EAAE;YACpB,WAAW,EAAE,CAAC,MAAM,CAAC,qBAAqB,GAAG,GAAG;YAChD,gBAAgB,EAAE,CAAC;YACnB,iBAAiB,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,qBAAqB;YAChC,gBAAgB,EAAE,KAAK;SACxB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,EACD;IACE,qBAAqB,EAAE,OAAQ;CAChC,CACF,CAAC","sourcesContent":["import { IProduct, IQueryProductsRequest, provideQueryProductsService } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { getFutureExchangeInfo } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\n// Provide QueryProducts service with the new design\nconst cache = provideQueryProductsService(\n terminal,\n 'BINANCE',\n async (req: IQueryProductsRequest): Promise<IProduct[]> => {\n // Directly call the external API to get exchange info\n const exchangeInfo = await getFutureExchangeInfo();\n\n // Convert symbols to IProduct format\n return exchangeInfo.symbols.map((symbol): IProduct => {\n return {\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', symbol.symbol),\n base_currency: symbol.baseAsset,\n quote_currency: symbol.quoteAsset,\n price_step: +`1e-${symbol.pricePrecision}`,\n value_scale: 1,\n volume_step: +`1e-${symbol.quantityPrecision}`,\n name: `${symbol.baseAsset}/${symbol.quoteAsset} PERP`,\n value_scale_unit: '',\n margin_rate: +symbol.requiredMarginPercent / 100,\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: true,\n market_id: 'BINANCE/USDT-FUTURE',\n no_interest_rate: false,\n };\n });\n },\n {\n auto_refresh_interval: 3600_000,\n },\n);\n"]}
@@ -28,7 +28,7 @@ const quoteFromPremiumIndex$ = futurePremiumIndex$.pipe((0, rxjs_1.mergeMap)((en
28
28
  var _a;
29
29
  return ({
30
30
  datasource_id: 'BINANCE',
31
- product_id: (0, utils_1.encodePath)('usdt-future', entry.symbol),
31
+ product_id: (0, utils_1.encodePath)('BINANCE', 'USDT-FUTURE', entry.symbol),
32
32
  last_price: entry.markPrice,
33
33
  // Use the latest funding rate so that long pays when fundingRate > 0
34
34
  interest_rate_long: `${-Number(entry.lastFundingRate)}`,
@@ -41,7 +41,7 @@ const quoteFromBookTicker$ = futureBookTicker$.pipe((0, rxjs_1.mergeMap)((entrie
41
41
  var _a;
42
42
  return ({
43
43
  datasource_id: 'BINANCE',
44
- product_id: (0, utils_1.encodePath)('usdt-future', entry.symbol),
44
+ product_id: (0, utils_1.encodePath)('BINANCE', 'USDT-FUTURE', entry.symbol),
45
45
  bid_price: entry.bidPrice,
46
46
  ask_price: entry.askPrice,
47
47
  updated_at: (0, utils_1.formatTime)((_a = entry.time) !== null && _a !== void 0 ? _a : Date.now()),
@@ -49,12 +49,12 @@ const quoteFromBookTicker$ = futureBookTicker$.pipe((0, rxjs_1.mergeMap)((entrie
49
49
  }));
50
50
  const quoteFromOpenInterest$ = futureBookTicker$.pipe((0, rxjs_1.mergeMap)((entries) => (0, rxjs_1.from)(entries || [])), (0, rxjs_1.mergeMap)((entry) => (0, rxjs_1.from)(openInterestCache.query(entry.symbol)).pipe((0, rxjs_1.map)((openInterest) => ({
51
51
  datasource_id: 'BINANCE',
52
- product_id: (0, utils_1.encodePath)('usdt-future', entry.symbol),
52
+ product_id: (0, utils_1.encodePath)('BINANCE', 'USDT-FUTURE', entry.symbol),
53
53
  open_interest: `${openInterest !== null && openInterest !== void 0 ? openInterest : 0}`,
54
54
  }))), 5));
55
55
  const quoteFromSpotBookTicker$ = (0, rxjs_1.defer)(() => (0, public_api_1.getSpotBookTicker)({})).pipe((0, rxjs_1.repeat)({ delay: 1000 }), (0, rxjs_1.retry)({ delay: 30000 }), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true }), (0, rxjs_1.mergeMap)((entries) => (0, rxjs_1.from)(entries || [])), (0, rxjs_1.map)((entry) => ({
56
56
  datasource_id: 'BINANCE',
57
- product_id: (0, utils_1.encodePath)('spot', entry.symbol),
57
+ product_id: (0, utils_1.encodePath)('BINANCE', 'SPOT', entry.symbol),
58
58
  bid_price: entry.bidPrice,
59
59
  ask_price: entry.askPrice,
60
60
  bid_volume: entry.bidQty,
@@ -85,7 +85,7 @@ const quoteFromMarginRates$ = marginPairs$.pipe((0, rxjs_1.mergeMap)((pairs) =>
85
85
  ]);
86
86
  return {
87
87
  datasource_id: 'BINANCE',
88
- product_id: (0, utils_1.encodePath)('spot', pair.symbol),
88
+ product_id: (0, utils_1.encodePath)('BINANCE', 'SPOT', pair.symbol),
89
89
  // User instruction: Long = Quote Rate, Short = Base Rate
90
90
  interest_rate_long: quoteRate,
91
91
  interest_rate_short: baseRate,
@@ -1 +1 @@
1
- {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../src/public-data/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { decodePath, encodePath, formatTime } from '@yuants/utils';\nimport {\n defer,\n filter,\n from,\n groupBy,\n map,\n merge,\n mergeMap,\n repeat,\n retry,\n scan,\n share,\n shareReplay,\n} from 'rxjs';\nimport { getMarginAllPairs, getMarginNextHourlyInterestRate, IMarginPair } from '../api/private-api';\nimport {\n getFutureBookTicker,\n getFutureOpenInterest,\n getFuturePremiumIndex,\n getSpotBookTicker,\n} from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\nconst OPEN_INTEREST_TTL = process.env.OPEN_INTEREST_TTL ? Number(process.env.OPEN_INTEREST_TTL) : 120_000;\n\nconst openInterestCache = createCache<number>(\n async (symbol: string) => {\n try {\n const data = await getFutureOpenInterest({ symbol });\n return Number(data.openInterest ?? 0);\n } catch (err) {\n console.warn('getFutureOpenInterest failed', symbol, err);\n return undefined;\n }\n },\n {\n expire: OPEN_INTEREST_TTL,\n },\n);\n\nconst futurePremiumIndex$ = defer(() => getFuturePremiumIndex({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst futureBookTicker$ = defer(() => getFutureBookTicker({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst quoteFromPremiumIndex$ = futurePremiumIndex$.pipe(\n mergeMap((entries) => from(entries || [])),\n map(\n (entry): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('usdt-future', entry.symbol),\n last_price: entry.markPrice,\n // Use the latest funding rate so that long pays when fundingRate > 0\n interest_rate_long: `${-Number(entry.lastFundingRate)}`,\n interest_rate_short: entry.lastFundingRate,\n interest_rate_next_settled_at: formatTime(entry.nextFundingTime),\n updated_at: formatTime(entry.time ?? Date.now()),\n }),\n ),\n);\n\nconst quoteFromBookTicker$ = futureBookTicker$.pipe(\n mergeMap((entries) => from(entries || [])),\n map(\n (entry): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('usdt-future', entry.symbol),\n bid_price: entry.bidPrice,\n ask_price: entry.askPrice,\n updated_at: formatTime(entry.time ?? Date.now()),\n }),\n ),\n);\n\nconst quoteFromOpenInterest$ = futureBookTicker$.pipe(\n mergeMap((entries) => from(entries || [])),\n mergeMap(\n (entry) =>\n from(openInterestCache.query(entry.symbol)).pipe(\n map(\n (openInterest): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('usdt-future', entry.symbol),\n open_interest: `${openInterest ?? 0}`,\n }),\n ),\n ),\n 5,\n ),\n);\n\nconst quoteFromSpotBookTicker$ = defer(() => getSpotBookTicker({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n mergeMap((entries) => from(entries || [])),\n map(\n (entry): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('spot', entry.symbol),\n bid_price: entry.bidPrice,\n ask_price: entry.askPrice,\n bid_volume: entry.bidQty,\n ask_volume: entry.askQty,\n updated_at: formatTime(Date.now()),\n }),\n ),\n);\n\nconst marginInterestRateCache = createCache<string>(\n async (asset: string) => {\n try {\n const data = await getMarginNextHourlyInterestRate({\n assets: asset,\n isIsolated: false,\n });\n return data[0]?.nextHourlyInterestRate;\n } catch (err) {\n return undefined;\n }\n },\n {\n expire: 60_000,\n },\n);\n\nconst marginPairs$ = defer(() => getMarginAllPairs()).pipe(\n repeat({ delay: 3600_000 }), // Refresh pair list hourly\n retry({ delay: 60_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst quoteFromMarginRates$ = marginPairs$.pipe(\n mergeMap((pairs: IMarginPair[]) =>\n from(pairs).pipe(\n mergeMap(\n (pair) =>\n defer(async () => {\n const [baseRate, quoteRate] = await Promise.all([\n marginInterestRateCache.query(pair.base),\n marginInterestRateCache.query(pair.quote),\n ]);\n return {\n datasource_id: 'BINANCE',\n product_id: encodePath('spot', pair.symbol),\n // User instruction: Long = Quote Rate, Short = Base Rate\n interest_rate_long: quoteRate,\n interest_rate_short: baseRate,\n updated_at: formatTime(Date.now()),\n } as Partial<IQuote>;\n }),\n 5, // Concurrency\n ),\n ),\n ),\n repeat({ delay: 60_000 }),\n);\n\nconst quote$ = merge(\n quoteFromPremiumIndex$,\n quoteFromBookTicker$,\n quoteFromOpenInterest$,\n quoteFromSpotBookTicker$,\n quoteFromMarginRates$,\n).pipe(\n groupBy((quote) => quote.product_id),\n mergeMap((group$) =>\n group$.pipe(\n scan(\n (acc, cur) =>\n Object.assign(acc, cur, {\n datasource_id: 'BINANCE',\n product_id: group$.key,\n }),\n {} as Partial<IQuote>,\n ),\n ),\n ),\n share(),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n quote$\n .pipe(\n writeToSQL({\n terminal,\n tableName: 'quote',\n writeInterval: 1_000,\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n\n terminal.channel.publishChannel('quote', { pattern: '^BINANCE/' }, (channel_id) => {\n const [datasourceId, productId] = decodePath(channel_id);\n if (!datasourceId || !productId) {\n throw new Error(`Invalid channel_id: ${channel_id}`);\n }\n return quote$.pipe(filter((quote) => quote.product_id === productId));\n });\n}\n"]}
1
+ {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../src/public-data/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { decodePath, encodePath, formatTime } from '@yuants/utils';\nimport {\n defer,\n filter,\n from,\n groupBy,\n map,\n merge,\n mergeMap,\n repeat,\n retry,\n scan,\n share,\n shareReplay,\n} from 'rxjs';\nimport { getMarginAllPairs, getMarginNextHourlyInterestRate, IMarginPair } from '../api/private-api';\nimport {\n getFutureBookTicker,\n getFutureOpenInterest,\n getFuturePremiumIndex,\n getSpotBookTicker,\n} from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\nconst OPEN_INTEREST_TTL = process.env.OPEN_INTEREST_TTL ? Number(process.env.OPEN_INTEREST_TTL) : 120_000;\n\nconst openInterestCache = createCache<number>(\n async (symbol: string) => {\n try {\n const data = await getFutureOpenInterest({ symbol });\n return Number(data.openInterest ?? 0);\n } catch (err) {\n console.warn('getFutureOpenInterest failed', symbol, err);\n return undefined;\n }\n },\n {\n expire: OPEN_INTEREST_TTL,\n },\n);\n\nconst futurePremiumIndex$ = defer(() => getFuturePremiumIndex({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst futureBookTicker$ = defer(() => getFutureBookTicker({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst quoteFromPremiumIndex$ = futurePremiumIndex$.pipe(\n mergeMap((entries) => from(entries || [])),\n map(\n (entry): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', entry.symbol),\n last_price: entry.markPrice,\n // Use the latest funding rate so that long pays when fundingRate > 0\n interest_rate_long: `${-Number(entry.lastFundingRate)}`,\n interest_rate_short: entry.lastFundingRate,\n interest_rate_next_settled_at: formatTime(entry.nextFundingTime),\n updated_at: formatTime(entry.time ?? Date.now()),\n }),\n ),\n);\n\nconst quoteFromBookTicker$ = futureBookTicker$.pipe(\n mergeMap((entries) => from(entries || [])),\n map(\n (entry): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', entry.symbol),\n bid_price: entry.bidPrice,\n ask_price: entry.askPrice,\n updated_at: formatTime(entry.time ?? Date.now()),\n }),\n ),\n);\n\nconst quoteFromOpenInterest$ = futureBookTicker$.pipe(\n mergeMap((entries) => from(entries || [])),\n mergeMap(\n (entry) =>\n from(openInterestCache.query(entry.symbol)).pipe(\n map(\n (openInterest): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', entry.symbol),\n open_interest: `${openInterest ?? 0}`,\n }),\n ),\n ),\n 5,\n ),\n);\n\nconst quoteFromSpotBookTicker$ = defer(() => getSpotBookTicker({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n mergeMap((entries) => from(entries || [])),\n map(\n (entry): Partial<IQuote> => ({\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'SPOT', entry.symbol),\n bid_price: entry.bidPrice,\n ask_price: entry.askPrice,\n bid_volume: entry.bidQty,\n ask_volume: entry.askQty,\n updated_at: formatTime(Date.now()),\n }),\n ),\n);\n\nconst marginInterestRateCache = createCache<string>(\n async (asset: string) => {\n try {\n const data = await getMarginNextHourlyInterestRate({\n assets: asset,\n isIsolated: false,\n });\n return data[0]?.nextHourlyInterestRate;\n } catch (err) {\n return undefined;\n }\n },\n {\n expire: 60_000,\n },\n);\n\nconst marginPairs$ = defer(() => getMarginAllPairs()).pipe(\n repeat({ delay: 3600_000 }), // Refresh pair list hourly\n retry({ delay: 60_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst quoteFromMarginRates$ = marginPairs$.pipe(\n mergeMap((pairs: IMarginPair[]) =>\n from(pairs).pipe(\n mergeMap(\n (pair) =>\n defer(async () => {\n const [baseRate, quoteRate] = await Promise.all([\n marginInterestRateCache.query(pair.base),\n marginInterestRateCache.query(pair.quote),\n ]);\n return {\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'SPOT', pair.symbol),\n // User instruction: Long = Quote Rate, Short = Base Rate\n interest_rate_long: quoteRate,\n interest_rate_short: baseRate,\n updated_at: formatTime(Date.now()),\n } as Partial<IQuote>;\n }),\n 5, // Concurrency\n ),\n ),\n ),\n repeat({ delay: 60_000 }),\n);\n\nconst quote$ = merge(\n quoteFromPremiumIndex$,\n quoteFromBookTicker$,\n quoteFromOpenInterest$,\n quoteFromSpotBookTicker$,\n quoteFromMarginRates$,\n).pipe(\n groupBy((quote) => quote.product_id),\n mergeMap((group$) =>\n group$.pipe(\n scan(\n (acc, cur) =>\n Object.assign(acc, cur, {\n datasource_id: 'BINANCE',\n product_id: group$.key,\n }),\n {} as Partial<IQuote>,\n ),\n ),\n ),\n share(),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n quote$\n .pipe(\n writeToSQL({\n terminal,\n tableName: 'quote',\n writeInterval: 1_000,\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n\n terminal.channel.publishChannel('quote', { pattern: '^BINANCE/' }, (channel_id) => {\n const [datasourceId, productId] = decodePath(channel_id);\n if (!datasourceId || !productId) {\n throw new Error(`Invalid channel_id: ${channel_id}`);\n }\n return quote$.pipe(filter((quote) => quote.product_id === productId));\n });\n}\n"]}
@@ -18,7 +18,7 @@ const getSpotAccountInfoSnapshot = async (credential) => {
18
18
  const position = (0, data_account_1.makeSpotPosition)({
19
19
  position_id: `spot/${balance.asset}`,
20
20
  datasource_id: 'BINANCE',
21
- product_id: (0, utils_1.encodePath)('spot', `${balance.asset}USDT`),
21
+ product_id: (0, utils_1.encodePath)('BINANCE', 'SPOT', `${balance.asset}USDT`),
22
22
  volume,
23
23
  free_volume: +balance.free,
24
24
  closable_price: 0, // TODO: fetch price later
@@ -1 +1 @@
1
- {"version":3,"file":"spot.js","sourceRoot":"","sources":["../../../src/services/accounts/spot.ts"],"names":[],"mappings":";;;AAAA,uDAAmG;AACnG,yCAA2C;AAC3C,6CAA8C;AAC9C,uDAAwE;AAEjE,MAAM,0BAA0B,GAAgD,KAAK,EAAE,UAAU,EAAE,EAAE;IAC1G,MAAM,GAAG,GAAG,MAAM,IAAA,gCAAkB,EAAC,UAAU,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,IAAA,mBAAU,EAAC,GAAG,CAAC,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC1B;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ;SAC3B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,QAAQ,GAAc,IAAA,+BAAgB,EAAC;YAC3C,WAAW,EAAE,QAAQ,OAAO,CAAC,KAAK,EAAE;YACpC,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,IAAA,kBAAU,EAAC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,CAAC;YACtD,MAAM;YACN,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI;YAC1B,cAAc,EAAE,CAAC,EAAE,0BAA0B;SAC9C,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,QAAQ,EAAyB,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AArBW,QAAA,0BAA0B,8BAqBrC","sourcesContent":["import { IActionHandlerOfGetAccountInfo, IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { isApiError } from '../../api/client';\nimport { getSpotAccountInfo, ICredential } from '../../api/private-api';\n\nexport const getSpotAccountInfoSnapshot: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n const res = await getSpotAccountInfo(credential, { omitZeroBalances: true });\n if (isApiError(res)) {\n throw new Error(res.msg);\n }\n const positions = res.balances\n .map((balance) => {\n const volume = +balance.free + +balance.locked;\n if (!volume) return undefined;\n const position: IPosition = makeSpotPosition({\n position_id: `spot/${balance.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('spot', `${balance.asset}USDT`),\n volume,\n free_volume: +balance.free,\n closable_price: 0, // TODO: fetch price later\n });\n return position;\n })\n .filter((position): position is IPosition => Boolean(position));\n return positions;\n};\n"]}
1
+ {"version":3,"file":"spot.js","sourceRoot":"","sources":["../../../src/services/accounts/spot.ts"],"names":[],"mappings":";;;AAAA,uDAAmG;AACnG,yCAA2C;AAC3C,6CAA8C;AAC9C,uDAAwE;AAEjE,MAAM,0BAA0B,GAAgD,KAAK,EAAE,UAAU,EAAE,EAAE;IAC1G,MAAM,GAAG,GAAG,MAAM,IAAA,gCAAkB,EAAC,UAAU,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,IAAA,mBAAU,EAAC,GAAG,CAAC,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KAC1B;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ;SAC3B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,QAAQ,GAAc,IAAA,+BAAgB,EAAC;YAC3C,WAAW,EAAE,QAAQ,OAAO,CAAC,KAAK,EAAE;YACpC,aAAa,EAAE,SAAS;YACxB,UAAU,EAAE,IAAA,kBAAU,EAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,MAAM,CAAC;YACjE,MAAM;YACN,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI;YAC1B,cAAc,EAAE,CAAC,EAAE,0BAA0B;SAC9C,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,QAAQ,EAAyB,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AArBW,QAAA,0BAA0B,8BAqBrC","sourcesContent":["import { IActionHandlerOfGetAccountInfo, IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { isApiError } from '../../api/client';\nimport { getSpotAccountInfo, ICredential } from '../../api/private-api';\n\nexport const getSpotAccountInfoSnapshot: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n const res = await getSpotAccountInfo(credential, { omitZeroBalances: true });\n if (isApiError(res)) {\n throw new Error(res.msg);\n }\n const positions = res.balances\n .map((balance) => {\n const volume = +balance.free + +balance.locked;\n if (!volume) return undefined;\n const position: IPosition = makeSpotPosition({\n position_id: `spot/${balance.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`),\n volume,\n free_volume: +balance.free,\n closable_price: 0, // TODO: fetch price later\n });\n return position;\n })\n .filter((position): position is IPosition => Boolean(position));\n return positions;\n};\n"]}