@yuants/vendor-okx 0.23.25 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/dist/account.js +35 -144
  2. package/dist/account.js.map +1 -1
  3. package/dist/accountInfos/earning.js +15 -0
  4. package/dist/accountInfos/earning.js.map +1 -0
  5. package/dist/accountInfos/funding.js +46 -0
  6. package/dist/accountInfos/funding.js.map +1 -0
  7. package/dist/accountInfos/index.js +7 -0
  8. package/dist/accountInfos/index.js.map +1 -0
  9. package/dist/accountInfos/loan.js +46 -0
  10. package/dist/accountInfos/loan.js.map +1 -0
  11. package/dist/accountInfos/strategy.js +56 -0
  12. package/dist/accountInfos/strategy.js.map +1 -0
  13. package/dist/accountInfos/trading.js +84 -0
  14. package/dist/accountInfos/trading.js.map +1 -0
  15. package/dist/accountInfos/types.js +2 -0
  16. package/dist/accountInfos/types.js.map +1 -0
  17. package/dist/{api.js → api/private-api.js} +1 -1
  18. package/dist/api/private-api.js.map +1 -0
  19. package/dist/api/public-api.js.map +1 -0
  20. package/dist/api-service.js +1 -1
  21. package/dist/api-service.js.map +1 -1
  22. package/dist/index.js +5 -4
  23. package/dist/index.js.map +1 -1
  24. package/dist/loan-account.js +6 -48
  25. package/dist/loan-account.js.map +1 -1
  26. package/dist/order-actions-with-credential.js +69 -0
  27. package/dist/order-actions-with-credential.js.map +1 -0
  28. package/dist/order-actions.js +12 -184
  29. package/dist/order-actions.js.map +1 -1
  30. package/dist/order.js +4 -7
  31. package/dist/order.js.map +1 -1
  32. package/dist/orders/cancelOrder.js +13 -0
  33. package/dist/orders/cancelOrder.js.map +1 -0
  34. package/dist/orders/modifyOrder.js +58 -0
  35. package/dist/orders/modifyOrder.js.map +1 -0
  36. package/dist/orders/submitOrder.js +107 -0
  37. package/dist/orders/submitOrder.js.map +1 -0
  38. package/dist/{interest_rate.js → public-data/interest_rate.js} +1 -1
  39. package/dist/public-data/interest_rate.js.map +1 -0
  40. package/dist/{market-order.js → public-data/market-order.js} +1 -1
  41. package/dist/public-data/market-order.js.map +1 -0
  42. package/dist/{ohlc.js → public-data/ohlc.js} +3 -4
  43. package/dist/public-data/ohlc.js.map +1 -0
  44. package/dist/{product.js → public-data/product.js} +1 -1
  45. package/dist/public-data/product.js.map +1 -0
  46. package/dist/{quote.js → public-data/quote.js} +2 -3
  47. package/dist/public-data/quote.js.map +1 -0
  48. package/dist/services.js +4 -4
  49. package/dist/services.js.map +1 -1
  50. package/dist/strategy-account.js +9 -70
  51. package/dist/strategy-account.js.map +1 -1
  52. package/dist/trade.js +6 -8
  53. package/dist/trade.js.map +1 -1
  54. package/dist/transfer.js +6 -4
  55. package/dist/transfer.js.map +1 -1
  56. package/dist/utils/provideOHLCFromTimeBackwardService.js.map +1 -0
  57. package/dist/utils/provideSeriesFromTimeBackwardService.js.map +1 -0
  58. package/dist/ws.js.map +1 -1
  59. package/lib/account.d.ts +6 -3
  60. package/lib/account.d.ts.map +1 -1
  61. package/lib/account.js +38 -146
  62. package/lib/account.js.map +1 -1
  63. package/lib/accountInfos/earning.d.ts +4 -0
  64. package/lib/accountInfos/earning.d.ts.map +1 -0
  65. package/lib/accountInfos/earning.js +19 -0
  66. package/lib/accountInfos/earning.js.map +1 -0
  67. package/lib/accountInfos/funding.d.ts +4 -0
  68. package/lib/accountInfos/funding.d.ts.map +1 -0
  69. package/lib/accountInfos/funding.js +50 -0
  70. package/lib/accountInfos/funding.js.map +1 -0
  71. package/lib/accountInfos/index.d.ts +8 -0
  72. package/lib/accountInfos/index.d.ts.map +1 -0
  73. package/lib/accountInfos/index.js +16 -0
  74. package/lib/accountInfos/index.js.map +1 -0
  75. package/lib/accountInfos/loan.d.ts +4 -0
  76. package/lib/accountInfos/loan.d.ts.map +1 -0
  77. package/lib/accountInfos/loan.js +50 -0
  78. package/lib/accountInfos/loan.js.map +1 -0
  79. package/lib/accountInfos/strategy.d.ts +4 -0
  80. package/lib/accountInfos/strategy.d.ts.map +1 -0
  81. package/lib/accountInfos/strategy.js +60 -0
  82. package/lib/accountInfos/strategy.js.map +1 -0
  83. package/lib/accountInfos/trading.d.ts +5 -0
  84. package/lib/accountInfos/trading.d.ts.map +1 -0
  85. package/lib/accountInfos/trading.js +88 -0
  86. package/lib/accountInfos/trading.js.map +1 -0
  87. package/lib/accountInfos/types.d.ts +6 -0
  88. package/lib/accountInfos/types.d.ts.map +1 -0
  89. package/lib/accountInfos/types.js +3 -0
  90. package/lib/accountInfos/types.js.map +1 -0
  91. package/lib/{api.d.ts → api/private-api.d.ts} +1 -1
  92. package/lib/api/private-api.d.ts.map +1 -0
  93. package/lib/{api.js → api/private-api.js} +1 -1
  94. package/lib/api/private-api.js.map +1 -0
  95. package/lib/api/public-api.d.ts.map +1 -0
  96. package/lib/api/public-api.js.map +1 -0
  97. package/lib/api-service.js +1 -1
  98. package/lib/api-service.js.map +1 -1
  99. package/lib/index.d.ts +5 -4
  100. package/lib/index.d.ts.map +1 -1
  101. package/lib/index.js +5 -4
  102. package/lib/index.js.map +1 -1
  103. package/lib/loan-account.js +5 -47
  104. package/lib/loan-account.js.map +1 -1
  105. package/lib/order-actions-with-credential.d.ts +2 -0
  106. package/lib/order-actions-with-credential.d.ts.map +1 -0
  107. package/lib/order-actions-with-credential.js +71 -0
  108. package/lib/order-actions-with-credential.js.map +1 -0
  109. package/lib/order-actions.js +11 -183
  110. package/lib/order-actions.js.map +1 -1
  111. package/lib/order.d.ts.map +1 -1
  112. package/lib/order.js +4 -7
  113. package/lib/order.js.map +1 -1
  114. package/lib/orders/cancelOrder.d.ts +4 -0
  115. package/lib/orders/cancelOrder.d.ts.map +1 -0
  116. package/lib/orders/cancelOrder.js +17 -0
  117. package/lib/orders/cancelOrder.js.map +1 -0
  118. package/lib/orders/modifyOrder.d.ts +4 -0
  119. package/lib/orders/modifyOrder.d.ts.map +1 -0
  120. package/lib/orders/modifyOrder.js +62 -0
  121. package/lib/orders/modifyOrder.js.map +1 -0
  122. package/lib/orders/submitOrder.d.ts +4 -0
  123. package/lib/orders/submitOrder.d.ts.map +1 -0
  124. package/lib/orders/submitOrder.js +111 -0
  125. package/lib/orders/submitOrder.js.map +1 -0
  126. package/lib/public-data/interest_rate.d.ts.map +1 -0
  127. package/lib/{interest_rate.js → public-data/interest_rate.js} +1 -1
  128. package/lib/public-data/interest_rate.js.map +1 -0
  129. package/lib/public-data/market-order.d.ts.map +1 -0
  130. package/lib/{market-order.js → public-data/market-order.js} +1 -1
  131. package/lib/public-data/market-order.js.map +1 -0
  132. package/lib/public-data/ohlc.d.ts.map +1 -0
  133. package/lib/{ohlc.js → public-data/ohlc.js} +3 -4
  134. package/lib/public-data/ohlc.js.map +1 -0
  135. package/lib/public-data/product.d.ts.map +1 -0
  136. package/lib/{product.js → public-data/product.js} +1 -1
  137. package/{dist → lib/public-data}/product.js.map +1 -1
  138. package/lib/public-data/quote.d.ts.map +1 -0
  139. package/lib/{quote.js → public-data/quote.js} +2 -3
  140. package/lib/public-data/quote.js.map +1 -0
  141. package/lib/services.js +4 -4
  142. package/lib/services.js.map +1 -1
  143. package/lib/strategy-account.d.ts +1 -28
  144. package/lib/strategy-account.d.ts.map +1 -1
  145. package/lib/strategy-account.js +10 -72
  146. package/lib/strategy-account.js.map +1 -1
  147. package/lib/trade.js +6 -8
  148. package/lib/trade.js.map +1 -1
  149. package/lib/transfer.js +17 -15
  150. package/lib/transfer.js.map +1 -1
  151. package/lib/utils/provideOHLCFromTimeBackwardService.d.ts.map +1 -0
  152. package/lib/utils/provideOHLCFromTimeBackwardService.js.map +1 -0
  153. package/lib/utils/provideSeriesFromTimeBackwardService.d.ts.map +1 -0
  154. package/lib/utils/provideSeriesFromTimeBackwardService.js.map +1 -0
  155. package/lib/ws.d.ts +1 -1
  156. package/lib/ws.d.ts.map +1 -1
  157. package/lib/ws.js.map +1 -1
  158. package/package.json +14 -13
  159. package/temp/package-deps.json +48 -37
  160. package/dist/api.js.map +0 -1
  161. package/dist/interest_rate.js.map +0 -1
  162. package/dist/market-order.js.map +0 -1
  163. package/dist/ohlc.js.map +0 -1
  164. package/dist/provideOHLCFromTimeBackwardService.js.map +0 -1
  165. package/dist/provideSeriesFromTimeBackwardService.js.map +0 -1
  166. package/dist/public-api.js.map +0 -1
  167. package/dist/quote.js.map +0 -1
  168. package/dist/websocket.js +0 -157
  169. package/dist/websocket.js.map +0 -1
  170. package/lib/api.d.ts.map +0 -1
  171. package/lib/api.js.map +0 -1
  172. package/lib/interest_rate.d.ts.map +0 -1
  173. package/lib/interest_rate.js.map +0 -1
  174. package/lib/market-order.d.ts.map +0 -1
  175. package/lib/market-order.js.map +0 -1
  176. package/lib/ohlc.d.ts.map +0 -1
  177. package/lib/ohlc.js.map +0 -1
  178. package/lib/product.d.ts.map +0 -1
  179. package/lib/product.js.map +0 -1
  180. package/lib/provideOHLCFromTimeBackwardService.d.ts.map +0 -1
  181. package/lib/provideOHLCFromTimeBackwardService.js.map +0 -1
  182. package/lib/provideSeriesFromTimeBackwardService.d.ts.map +0 -1
  183. package/lib/provideSeriesFromTimeBackwardService.js.map +0 -1
  184. package/lib/public-api.d.ts.map +0 -1
  185. package/lib/public-api.js.map +0 -1
  186. package/lib/quote.d.ts.map +0 -1
  187. package/lib/quote.js.map +0 -1
  188. package/lib/websocket.d.ts +0 -15
  189. package/lib/websocket.d.ts.map +0 -1
  190. package/lib/websocket.js +0 -163
  191. package/lib/websocket.js.map +0 -1
  192. /package/dist/{public-api.js → api/public-api.js} +0 -0
  193. /package/dist/{provideOHLCFromTimeBackwardService.js → utils/provideOHLCFromTimeBackwardService.js} +0 -0
  194. /package/dist/{provideSeriesFromTimeBackwardService.js → utils/provideSeriesFromTimeBackwardService.js} +0 -0
  195. /package/lib/{public-api.d.ts → api/public-api.d.ts} +0 -0
  196. /package/lib/{public-api.js → api/public-api.js} +0 -0
  197. /package/lib/{interest_rate.d.ts → public-data/interest_rate.d.ts} +0 -0
  198. /package/lib/{market-order.d.ts → public-data/market-order.d.ts} +0 -0
  199. /package/lib/{ohlc.d.ts → public-data/ohlc.d.ts} +0 -0
  200. /package/lib/{product.d.ts → public-data/product.d.ts} +0 -0
  201. /package/lib/{quote.d.ts → public-data/quote.d.ts} +0 -0
  202. /package/lib/{provideOHLCFromTimeBackwardService.d.ts → utils/provideOHLCFromTimeBackwardService.d.ts} +0 -0
  203. /package/lib/{provideOHLCFromTimeBackwardService.js → utils/provideOHLCFromTimeBackwardService.js} +0 -0
  204. /package/lib/{provideSeriesFromTimeBackwardService.d.ts → utils/provideSeriesFromTimeBackwardService.d.ts} +0 -0
  205. /package/lib/{provideSeriesFromTimeBackwardService.js → utils/provideSeriesFromTimeBackwardService.js} +0 -0
