@yuants/vendor-binance 0.14.11 → 0.14.13

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.
@@ -47,9 +47,10 @@ export const getPositions = async (credential) => {
47
47
  positions.push(makeSpotPosition({
48
48
  position_id: `spot/${balance.asset}`,
49
49
  datasource_id: 'BINANCE',
50
- product_id: encodePath('BINANCE', 'SPOT', `${balance.asset}`),
50
+ product_id: encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`),
51
51
  volume,
52
52
  free_volume: +balance.free,
53
+ size: volume.toString(),
53
54
  closable_price: balance.asset === 'USDT'
54
55
  ? 1
55
56
  : +(((_a = (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`)))) === null || _a === void 0 ? void 0 : _a.last_price) ||
@@ -1 +1 @@
1
- {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../../src/services/accounts/unified.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath } from '@yuants/utils';\nimport { isApiError } from '../../api/client';\nimport {\n getFundingAsset,\n getSpotAccountInfo,\n getUmPositionInformation,\n getUnifiedAccountBalance,\n getUnifiedUmAccount,\n ICredential,\n} from '../../api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst quoteCache = createCache<IQuote>(\n async (product_id) => {\n const sql = `select * from quote where product_id = ${escapeSQL(product_id)}`;\n const [quote] = await requestSQL<IQuote[]>(terminal, sql);\n return quote;\n },\n { expire: 10_000 },\n);\n\nexport const getPositions = async (credential: ICredential): Promise<IPosition[]> => {\n const [balanceRes, umAccountRes, res, fundingAsset, positionRisk] = await Promise.all([\n getUnifiedAccountBalance(credential),\n getUnifiedUmAccount(credential),\n getSpotAccountInfo(credential, { omitZeroBalances: true }),\n getFundingAsset(credential, {\n timestamp: Date.now(),\n }),\n getUmPositionInformation(credential, {\n timestamp: Date.now(),\n }),\n ]);\n if (isApiError(balanceRes)) {\n throw new Error(balanceRes.msg);\n }\n if (isApiError(umAccountRes)) {\n throw new Error(umAccountRes.msg);\n }\n if (isApiError(res)) {\n throw new Error(res.msg);\n }\n if (isApiError(fundingAsset)) {\n throw new Error(fundingAsset.msg);\n }\n\n if (isApiError(positionRisk)) {\n throw new Error(positionRisk.msg);\n }\n\n const positions: IPosition[] = [];\n\n for (const balance of [...res.balances, ...fundingAsset]) {\n const volume = +balance.free + +balance.locked;\n if (!volume) continue;\n positions.push(\n makeSpotPosition({\n position_id: `spot/${balance.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'SPOT', `${balance.asset}`),\n volume,\n free_volume: +balance.free,\n closable_price:\n balance.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`)))?.last_price ||\n 0\n ),\n }),\n );\n }\n\n for (const position of umAccountRes.positions) {\n if (+position.positionAmt === 0) continue;\n positions.push({\n position_id: `${position.symbol}/${position.positionSide}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', position.symbol),\n direction:\n position.positionSide === 'LONG'\n ? 'LONG'\n : position.positionSide === 'SHORT'\n ? 'SHORT'\n : position.positionSide === 'BOTH'\n ? 'BOTH'\n : 'UNKNOWN',\n volume: Math.abs(+position.positionAmt),\n free_volume: Math.abs(+position.positionAmt),\n position_price: +position.entryPrice,\n // ISSUE: positionAmt 有正负,这里计算有个 trick,不需要区分仓位方向\n closable_price: +position.entryPrice + +position.unrealizedProfit / +position.positionAmt,\n floating_profit: +position.unrealizedProfit,\n valuation:\n +position.positionAmt *\n (+position.entryPrice +\n (+position.positionAmt === 0 ? 0 : +position.unrealizedProfit / +position.positionAmt)),\n liquidation_price: positionRisk.find(\n (r) => r.symbol === position.symbol && position.positionSide === r.positionSide,\n )?.liquidationPrice,\n });\n }\n\n for (const position of balanceRes) {\n if (+position.totalWalletBalance === 0) continue;\n positions.push(\n makeSpotPosition({\n position_id: `UNIFIED-SPOT/${position.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'UNIFIED-SPOT', position.asset),\n volume: +position.totalWalletBalance,\n free_volume: +position.crossMarginFree,\n closable_price:\n position.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${position.asset}USDT`)))\n ?.last_price || 0\n ),\n }),\n );\n }\n\n return positions;\n};\n"]}
1
+ {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../../src/services/accounts/unified.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath } from '@yuants/utils';\nimport { isApiError } from '../../api/client';\nimport {\n getFundingAsset,\n getSpotAccountInfo,\n getUmPositionInformation,\n getUnifiedAccountBalance,\n getUnifiedUmAccount,\n ICredential,\n} from '../../api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst quoteCache = createCache<IQuote>(\n async (product_id) => {\n const sql = `select * from quote where product_id = ${escapeSQL(product_id)}`;\n const [quote] = await requestSQL<IQuote[]>(terminal, sql);\n return quote;\n },\n { expire: 10_000 },\n);\n\nexport const getPositions = async (credential: ICredential): Promise<IPosition[]> => {\n const [balanceRes, umAccountRes, res, fundingAsset, positionRisk] = await Promise.all([\n getUnifiedAccountBalance(credential),\n getUnifiedUmAccount(credential),\n getSpotAccountInfo(credential, { omitZeroBalances: true }),\n getFundingAsset(credential, {\n timestamp: Date.now(),\n }),\n getUmPositionInformation(credential, {\n timestamp: Date.now(),\n }),\n ]);\n if (isApiError(balanceRes)) {\n throw new Error(balanceRes.msg);\n }\n if (isApiError(umAccountRes)) {\n throw new Error(umAccountRes.msg);\n }\n if (isApiError(res)) {\n throw new Error(res.msg);\n }\n if (isApiError(fundingAsset)) {\n throw new Error(fundingAsset.msg);\n }\n\n if (isApiError(positionRisk)) {\n throw new Error(positionRisk.msg);\n }\n\n const positions: IPosition[] = [];\n\n for (const balance of [...res.balances, ...fundingAsset]) {\n const volume = +balance.free + +balance.locked;\n if (!volume) continue;\n positions.push(\n makeSpotPosition({\n position_id: `spot/${balance.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`),\n volume,\n free_volume: +balance.free,\n size: volume.toString(),\n closable_price:\n balance.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`)))?.last_price ||\n 0\n ),\n }),\n );\n }\n\n for (const position of umAccountRes.positions) {\n if (+position.positionAmt === 0) continue;\n positions.push({\n position_id: `${position.symbol}/${position.positionSide}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', position.symbol),\n direction:\n position.positionSide === 'LONG'\n ? 'LONG'\n : position.positionSide === 'SHORT'\n ? 'SHORT'\n : position.positionSide === 'BOTH'\n ? 'BOTH'\n : 'UNKNOWN',\n volume: Math.abs(+position.positionAmt),\n free_volume: Math.abs(+position.positionAmt),\n position_price: +position.entryPrice,\n // ISSUE: positionAmt 有正负,这里计算有个 trick,不需要区分仓位方向\n closable_price: +position.entryPrice + +position.unrealizedProfit / +position.positionAmt,\n floating_profit: +position.unrealizedProfit,\n valuation:\n +position.positionAmt *\n (+position.entryPrice +\n (+position.positionAmt === 0 ? 0 : +position.unrealizedProfit / +position.positionAmt)),\n liquidation_price: positionRisk.find(\n (r) => r.symbol === position.symbol && position.positionSide === r.positionSide,\n )?.liquidationPrice,\n });\n }\n\n for (const position of balanceRes) {\n if (+position.totalWalletBalance === 0) continue;\n positions.push(\n makeSpotPosition({\n position_id: `UNIFIED-SPOT/${position.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'UNIFIED-SPOT', position.asset),\n volume: +position.totalWalletBalance,\n free_volume: +position.crossMarginFree,\n closable_price:\n position.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${position.asset}USDT`)))\n ?.last_price || 0\n ),\n }),\n );\n }\n\n return positions;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../../../src/services/accounts/unified.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAC;AAMnE,OAAO,EAML,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAa/B,eAAO,MAAM,YAAY,GAAU,YAAY,WAAW,KAAG,OAAO,CAAC,SAAS,EAAE,CAuG/E,CAAC"}
1
+ {"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../../../src/services/accounts/unified.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAoB,MAAM,sBAAsB,CAAC;AAMnE,OAAO,EAML,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAa/B,eAAO,MAAM,YAAY,GAAU,YAAY,WAAW,KAAG,OAAO,CAAC,SAAS,EAAE,CAwG/E,CAAC"}
@@ -50,9 +50,10 @@ const getPositions = async (credential) => {
50
50
  positions.push((0, data_account_1.makeSpotPosition)({
51
51
  position_id: `spot/${balance.asset}`,
52
52
  datasource_id: 'BINANCE',
53
- product_id: (0, utils_1.encodePath)('BINANCE', 'SPOT', `${balance.asset}`),
53
+ product_id: (0, utils_1.encodePath)('BINANCE', 'SPOT', `${balance.asset}USDT`),
54
54
  volume,
55
55
  free_volume: +balance.free,
56
+ size: volume.toString(),
56
57
  closable_price: balance.asset === 'USDT'
57
58
  ? 1
58
59
  : +(((_a = (await quoteCache.query((0, utils_1.encodePath)('BINANCE', 'SPOT', `${balance.asset}USDT`)))) === null || _a === void 0 ? void 0 : _a.last_price) ||
@@ -1 +1 @@
1
- {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../../src/services/accounts/unified.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath } from '@yuants/utils';\nimport { isApiError } from '../../api/client';\nimport {\n getFundingAsset,\n getSpotAccountInfo,\n getUmPositionInformation,\n getUnifiedAccountBalance,\n getUnifiedUmAccount,\n ICredential,\n} from '../../api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst quoteCache = createCache<IQuote>(\n async (product_id) => {\n const sql = `select * from quote where product_id = ${escapeSQL(product_id)}`;\n const [quote] = await requestSQL<IQuote[]>(terminal, sql);\n return quote;\n },\n { expire: 10_000 },\n);\n\nexport const getPositions = async (credential: ICredential): Promise<IPosition[]> => {\n const [balanceRes, umAccountRes, res, fundingAsset, positionRisk] = await Promise.all([\n getUnifiedAccountBalance(credential),\n getUnifiedUmAccount(credential),\n getSpotAccountInfo(credential, { omitZeroBalances: true }),\n getFundingAsset(credential, {\n timestamp: Date.now(),\n }),\n getUmPositionInformation(credential, {\n timestamp: Date.now(),\n }),\n ]);\n if (isApiError(balanceRes)) {\n throw new Error(balanceRes.msg);\n }\n if (isApiError(umAccountRes)) {\n throw new Error(umAccountRes.msg);\n }\n if (isApiError(res)) {\n throw new Error(res.msg);\n }\n if (isApiError(fundingAsset)) {\n throw new Error(fundingAsset.msg);\n }\n\n if (isApiError(positionRisk)) {\n throw new Error(positionRisk.msg);\n }\n\n const positions: IPosition[] = [];\n\n for (const balance of [...res.balances, ...fundingAsset]) {\n const volume = +balance.free + +balance.locked;\n if (!volume) continue;\n positions.push(\n makeSpotPosition({\n position_id: `spot/${balance.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'SPOT', `${balance.asset}`),\n volume,\n free_volume: +balance.free,\n closable_price:\n balance.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`)))?.last_price ||\n 0\n ),\n }),\n );\n }\n\n for (const position of umAccountRes.positions) {\n if (+position.positionAmt === 0) continue;\n positions.push({\n position_id: `${position.symbol}/${position.positionSide}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', position.symbol),\n direction:\n position.positionSide === 'LONG'\n ? 'LONG'\n : position.positionSide === 'SHORT'\n ? 'SHORT'\n : position.positionSide === 'BOTH'\n ? 'BOTH'\n : 'UNKNOWN',\n volume: Math.abs(+position.positionAmt),\n free_volume: Math.abs(+position.positionAmt),\n position_price: +position.entryPrice,\n // ISSUE: positionAmt 有正负,这里计算有个 trick,不需要区分仓位方向\n closable_price: +position.entryPrice + +position.unrealizedProfit / +position.positionAmt,\n floating_profit: +position.unrealizedProfit,\n valuation:\n +position.positionAmt *\n (+position.entryPrice +\n (+position.positionAmt === 0 ? 0 : +position.unrealizedProfit / +position.positionAmt)),\n liquidation_price: positionRisk.find(\n (r) => r.symbol === position.symbol && position.positionSide === r.positionSide,\n )?.liquidationPrice,\n });\n }\n\n for (const position of balanceRes) {\n if (+position.totalWalletBalance === 0) continue;\n positions.push(\n makeSpotPosition({\n position_id: `UNIFIED-SPOT/${position.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'UNIFIED-SPOT', position.asset),\n volume: +position.totalWalletBalance,\n free_volume: +position.crossMarginFree,\n closable_price:\n position.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${position.asset}USDT`)))\n ?.last_price || 0\n ),\n }),\n );\n }\n\n return positions;\n};\n"]}
1
+ {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../../src/services/accounts/unified.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath } from '@yuants/utils';\nimport { isApiError } from '../../api/client';\nimport {\n getFundingAsset,\n getSpotAccountInfo,\n getUmPositionInformation,\n getUnifiedAccountBalance,\n getUnifiedUmAccount,\n ICredential,\n} from '../../api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst quoteCache = createCache<IQuote>(\n async (product_id) => {\n const sql = `select * from quote where product_id = ${escapeSQL(product_id)}`;\n const [quote] = await requestSQL<IQuote[]>(terminal, sql);\n return quote;\n },\n { expire: 10_000 },\n);\n\nexport const getPositions = async (credential: ICredential): Promise<IPosition[]> => {\n const [balanceRes, umAccountRes, res, fundingAsset, positionRisk] = await Promise.all([\n getUnifiedAccountBalance(credential),\n getUnifiedUmAccount(credential),\n getSpotAccountInfo(credential, { omitZeroBalances: true }),\n getFundingAsset(credential, {\n timestamp: Date.now(),\n }),\n getUmPositionInformation(credential, {\n timestamp: Date.now(),\n }),\n ]);\n if (isApiError(balanceRes)) {\n throw new Error(balanceRes.msg);\n }\n if (isApiError(umAccountRes)) {\n throw new Error(umAccountRes.msg);\n }\n if (isApiError(res)) {\n throw new Error(res.msg);\n }\n if (isApiError(fundingAsset)) {\n throw new Error(fundingAsset.msg);\n }\n\n if (isApiError(positionRisk)) {\n throw new Error(positionRisk.msg);\n }\n\n const positions: IPosition[] = [];\n\n for (const balance of [...res.balances, ...fundingAsset]) {\n const volume = +balance.free + +balance.locked;\n if (!volume) continue;\n positions.push(\n makeSpotPosition({\n position_id: `spot/${balance.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`),\n volume,\n free_volume: +balance.free,\n size: volume.toString(),\n closable_price:\n balance.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${balance.asset}USDT`)))?.last_price ||\n 0\n ),\n }),\n );\n }\n\n for (const position of umAccountRes.positions) {\n if (+position.positionAmt === 0) continue;\n positions.push({\n position_id: `${position.symbol}/${position.positionSide}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'USDT-FUTURE', position.symbol),\n direction:\n position.positionSide === 'LONG'\n ? 'LONG'\n : position.positionSide === 'SHORT'\n ? 'SHORT'\n : position.positionSide === 'BOTH'\n ? 'BOTH'\n : 'UNKNOWN',\n volume: Math.abs(+position.positionAmt),\n free_volume: Math.abs(+position.positionAmt),\n position_price: +position.entryPrice,\n // ISSUE: positionAmt 有正负,这里计算有个 trick,不需要区分仓位方向\n closable_price: +position.entryPrice + +position.unrealizedProfit / +position.positionAmt,\n floating_profit: +position.unrealizedProfit,\n valuation:\n +position.positionAmt *\n (+position.entryPrice +\n (+position.positionAmt === 0 ? 0 : +position.unrealizedProfit / +position.positionAmt)),\n liquidation_price: positionRisk.find(\n (r) => r.symbol === position.symbol && position.positionSide === r.positionSide,\n )?.liquidationPrice,\n });\n }\n\n for (const position of balanceRes) {\n if (+position.totalWalletBalance === 0) continue;\n positions.push(\n makeSpotPosition({\n position_id: `UNIFIED-SPOT/${position.asset}`,\n datasource_id: 'BINANCE',\n product_id: encodePath('BINANCE', 'UNIFIED-SPOT', position.asset),\n volume: +position.totalWalletBalance,\n free_volume: +position.crossMarginFree,\n closable_price:\n position.asset === 'USDT'\n ? 1\n : +(\n (await quoteCache.query(encodePath('BINANCE', 'SPOT', `${position.asset}USDT`)))\n ?.last_price || 0\n ),\n }),\n );\n }\n\n return positions;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuants/vendor-binance",
3
- "version": "0.14.11",
3
+ "version": "0.14.13",
4
4
  "main": "lib/index.js",
5
5
  "files": [
6
6
  "dist",
@@ -11,19 +11,19 @@
11
11
  "rxjs": "~7.5.6",
12
12
  "@yuants/protocol": "0.55.0",
13
13
  "@yuants/data-account": "0.11.12",
14
+ "@yuants/data-quote": "0.4.12",
14
15
  "@yuants/cache": "0.3.15",
15
16
  "@yuants/utils": "0.19.7",
16
- "@yuants/data-quote": "0.4.12",
17
17
  "@yuants/data-series": "0.3.65",
18
18
  "@yuants/sql": "0.9.43",
19
+ "@yuants/data-ohlc": "0.6.8",
19
20
  "@yuants/data-product": "0.5.13",
21
+ "@yuants/data-order": "0.7.13",
20
22
  "@yuants/data-interest-rate": "0.2.13",
21
23
  "@yuants/transfer": "0.2.52",
22
24
  "@yuants/exchange": "0.8.23",
23
- "@yuants/data-order": "0.7.13",
24
- "@yuants/data-ohlc": "0.6.8",
25
- "@yuants/data-trade": "0.1.38",
26
- "@yuants/http-services": "0.5.3"
25
+ "@yuants/http-services": "0.5.3",
26
+ "@yuants/data-trade": "0.1.38"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@microsoft/api-extractor": "~7.55.2",