@yuants/vendor-binance 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.js CHANGED
@@ -209,10 +209,9 @@ export class ApiClient {
209
209
  if (!this.config.auth) {
210
210
  console.info(formatTime(Date.now()), method, url.href);
211
211
  const res = await fetch(url.href, { method });
212
- console.info(formatTime(Date.now()), 'response', method, url.href, res.status);
213
212
  const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');
213
+ console.info(formatTime(Date.now()), 'response', method, url.href, res.status, `usedWeight1M=${usedWeight1M !== null && usedWeight1M !== void 0 ? usedWeight1M : 'N/A'}`);
214
214
  if (usedWeight1M) {
215
- // console.info('usedWeight1M', method, url.href, usedWeight1M);
216
215
  MetricBinanceApiUsedWeight.set(+usedWeight1M, {});
217
216
  }
218
217
  return res.json();
@@ -231,9 +230,8 @@ export class ApiClient {
231
230
  headers,
232
231
  });
233
232
  const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');
234
- console.info(formatTime(Date.now()), 'response', method, url.href, res.status);
233
+ console.info(formatTime(Date.now()), 'response', method, url.href, res.status, `usedWeight1M=${usedWeight1M !== null && usedWeight1M !== void 0 ? usedWeight1M : 'N/A'}`);
235
234
  if (usedWeight1M) {
236
- // console.info('usedWeight1M', method, url.href, res.status, usedWeight1M);
237
235
  MetricBinanceApiUsedWeight.set(+usedWeight1M, {});
238
236
  }
239
237
  return res.json();
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { PromRegistry } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\n// @ts-ignore\nimport CryptoJS from 'crypto-js';\n\nconst MetricBinanceApiUsedWeight = PromRegistry.create('gauge', 'binance_api_used_weight');\n\ninterface errorResult {\n code: number;\n msg: string;\n}\n\nexport const isError = <T>(x: T | errorResult): x is errorResult => (x as errorResult).code !== undefined;\n\n/**\n * Binance 币安 API\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/CHANGELOG\n */\nexport class ApiClient {\n constructor(\n public config: {\n auth?: {\n public_key: string;\n secret_key: string;\n };\n },\n ) {}\n\n async request(method: string, path: string, params: any = {}) {\n const url = new URL(path);\n params.recvWindow = 5000;\n params.timestamp = Date.now();\n for (const key in params) {\n if (params[key] === undefined) continue;\n url.searchParams.set(key, params[key]);\n }\n if (!this.config.auth) {\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n console.info(formatTime(Date.now()), 'response', method, url.href, res.status);\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n if (usedWeight1M) {\n // console.info('usedWeight1M', method, url.href, usedWeight1M);\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n const secret_key = this.config.auth.secret_key;\n const signData = url.search.slice(1);\n const str = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA256(signData, secret_key));\n url.searchParams.set('signature', str);\n\n const headers = {\n 'Content-Type': 'application/json;charset=utf-8',\n 'X-MBX-APIKEY': this.config.auth.public_key!,\n };\n\n console.info(\n formatTime(Date.now()),\n method,\n url.href,\n JSON.stringify(headers),\n url.searchParams.toString(),\n signData,\n );\n const res = await fetch(url.href, {\n method,\n headers,\n });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n console.info(formatTime(Date.now()), 'response', method, url.href, res.status);\n if (usedWeight1M) {\n // console.info('usedWeight1M', method, url.href, res.status, usedWeight1M);\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n\n /**\n * 获取交易规则和交易对\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#0f3f2d5ee7\n */\n getFutureExchangeInfo = (): Promise<{\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: any[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: {\n filterType: string;\n maxPrice?: string;\n minPrice?: string;\n tickSize?: string;\n maxQty?: string;\n stepSize?: string;\n minQty?: string;\n limit?: number;\n notional?: string;\n multiplierDecimal?: string;\n multiplierUp?: string;\n multiplierDown?: string;\n }[];\n orderTypes: string[];\n timeInForce: string[];\n }[];\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/exchangeInfo');\n\n /**\n * 查询资金费率历史\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#31dbeb24c4\n */\n getFutureFundingRate = (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<\n {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/fundingRate', params);\n\n /**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\n getFuturePremiumIndex = (params: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/premiumIndex', params);\n\n /**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\n getFutureBookTicker = (params?: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/ticker/bookTicker', params);\n\n /**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\n getFutureOpenInterest = (params: {\n symbol: string;\n }): Promise<{\n openInterest: string;\n symbol: string;\n time: number;\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/openInterest', params);\n\n /**\n * 查询账户信息(USER_DATA)\n *\n * 查询账户信息\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Information\n */\n getUnifiedAccountInfo = (): Promise<\n | {\n uniMMR: string;\n accountEquity: string;\n actualEquity: string;\n accountInitialMargin: string;\n accountMaintMargin: string;\n accountStatus: string;\n virtualMaxWithdrawAmount: string;\n totalAvailableBalance: string;\n totalMarginOpenLoss: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/account');\n\n /**\n * 获取UM账户信息\n *\n * 现有UM账户资产和仓位信息\n *\n * 权重: 5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Account-Detail\n */\n getUnifiedUmAccount = (): Promise<\n | {\n assets: {\n asset: string;\n crossWalletBalance: string;\n crossUnPnl: string;\n maintMargin: string;\n initialMargin: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n updateTime: number;\n }[];\n positions: {\n symbol: string;\n initialMargin: string;\n maintMargin: string;\n unrealizedProfit: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n leverage: string;\n entryPrice: string;\n maxNotional: string;\n bidNotional: string;\n askNotional: string;\n positionSide: string;\n positionAmt: string;\n updateTime: number;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/account');\n\n /**\n * 查看当前全部UM挂单(USER_DATA)\n *\n * 查看当前全部UM挂单,请小心使用不带symbol参数的调用\n *\n * 权重: 带symbol 1 - 不带 40\n */\n getUnifiedUmOpenOrders = (params?: {\n symbol?: string;\n }): Promise<\n {\n avgPrice: string;\n clientOrderId: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n origType: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n time: number;\n timeInForce: string;\n type: string;\n updateTime: number;\n selfTradePreventionMode: string;\n goodTillDate: number;\n }[]\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/openOrders', params);\n\n /**\n * 查询账户余额(USER_DATA)\n *\n * 查询账户余额\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Balance\n */\n getUnifiedAccountBalance = (params?: {\n assets?: string;\n }): Promise<\n | {\n asset: string;\n totalWalletBalance: string;\n crossMarginAsset: string;\n crossMarginBorrowed: string;\n crossMarginFree: string;\n crossMarginInterest: string;\n crossMarginLocked: string;\n umWalletBalance: string;\n umUnrealizedPNL: string;\n cmWalletBalance: string;\n cmUnrealizedPNL: string;\n updateTime: number;\n }[]\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/balance', params);\n\n /**\n * 账户信息 (USER_DATA)\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api#%E8%B4%A6%E6%88%B7%E4%BF%A1%E6%81%AF-user_data\n */\n getSpotAccountInfo = (params?: {\n omitZeroBalances?: boolean;\n }): Promise<\n | {\n makerCommission: number;\n takerCommission: number;\n buyerCommission: number;\n sellerCommission: number;\n commissionRates: {\n maker: string;\n taker: string;\n buyer: string;\n seller: string;\n };\n canTrade: boolean;\n canWithdraw: boolean;\n canDeposit: boolean;\n brokered: boolean;\n requireSelfTradePrevention: boolean;\n preventSor: boolean;\n updateTime: number;\n balances: {\n asset: string;\n free: string;\n locked: string;\n }[];\n permissions: string[];\n uid: number;\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/api/v3/account', params);\n\n /**\n * 用户万向划转(USER_DATA)\n *\n * 用户万向划转\n *\n * 您需要开通api key 允许万向划转权限来调用此接口。\n *\n * 权重: 900\n *\n * https://developers.binance.com/docs/zh-CN/wallet/asset/user-universal-transfer\n */\n postAssetTransfer = (params: {\n type: string;\n asset: string;\n amount: number;\n fromSymbol?: string;\n toSymbol?: string;\n }): Promise<\n | {\n tranId: number;\n }\n | errorResult\n > => this.request('POST', 'https://api.binance.com/sapi/v1/asset/transfer', params);\n\n /**\n * 统一账户资金归集(TRADE)\n *\n * 资金归集到统一账户钱包\n *\n * 权重: 750\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Fund-Auto-collection\n *\n * ISSUE(2024-07-18): 目前这是唯一能够将资金从原 U 本位合约账户转入统一账户的接口。\n */\n postUnifiedAccountAutoCollection = (): Promise<{\n msg: string;\n }> => this.request('POST', 'https://papi.binance.com/papi/v1/auto-collection');\n\n /**\n * 获取充值地址(支持多网络)(USER_DATA)\n *\n * 获取充值地址\n *\n * 权重: 10\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-address\n */\n getDepositAddress = (params: {\n coin: string;\n network?: string;\n amount?: number;\n }): Promise<{\n address: string;\n coin: string;\n tag: string;\n url: string;\n }> => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/address', params);\n\n /**\n * 查询子账户列表(适用主账户)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/sub_account/account-management/Query-Sub-account-List\n */\n getSubAccountList = (params?: {\n email?: string;\n isFreeze?: number;\n page?: number;\n limit?: number;\n }): Promise<\n | {\n subAccounts: {\n email: string;\n isFreeze: boolean;\n createTime: number;\n isManagedSubAccount: boolean;\n isAssetManagementSubAccount: boolean;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/sapi/v1/sub-account/list');\n\n /**\n * 提币(USER_DATA)\n *\n * 权重: 600\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw\n */\n postWithdraw = (\n params:\n | {\n coin: string;\n withdrawOrderId?: string;\n network?: string;\n address: string;\n addressTag?: string;\n amount: number;\n transactionFeeFlag?: boolean;\n name?: string;\n walletType?: number;\n }\n | errorResult,\n ): Promise<{\n id: string;\n }> => this.request('POST', 'https://api.binance.com/sapi/v1/capital/withdraw/apply', params);\n\n /**\n * 获取提币历史(支持多网络)(USER_DATA)\n *\n * 获取提币历史 (支持多网络)\n *\n * 请求权重(IP)#\n * 18000 请求限制: 每秒10次\n *\n * 本接口特别采用每秒UID速率限制,用户的总秒级 UID 速率限制为180000/秒。从该接口收到的响应包含key X-SAPI-USED-UID-WEIGHT-1S,该key定义了当前 UID 使用的权重\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw-history\n */\n getWithdrawHistory = (params?: {\n coin?: string;\n withdrawOrderId?: string;\n status?: number;\n offset?: number;\n limit?: number;\n startTime?: number;\n endTime?: number;\n }): Promise<\n {\n id: string;\n amount: string;\n transactionFee: string;\n coin: string;\n status: number;\n address: string;\n txId: string;\n applyTime: Date;\n network: string;\n transferType: number;\n info: string;\n confirmNo: number;\n walletType: number;\n txKey: string;\n completeTime: Date;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/withdraw/history', params);\n\n /**\n * 获取充值历史(支持多网络)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-history\n */\n getDepositHistory = (params?: {\n includeSource?: boolean;\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n txId?: string;\n }): Promise<\n {\n id: string;\n amount: string;\n coin: string;\n network: string;\n status: number;\n address: string;\n addressTag: string;\n txId: string;\n insertTime: number;\n transferType: number;\n confirmTimes: string;\n unlockConfirm: number;\n walletType: number;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/hisrec', params);\n\n /**\n * UM下单(TRADE)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/trade/New-UM-Order\n */\n postUmOrder = (params: {\n symbol: string;\n side: string;\n positionSide?: string;\n type: string;\n timeInForce?: string;\n quantity: number;\n reduceOnly?: string;\n price?: number;\n newClientOrderId?: string;\n newOrderRespType?: string;\n selfTradePreventionMode?: string;\n goodTillDate?: number;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n avgPrice: string;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n selfTradePreventionMode: string;\n goodTillDate: number;\n updateTime: number;\n }\n | errorResult\n > => this.request('POST', 'https://papi.binance.com/papi/v1/um/order', params);\n\n deleteUmOrder = (params: {\n symbol: string;\n orderId?: string | number;\n origClientOrderId?: string;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('DELETE', 'https://papi.binance.com/papi/v1/um/order', params);\n\n /**\n * 获取所有全仓杠杆交易对(MARKET_DATA)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/margin_trading/market-data/Get-All-Cross-Margin-Pairs\n */\n getMarginAllPairs = (params?: {\n symbol?: string;\n }): Promise<\n {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/margin/allPairs', params);\n\n /**\n * 获取UM损益资金流水(USER_DATA)\n *\n * 权重: 30\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Income-History\n */\n getUMIncome = (params?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n recvWindow?: number;\n limit?: number;\n timestamp: number;\n }): Promise<\n {\n symbol: string; // 交易对,仅针对涉及交易对的资金流\n incomeType: string; // 资金流类型\n income: string; // 资金流数量,正数代表流入,负数代表流出\n asset: string; // 资产内容\n info: string; // 备注信息,取决于流水类型\n time: number;\n tranId: string; // 划转ID\n tradeId: string; // 引起流水产生的原始交易ID\n }[]\n > => this.request('GET', 'https://api.binance.com/papi/v1/um/income', params);\n}\nexport const client = new ApiClient({\n auth: process.env.PUBLIC_ONLY\n ? undefined\n : {\n public_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n },\n});\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { PromRegistry } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\n// @ts-ignore\nimport CryptoJS from 'crypto-js';\n\nconst MetricBinanceApiUsedWeight = PromRegistry.create('gauge', 'binance_api_used_weight');\n\ninterface errorResult {\n code: number;\n msg: string;\n}\n\nexport const isError = <T>(x: T | errorResult): x is errorResult => (x as errorResult).code !== undefined;\n\n/**\n * Binance 币安 API\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/CHANGELOG\n */\nexport class ApiClient {\n constructor(\n public config: {\n auth?: {\n public_key: string;\n secret_key: string;\n };\n },\n ) {}\n\n async request(method: string, path: string, params: any = {}) {\n const url = new URL(path);\n params.recvWindow = 5000;\n params.timestamp = Date.now();\n for (const key in params) {\n if (params[key] === undefined) continue;\n url.searchParams.set(key, params[key]);\n }\n if (!this.config.auth) {\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n console.info(\n formatTime(Date.now()),\n 'response',\n method,\n url.href,\n res.status,\n `usedWeight1M=${usedWeight1M ?? 'N/A'}`,\n );\n if (usedWeight1M) {\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n const secret_key = this.config.auth.secret_key;\n const signData = url.search.slice(1);\n const str = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA256(signData, secret_key));\n url.searchParams.set('signature', str);\n\n const headers = {\n 'Content-Type': 'application/json;charset=utf-8',\n 'X-MBX-APIKEY': this.config.auth.public_key!,\n };\n\n console.info(\n formatTime(Date.now()),\n method,\n url.href,\n JSON.stringify(headers),\n url.searchParams.toString(),\n signData,\n );\n const res = await fetch(url.href, {\n method,\n headers,\n });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n console.info(\n formatTime(Date.now()),\n 'response',\n method,\n url.href,\n res.status,\n `usedWeight1M=${usedWeight1M ?? 'N/A'}`,\n );\n if (usedWeight1M) {\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n\n /**\n * 获取交易规则和交易对\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#0f3f2d5ee7\n */\n getFutureExchangeInfo = (): Promise<{\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: any[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: {\n filterType: string;\n maxPrice?: string;\n minPrice?: string;\n tickSize?: string;\n maxQty?: string;\n stepSize?: string;\n minQty?: string;\n limit?: number;\n notional?: string;\n multiplierDecimal?: string;\n multiplierUp?: string;\n multiplierDown?: string;\n }[];\n orderTypes: string[];\n timeInForce: string[];\n }[];\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/exchangeInfo');\n\n /**\n * 查询资金费率历史\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#31dbeb24c4\n */\n getFutureFundingRate = (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<\n {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/fundingRate', params);\n\n /**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\n getFuturePremiumIndex = (params: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/premiumIndex', params);\n\n /**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\n getFutureBookTicker = (params?: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/ticker/bookTicker', params);\n\n /**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\n getFutureOpenInterest = (params: {\n symbol: string;\n }): Promise<{\n openInterest: string;\n symbol: string;\n time: number;\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/openInterest', params);\n\n /**\n * 查询账户信息(USER_DATA)\n *\n * 查询账户信息\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Information\n */\n getUnifiedAccountInfo = (): Promise<\n | {\n uniMMR: string;\n accountEquity: string;\n actualEquity: string;\n accountInitialMargin: string;\n accountMaintMargin: string;\n accountStatus: string;\n virtualMaxWithdrawAmount: string;\n totalAvailableBalance: string;\n totalMarginOpenLoss: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/account');\n\n /**\n * 获取UM账户信息\n *\n * 现有UM账户资产和仓位信息\n *\n * 权重: 5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Account-Detail\n */\n getUnifiedUmAccount = (): Promise<\n | {\n assets: {\n asset: string;\n crossWalletBalance: string;\n crossUnPnl: string;\n maintMargin: string;\n initialMargin: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n updateTime: number;\n }[];\n positions: {\n symbol: string;\n initialMargin: string;\n maintMargin: string;\n unrealizedProfit: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n leverage: string;\n entryPrice: string;\n maxNotional: string;\n bidNotional: string;\n askNotional: string;\n positionSide: string;\n positionAmt: string;\n updateTime: number;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/account');\n\n /**\n * 查看当前全部UM挂单(USER_DATA)\n *\n * 查看当前全部UM挂单,请小心使用不带symbol参数的调用\n *\n * 权重: 带symbol 1 - 不带 40\n */\n getUnifiedUmOpenOrders = (params?: {\n symbol?: string;\n }): Promise<\n {\n avgPrice: string;\n clientOrderId: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n origType: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n time: number;\n timeInForce: string;\n type: string;\n updateTime: number;\n selfTradePreventionMode: string;\n goodTillDate: number;\n }[]\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/openOrders', params);\n\n /**\n * 查询账户余额(USER_DATA)\n *\n * 查询账户余额\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Balance\n */\n getUnifiedAccountBalance = (params?: {\n assets?: string;\n }): Promise<\n | {\n asset: string;\n totalWalletBalance: string;\n crossMarginAsset: string;\n crossMarginBorrowed: string;\n crossMarginFree: string;\n crossMarginInterest: string;\n crossMarginLocked: string;\n umWalletBalance: string;\n umUnrealizedPNL: string;\n cmWalletBalance: string;\n cmUnrealizedPNL: string;\n updateTime: number;\n }[]\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/balance', params);\n\n /**\n * 账户信息 (USER_DATA)\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api#%E8%B4%A6%E6%88%B7%E4%BF%A1%E6%81%AF-user_data\n */\n getSpotAccountInfo = (params?: {\n omitZeroBalances?: boolean;\n }): Promise<\n | {\n makerCommission: number;\n takerCommission: number;\n buyerCommission: number;\n sellerCommission: number;\n commissionRates: {\n maker: string;\n taker: string;\n buyer: string;\n seller: string;\n };\n canTrade: boolean;\n canWithdraw: boolean;\n canDeposit: boolean;\n brokered: boolean;\n requireSelfTradePrevention: boolean;\n preventSor: boolean;\n updateTime: number;\n balances: {\n asset: string;\n free: string;\n locked: string;\n }[];\n permissions: string[];\n uid: number;\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/api/v3/account', params);\n\n /**\n * 用户万向划转(USER_DATA)\n *\n * 用户万向划转\n *\n * 您需要开通api key 允许万向划转权限来调用此接口。\n *\n * 权重: 900\n *\n * https://developers.binance.com/docs/zh-CN/wallet/asset/user-universal-transfer\n */\n postAssetTransfer = (params: {\n type: string;\n asset: string;\n amount: number;\n fromSymbol?: string;\n toSymbol?: string;\n }): Promise<\n | {\n tranId: number;\n }\n | errorResult\n > => this.request('POST', 'https://api.binance.com/sapi/v1/asset/transfer', params);\n\n /**\n * 统一账户资金归集(TRADE)\n *\n * 资金归集到统一账户钱包\n *\n * 权重: 750\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Fund-Auto-collection\n *\n * ISSUE(2024-07-18): 目前这是唯一能够将资金从原 U 本位合约账户转入统一账户的接口。\n */\n postUnifiedAccountAutoCollection = (): Promise<{\n msg: string;\n }> => this.request('POST', 'https://papi.binance.com/papi/v1/auto-collection');\n\n /**\n * 获取充值地址(支持多网络)(USER_DATA)\n *\n * 获取充值地址\n *\n * 权重: 10\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-address\n */\n getDepositAddress = (params: {\n coin: string;\n network?: string;\n amount?: number;\n }): Promise<{\n address: string;\n coin: string;\n tag: string;\n url: string;\n }> => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/address', params);\n\n /**\n * 查询子账户列表(适用主账户)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/sub_account/account-management/Query-Sub-account-List\n */\n getSubAccountList = (params?: {\n email?: string;\n isFreeze?: number;\n page?: number;\n limit?: number;\n }): Promise<\n | {\n subAccounts: {\n email: string;\n isFreeze: boolean;\n createTime: number;\n isManagedSubAccount: boolean;\n isAssetManagementSubAccount: boolean;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/sapi/v1/sub-account/list');\n\n /**\n * 提币(USER_DATA)\n *\n * 权重: 600\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw\n */\n postWithdraw = (\n params:\n | {\n coin: string;\n withdrawOrderId?: string;\n network?: string;\n address: string;\n addressTag?: string;\n amount: number;\n transactionFeeFlag?: boolean;\n name?: string;\n walletType?: number;\n }\n | errorResult,\n ): Promise<{\n id: string;\n }> => this.request('POST', 'https://api.binance.com/sapi/v1/capital/withdraw/apply', params);\n\n /**\n * 获取提币历史(支持多网络)(USER_DATA)\n *\n * 获取提币历史 (支持多网络)\n *\n * 请求权重(IP)#\n * 18000 请求限制: 每秒10次\n *\n * 本接口特别采用每秒UID速率限制,用户的总秒级 UID 速率限制为180000/秒。从该接口收到的响应包含key X-SAPI-USED-UID-WEIGHT-1S,该key定义了当前 UID 使用的权重\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw-history\n */\n getWithdrawHistory = (params?: {\n coin?: string;\n withdrawOrderId?: string;\n status?: number;\n offset?: number;\n limit?: number;\n startTime?: number;\n endTime?: number;\n }): Promise<\n {\n id: string;\n amount: string;\n transactionFee: string;\n coin: string;\n status: number;\n address: string;\n txId: string;\n applyTime: Date;\n network: string;\n transferType: number;\n info: string;\n confirmNo: number;\n walletType: number;\n txKey: string;\n completeTime: Date;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/withdraw/history', params);\n\n /**\n * 获取充值历史(支持多网络)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-history\n */\n getDepositHistory = (params?: {\n includeSource?: boolean;\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n txId?: string;\n }): Promise<\n {\n id: string;\n amount: string;\n coin: string;\n network: string;\n status: number;\n address: string;\n addressTag: string;\n txId: string;\n insertTime: number;\n transferType: number;\n confirmTimes: string;\n unlockConfirm: number;\n walletType: number;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/hisrec', params);\n\n /**\n * UM下单(TRADE)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/trade/New-UM-Order\n */\n postUmOrder = (params: {\n symbol: string;\n side: string;\n positionSide?: string;\n type: string;\n timeInForce?: string;\n quantity: number;\n reduceOnly?: string;\n price?: number;\n newClientOrderId?: string;\n newOrderRespType?: string;\n selfTradePreventionMode?: string;\n goodTillDate?: number;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n avgPrice: string;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n selfTradePreventionMode: string;\n goodTillDate: number;\n updateTime: number;\n }\n | errorResult\n > => this.request('POST', 'https://papi.binance.com/papi/v1/um/order', params);\n\n deleteUmOrder = (params: {\n symbol: string;\n orderId?: string | number;\n origClientOrderId?: string;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('DELETE', 'https://papi.binance.com/papi/v1/um/order', params);\n\n /**\n * 获取所有全仓杠杆交易对(MARKET_DATA)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/margin_trading/market-data/Get-All-Cross-Margin-Pairs\n */\n getMarginAllPairs = (params?: {\n symbol?: string;\n }): Promise<\n {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/margin/allPairs', params);\n\n /**\n * 获取UM损益资金流水(USER_DATA)\n *\n * 权重: 30\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Income-History\n */\n getUMIncome = (params?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n recvWindow?: number;\n limit?: number;\n timestamp: number;\n }): Promise<\n {\n symbol: string; // 交易对,仅针对涉及交易对的资金流\n incomeType: string; // 资金流类型\n income: string; // 资金流数量,正数代表流入,负数代表流出\n asset: string; // 资产内容\n info: string; // 备注信息,取决于流水类型\n time: number;\n tranId: string; // 划转ID\n tradeId: string; // 引起流水产生的原始交易ID\n }[]\n > => this.request('GET', 'https://api.binance.com/papi/v1/um/income', params);\n}\nexport const client = new ApiClient({\n auth: process.env.PUBLIC_ONLY\n ? undefined\n : {\n public_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n },\n});\n"]}
package/dist/quote.js CHANGED
@@ -1,27 +1,54 @@
1
+ import { createCache } from '@yuants/cache';
1
2
  import { Terminal } from '@yuants/protocol';
2
3
  import { writeToSQL } from '@yuants/sql';
3
4
  import { decodePath, encodePath } from '@yuants/utils';
4
- import { combineLatest, defer, filter, from, map, mergeMap, repeat, retry, shareReplay, toArray } from 'rxjs';
5
+ import { defer, filter, from, groupBy, map, merge, mergeMap, repeat, retry, scan, share, shareReplay, } from 'rxjs';
5
6
  import { client } from './api';
6
7
  const terminal = Terminal.fromNodeEnv();
7
- const mapSymbolToFuturePremiumIndex$ = defer(() => client.getFuturePremiumIndex({})).pipe(repeat({ delay: 1000 }), retry({ delay: 30000 }), mergeMap((x) => from(x).pipe(map((v) => [v.symbol, v]), toArray(), map((v) => new Map(v)))), shareReplay({ bufferSize: 1, refCount: true }));
8
- const mapSymbolToFutureBookTicker$ = defer(() => client.getFutureBookTicker({})).pipe(repeat({ delay: 1000 }), retry({ delay: 30000 }), mergeMap((x) => from(x).pipe(map((v) => [v.symbol, v]), toArray(), map((v) => new Map(v)))), shareReplay({ bufferSize: 1, refCount: true }));
9
- const quote$ = combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(mergeMap(([premiumIndexMap, bookTickerMap]) => from([...bookTickerMap.entries()].map(([symbol, ticker]) => ({
10
- symbol,
11
- ticker,
12
- premium: premiumIndexMap.get(symbol),
13
- })))), map(({ symbol, ticker, premium }) => {
14
- var _a, _b, _c, _d;
15
- const updatedAt = new Date((_b = (_a = ticker === null || ticker === void 0 ? void 0 : ticker.time) !== null && _a !== void 0 ? _a : premium === null || premium === void 0 ? void 0 : premium.time) !== null && _b !== void 0 ? _b : Date.now()).toISOString();
16
- return {
8
+ const OPEN_INTEREST_TTL = process.env.OPEN_INTEREST_TTL ? Number(process.env.OPEN_INTEREST_TTL) : 120000;
9
+ const openInterestCache = createCache(async (symbol) => {
10
+ var _a;
11
+ try {
12
+ const data = await client.getFutureOpenInterest({ symbol });
13
+ return Number((_a = data.openInterest) !== null && _a !== void 0 ? _a : 0);
14
+ }
15
+ catch (err) {
16
+ console.warn('getFutureOpenInterest failed', symbol, err);
17
+ return undefined;
18
+ }
19
+ }, {
20
+ expire: OPEN_INTEREST_TTL,
21
+ });
22
+ const futurePremiumIndex$ = defer(() => client.getFuturePremiumIndex({})).pipe(repeat({ delay: 1000 }), retry({ delay: 30000 }), shareReplay({ bufferSize: 1, refCount: true }));
23
+ const futureBookTicker$ = defer(() => client.getFutureBookTicker({})).pipe(repeat({ delay: 1000 }), retry({ delay: 30000 }), shareReplay({ bufferSize: 1, refCount: true }));
24
+ const quoteFromPremiumIndex$ = futurePremiumIndex$.pipe(mergeMap((entries) => from(entries || [])), map((entry) => {
25
+ var _a;
26
+ return ({
17
27
  datasource_id: 'BINANCE',
18
- product_id: encodePath('usdt-future', symbol),
19
- last_price: (_d = (_c = premium === null || premium === void 0 ? void 0 : premium.markPrice) !== null && _c !== void 0 ? _c : ticker.bidPrice) !== null && _d !== void 0 ? _d : ticker.askPrice,
20
- bid_price: ticker.bidPrice,
21
- ask_price: ticker.askPrice,
22
- updated_at: updatedAt,
23
- };
24
- }), shareReplay({ bufferSize: 1, refCount: true }));
28
+ product_id: encodePath('usdt-future', entry.symbol),
29
+ last_price: entry.markPrice,
30
+ updated_at: new Date((_a = entry.time) !== null && _a !== void 0 ? _a : Date.now()).toISOString(),
31
+ });
32
+ }));
33
+ const quoteFromBookTicker$ = futureBookTicker$.pipe(mergeMap((entries) => from(entries || [])), map((entry) => {
34
+ var _a;
35
+ return ({
36
+ datasource_id: 'BINANCE',
37
+ product_id: encodePath('usdt-future', entry.symbol),
38
+ bid_price: entry.bidPrice,
39
+ ask_price: entry.askPrice,
40
+ updated_at: new Date((_a = entry.time) !== null && _a !== void 0 ? _a : Date.now()).toISOString(),
41
+ });
42
+ }));
43
+ const quoteFromOpenInterest$ = futureBookTicker$.pipe(mergeMap((entries) => from(entries || [])), mergeMap((entry) => from(openInterestCache.query(entry.symbol)).pipe(map((openInterest) => ({
44
+ datasource_id: 'BINANCE',
45
+ product_id: encodePath('usdt-future', entry.symbol),
46
+ open_interest: `${openInterest !== null && openInterest !== void 0 ? openInterest : 0}`,
47
+ }))), 5));
48
+ const quote$ = merge(quoteFromPremiumIndex$, quoteFromBookTicker$, quoteFromOpenInterest$).pipe(groupBy((quote) => quote.product_id), mergeMap((group$) => group$.pipe(scan((acc, cur) => Object.assign(acc, cur, {
49
+ datasource_id: 'BINANCE',
50
+ product_id: group$.key,
51
+ }), {}))), share(), shareReplay({ bufferSize: 1, refCount: true }));
25
52
  if (process.env.WRITE_QUOTE_TO_SQL === 'true') {
26
53
  quote$
27
54
  .pipe(writeToSQL({
package/dist/quote.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"quote.js","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { decodePath, encodePath } from '@yuants/utils';\nimport { combineLatest, defer, filter, from, map, mergeMap, repeat, retry, shareReplay, toArray } from 'rxjs';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst mapSymbolToFuturePremiumIndex$ = defer(() => client.getFuturePremiumIndex({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n mergeMap((x) =>\n from(x).pipe(\n map((v) => [v.symbol, v] as const),\n toArray(),\n map((v) => new Map(v)),\n ),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst mapSymbolToFutureBookTicker$ = defer(() => client.getFutureBookTicker({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n mergeMap((x) =>\n from(x).pipe(\n map((v) => [v.symbol, v] as const),\n toArray(),\n map((v) => new Map(v)),\n ),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst quote$ = combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(\n mergeMap(([premiumIndexMap, bookTickerMap]) =>\n from(\n [...bookTickerMap.entries()].map(([symbol, ticker]) => ({\n symbol,\n ticker,\n premium: premiumIndexMap.get(symbol),\n })),\n ),\n ),\n map(({ symbol, ticker, premium }): Partial<IQuote> => {\n const updatedAt = new Date(ticker?.time ?? premium?.time ?? Date.now()).toISOString();\n return {\n datasource_id: 'BINANCE',\n product_id: encodePath('usdt-future', symbol),\n last_price: premium?.markPrice ?? ticker.bidPrice ?? ticker.askPrice,\n bid_price: ticker.bidPrice,\n ask_price: ticker.askPrice,\n updated_at: updatedAt,\n };\n }),\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/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 } 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 { client } from './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 client.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(() => client.getFuturePremiumIndex({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst futureBookTicker$ = defer(() => client.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 updated_at: new Date(entry.time ?? Date.now()).toISOString(),\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: new Date(entry.time ?? Date.now()).toISOString(),\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 quote$ = merge(quoteFromPremiumIndex$, quoteFromBookTicker$, quoteFromOpenInterest$).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"]}
package/lib/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/lib/api.js CHANGED
@@ -216,10 +216,9 @@ class ApiClient {
216
216
  if (!this.config.auth) {
217
217
  console.info((0, utils_1.formatTime)(Date.now()), method, url.href);
218
218
  const res = await fetch(url.href, { method });
219
- console.info((0, utils_1.formatTime)(Date.now()), 'response', method, url.href, res.status);
220
219
  const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');
220
+ console.info((0, utils_1.formatTime)(Date.now()), 'response', method, url.href, res.status, `usedWeight1M=${usedWeight1M !== null && usedWeight1M !== void 0 ? usedWeight1M : 'N/A'}`);
221
221
  if (usedWeight1M) {
222
- // console.info('usedWeight1M', method, url.href, usedWeight1M);
223
222
  MetricBinanceApiUsedWeight.set(+usedWeight1M, {});
224
223
  }
225
224
  return res.json();
@@ -238,9 +237,8 @@ class ApiClient {
238
237
  headers,
239
238
  });
240
239
  const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');
241
- console.info((0, utils_1.formatTime)(Date.now()), 'response', method, url.href, res.status);
240
+ console.info((0, utils_1.formatTime)(Date.now()), 'response', method, url.href, res.status, `usedWeight1M=${usedWeight1M !== null && usedWeight1M !== void 0 ? usedWeight1M : 'N/A'}`);
242
241
  if (usedWeight1M) {
243
- // console.info('usedWeight1M', method, url.href, res.status, usedWeight1M);
244
242
  MetricBinanceApiUsedWeight.set(+usedWeight1M, {});
245
243
  }
246
244
  return res.json();
package/lib/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { PromRegistry } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\n// @ts-ignore\nimport CryptoJS from 'crypto-js';\n\nconst MetricBinanceApiUsedWeight = PromRegistry.create('gauge', 'binance_api_used_weight');\n\ninterface errorResult {\n code: number;\n msg: string;\n}\n\nexport const isError = <T>(x: T | errorResult): x is errorResult => (x as errorResult).code !== undefined;\n\n/**\n * Binance 币安 API\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/CHANGELOG\n */\nexport class ApiClient {\n constructor(\n public config: {\n auth?: {\n public_key: string;\n secret_key: string;\n };\n },\n ) {}\n\n async request(method: string, path: string, params: any = {}) {\n const url = new URL(path);\n params.recvWindow = 5000;\n params.timestamp = Date.now();\n for (const key in params) {\n if (params[key] === undefined) continue;\n url.searchParams.set(key, params[key]);\n }\n if (!this.config.auth) {\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n console.info(formatTime(Date.now()), 'response', method, url.href, res.status);\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n if (usedWeight1M) {\n // console.info('usedWeight1M', method, url.href, usedWeight1M);\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n const secret_key = this.config.auth.secret_key;\n const signData = url.search.slice(1);\n const str = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA256(signData, secret_key));\n url.searchParams.set('signature', str);\n\n const headers = {\n 'Content-Type': 'application/json;charset=utf-8',\n 'X-MBX-APIKEY': this.config.auth.public_key!,\n };\n\n console.info(\n formatTime(Date.now()),\n method,\n url.href,\n JSON.stringify(headers),\n url.searchParams.toString(),\n signData,\n );\n const res = await fetch(url.href, {\n method,\n headers,\n });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n console.info(formatTime(Date.now()), 'response', method, url.href, res.status);\n if (usedWeight1M) {\n // console.info('usedWeight1M', method, url.href, res.status, usedWeight1M);\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n\n /**\n * 获取交易规则和交易对\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#0f3f2d5ee7\n */\n getFutureExchangeInfo = (): Promise<{\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: any[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: {\n filterType: string;\n maxPrice?: string;\n minPrice?: string;\n tickSize?: string;\n maxQty?: string;\n stepSize?: string;\n minQty?: string;\n limit?: number;\n notional?: string;\n multiplierDecimal?: string;\n multiplierUp?: string;\n multiplierDown?: string;\n }[];\n orderTypes: string[];\n timeInForce: string[];\n }[];\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/exchangeInfo');\n\n /**\n * 查询资金费率历史\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#31dbeb24c4\n */\n getFutureFundingRate = (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<\n {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/fundingRate', params);\n\n /**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\n getFuturePremiumIndex = (params: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/premiumIndex', params);\n\n /**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\n getFutureBookTicker = (params?: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/ticker/bookTicker', params);\n\n /**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\n getFutureOpenInterest = (params: {\n symbol: string;\n }): Promise<{\n openInterest: string;\n symbol: string;\n time: number;\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/openInterest', params);\n\n /**\n * 查询账户信息(USER_DATA)\n *\n * 查询账户信息\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Information\n */\n getUnifiedAccountInfo = (): Promise<\n | {\n uniMMR: string;\n accountEquity: string;\n actualEquity: string;\n accountInitialMargin: string;\n accountMaintMargin: string;\n accountStatus: string;\n virtualMaxWithdrawAmount: string;\n totalAvailableBalance: string;\n totalMarginOpenLoss: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/account');\n\n /**\n * 获取UM账户信息\n *\n * 现有UM账户资产和仓位信息\n *\n * 权重: 5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Account-Detail\n */\n getUnifiedUmAccount = (): Promise<\n | {\n assets: {\n asset: string;\n crossWalletBalance: string;\n crossUnPnl: string;\n maintMargin: string;\n initialMargin: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n updateTime: number;\n }[];\n positions: {\n symbol: string;\n initialMargin: string;\n maintMargin: string;\n unrealizedProfit: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n leverage: string;\n entryPrice: string;\n maxNotional: string;\n bidNotional: string;\n askNotional: string;\n positionSide: string;\n positionAmt: string;\n updateTime: number;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/account');\n\n /**\n * 查看当前全部UM挂单(USER_DATA)\n *\n * 查看当前全部UM挂单,请小心使用不带symbol参数的调用\n *\n * 权重: 带symbol 1 - 不带 40\n */\n getUnifiedUmOpenOrders = (params?: {\n symbol?: string;\n }): Promise<\n {\n avgPrice: string;\n clientOrderId: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n origType: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n time: number;\n timeInForce: string;\n type: string;\n updateTime: number;\n selfTradePreventionMode: string;\n goodTillDate: number;\n }[]\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/openOrders', params);\n\n /**\n * 查询账户余额(USER_DATA)\n *\n * 查询账户余额\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Balance\n */\n getUnifiedAccountBalance = (params?: {\n assets?: string;\n }): Promise<\n | {\n asset: string;\n totalWalletBalance: string;\n crossMarginAsset: string;\n crossMarginBorrowed: string;\n crossMarginFree: string;\n crossMarginInterest: string;\n crossMarginLocked: string;\n umWalletBalance: string;\n umUnrealizedPNL: string;\n cmWalletBalance: string;\n cmUnrealizedPNL: string;\n updateTime: number;\n }[]\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/balance', params);\n\n /**\n * 账户信息 (USER_DATA)\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api#%E8%B4%A6%E6%88%B7%E4%BF%A1%E6%81%AF-user_data\n */\n getSpotAccountInfo = (params?: {\n omitZeroBalances?: boolean;\n }): Promise<\n | {\n makerCommission: number;\n takerCommission: number;\n buyerCommission: number;\n sellerCommission: number;\n commissionRates: {\n maker: string;\n taker: string;\n buyer: string;\n seller: string;\n };\n canTrade: boolean;\n canWithdraw: boolean;\n canDeposit: boolean;\n brokered: boolean;\n requireSelfTradePrevention: boolean;\n preventSor: boolean;\n updateTime: number;\n balances: {\n asset: string;\n free: string;\n locked: string;\n }[];\n permissions: string[];\n uid: number;\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/api/v3/account', params);\n\n /**\n * 用户万向划转(USER_DATA)\n *\n * 用户万向划转\n *\n * 您需要开通api key 允许万向划转权限来调用此接口。\n *\n * 权重: 900\n *\n * https://developers.binance.com/docs/zh-CN/wallet/asset/user-universal-transfer\n */\n postAssetTransfer = (params: {\n type: string;\n asset: string;\n amount: number;\n fromSymbol?: string;\n toSymbol?: string;\n }): Promise<\n | {\n tranId: number;\n }\n | errorResult\n > => this.request('POST', 'https://api.binance.com/sapi/v1/asset/transfer', params);\n\n /**\n * 统一账户资金归集(TRADE)\n *\n * 资金归集到统一账户钱包\n *\n * 权重: 750\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Fund-Auto-collection\n *\n * ISSUE(2024-07-18): 目前这是唯一能够将资金从原 U 本位合约账户转入统一账户的接口。\n */\n postUnifiedAccountAutoCollection = (): Promise<{\n msg: string;\n }> => this.request('POST', 'https://papi.binance.com/papi/v1/auto-collection');\n\n /**\n * 获取充值地址(支持多网络)(USER_DATA)\n *\n * 获取充值地址\n *\n * 权重: 10\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-address\n */\n getDepositAddress = (params: {\n coin: string;\n network?: string;\n amount?: number;\n }): Promise<{\n address: string;\n coin: string;\n tag: string;\n url: string;\n }> => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/address', params);\n\n /**\n * 查询子账户列表(适用主账户)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/sub_account/account-management/Query-Sub-account-List\n */\n getSubAccountList = (params?: {\n email?: string;\n isFreeze?: number;\n page?: number;\n limit?: number;\n }): Promise<\n | {\n subAccounts: {\n email: string;\n isFreeze: boolean;\n createTime: number;\n isManagedSubAccount: boolean;\n isAssetManagementSubAccount: boolean;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/sapi/v1/sub-account/list');\n\n /**\n * 提币(USER_DATA)\n *\n * 权重: 600\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw\n */\n postWithdraw = (\n params:\n | {\n coin: string;\n withdrawOrderId?: string;\n network?: string;\n address: string;\n addressTag?: string;\n amount: number;\n transactionFeeFlag?: boolean;\n name?: string;\n walletType?: number;\n }\n | errorResult,\n ): Promise<{\n id: string;\n }> => this.request('POST', 'https://api.binance.com/sapi/v1/capital/withdraw/apply', params);\n\n /**\n * 获取提币历史(支持多网络)(USER_DATA)\n *\n * 获取提币历史 (支持多网络)\n *\n * 请求权重(IP)#\n * 18000 请求限制: 每秒10次\n *\n * 本接口特别采用每秒UID速率限制,用户的总秒级 UID 速率限制为180000/秒。从该接口收到的响应包含key X-SAPI-USED-UID-WEIGHT-1S,该key定义了当前 UID 使用的权重\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw-history\n */\n getWithdrawHistory = (params?: {\n coin?: string;\n withdrawOrderId?: string;\n status?: number;\n offset?: number;\n limit?: number;\n startTime?: number;\n endTime?: number;\n }): Promise<\n {\n id: string;\n amount: string;\n transactionFee: string;\n coin: string;\n status: number;\n address: string;\n txId: string;\n applyTime: Date;\n network: string;\n transferType: number;\n info: string;\n confirmNo: number;\n walletType: number;\n txKey: string;\n completeTime: Date;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/withdraw/history', params);\n\n /**\n * 获取充值历史(支持多网络)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-history\n */\n getDepositHistory = (params?: {\n includeSource?: boolean;\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n txId?: string;\n }): Promise<\n {\n id: string;\n amount: string;\n coin: string;\n network: string;\n status: number;\n address: string;\n addressTag: string;\n txId: string;\n insertTime: number;\n transferType: number;\n confirmTimes: string;\n unlockConfirm: number;\n walletType: number;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/hisrec', params);\n\n /**\n * UM下单(TRADE)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/trade/New-UM-Order\n */\n postUmOrder = (params: {\n symbol: string;\n side: string;\n positionSide?: string;\n type: string;\n timeInForce?: string;\n quantity: number;\n reduceOnly?: string;\n price?: number;\n newClientOrderId?: string;\n newOrderRespType?: string;\n selfTradePreventionMode?: string;\n goodTillDate?: number;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n avgPrice: string;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n selfTradePreventionMode: string;\n goodTillDate: number;\n updateTime: number;\n }\n | errorResult\n > => this.request('POST', 'https://papi.binance.com/papi/v1/um/order', params);\n\n deleteUmOrder = (params: {\n symbol: string;\n orderId?: string | number;\n origClientOrderId?: string;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('DELETE', 'https://papi.binance.com/papi/v1/um/order', params);\n\n /**\n * 获取所有全仓杠杆交易对(MARKET_DATA)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/margin_trading/market-data/Get-All-Cross-Margin-Pairs\n */\n getMarginAllPairs = (params?: {\n symbol?: string;\n }): Promise<\n {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/margin/allPairs', params);\n\n /**\n * 获取UM损益资金流水(USER_DATA)\n *\n * 权重: 30\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Income-History\n */\n getUMIncome = (params?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n recvWindow?: number;\n limit?: number;\n timestamp: number;\n }): Promise<\n {\n symbol: string; // 交易对,仅针对涉及交易对的资金流\n incomeType: string; // 资金流类型\n income: string; // 资金流数量,正数代表流入,负数代表流出\n asset: string; // 资产内容\n info: string; // 备注信息,取决于流水类型\n time: number;\n tranId: string; // 划转ID\n tradeId: string; // 引起流水产生的原始交易ID\n }[]\n > => this.request('GET', 'https://api.binance.com/papi/v1/um/income', params);\n}\nexport const client = new ApiClient({\n auth: process.env.PUBLIC_ONLY\n ? undefined\n : {\n public_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n },\n});\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { PromRegistry } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\n// @ts-ignore\nimport CryptoJS from 'crypto-js';\n\nconst MetricBinanceApiUsedWeight = PromRegistry.create('gauge', 'binance_api_used_weight');\n\ninterface errorResult {\n code: number;\n msg: string;\n}\n\nexport const isError = <T>(x: T | errorResult): x is errorResult => (x as errorResult).code !== undefined;\n\n/**\n * Binance 币安 API\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/CHANGELOG\n */\nexport class ApiClient {\n constructor(\n public config: {\n auth?: {\n public_key: string;\n secret_key: string;\n };\n },\n ) {}\n\n async request(method: string, path: string, params: any = {}) {\n const url = new URL(path);\n params.recvWindow = 5000;\n params.timestamp = Date.now();\n for (const key in params) {\n if (params[key] === undefined) continue;\n url.searchParams.set(key, params[key]);\n }\n if (!this.config.auth) {\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n console.info(\n formatTime(Date.now()),\n 'response',\n method,\n url.href,\n res.status,\n `usedWeight1M=${usedWeight1M ?? 'N/A'}`,\n );\n if (usedWeight1M) {\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n const secret_key = this.config.auth.secret_key;\n const signData = url.search.slice(1);\n const str = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA256(signData, secret_key));\n url.searchParams.set('signature', str);\n\n const headers = {\n 'Content-Type': 'application/json;charset=utf-8',\n 'X-MBX-APIKEY': this.config.auth.public_key!,\n };\n\n console.info(\n formatTime(Date.now()),\n method,\n url.href,\n JSON.stringify(headers),\n url.searchParams.toString(),\n signData,\n );\n const res = await fetch(url.href, {\n method,\n headers,\n });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n console.info(\n formatTime(Date.now()),\n 'response',\n method,\n url.href,\n res.status,\n `usedWeight1M=${usedWeight1M ?? 'N/A'}`,\n );\n if (usedWeight1M) {\n MetricBinanceApiUsedWeight.set(+usedWeight1M, {});\n }\n return res.json();\n }\n\n /**\n * 获取交易规则和交易对\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#0f3f2d5ee7\n */\n getFutureExchangeInfo = (): Promise<{\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: any[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: {\n filterType: string;\n maxPrice?: string;\n minPrice?: string;\n tickSize?: string;\n maxQty?: string;\n stepSize?: string;\n minQty?: string;\n limit?: number;\n notional?: string;\n multiplierDecimal?: string;\n multiplierUp?: string;\n multiplierDown?: string;\n }[];\n orderTypes: string[];\n timeInForce: string[];\n }[];\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/exchangeInfo');\n\n /**\n * 查询资金费率历史\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#31dbeb24c4\n */\n getFutureFundingRate = (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n }): Promise<\n {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/fundingRate', params);\n\n /**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\n getFuturePremiumIndex = (params: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/premiumIndex', params);\n\n /**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\n getFutureBookTicker = (params?: {\n symbol?: string;\n }): Promise<\n {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n }[]\n > => this.request('GET', 'https://fapi.binance.com/fapi/v1/ticker/bookTicker', params);\n\n /**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\n getFutureOpenInterest = (params: {\n symbol: string;\n }): Promise<{\n openInterest: string;\n symbol: string;\n time: number;\n }> => this.request('GET', 'https://fapi.binance.com/fapi/v1/openInterest', params);\n\n /**\n * 查询账户信息(USER_DATA)\n *\n * 查询账户信息\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Information\n */\n getUnifiedAccountInfo = (): Promise<\n | {\n uniMMR: string;\n accountEquity: string;\n actualEquity: string;\n accountInitialMargin: string;\n accountMaintMargin: string;\n accountStatus: string;\n virtualMaxWithdrawAmount: string;\n totalAvailableBalance: string;\n totalMarginOpenLoss: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/account');\n\n /**\n * 获取UM账户信息\n *\n * 现有UM账户资产和仓位信息\n *\n * 权重: 5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Account-Detail\n */\n getUnifiedUmAccount = (): Promise<\n | {\n assets: {\n asset: string;\n crossWalletBalance: string;\n crossUnPnl: string;\n maintMargin: string;\n initialMargin: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n updateTime: number;\n }[];\n positions: {\n symbol: string;\n initialMargin: string;\n maintMargin: string;\n unrealizedProfit: string;\n positionInitialMargin: string;\n openOrderInitialMargin: string;\n leverage: string;\n entryPrice: string;\n maxNotional: string;\n bidNotional: string;\n askNotional: string;\n positionSide: string;\n positionAmt: string;\n updateTime: number;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/account');\n\n /**\n * 查看当前全部UM挂单(USER_DATA)\n *\n * 查看当前全部UM挂单,请小心使用不带symbol参数的调用\n *\n * 权重: 带symbol 1 - 不带 40\n */\n getUnifiedUmOpenOrders = (params?: {\n symbol?: string;\n }): Promise<\n {\n avgPrice: string;\n clientOrderId: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n origType: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n time: number;\n timeInForce: string;\n type: string;\n updateTime: number;\n selfTradePreventionMode: string;\n goodTillDate: number;\n }[]\n > => this.request('GET', 'https://papi.binance.com/papi/v1/um/openOrders', params);\n\n /**\n * 查询账户余额(USER_DATA)\n *\n * 查询账户余额\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Account-Balance\n */\n getUnifiedAccountBalance = (params?: {\n assets?: string;\n }): Promise<\n | {\n asset: string;\n totalWalletBalance: string;\n crossMarginAsset: string;\n crossMarginBorrowed: string;\n crossMarginFree: string;\n crossMarginInterest: string;\n crossMarginLocked: string;\n umWalletBalance: string;\n umUnrealizedPNL: string;\n cmWalletBalance: string;\n cmUnrealizedPNL: string;\n updateTime: number;\n }[]\n | errorResult\n > => this.request('GET', 'https://papi.binance.com/papi/v1/balance', params);\n\n /**\n * 账户信息 (USER_DATA)\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api#%E8%B4%A6%E6%88%B7%E4%BF%A1%E6%81%AF-user_data\n */\n getSpotAccountInfo = (params?: {\n omitZeroBalances?: boolean;\n }): Promise<\n | {\n makerCommission: number;\n takerCommission: number;\n buyerCommission: number;\n sellerCommission: number;\n commissionRates: {\n maker: string;\n taker: string;\n buyer: string;\n seller: string;\n };\n canTrade: boolean;\n canWithdraw: boolean;\n canDeposit: boolean;\n brokered: boolean;\n requireSelfTradePrevention: boolean;\n preventSor: boolean;\n updateTime: number;\n balances: {\n asset: string;\n free: string;\n locked: string;\n }[];\n permissions: string[];\n uid: number;\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/api/v3/account', params);\n\n /**\n * 用户万向划转(USER_DATA)\n *\n * 用户万向划转\n *\n * 您需要开通api key 允许万向划转权限来调用此接口。\n *\n * 权重: 900\n *\n * https://developers.binance.com/docs/zh-CN/wallet/asset/user-universal-transfer\n */\n postAssetTransfer = (params: {\n type: string;\n asset: string;\n amount: number;\n fromSymbol?: string;\n toSymbol?: string;\n }): Promise<\n | {\n tranId: number;\n }\n | errorResult\n > => this.request('POST', 'https://api.binance.com/sapi/v1/asset/transfer', params);\n\n /**\n * 统一账户资金归集(TRADE)\n *\n * 资金归集到统一账户钱包\n *\n * 权重: 750\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Fund-Auto-collection\n *\n * ISSUE(2024-07-18): 目前这是唯一能够将资金从原 U 本位合约账户转入统一账户的接口。\n */\n postUnifiedAccountAutoCollection = (): Promise<{\n msg: string;\n }> => this.request('POST', 'https://papi.binance.com/papi/v1/auto-collection');\n\n /**\n * 获取充值地址(支持多网络)(USER_DATA)\n *\n * 获取充值地址\n *\n * 权重: 10\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-address\n */\n getDepositAddress = (params: {\n coin: string;\n network?: string;\n amount?: number;\n }): Promise<{\n address: string;\n coin: string;\n tag: string;\n url: string;\n }> => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/address', params);\n\n /**\n * 查询子账户列表(适用主账户)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/sub_account/account-management/Query-Sub-account-List\n */\n getSubAccountList = (params?: {\n email?: string;\n isFreeze?: number;\n page?: number;\n limit?: number;\n }): Promise<\n | {\n subAccounts: {\n email: string;\n isFreeze: boolean;\n createTime: number;\n isManagedSubAccount: boolean;\n isAssetManagementSubAccount: boolean;\n }[];\n }\n | errorResult\n > => this.request('GET', 'https://api.binance.com/sapi/v1/sub-account/list');\n\n /**\n * 提币(USER_DATA)\n *\n * 权重: 600\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw\n */\n postWithdraw = (\n params:\n | {\n coin: string;\n withdrawOrderId?: string;\n network?: string;\n address: string;\n addressTag?: string;\n amount: number;\n transactionFeeFlag?: boolean;\n name?: string;\n walletType?: number;\n }\n | errorResult,\n ): Promise<{\n id: string;\n }> => this.request('POST', 'https://api.binance.com/sapi/v1/capital/withdraw/apply', params);\n\n /**\n * 获取提币历史(支持多网络)(USER_DATA)\n *\n * 获取提币历史 (支持多网络)\n *\n * 请求权重(IP)#\n * 18000 请求限制: 每秒10次\n *\n * 本接口特别采用每秒UID速率限制,用户的总秒级 UID 速率限制为180000/秒。从该接口收到的响应包含key X-SAPI-USED-UID-WEIGHT-1S,该key定义了当前 UID 使用的权重\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/withdraw-history\n */\n getWithdrawHistory = (params?: {\n coin?: string;\n withdrawOrderId?: string;\n status?: number;\n offset?: number;\n limit?: number;\n startTime?: number;\n endTime?: number;\n }): Promise<\n {\n id: string;\n amount: string;\n transactionFee: string;\n coin: string;\n status: number;\n address: string;\n txId: string;\n applyTime: Date;\n network: string;\n transferType: number;\n info: string;\n confirmNo: number;\n walletType: number;\n txKey: string;\n completeTime: Date;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/withdraw/history', params);\n\n /**\n * 获取充值历史(支持多网络)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/wallet/capital/deposite-history\n */\n getDepositHistory = (params?: {\n includeSource?: boolean;\n coin?: string;\n status?: number;\n startTime?: number;\n endTime?: number;\n offset?: number;\n limit?: number;\n txId?: string;\n }): Promise<\n {\n id: string;\n amount: string;\n coin: string;\n network: string;\n status: number;\n address: string;\n addressTag: string;\n txId: string;\n insertTime: number;\n transferType: number;\n confirmTimes: string;\n unlockConfirm: number;\n walletType: number;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/capital/deposit/hisrec', params);\n\n /**\n * UM下单(TRADE)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/trade/New-UM-Order\n */\n postUmOrder = (params: {\n symbol: string;\n side: string;\n positionSide?: string;\n type: string;\n timeInForce?: string;\n quantity: number;\n reduceOnly?: string;\n price?: number;\n newClientOrderId?: string;\n newOrderRespType?: string;\n selfTradePreventionMode?: string;\n goodTillDate?: number;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n avgPrice: string;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n selfTradePreventionMode: string;\n goodTillDate: number;\n updateTime: number;\n }\n | errorResult\n > => this.request('POST', 'https://papi.binance.com/papi/v1/um/order', params);\n\n deleteUmOrder = (params: {\n symbol: string;\n orderId?: string | number;\n origClientOrderId?: string;\n }): Promise<\n | {\n clientOrderId: string;\n cumQty: string;\n cumQuote: string;\n executedQty: string;\n orderId: number;\n origQty: string;\n price: string;\n reduceOnly: boolean;\n side: string;\n positionSide: string;\n status: string;\n symbol: string;\n timeInForce: string;\n type: string;\n updateTime: number;\n }\n | errorResult\n > => this.request('DELETE', 'https://papi.binance.com/papi/v1/um/order', params);\n\n /**\n * 获取所有全仓杠杆交易对(MARKET_DATA)\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/margin_trading/market-data/Get-All-Cross-Margin-Pairs\n */\n getMarginAllPairs = (params?: {\n symbol?: string;\n }): Promise<\n {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n }[]\n > => this.request('GET', 'https://api.binance.com/sapi/v1/margin/allPairs', params);\n\n /**\n * 获取UM损益资金流水(USER_DATA)\n *\n * 权重: 30\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/portfolio-margin/account/Get-UM-Income-History\n */\n getUMIncome = (params?: {\n symbol?: string;\n incomeType?: string;\n startTime?: number;\n endTime?: number;\n recvWindow?: number;\n limit?: number;\n timestamp: number;\n }): Promise<\n {\n symbol: string; // 交易对,仅针对涉及交易对的资金流\n incomeType: string; // 资金流类型\n income: string; // 资金流数量,正数代表流入,负数代表流出\n asset: string; // 资产内容\n info: string; // 备注信息,取决于流水类型\n time: number;\n tranId: string; // 划转ID\n tradeId: string; // 引起流水产生的原始交易ID\n }[]\n > => this.request('GET', 'https://api.binance.com/papi/v1/um/income', params);\n}\nexport const client = new ApiClient({\n auth: process.env.PUBLIC_ONLY\n ? undefined\n : {\n public_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n },\n});\n"]}
package/lib/quote.js CHANGED
@@ -1,29 +1,56 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cache_1 = require("@yuants/cache");
3
4
  const protocol_1 = require("@yuants/protocol");
4
5
  const sql_1 = require("@yuants/sql");
5
6
  const utils_1 = require("@yuants/utils");
6
7
  const rxjs_1 = require("rxjs");
7
8
  const api_1 = require("./api");
8
9
  const terminal = protocol_1.Terminal.fromNodeEnv();
9
- const mapSymbolToFuturePremiumIndex$ = (0, rxjs_1.defer)(() => api_1.client.getFuturePremiumIndex({})).pipe((0, rxjs_1.repeat)({ delay: 1000 }), (0, rxjs_1.retry)({ delay: 30000 }), (0, rxjs_1.mergeMap)((x) => (0, rxjs_1.from)(x).pipe((0, rxjs_1.map)((v) => [v.symbol, v]), (0, rxjs_1.toArray)(), (0, rxjs_1.map)((v) => new Map(v)))), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true }));
10
- const mapSymbolToFutureBookTicker$ = (0, rxjs_1.defer)(() => api_1.client.getFutureBookTicker({})).pipe((0, rxjs_1.repeat)({ delay: 1000 }), (0, rxjs_1.retry)({ delay: 30000 }), (0, rxjs_1.mergeMap)((x) => (0, rxjs_1.from)(x).pipe((0, rxjs_1.map)((v) => [v.symbol, v]), (0, rxjs_1.toArray)(), (0, rxjs_1.map)((v) => new Map(v)))), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true }));
11
- const quote$ = (0, rxjs_1.combineLatest)([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe((0, rxjs_1.mergeMap)(([premiumIndexMap, bookTickerMap]) => (0, rxjs_1.from)([...bookTickerMap.entries()].map(([symbol, ticker]) => ({
12
- symbol,
13
- ticker,
14
- premium: premiumIndexMap.get(symbol),
15
- })))), (0, rxjs_1.map)(({ symbol, ticker, premium }) => {
16
- var _a, _b, _c, _d;
17
- const updatedAt = new Date((_b = (_a = ticker === null || ticker === void 0 ? void 0 : ticker.time) !== null && _a !== void 0 ? _a : premium === null || premium === void 0 ? void 0 : premium.time) !== null && _b !== void 0 ? _b : Date.now()).toISOString();
18
- return {
10
+ const OPEN_INTEREST_TTL = process.env.OPEN_INTEREST_TTL ? Number(process.env.OPEN_INTEREST_TTL) : 120000;
11
+ const openInterestCache = (0, cache_1.createCache)(async (symbol) => {
12
+ var _a;
13
+ try {
14
+ const data = await api_1.client.getFutureOpenInterest({ symbol });
15
+ return Number((_a = data.openInterest) !== null && _a !== void 0 ? _a : 0);
16
+ }
17
+ catch (err) {
18
+ console.warn('getFutureOpenInterest failed', symbol, err);
19
+ return undefined;
20
+ }
21
+ }, {
22
+ expire: OPEN_INTEREST_TTL,
23
+ });
24
+ const futurePremiumIndex$ = (0, rxjs_1.defer)(() => api_1.client.getFuturePremiumIndex({})).pipe((0, rxjs_1.repeat)({ delay: 1000 }), (0, rxjs_1.retry)({ delay: 30000 }), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true }));
25
+ const futureBookTicker$ = (0, rxjs_1.defer)(() => api_1.client.getFutureBookTicker({})).pipe((0, rxjs_1.repeat)({ delay: 1000 }), (0, rxjs_1.retry)({ delay: 30000 }), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true }));
26
+ const quoteFromPremiumIndex$ = futurePremiumIndex$.pipe((0, rxjs_1.mergeMap)((entries) => (0, rxjs_1.from)(entries || [])), (0, rxjs_1.map)((entry) => {
27
+ var _a;
28
+ return ({
19
29
  datasource_id: 'BINANCE',
20
- product_id: (0, utils_1.encodePath)('usdt-future', symbol),
21
- last_price: (_d = (_c = premium === null || premium === void 0 ? void 0 : premium.markPrice) !== null && _c !== void 0 ? _c : ticker.bidPrice) !== null && _d !== void 0 ? _d : ticker.askPrice,
22
- bid_price: ticker.bidPrice,
23
- ask_price: ticker.askPrice,
24
- updated_at: updatedAt,
25
- };
26
- }), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true }));
30
+ product_id: (0, utils_1.encodePath)('usdt-future', entry.symbol),
31
+ last_price: entry.markPrice,
32
+ updated_at: new Date((_a = entry.time) !== null && _a !== void 0 ? _a : Date.now()).toISOString(),
33
+ });
34
+ }));
35
+ const quoteFromBookTicker$ = futureBookTicker$.pipe((0, rxjs_1.mergeMap)((entries) => (0, rxjs_1.from)(entries || [])), (0, rxjs_1.map)((entry) => {
36
+ var _a;
37
+ return ({
38
+ datasource_id: 'BINANCE',
39
+ product_id: (0, utils_1.encodePath)('usdt-future', entry.symbol),
40
+ bid_price: entry.bidPrice,
41
+ ask_price: entry.askPrice,
42
+ updated_at: new Date((_a = entry.time) !== null && _a !== void 0 ? _a : Date.now()).toISOString(),
43
+ });
44
+ }));
45
+ 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) => ({
46
+ datasource_id: 'BINANCE',
47
+ product_id: (0, utils_1.encodePath)('usdt-future', entry.symbol),
48
+ open_interest: `${openInterest !== null && openInterest !== void 0 ? openInterest : 0}`,
49
+ }))), 5));
50
+ const quote$ = (0, rxjs_1.merge)(quoteFromPremiumIndex$, quoteFromBookTicker$, quoteFromOpenInterest$).pipe((0, rxjs_1.groupBy)((quote) => quote.product_id), (0, rxjs_1.mergeMap)((group$) => group$.pipe((0, rxjs_1.scan)((acc, cur) => Object.assign(acc, cur, {
51
+ datasource_id: 'BINANCE',
52
+ product_id: group$.key,
53
+ }), {}))), (0, rxjs_1.share)(), (0, rxjs_1.shareReplay)({ bufferSize: 1, refCount: true }));
27
54
  if (process.env.WRITE_QUOTE_TO_SQL === 'true') {
28
55
  quote$
29
56
  .pipe((0, sql_1.writeToSQL)({
package/lib/quote.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"quote.js","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":";;AACA,+CAA4C;AAC5C,qCAAyC;AACzC,yCAAuD;AACvD,+BAA8G;AAC9G,+BAA+B;AAE/B,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,8BAA8B,GAAG,IAAA,YAAK,EAAC,GAAG,EAAE,CAAC,YAAM,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACvF,IAAA,aAAM,EAAC,EAAE,KAAK,EAAE,IAAK,EAAE,CAAC,EACxB,IAAA,YAAK,EAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACxB,IAAA,eAAQ,EAAC,CAAC,CAAC,EAAE,EAAE,CACb,IAAA,WAAI,EAAC,CAAC,CAAC,CAAC,IAAI,CACV,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAU,CAAC,EAClC,IAAA,cAAO,GAAE,EACT,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CACvB,CACF,EACD,IAAA,kBAAW,EAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;AAEF,MAAM,4BAA4B,GAAG,IAAA,YAAK,EAAC,GAAG,EAAE,CAAC,YAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACnF,IAAA,aAAM,EAAC,EAAE,KAAK,EAAE,IAAK,EAAE,CAAC,EACxB,IAAA,YAAK,EAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACxB,IAAA,eAAQ,EAAC,CAAC,CAAC,EAAE,EAAE,CACb,IAAA,WAAI,EAAC,CAAC,CAAC,CAAC,IAAI,CACV,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAU,CAAC,EAClC,IAAA,cAAO,GAAE,EACT,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CACvB,CACF,EACD,IAAA,kBAAW,EAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;AAEF,MAAM,MAAM,GAAG,IAAA,oBAAa,EAAC,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAC/F,IAAA,eAAQ,EAAC,CAAC,CAAC,eAAe,EAAE,aAAa,CAAC,EAAE,EAAE,CAC5C,IAAA,WAAI,EACF,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM;IACN,MAAM;IACN,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;CACrC,CAAC,CAAC,CACJ,CACF,EACD,IAAA,UAAG,EAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAmB,EAAE;;IACnD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,mCAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtF,OAAO;QACL,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,IAAA,kBAAU,EAAC,aAAa,EAAE,MAAM,CAAC;QAC7C,UAAU,EAAE,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,MAAM,CAAC,QAAQ,mCAAI,MAAM,CAAC,QAAQ;QACpE,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC,CAAC,EACF,IAAA,kBAAW,EAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;AAEF,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE;IAC7C,MAAM;SACH,IAAI,CACH,IAAA,gBAAU,EAAC;QACT,QAAQ;QACR,SAAS,EAAE,OAAO;QAClB,aAAa,EAAE,IAAK;QACpB,YAAY,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC;KAC9C,CAAC,CACH;SACA,SAAS,EAAE,CAAC;IAEf,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE;QAChF,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,IAAA,kBAAU,EAAC,UAAU,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;SACtD;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAA,aAAM,EAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;CACJ","sourcesContent":["import { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { decodePath, encodePath } from '@yuants/utils';\nimport { combineLatest, defer, filter, from, map, mergeMap, repeat, retry, shareReplay, toArray } from 'rxjs';\nimport { client } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst mapSymbolToFuturePremiumIndex$ = defer(() => client.getFuturePremiumIndex({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n mergeMap((x) =>\n from(x).pipe(\n map((v) => [v.symbol, v] as const),\n toArray(),\n map((v) => new Map(v)),\n ),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst mapSymbolToFutureBookTicker$ = defer(() => client.getFutureBookTicker({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n mergeMap((x) =>\n from(x).pipe(\n map((v) => [v.symbol, v] as const),\n toArray(),\n map((v) => new Map(v)),\n ),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst quote$ = combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(\n mergeMap(([premiumIndexMap, bookTickerMap]) =>\n from(\n [...bookTickerMap.entries()].map(([symbol, ticker]) => ({\n symbol,\n ticker,\n premium: premiumIndexMap.get(symbol),\n })),\n ),\n ),\n map(({ symbol, ticker, premium }): Partial<IQuote> => {\n const updatedAt = new Date(ticker?.time ?? premium?.time ?? Date.now()).toISOString();\n return {\n datasource_id: 'BINANCE',\n product_id: encodePath('usdt-future', symbol),\n last_price: premium?.markPrice ?? ticker.bidPrice ?? ticker.askPrice,\n bid_price: ticker.bidPrice,\n ask_price: ticker.askPrice,\n updated_at: updatedAt,\n };\n }),\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/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 } 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 { client } from './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 client.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(() => client.getFuturePremiumIndex({})).pipe(\n repeat({ delay: 1_000 }),\n retry({ delay: 30_000 }),\n shareReplay({ bufferSize: 1, refCount: true }),\n);\n\nconst futureBookTicker$ = defer(() => client.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 updated_at: new Date(entry.time ?? Date.now()).toISOString(),\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: new Date(entry.time ?? Date.now()).toISOString(),\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 quote$ = merge(quoteFromPremiumIndex$, quoteFromBookTicker$, quoteFromOpenInterest$).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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuants/vendor-binance",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "bin": "lib/cli.js",
5
5
  "main": "lib/index.js",
6
6
  "files": [
@@ -9,17 +9,18 @@
9
9
  "temp"
10
10
  ],
11
11
  "dependencies": {
12
- "@yuants/protocol": "0.50.1",
13
- "@yuants/data-account": "0.6.11",
14
- "@yuants/data-quote": "0.2.34",
15
- "@yuants/utils": "0.10.1",
16
- "@yuants/data-series": "0.3.42",
17
- "@yuants/sql": "0.9.21",
18
- "@yuants/data-product": "0.4.12",
19
- "@yuants/data-ohlc": "0.4.13",
20
- "@yuants/data-order": "0.3.9",
21
- "@yuants/data-interest-rate": "0.1.39",
22
- "@yuants/transfer": "0.2.30",
12
+ "@yuants/protocol": "0.50.2",
13
+ "@yuants/data-account": "0.6.12",
14
+ "@yuants/cache": "0.2.3",
15
+ "@yuants/data-quote": "0.2.35",
16
+ "@yuants/utils": "0.11.0",
17
+ "@yuants/data-series": "0.3.43",
18
+ "@yuants/sql": "0.9.22",
19
+ "@yuants/data-product": "0.4.13",
20
+ "@yuants/data-ohlc": "0.4.14",
21
+ "@yuants/data-order": "0.3.10",
22
+ "@yuants/data-interest-rate": "0.1.40",
23
+ "@yuants/transfer": "0.2.31",
23
24
  "rxjs": "~7.5.6",
24
25
  "crypto-js": "^4.2.0"
25
26
  },
@@ -30,7 +31,7 @@
30
31
  "@rushstack/heft-node-rig": "~1.10.7",
31
32
  "@types/heft-jest": "1.0.3",
32
33
  "@types/node": "22",
33
- "@yuants/extension": "0.2.27",
34
+ "@yuants/extension": "0.2.28",
34
35
  "@yuants/tool-kit": "0.2.1",
35
36
  "typescript": "~4.7.4",
36
37
  "ts-node": "~10.9.2"
@@ -1,33 +1,34 @@
1
1
  {
2
- "apps/vendor-binance/CHANGELOG.json": "c3d6d7a191e1defbbb448c06b223e085c7cd356a",
3
- "apps/vendor-binance/CHANGELOG.md": "6b868bb815b5ea6b2d7dddd6a43dc2176f0cc14e",
2
+ "apps/vendor-binance/CHANGELOG.json": "f8152d34af3712e6f18f629c299e76456657a0e8",
3
+ "apps/vendor-binance/CHANGELOG.md": "07138d49729a4b5f1897bd3641f9fd3fd34fcabc",
4
4
  "apps/vendor-binance/README.md": "4ab94c08b3d07398aee74c3264a4f87d554d20fa",
5
5
  "apps/vendor-binance/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
6
6
  "apps/vendor-binance/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
7
7
  "apps/vendor-binance/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
8
8
  "apps/vendor-binance/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
9
9
  "apps/vendor-binance/etc/vendor-binance.api.md": "2094b84e9b5e7503f5c42b31fffee8d7db47fe7b",
10
- "apps/vendor-binance/package.json": "34d18f882704bbe3dd02249bf711c9a4f00026e6",
11
- "apps/vendor-binance/src/api.ts": "d66f2c51d13d902085259b80ecd7c421264bf552",
10
+ "apps/vendor-binance/package.json": "b1c591f9e17e5ebcae0829b6336562491ac91cb4",
11
+ "apps/vendor-binance/src/api.ts": "0c5cd2afada60d8e7ab20be65230e16aa8256921",
12
12
  "apps/vendor-binance/src/cli.ts": "9bf6b5559a6c6f33da20e74cc6c5d702c60ec891",
13
13
  "apps/vendor-binance/src/index.ts": "7573aa8600e289793c2e834dee11fef5a664efae",
14
14
  "apps/vendor-binance/src/interest_rate.ts": "ee82ea130495c151b67850a8b90ca972cb8a8d84",
15
15
  "apps/vendor-binance/src/legacy_index.ts": "4a240f03ae64527d1e73ab56af4056529b217ce5",
16
16
  "apps/vendor-binance/src/product.ts": "ea88fc2e6d0e57ee01d13131b26eb052d8f29fb7",
17
- "apps/vendor-binance/src/quote.ts": "781169084d2f95640cc9b9d6421d448e7e587242",
17
+ "apps/vendor-binance/src/quote.ts": "3184973a00240676040c8a4898c6a20563a9a6a6",
18
18
  "apps/vendor-binance/tsconfig.json": "81da8f78196974b5d15da0edb6b2d9f48641063c",
19
- "apps/vendor-binance/.rush/temp/shrinkwrap-deps.json": "979c02b8a8095cd2f0d9ddf068380821e850278f",
20
- "libraries/protocol/temp/package-deps.json": "0b032cee3e535748f6b18aafc53ebb5d22b93b39",
21
- "libraries/data-account/temp/package-deps.json": "db21ad5308b662aeb4080aeab2ea1b3ce707fbc3",
22
- "libraries/data-quote/temp/package-deps.json": "dac628dcc28baf1810f38a9fb293269f943231ea",
23
- "libraries/utils/temp/package-deps.json": "cb0a4bb6018bb4723b41538c5d8de701976651a9",
24
- "libraries/data-series/temp/package-deps.json": "705e60258cd1b672ccd5bbd397f96e915dd041fe",
25
- "libraries/sql/temp/package-deps.json": "9b6f844923fb0890c6b6b340148c36c0c509529f",
26
- "libraries/data-product/temp/package-deps.json": "c0c0fe3448f71b00cf35f3d7f01f3f23766853f7",
27
- "libraries/data-ohlc/temp/package-deps.json": "d133678d93bde02a5ecb128bff6d5d43586e6423",
28
- "libraries/data-order/temp/package-deps.json": "8004fda5dded2e15763321180f81ecd5c1f03e73",
29
- "libraries/data-interest-rate/temp/package-deps.json": "8df7f68dffe18726f766de1ceb7823f8afa9e0c9",
30
- "libraries/transfer/temp/package-deps.json": "6c2b48061b395f9f1a06dffcd6152be79090d150",
31
- "libraries/extension/temp/package-deps.json": "060fce6fcff500e243a49c37c970a9b2ea580c32",
19
+ "apps/vendor-binance/.rush/temp/shrinkwrap-deps.json": "7b773443e30eca79d696c3c880b16f7ffcb15b02",
20
+ "libraries/protocol/temp/package-deps.json": "927e493d72c10154de2879f2d0c89fb1e8726487",
21
+ "libraries/data-account/temp/package-deps.json": "c29b11fcb30dc5bf813894995bd958142783ee13",
22
+ "libraries/cache/temp/package-deps.json": "ccbc084176f6cf6580b3006d0cac81a5b0ecb964",
23
+ "libraries/data-quote/temp/package-deps.json": "ca82690303c9b5a55846387d1bfa0d8fe57e3947",
24
+ "libraries/utils/temp/package-deps.json": "c58f1ca8f498315d9a0219ca8c498299a41d297b",
25
+ "libraries/data-series/temp/package-deps.json": "9525d8c8a2933830845fd34551d11897a8cf31fc",
26
+ "libraries/sql/temp/package-deps.json": "159a9bfbc1734553ee3295f3ddaafd85b2725c81",
27
+ "libraries/data-product/temp/package-deps.json": "a056c3df6e19e1e51bc814ed1f09541d63b2afe7",
28
+ "libraries/data-ohlc/temp/package-deps.json": "4cca5eb528cf247e88594a7dda67f6e75b43de24",
29
+ "libraries/data-order/temp/package-deps.json": "e97eced62e0ec43de4519dd383c4b8948282fbb3",
30
+ "libraries/data-interest-rate/temp/package-deps.json": "53722b7498258ac7069e609c627047ae8b40f474",
31
+ "libraries/transfer/temp/package-deps.json": "dcc50695281bd25e170ea2d105332c8bc1ff5a87",
32
+ "libraries/extension/temp/package-deps.json": "fd20507284f9fd74b4de6f9855c8cead9cc132e8",
32
33
  "tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
33
34
  }