package/dist/account.js CHANGED
@@ -1,18 +1,23 @@
1
+ import { createCache } from '@yuants/cache';
1
2
  import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';
2
3
  import { providePendingOrdersService } from '@yuants/data-order';
3
4
  import { Terminal } from '@yuants/protocol';
4
5
  import { encodePath } from '@yuants/utils';
5
- import { defer, filter, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';
6
- import { getAccountConfig, getAccountBalance, getAccountPositions, getAssetBalances, getFinanceSavingsBalance, getSubAccountList, getDefaultCredential, getTradeOrdersPending, } from './api';
7
- import { productService } from './product';
8
- import { getMarketIndexTicker } from './public-api';
6
+ import { defer } from 'rxjs';
7
+ import { getEarningAccountInfo, getFundingAccountInfo, getTradingAccountInfo, marketIndexTickerUSDT$, } from './accountInfos';
8
+ import { getAccountConfig, getDefaultCredential, getTradeOrdersPending } from './api/private-api';
9
9
  const terminal = Terminal.fromNodeEnv();
10
10
  const credential = getDefaultCredential();
11
- export const accountConfig$ = defer(() => getAccountConfig(credential)).pipe(repeat({ delay: 10000 }), retry({ delay: 10000 }), shareReplay(1));
12
- const subAccountUids$ = defer(() => getSubAccountList(credential)).pipe(repeat({ delay: 10000 }), retry({ delay: 10000 }), shareReplay(1));
13
- export const accountUid$ = accountConfig$.pipe(map((x) => x.data[0].uid), filter((x) => !!x), shareReplay(1));
11
+ export const accountConfigCache = createCache(() => getAccountConfig(credential), {
12
+ expire: 100000,
13
+ swrAfter: 10000,
14
+ });
15
+ export const accountUidCache = createCache(async () => {
16
+ const config = await accountConfigCache.query('');
17
+ return config === null || config === void 0 ? void 0 : config.data[0].uid;
18
+ });
14
19
  defer(async () => {
15
- const uid = await firstValueFrom(accountUid$);
20
+ const uid = await accountUidCache.query('');
16
21
  const account_id = `okx/${uid}/trading`;
17
22
  providePendingOrdersService(terminal, account_id, async () => {
18
23
  const orders = await getTradeOrdersPending(credential, {});
@@ -41,149 +46,35 @@ defer(async () => {
41
46
  });
42
47
  }, { auto_refresh_interval: 5000 });
43
48
  }).subscribe();
44
- const marketIndexTickerUSDT$ = defer(() => getMarketIndexTicker({ quoteCcy: 'USDT' })).pipe(map((x) => {
45
- const mapInstIdToPrice = new Map();
46
- x.data.forEach((inst) => mapInstIdToPrice.set(inst.instId, Number(inst.idxPx)));
47
- return mapInstIdToPrice;
48
- }), repeat({ delay: 1000 }), retry({ delay: 5000 }), shareReplay(1));
49
- export const tradingAccountId$ = accountUid$.pipe(map((uid) => `okx/${uid}/trading`), shareReplay(1));
49
+ export const getTradingAccountId = async () => {
50
+ const uid = await accountUidCache.query('');
51
+ return `okx/${uid}/trading`;
52
+ };
53
+ export const getStrategyAccountId = async () => {
54
+ const uid = await accountUidCache.query('');
55
+ return `okx/${uid}/strategy`;
56
+ };
50
57
  defer(async () => {
51
- const tradingAccountId = await firstValueFrom(tradingAccountId$);
58
+ const tradingAccountId = await getTradingAccountId();
52
59
  addAccountMarket(terminal, { account_id: tradingAccountId, market_id: 'OKX' });
53
- provideAccountInfoService(terminal, tradingAccountId, async () => {
54
- var _a;
55
- const [positionsApi, balanceApi, mapProductIdToProduct, marketIndexTickerUSDT] = await Promise.all([
56
- getAccountPositions(credential, {}),
57
- getAccountBalance(credential, {}),
58
- firstValueFrom(productService.mapProductIdToProduct$),
59
- firstValueFrom(marketIndexTickerUSDT$),
60
- ]);
61
- let totalEquity = 0;
62
- let totalFree = 0;
63
- const positions = [];
64
- (_a = balanceApi.data[0]) === null || _a === void 0 ? void 0 : _a.details.forEach((detail) => {
65
- var _a, _b, _c, _d, _e, _f;
66
- if (detail.ccy === 'USDT') {
67
- const balance = +((_a = detail.cashBal) !== null && _a !== void 0 ? _a : 0);
68
- const free = Math.min(balance, // free should no more than balance if there is much profits
69
- +((_b = detail.availEq) !== null && _b !== void 0 ? _b : 0));
70
- const equity = +((_c = detail.eq) !== null && _c !== void 0 ? _c : 0) - +((_d = detail.stgyEq) !== null && _d !== void 0 ? _d : 0);
71
- totalEquity += equity;
72
- totalFree += free;
73
- }
74
- else {
75
- const volume = +((_e = detail.cashBal) !== null && _e !== void 0 ? _e : 0);
76
- const free_volume = Math.min(volume, // free should no more than balance if there is much profits
77
- +((_f = detail.availEq) !== null && _f !== void 0 ? _f : 0));
78
- const closable_price = marketIndexTickerUSDT.get(detail.ccy + '-USDT') || 0;
79
- const delta_equity = volume * closable_price || 0;
80
- const delta_profit = +detail.totalPnl || 0;
81
- const product_id = encodePath('SPOT', `${detail.ccy}-USDT`);
82
- positions.push({
83
- position_id: product_id,
84
- datasource_id: 'OKX',
85
- product_id: product_id,
86
- direction: 'LONG',
87
- volume: volume,
88
- free_volume: free_volume,
89
- position_price: +detail.accAvgPx,
90
- floating_profit: delta_profit,
91
- closable_price: closable_price,
92
- valuation: delta_equity,
93
- });
94
- totalEquity += delta_equity;
95
- }
96
- });
97
- positionsApi.data.forEach((x) => {
98
- var _a, _b;
99
- const direction = x.posSide === 'long' ? 'LONG' : x.posSide === 'short' ? 'SHORT' : +x.pos > 0 ? 'LONG' : 'SHORT';
100
- const volume = Math.abs(+x.pos);
101
- const product_id = encodePath(x.instType, x.instId);
102
- const closable_price = +x.last;
103
- const valuation = ((_b = (_a = mapProductIdToProduct.get(product_id)) === null || _a === void 0 ? void 0 : _a.value_scale) !== null && _b !== void 0 ? _b : 1) * volume * closable_price || 0;
104
- positions.push({
105
- position_id: x.posId,
106
- datasource_id: 'OKX',
107
- product_id,
108
- direction,
109
- volume: volume,
110
- free_volume: +x.availPos,
111
- closable_price,
112
- position_price: +x.avgPx,
113
- floating_profit: +x.upl,
114
- valuation,
115
- });
116
- });
117
- return {
118
- money: {
119
- currency: 'USDT',
120
- equity: totalEquity,
121
- free: totalFree,
122
- },
123
- positions: positions,
124
- };
125
- }, { auto_refresh_interval: 1000 });
60
+ provideAccountInfoService(terminal, tradingAccountId, () => getTradingAccountInfo(credential), {
61
+ auto_refresh_interval: 1000,
62
+ });
126
63
  }).subscribe();
127
64
  defer(async () => {
128
- const uid = await firstValueFrom(accountUid$);
65
+ const uid = await accountUidCache.query('');
129
66
  const fundingAccountId = `okx/${uid}/funding/USDT`;
130
- provideAccountInfoService(terminal, fundingAccountId, async () => {
131
- const [assetBalances, marketIndexTickerUSDT] = await Promise.all([
132
- getAssetBalances(credential, {}),
133
- firstValueFrom(marketIndexTickerUSDT$),
134
- ]);
135
- const positions = [];
136
- let equity = 0;
137
- let free = 0;
138
- assetBalances.data.forEach((x) => {
139
- if (x.ccy === 'USDT') {
140
- const balance = +x.bal;
141
- equity += balance;
142
- free += balance;
143
- return;
144
- }
145
- const price = marketIndexTickerUSDT.get(`${x.ccy}-USDT`) || 0;
146
- const valuation = price * +x.bal || 0;
147
- const productId = encodePath('SPOT', `${x.ccy}-USDT`);
148
- positions.push({
149
- datasource_id: 'OKX',
150
- position_id: productId,
151
- product_id: productId,
152
- direction: 'LONG',
153
- volume: +x.bal,
154
- free_volume: +x.bal,
155
- position_price: price,
156
- floating_profit: 0,
157
- closable_price: price,
158
- valuation,
159
- });
160
- equity += valuation;
161
- });
162
- return {
163
- money: {
164
- currency: 'USDT',
165
- equity,
166
- free,
167
- },
168
- positions,
169
- };
170
- }, { auto_refresh_interval: 1000 });
67
+ provideAccountInfoService(terminal, fundingAccountId, () => getFundingAccountInfo(credential), {
68
+ auto_refresh_interval: 1000,
69
+ });
171
70
  }).subscribe();
172
71
  defer(async () => {
173
- const uid = await firstValueFrom(accountUid$);
72
+ const uid = await accountUidCache.query('');
174
73
  const earningAccountId = `okx/${uid}/earning/USDT`;
175
- provideAccountInfoService(terminal, earningAccountId, async () => {
176
- const offers = await getFinanceSavingsBalance(credential, {});
177
- const equity = offers.data.filter((x) => x.ccy === 'USDT').reduce((acc, x) => acc + +x.amt, 0);
178
- const free = equity;
179
- return {
180
- money: {
181
- currency: 'USDT',
182
- equity,
183
- free,
184
- },
185
- positions: [],
186
- };
187
- }, { auto_refresh_interval: 5000 });
74
+ provideAccountInfoService(terminal, earningAccountId, () => getEarningAccountInfo(credential), {
75
+ auto_refresh_interval: 5000,
76
+ });
188
77
  }).subscribe();
78
+ // 导出 marketIndexTickerUSDT$ 供其他模块使用
79
+ export { marketIndexTickerUSDT$ };
189
80
  //# sourceMappingURL=account.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { providePendingOrdersService } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { defer, filter, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';\nimport {\n getAccountConfig,\n getAccountBalance,\n getAccountPositions,\n getAssetBalances,\n getFinanceSavingsBalance,\n getSubAccountList,\n getDefaultCredential,\n getTradeOrdersPending,\n} from './api';\nimport { productService } from './product';\nimport { getMarketIndexTicker } from './public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\nexport const accountConfig$ = defer(() => getAccountConfig(credential)).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nconst subAccountUids$ = defer(() => getSubAccountList(credential)).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nexport const accountUid$ = accountConfig$.pipe(\n map((x) => x.data[0].uid),\n filter((x) => !!x),\n shareReplay(1),\n);\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n const account_id = `okx/${uid}/trading`;\n providePendingOrdersService(\n terminal,\n account_id,\n async () => {\n const orders = await getTradeOrdersPending(credential, {});\n return orders.data.map((x) => {\n const order_type = x.ordType === 'market' ? 'MARKET' : x.ordType === 'limit' ? 'LIMIT' : 'UNKNOWN';\n\n const order_direction =\n x.side === 'buy'\n ? x.posSide === 'long'\n ? 'OPEN_LONG'\n : 'CLOSE_SHORT'\n : x.posSide === 'short'\n ? 'OPEN_SHORT'\n : 'CLOSE_LONG';\n return {\n order_id: x.ordId,\n account_id,\n product_id: encodePath(x.instType, x.instId),\n submit_at: +x.cTime,\n filled_at: +x.fillTime,\n order_type,\n order_direction,\n volume: +x.sz,\n traded_volume: +x.accFillSz,\n price: +x.px,\n traded_price: +x.avgPx,\n };\n });\n },\n { auto_refresh_interval: 5000 },\n );\n}).subscribe();\n\nconst marketIndexTickerUSDT$ = defer(() => getMarketIndexTicker({ quoteCcy: 'USDT' })).pipe(\n map((x) => {\n const mapInstIdToPrice = new Map<string, number>();\n x.data.forEach((inst) => mapInstIdToPrice.set(inst.instId, Number(inst.idxPx)));\n return mapInstIdToPrice;\n }),\n repeat({ delay: 1000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\nexport const tradingAccountId$ = accountUid$.pipe(\n map((uid) => `okx/${uid}/trading`),\n shareReplay(1),\n);\n\ndefer(async () => {\n const tradingAccountId = await firstValueFrom(tradingAccountId$);\n addAccountMarket(terminal, { account_id: tradingAccountId, market_id: 'OKX' });\n\n provideAccountInfoService(\n terminal,\n tradingAccountId,\n async () => {\n const [positionsApi, balanceApi, mapProductIdToProduct, marketIndexTickerUSDT] = await Promise.all([\n getAccountPositions(credential, {}),\n getAccountBalance(credential, {}),\n firstValueFrom(productService.mapProductIdToProduct$),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n let totalEquity = 0;\n let totalFree = 0;\n const positions: IPosition[] = [];\n\n balanceApi.data[0]?.details.forEach((detail) => {\n if (detail.ccy === 'USDT') {\n const balance = +(detail.cashBal ?? 0);\n const free = Math.min(\n balance, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const equity = +(detail.eq ?? 0) - +(detail.stgyEq ?? 0);\n totalEquity += equity;\n totalFree += free;\n } else {\n const volume = +(detail.cashBal ?? 0);\n const free_volume = Math.min(\n volume, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const closable_price = marketIndexTickerUSDT.get(detail.ccy + '-USDT') || 0;\n const delta_equity = volume * closable_price || 0;\n const delta_profit = +detail.totalPnl || 0;\n\n const product_id = encodePath('SPOT', `${detail.ccy}-USDT`);\n positions.push({\n position_id: product_id,\n datasource_id: 'OKX',\n product_id: product_id,\n direction: 'LONG',\n volume: volume,\n free_volume: free_volume,\n position_price: +detail.accAvgPx,\n floating_profit: delta_profit,\n closable_price: closable_price,\n valuation: delta_equity,\n });\n\n totalEquity += delta_equity;\n }\n });\n positionsApi.data.forEach((x) => {\n const direction =\n x.posSide === 'long' ? 'LONG' : x.posSide === 'short' ? 'SHORT' : +x.pos > 0 ? 'LONG' : 'SHORT';\n const volume = Math.abs(+x.pos);\n const product_id = encodePath(x.instType, x.instId);\n const closable_price = +x.last;\n const valuation =\n (mapProductIdToProduct.get(product_id)?.value_scale ?? 1) * volume * closable_price || 0;\n\n positions.push({\n position_id: x.posId,\n datasource_id: 'OKX',\n product_id,\n direction,\n volume: volume,\n free_volume: +x.availPos,\n closable_price,\n position_price: +x.avgPx,\n floating_profit: +x.upl,\n valuation,\n });\n });\n return {\n money: {\n currency: 'USDT',\n equity: totalEquity,\n free: totalFree,\n },\n positions: positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n}).subscribe();\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n\n const fundingAccountId = `okx/${uid}/funding/USDT`;\n\n provideAccountInfoService(\n terminal,\n fundingAccountId,\n async () => {\n const [assetBalances, marketIndexTickerUSDT] = await Promise.all([\n getAssetBalances(credential, {}),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n const positions: IPosition[] = [];\n let equity = 0;\n let free = 0;\n\n assetBalances.data.forEach((x) => {\n if (x.ccy === 'USDT') {\n const balance = +x.bal;\n equity += balance;\n free += balance;\n return;\n }\n\n const price = marketIndexTickerUSDT.get(`${x.ccy}-USDT`) || 0;\n const valuation = price * +x.bal || 0;\n const productId = encodePath('SPOT', `${x.ccy}-USDT`);\n\n positions.push({\n datasource_id: 'OKX',\n position_id: productId,\n product_id: productId,\n direction: 'LONG',\n volume: +x.bal,\n free_volume: +x.bal,\n position_price: price,\n floating_profit: 0,\n closable_price: price,\n valuation,\n });\n\n equity += valuation;\n });\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n}).subscribe();\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n const earningAccountId = `okx/${uid}/earning/USDT`;\n provideAccountInfoService(\n terminal,\n earningAccountId,\n async () => {\n const offers = await getFinanceSavingsBalance(credential, {});\n const equity = offers.data.filter((x) => x.ccy === 'USDT').reduce((acc, x) => acc + +x.amt, 0);\n const free = equity;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n },\n { auto_refresh_interval: 5000 },\n );\n}).subscribe();\n"]}
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';\nimport { providePendingOrdersService } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { defer } from 'rxjs';\nimport {\n getEarningAccountInfo,\n getFundingAccountInfo,\n getTradingAccountInfo,\n marketIndexTickerUSDT$,\n} from './accountInfos';\nimport { getAccountConfig, getDefaultCredential, getTradeOrdersPending } from './api/private-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\nexport const accountConfigCache = createCache(() => getAccountConfig(credential), {\n expire: 100_000,\n swrAfter: 10_000,\n});\n\nexport const accountUidCache = createCache(async () => {\n const config = await accountConfigCache.query('');\n return config?.data[0].uid;\n});\n\ndefer(async () => {\n const uid = await accountUidCache.query('');\n const account_id = `okx/${uid}/trading`;\n providePendingOrdersService(\n terminal,\n account_id,\n async () => {\n const orders = await getTradeOrdersPending(credential, {});\n return orders.data.map((x) => {\n const order_type = x.ordType === 'market' ? 'MARKET' : x.ordType === 'limit' ? 'LIMIT' : 'UNKNOWN';\n\n const order_direction =\n x.side === 'buy'\n ? x.posSide === 'long'\n ? 'OPEN_LONG'\n : 'CLOSE_SHORT'\n : x.posSide === 'short'\n ? 'OPEN_SHORT'\n : 'CLOSE_LONG';\n return {\n order_id: x.ordId,\n account_id,\n product_id: encodePath(x.instType, x.instId),\n submit_at: +x.cTime,\n filled_at: +x.fillTime,\n order_type,\n order_direction,\n volume: +x.sz,\n traded_volume: +x.accFillSz,\n price: +x.px,\n traded_price: +x.avgPx,\n };\n });\n },\n { auto_refresh_interval: 5000 },\n );\n}).subscribe();\n\nexport const getTradingAccountId = async () => {\n const uid = await accountUidCache.query('');\n return `okx/${uid}/trading`;\n};\n\nexport const getStrategyAccountId = async () => {\n const uid = await accountUidCache.query('');\n return `okx/${uid}/strategy`;\n};\n\ndefer(async () => {\n const tradingAccountId = await getTradingAccountId();\n addAccountMarket(terminal, { account_id: tradingAccountId, market_id: 'OKX' });\n\n provideAccountInfoService(terminal, tradingAccountId, () => getTradingAccountInfo(credential), {\n auto_refresh_interval: 1000,\n });\n}).subscribe();\n\ndefer(async () => {\n const uid = await accountUidCache.query('');\n\n const fundingAccountId = `okx/${uid}/funding/USDT`;\n\n provideAccountInfoService(terminal, fundingAccountId, () => getFundingAccountInfo(credential), {\n auto_refresh_interval: 1000,\n });\n}).subscribe();\n\ndefer(async () => {\n const uid = await accountUidCache.query('');\n const earningAccountId = `okx/${uid}/earning/USDT`;\n provideAccountInfoService(terminal, earningAccountId, () => getEarningAccountInfo(credential), {\n auto_refresh_interval: 5000,\n });\n}).subscribe();\n\n// 导出 marketIndexTickerUSDT$ 供其他模块使用\nexport { marketIndexTickerUSDT$ };\n"]}
@@ -0,0 +1,15 @@
1
+ import { getFinanceSavingsBalance } from '../api/private-api';
2
+ export const getEarningAccountInfo = async (credential) => {
3
+ const offers = await getFinanceSavingsBalance(credential, {});
4
+ const equity = offers.data.filter((x) => x.ccy === 'USDT').reduce((acc, x) => acc + +x.amt, 0);
5
+ const free = equity;
6
+ return {
7
+ money: {
8
+ currency: 'USDT',
9
+ equity,
10
+ free,
11
+ },
12
+ positions: [],
13
+ };
14
+ };
15
+ //# sourceMappingURL=earning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"earning.js","sourceRoot":"","sources":["../../src/accountInfos/earning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,UAAuB,EAA6B,EAAE;IAChG,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,MAAM,CAAC;IAEpB,OAAO;QACL,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM;YAChB,MAAM;YACN,IAAI;SACL;QACD,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { ICredential, getFinanceSavingsBalance } from '../api/private-api';\nimport { IAccountInfoCore } from './types';\n\nexport const getEarningAccountInfo = async (credential: ICredential): Promise<IAccountInfoCore> => {\n const offers = await getFinanceSavingsBalance(credential, {});\n const equity = offers.data.filter((x) => x.ccy === 'USDT').reduce((acc, x) => acc + +x.amt, 0);\n const free = equity;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n};\n"]}
@@ -0,0 +1,46 @@
1
+ import { encodePath } from '@yuants/utils';
2
+ import { firstValueFrom } from 'rxjs';
3
+ import { getAssetBalances } from '../api/private-api';
4
+ import { marketIndexTickerUSDT$ } from './trading';
5
+ export const getFundingAccountInfo = async (credential) => {
6
+ const [assetBalances, marketIndexTickerUSDT] = await Promise.all([
7
+ getAssetBalances(credential, {}),
8
+ firstValueFrom(marketIndexTickerUSDT$),
9
+ ]);
10
+ const positions = [];
11
+ let equity = 0;
12
+ let free = 0;
13
+ assetBalances.data.forEach((x) => {
14
+ if (x.ccy === 'USDT') {
15
+ const balance = +x.bal;
16
+ equity += balance;
17
+ free += balance;
18
+ return;
19
+ }
20
+ const price = marketIndexTickerUSDT.get(`${x.ccy}-USDT`) || 0;
21
+ const valuation = price * +x.bal || 0;
22
+ const productId = encodePath('SPOT', `${x.ccy}-USDT`);
23
+ positions.push({
24
+ datasource_id: 'OKX',
25
+ position_id: productId,
26
+ product_id: productId,
27
+ direction: 'LONG',
28
+ volume: +x.bal,
29
+ free_volume: +x.bal,
30
+ position_price: price,
31
+ floating_profit: 0,
32
+ closable_price: price,
33
+ valuation,
34
+ });
35
+ equity += valuation;
36
+ });
37
+ return {
38
+ money: {
39
+ currency: 'USDT',
40
+ equity,
41
+ free,
42
+ },
43
+ positions,
44
+ };
45
+ };
46
+ //# sourceMappingURL=funding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funding.js","sourceRoot":"","sources":["../../src/accountInfos/funding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAe,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,UAAuB,EAA6B,EAAE;IAChG,MAAM,CAAC,aAAa,EAAE,qBAAqB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/D,gBAAgB,CAAC,UAAU,EAAE,EAAE,CAAC;QAChC,cAAc,CAAC,sBAAsB,CAAC;KACvC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,EAAE;YACpB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACvB,MAAM,IAAI,OAAO,CAAC;YAClB,IAAI,IAAI,OAAO,CAAC;YAChB,OAAO;SACR;QAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QAEtD,SAAS,CAAC,IAAI,CAAC;YACb,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG;YACd,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG;YACnB,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,KAAK;YACrB,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,IAAI,SAAS,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM;YAChB,MAAM;YACN,IAAI;SACL;QACD,SAAS;KACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { IPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { firstValueFrom } from 'rxjs';\nimport { ICredential, getAssetBalances } from '../api/private-api';\nimport { marketIndexTickerUSDT$ } from './trading';\nimport { IAccountInfoCore } from './types';\n\nexport const getFundingAccountInfo = async (credential: ICredential): Promise<IAccountInfoCore> => {\n const [assetBalances, marketIndexTickerUSDT] = await Promise.all([\n getAssetBalances(credential, {}),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n const positions: IPosition[] = [];\n let equity = 0;\n let free = 0;\n\n assetBalances.data.forEach((x) => {\n if (x.ccy === 'USDT') {\n const balance = +x.bal;\n equity += balance;\n free += balance;\n return;\n }\n\n const price = marketIndexTickerUSDT.get(`${x.ccy}-USDT`) || 0;\n const valuation = price * +x.bal || 0;\n const productId = encodePath('SPOT', `${x.ccy}-USDT`);\n\n positions.push({\n datasource_id: 'OKX',\n position_id: productId,\n product_id: productId,\n direction: 'LONG',\n volume: +x.bal,\n free_volume: +x.bal,\n position_price: price,\n floating_profit: 0,\n closable_price: price,\n valuation,\n });\n\n equity += valuation;\n });\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n};\n"]}
@@ -0,0 +1,7 @@
1
+ export { getTradingAccountInfo } from './trading';
2
+ export { getFundingAccountInfo } from './funding';
3
+ export { getLoanAccountInfo } from './loan';
4
+ export { getEarningAccountInfo } from './earning';
5
+ export { getStrategyAccountInfo } from './strategy';
6
+ export { marketIndexTickerUSDT$ } from './trading';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/accountInfos/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC","sourcesContent":["export { getTradingAccountInfo } from './trading';\nexport { getFundingAccountInfo } from './funding';\nexport { getLoanAccountInfo } from './loan';\nexport { getEarningAccountInfo } from './earning';\nexport { getStrategyAccountInfo } from './strategy';\nexport { marketIndexTickerUSDT$ } from './trading';\nexport { IAccountInfoCore } from './types';\n"]}
@@ -0,0 +1,46 @@
1
+ import { encodePath } from '@yuants/utils';
2
+ import { getFlexibleLoanInfo } from '../api/private-api';
3
+ export const getLoanAccountInfo = async (credential) => {
4
+ const res = await getFlexibleLoanInfo(credential);
5
+ const data = res.data[0];
6
+ const positions = [];
7
+ for (const loan of data.loanData) {
8
+ positions.push({
9
+ datasource_id: 'OKX',
10
+ product_id: `SPOT/${loan.ccy}-USDT`,
11
+ volume: +loan.amt,
12
+ free_volume: +loan.amt,
13
+ position_id: encodePath('loan', loan.ccy),
14
+ direction: 'SHORT',
15
+ position_price: 0,
16
+ closable_price: 0,
17
+ floating_profit: 0,
18
+ valuation: 0,
19
+ });
20
+ }
21
+ for (const collateral of data.collateralData) {
22
+ positions.push({
23
+ datasource_id: 'OKX',
24
+ product_id: `SPOT/${collateral.ccy}-USDT`,
25
+ volume: +collateral.amt,
26
+ free_volume: +collateral.amt,
27
+ position_id: encodePath('collateral', collateral.ccy),
28
+ direction: 'LONG',
29
+ position_price: 0,
30
+ closable_price: 0,
31
+ floating_profit: 0,
32
+ valuation: 0,
33
+ });
34
+ }
35
+ const equity = +data.collateralNotionalUsd - +data.loanNotionalUsd;
36
+ const free = equity - +data.collateralNotionalUsd;
37
+ return {
38
+ money: {
39
+ currency: 'USDT',
40
+ equity,
41
+ free,
42
+ },
43
+ positions,
44
+ };
45
+ };
46
+ //# sourceMappingURL=loan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loan.js","sourceRoot":"","sources":["../../src/accountInfos/loan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAe,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,UAAuB,EAA6B,EAAE;IAC7F,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzB,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;QAChC,SAAS,CAAC,IAAI,CAAC;YACb,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,QAAQ,IAAI,CAAC,GAAG,OAAO;YACnC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;YACjB,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG;YACtB,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;YACzC,SAAS,EAAE,OAAO;YAClB,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;KACJ;IACD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE;QAC5C,SAAS,CAAC,IAAI,CAAC;YACb,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,QAAQ,UAAU,CAAC,GAAG,OAAO;YACzC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG;YACvB,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG;YAC5B,WAAW,EAAE,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC;YACrD,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;YAClB,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;KACJ;IACD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;IACnE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;IAElD,OAAO;QACL,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM;YAChB,MAAM;YACN,IAAI;SACL;QACD,SAAS;KACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { IPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { ICredential, getFlexibleLoanInfo } from '../api/private-api';\nimport { IAccountInfoCore } from './types';\n\nexport const getLoanAccountInfo = async (credential: ICredential): Promise<IAccountInfoCore> => {\n const res = await getFlexibleLoanInfo(credential);\n const data = res.data[0];\n\n const positions: IPosition[] = [];\n for (const loan of data.loanData) {\n positions.push({\n datasource_id: 'OKX',\n product_id: `SPOT/${loan.ccy}-USDT`,\n volume: +loan.amt,\n free_volume: +loan.amt,\n position_id: encodePath('loan', loan.ccy),\n direction: 'SHORT',\n position_price: 0,\n closable_price: 0,\n floating_profit: 0,\n valuation: 0,\n });\n }\n for (const collateral of data.collateralData) {\n positions.push({\n datasource_id: 'OKX',\n product_id: `SPOT/${collateral.ccy}-USDT`,\n volume: +collateral.amt,\n free_volume: +collateral.amt,\n position_id: encodePath('collateral', collateral.ccy),\n direction: 'LONG',\n position_price: 0,\n closable_price: 0,\n floating_profit: 0,\n valuation: 0,\n });\n }\n const equity = +data.collateralNotionalUsd - +data.loanNotionalUsd;\n const free = equity - +data.collateralNotionalUsd;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n};\n"]}
@@ -0,0 +1,56 @@
1
+ import { encodePath } from '@yuants/utils';
2
+ import { getGridOrdersAlgoPending, getGridPositions } from '../api/private-api';
3
+ export const getStrategyAccountInfo = async (credential) => {
4
+ // TODO: 需要分页获取所有的网格订单 (每页 100 条)
5
+ const [gridAlgoOrders] = await Promise.all([
6
+ getGridOrdersAlgoPending(credential, {
7
+ algoOrdType: 'contract_grid',
8
+ }),
9
+ ]);
10
+ let totalEquity = 0;
11
+ const positions = [];
12
+ const gridPositionsRes = await Promise.all(gridAlgoOrders.data.map((item) => getGridPositions(credential, { algoOrdType: 'contract_grid', algoId: item.algoId })));
13
+ gridPositionsRes.forEach((gridPositions, index) => {
14
+ var _a, _b, _c, _d;
15
+ let positionValuation = 0;
16
+ const leverage = +((_a = gridAlgoOrders.data) === null || _a === void 0 ? void 0 : _a[index].actualLever);
17
+ (_b = gridPositions === null || gridPositions === void 0 ? void 0 : gridPositions.data) === null || _b === void 0 ? void 0 : _b.forEach((position) => {
18
+ var _a, _b, _c;
19
+ if (+position.pos !== 0) {
20
+ const directionRaw = (_c = (_b = (_a = gridAlgoOrders.data) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.direction) !== null && _c !== void 0 ? _c : '';
21
+ const direction = directionRaw ? directionRaw.toUpperCase() : 'LONG';
22
+ positions.push({
23
+ position_id: encodePath(position.algoId, position.instId),
24
+ datasource_id: 'OKX',
25
+ product_id: encodePath(position.instType, position.instId),
26
+ direction,
27
+ volume: Math.abs(+position.pos),
28
+ free_volume: +position.pos,
29
+ position_price: +position.avgPx,
30
+ floating_profit: +position.upl,
31
+ closable_price: +position.last,
32
+ valuation: +position.notionalUsd,
33
+ });
34
+ positionValuation += +position.notionalUsd;
35
+ }
36
+ });
37
+ if (leverage === 0) {
38
+ // 实际杠杆为 0,说明没有持仓,直接把投资金额和累计盈亏算到净值里
39
+ totalEquity += +((_c = gridAlgoOrders.data) === null || _c === void 0 ? void 0 : _c[index].investment) + +((_d = gridAlgoOrders.data) === null || _d === void 0 ? void 0 : _d[index].totalPnl);
40
+ }
41
+ else {
42
+ // 历史提取金额不会从 investment, totalPnl 扣减
43
+ // 计算净值需要通过仓位的名义价值和实际杠杆计算
44
+ totalEquity += positionValuation / leverage;
45
+ }
46
+ });
47
+ return {
48
+ money: {
49
+ currency: 'USDT',
50
+ equity: totalEquity,
51
+ free: 0, // TODO: 累计策略的可提取资金作为 free
52
+ },
53
+ positions,
54
+ };
55
+ };
56
+ //# sourceMappingURL=strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../src/accountInfos/strategy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAe,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG7F,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,UAAuB,EAA6B,EAAE;IACjG,iCAAiC;IACjC,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,wBAAwB,CAAC,UAAU,EAAE;YACnC,WAAW,EAAE,eAAe;SAC7B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,SAAS,GAAgB,EAAE,CAAC;IAElC,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,gBAAgB,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CACpF,CACF,CAAC;IAEF,gBAAgB,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE;;QAChD,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,CAAC,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAG,KAAK,EAAE,WAAW,CAAA,CAAC;QAC3D,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,IAAI,0CAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;;YACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,EAAE;gBACvB,MAAM,YAAY,GAAG,MAAA,MAAA,MAAA,cAAc,CAAC,IAAI,0CAAG,KAAK,CAAC,0CAAE,SAAS,mCAAI,EAAE,CAAC;gBACnE,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;gBACrE,SAAS,CAAC,IAAI,CAAC;oBACb,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;oBACzD,aAAa,EAAE,KAAK;oBACpB,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC;oBAC1D,SAAS;oBACT,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAC/B,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG;oBAC1B,cAAc,EAAE,CAAC,QAAQ,CAAC,KAAK;oBAC/B,eAAe,EAAE,CAAC,QAAQ,CAAC,GAAG;oBAC9B,cAAc,EAAE,CAAC,QAAQ,CAAC,IAAI;oBAC9B,SAAS,EAAE,CAAC,QAAQ,CAAC,WAAW;iBACjC,CAAC,CAAC;gBACH,iBAAiB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;aAC5C;QACH,CAAC,CAAC,CAAC;QACH,IAAI,QAAQ,KAAK,CAAC,EAAE;YAClB,mCAAmC;YACnC,WAAW,IAAI,CAAC,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAG,KAAK,EAAE,UAAU,CAAA,GAAG,CAAC,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAG,KAAK,EAAE,QAAQ,CAAA,CAAC;SAClG;aAAM;YACL,oCAAoC;YACpC,yBAAyB;YACzB,WAAW,IAAI,iBAAiB,GAAG,QAAQ,CAAC;SAC7C;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,CAAC,EAAE,0BAA0B;SACpC;QACD,SAAS;KACV,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { IPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { ICredential, getGridOrdersAlgoPending, getGridPositions } from '../api/private-api';\nimport { IAccountInfoCore } from './types';\n\nexport const getStrategyAccountInfo = async (credential: ICredential): Promise<IAccountInfoCore> => {\n // TODO: 需要分页获取所有的网格订单 (每页 100 条)\n const [gridAlgoOrders] = await Promise.all([\n getGridOrdersAlgoPending(credential, {\n algoOrdType: 'contract_grid',\n }),\n ]);\n\n let totalEquity = 0;\n const positions: IPosition[] = [];\n\n const gridPositionsRes = await Promise.all(\n gridAlgoOrders.data.map((item) =>\n getGridPositions(credential, { algoOrdType: 'contract_grid', algoId: item.algoId }),\n ),\n );\n\n gridPositionsRes.forEach((gridPositions, index) => {\n let positionValuation = 0;\n const leverage = +gridAlgoOrders.data?.[index].actualLever;\n gridPositions?.data?.forEach((position) => {\n if (+position.pos !== 0) {\n const directionRaw = gridAlgoOrders.data?.[index]?.direction ?? '';\n const direction = directionRaw ? directionRaw.toUpperCase() : 'LONG';\n positions.push({\n position_id: encodePath(position.algoId, position.instId),\n datasource_id: 'OKX',\n product_id: encodePath(position.instType, position.instId),\n direction,\n volume: Math.abs(+position.pos),\n free_volume: +position.pos,\n position_price: +position.avgPx,\n floating_profit: +position.upl,\n closable_price: +position.last,\n valuation: +position.notionalUsd,\n });\n positionValuation += +position.notionalUsd;\n }\n });\n if (leverage === 0) {\n // 实际杠杆为 0,说明没有持仓,直接把投资金额和累计盈亏算到净值里\n totalEquity += +gridAlgoOrders.data?.[index].investment + +gridAlgoOrders.data?.[index].totalPnl;\n } else {\n // 历史提取金额不会从 investment, totalPnl 扣减\n // 计算净值需要通过仓位的名义价值和实际杠杆计算\n totalEquity += positionValuation / leverage;\n }\n });\n\n return {\n money: {\n currency: 'USDT',\n equity: totalEquity,\n free: 0, // TODO: 累计策略的可提取资金作为 free\n },\n positions,\n };\n};\n"]}
@@ -0,0 +1,84 @@
1
+ import { encodePath } from '@yuants/utils';
2
+ import { defer, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';
3
+ import { getAccountBalance, getAccountPositions } from '../api/private-api';
4
+ import { getMarketIndexTicker } from '../api/public-api';
5
+ import { productService } from '../public-data/product';
6
+ export const marketIndexTickerUSDT$ = defer(() => getMarketIndexTicker({ quoteCcy: 'USDT' })).pipe(map((x) => {
7
+ const mapInstIdToPrice = new Map();
8
+ x.data.forEach((inst) => mapInstIdToPrice.set(inst.instId, Number(inst.idxPx)));
9
+ return mapInstIdToPrice;
10
+ }), repeat({ delay: 1000 }), retry({ delay: 5000 }), shareReplay(1));
11
+ export const getTradingAccountInfo = async (credential) => {
12
+ var _a;
13
+ const [positionsApi, balanceApi, mapProductIdToProduct, marketIndexTickerUSDT] = await Promise.all([
14
+ getAccountPositions(credential, {}),
15
+ getAccountBalance(credential, {}),
16
+ firstValueFrom(productService.mapProductIdToProduct$),
17
+ firstValueFrom(marketIndexTickerUSDT$),
18
+ ]);
19
+ let totalEquity = 0;
20
+ let totalFree = 0;
21
+ const positions = [];
22
+ (_a = balanceApi.data[0]) === null || _a === void 0 ? void 0 : _a.details.forEach((detail) => {
23
+ var _a, _b, _c, _d, _e, _f;
24
+ if (detail.ccy === 'USDT') {
25
+ const balance = +((_a = detail.cashBal) !== null && _a !== void 0 ? _a : 0);
26
+ const free = Math.min(balance, // free should no more than balance if there is much profits
27
+ +((_b = detail.availEq) !== null && _b !== void 0 ? _b : 0));
28
+ const equity = +((_c = detail.eq) !== null && _c !== void 0 ? _c : 0) - +((_d = detail.stgyEq) !== null && _d !== void 0 ? _d : 0);
29
+ totalEquity += equity;
30
+ totalFree += free;
31
+ }
32
+ else {
33
+ const volume = +((_e = detail.cashBal) !== null && _e !== void 0 ? _e : 0);
34
+ const free_volume = Math.min(volume, // free should no more than balance if there is much profits
35
+ +((_f = detail.availEq) !== null && _f !== void 0 ? _f : 0));
36
+ const closable_price = marketIndexTickerUSDT.get(detail.ccy + '-USDT') || 0;
37
+ const delta_equity = volume * closable_price || 0;
38
+ const delta_profit = +detail.totalPnl || 0;
39
+ const product_id = encodePath('SPOT', `${detail.ccy}-USDT`);
40
+ positions.push({
41
+ position_id: product_id,
42
+ datasource_id: 'OKX',
43
+ product_id: product_id,
44
+ direction: 'LONG',
45
+ volume: volume,
46
+ free_volume: free_volume,
47
+ position_price: +detail.accAvgPx,
48
+ floating_profit: delta_profit,
49
+ closable_price: closable_price,
50
+ valuation: delta_equity,
51
+ });
52
+ totalEquity += delta_equity;
53
+ }
54
+ });
55
+ positionsApi.data.forEach((x) => {
56
+ var _a, _b;
57
+ const direction = x.posSide === 'long' ? 'LONG' : x.posSide === 'short' ? 'SHORT' : +x.pos > 0 ? 'LONG' : 'SHORT';
58
+ const volume = Math.abs(+x.pos);
59
+ const product_id = encodePath(x.instType, x.instId);
60
+ const closable_price = +x.last;
61
+ const valuation = ((_b = (_a = mapProductIdToProduct.get(product_id)) === null || _a === void 0 ? void 0 : _a.value_scale) !== null && _b !== void 0 ? _b : 1) * volume * closable_price || 0;
62
+ positions.push({
63
+ position_id: x.posId,
64
+ datasource_id: 'OKX',
65
+ product_id,
66
+ direction,
67
+ volume: volume,
68
+ free_volume: +x.availPos,
69
+ closable_price,
70
+ position_price: +x.avgPx,
71
+ floating_profit: +x.upl,
72
+ valuation,
73
+ });
74
+ });
75
+ return {
76
+ money: {
77
+ currency: 'USDT',
78
+ equity: totalEquity,
79
+ free: totalFree,
80
+ },
81
+ positions: positions,
82
+ };
83
+ };
84
+ //# sourceMappingURL=trading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading.js","sourceRoot":"","sources":["../../src/accountInfos/trading.ts"],"names":[],"mappings":"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","sourcesContent":["import { IPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { defer, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';\nimport { ICredential, getAccountBalance, getAccountPositions } from '../api/private-api';\nimport { getMarketIndexTicker } from '../api/public-api';\nimport { productService } from '../public-data/product';\nimport { IAccountInfoCore } from './types';\n\nexport const marketIndexTickerUSDT$ = defer(() => getMarketIndexTicker({ quoteCcy: 'USDT' })).pipe(\n map((x) => {\n const mapInstIdToPrice = new Map<string, number>();\n x.data.forEach((inst: any) => mapInstIdToPrice.set(inst.instId, Number(inst.idxPx)));\n return mapInstIdToPrice;\n }),\n repeat({ delay: 1000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\nexport const getTradingAccountInfo = async (credential: ICredential): Promise<IAccountInfoCore> => {\n const [positionsApi, balanceApi, mapProductIdToProduct, marketIndexTickerUSDT] = await Promise.all([\n getAccountPositions(credential, {}),\n getAccountBalance(credential, {}),\n firstValueFrom(productService.mapProductIdToProduct$),\n firstValueFrom(marketIndexTickerUSDT$),\n ]);\n\n let totalEquity = 0;\n let totalFree = 0;\n const positions: IPosition[] = [];\n\n balanceApi.data[0]?.details.forEach((detail) => {\n if (detail.ccy === 'USDT') {\n const balance = +(detail.cashBal ?? 0);\n const free = Math.min(\n balance, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const equity = +(detail.eq ?? 0) - +(detail.stgyEq ?? 0);\n totalEquity += equity;\n totalFree += free;\n } else {\n const volume = +(detail.cashBal ?? 0);\n const free_volume = Math.min(\n volume, // free should no more than balance if there is much profits\n +(detail.availEq ?? 0),\n );\n const closable_price = marketIndexTickerUSDT.get(detail.ccy + '-USDT') || 0;\n const delta_equity = volume * closable_price || 0;\n const delta_profit = +detail.totalPnl || 0;\n\n const product_id = encodePath('SPOT', `${detail.ccy}-USDT`);\n positions.push({\n position_id: product_id,\n datasource_id: 'OKX',\n product_id: product_id,\n direction: 'LONG',\n volume: volume,\n free_volume: free_volume,\n position_price: +detail.accAvgPx,\n floating_profit: delta_profit,\n closable_price: closable_price,\n valuation: delta_equity,\n });\n\n totalEquity += delta_equity;\n }\n });\n positionsApi.data.forEach((x) => {\n const direction =\n x.posSide === 'long' ? 'LONG' : x.posSide === 'short' ? 'SHORT' : +x.pos > 0 ? 'LONG' : 'SHORT';\n const volume = Math.abs(+x.pos);\n const product_id = encodePath(x.instType, x.instId);\n const closable_price = +x.last;\n const valuation =\n (mapProductIdToProduct.get(product_id)?.value_scale ?? 1) * volume * closable_price || 0;\n\n positions.push({\n position_id: x.posId,\n datasource_id: 'OKX',\n product_id,\n direction,\n volume: volume,\n free_volume: +x.availPos,\n closable_price,\n position_price: +x.avgPx,\n floating_profit: +x.upl,\n valuation,\n });\n });\n return {\n money: {\n currency: 'USDT',\n equity: totalEquity,\n free: totalFree,\n },\n positions: positions,\n };\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/accountInfos/types.ts"],"names":[],"mappings":"","sourcesContent":["import { IAccountMoney, IPosition } from '@yuants/data-account';\n\nexport interface IAccountInfoCore {\n money: Pick<IAccountMoney, 'currency' | 'equity' | 'free'>;\n positions: IPosition[];\n}\n"]}
@@ -446,4 +446,4 @@ export function getGridOrdersAlgoPending(credential, param) {
446
446
  export function getGridPositions(credential, param) {
447
447
  return request(credential, 'GET', '/api/v5/tradingBot/grid/positions', param);
448
448
  }
449
- //# sourceMappingURL=api.js.map
449
+ //# sourceMappingURL=private-api.js.map