@yuants/vendor-okx 0.23.24 → 0.23.26
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/account.js +16 -138
- package/dist/account.js.map +1 -1
- package/dist/accountInfos/earning.js +15 -0
- package/dist/accountInfos/earning.js.map +1 -0
- package/dist/accountInfos/funding.js +46 -0
- package/dist/accountInfos/funding.js.map +1 -0
- package/dist/accountInfos/index.js +7 -0
- package/dist/accountInfos/index.js.map +1 -0
- package/dist/accountInfos/loan.js +46 -0
- package/dist/accountInfos/loan.js.map +1 -0
- package/dist/accountInfos/strategy.js +56 -0
- package/dist/accountInfos/strategy.js.map +1 -0
- package/dist/accountInfos/trading.js +84 -0
- package/dist/accountInfos/trading.js.map +1 -0
- package/dist/accountInfos/types.js +2 -0
- package/dist/accountInfos/types.js.map +1 -0
- package/dist/api.js +444 -402
- package/dist/api.js.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/loan-account.js +4 -45
- package/dist/loan-account.js.map +1 -1
- package/dist/market-order.js +1 -1
- package/dist/market-order.js.map +1 -1
- package/dist/order-actions.js +39 -0
- package/dist/order-actions.js.map +1 -0
- package/dist/order.js +3 -3
- package/dist/order.js.map +1 -1
- package/dist/orders/cancelOrder.js +13 -0
- package/dist/orders/cancelOrder.js.map +1 -0
- package/dist/orders/modifyOrder.js +58 -0
- package/dist/orders/modifyOrder.js.map +1 -0
- package/dist/orders/submitOrder.js +107 -0
- package/dist/orders/submitOrder.js.map +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/quote.js.map +1 -1
- package/dist/services.js +3 -2
- package/dist/services.js.map +1 -1
- package/dist/strategy-account.js +8 -61
- package/dist/strategy-account.js.map +1 -1
- package/dist/trade.js +6 -5
- package/dist/trade.js.map +1 -1
- package/dist/transfer.js +279 -0
- package/dist/transfer.js.map +1 -0
- package/dist/websocket.js.map +1 -1
- package/lib/account.d.ts +4 -2
- package/lib/account.d.ts.map +1 -1
- package/lib/account.js +15 -138
- package/lib/account.js.map +1 -1
- package/lib/accountInfos/earning.d.ts +4 -0
- package/lib/accountInfos/earning.d.ts.map +1 -0
- package/lib/accountInfos/earning.js +19 -0
- package/lib/accountInfos/earning.js.map +1 -0
- package/lib/accountInfos/funding.d.ts +4 -0
- package/lib/accountInfos/funding.d.ts.map +1 -0
- package/lib/accountInfos/funding.js +50 -0
- package/lib/accountInfos/funding.js.map +1 -0
- package/lib/accountInfos/index.d.ts +8 -0
- package/lib/accountInfos/index.d.ts.map +1 -0
- package/lib/accountInfos/index.js +16 -0
- package/lib/accountInfos/index.js.map +1 -0
- package/lib/accountInfos/loan.d.ts +4 -0
- package/lib/accountInfos/loan.d.ts.map +1 -0
- package/lib/accountInfos/loan.js +50 -0
- package/lib/accountInfos/loan.js.map +1 -0
- package/lib/accountInfos/strategy.d.ts +4 -0
- package/lib/accountInfos/strategy.d.ts.map +1 -0
- package/lib/accountInfos/strategy.js +60 -0
- package/lib/accountInfos/strategy.js.map +1 -0
- package/lib/accountInfos/trading.d.ts +5 -0
- package/lib/accountInfos/trading.d.ts.map +1 -0
- package/lib/accountInfos/trading.js +88 -0
- package/lib/accountInfos/trading.js.map +1 -0
- package/lib/accountInfos/types.d.ts +6 -0
- package/lib/accountInfos/types.d.ts.map +1 -0
- package/lib/accountInfos/types.js +3 -0
- package/lib/accountInfos/types.js.map +1 -0
- package/lib/api.d.ts +1252 -1264
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +477 -404
- package/lib/api.js.map +1 -1
- package/lib/index.d.ts +5 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -4
- package/lib/index.js.map +1 -1
- package/lib/loan-account.js +3 -44
- package/lib/loan-account.js.map +1 -1
- package/lib/market-order.d.ts.map +1 -1
- package/lib/market-order.js +1 -1
- package/lib/market-order.js.map +1 -1
- package/lib/order-actions.d.ts +2 -0
- package/lib/order-actions.d.ts.map +1 -0
- package/lib/order-actions.js +41 -0
- package/lib/order-actions.js.map +1 -0
- package/lib/order.js +2 -2
- package/lib/order.js.map +1 -1
- package/lib/orders/cancelOrder.d.ts +4 -0
- package/lib/orders/cancelOrder.d.ts.map +1 -0
- package/lib/orders/cancelOrder.js +17 -0
- package/lib/orders/cancelOrder.js.map +1 -0
- package/lib/orders/modifyOrder.d.ts +4 -0
- package/lib/orders/modifyOrder.d.ts.map +1 -0
- package/lib/orders/modifyOrder.js +62 -0
- package/lib/orders/modifyOrder.js.map +1 -0
- package/lib/orders/submitOrder.d.ts +4 -0
- package/lib/orders/submitOrder.d.ts.map +1 -0
- package/lib/orders/submitOrder.js +111 -0
- package/lib/orders/submitOrder.js.map +1 -0
- package/lib/public-api.js.map +1 -1
- package/lib/quote.d.ts +1 -1
- package/lib/quote.d.ts.map +1 -1
- package/lib/quote.js.map +1 -1
- package/lib/services.js +2 -1
- package/lib/services.js.map +1 -1
- package/lib/strategy-account.d.ts +2 -2
- package/lib/strategy-account.d.ts.map +1 -1
- package/lib/strategy-account.js +7 -60
- package/lib/strategy-account.js.map +1 -1
- package/lib/trade.js +6 -5
- package/lib/trade.js.map +1 -1
- package/lib/transfer.d.ts +2 -0
- package/lib/transfer.d.ts.map +1 -0
- package/lib/transfer.js +281 -0
- package/lib/transfer.js.map +1 -0
- package/lib/websocket.js.map +1 -1
- package/package.json +13 -12
- package/temp/package-deps.json +40 -29
- package/dist/legacy_index.js +0 -563
- package/dist/legacy_index.js.map +0 -1
- package/dist/logger.js +0 -91
- package/dist/logger.js.map +0 -1
- package/lib/legacy_index.d.ts +0 -2
- package/lib/legacy_index.d.ts.map +0 -1
- package/lib/legacy_index.js +0 -565
- package/lib/legacy_index.js.map +0 -1
- package/lib/logger.d.ts +0 -21
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js +0 -98
- package/lib/logger.js.map +0 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { decodePath, formatTime, roundToStep } from '@yuants/utils';
|
|
2
|
+
import { firstValueFrom, map } from 'rxjs';
|
|
3
|
+
import { postTradeOrder } from '../api';
|
|
4
|
+
import { productService } from '../product';
|
|
5
|
+
import { spotMarketTickers$ } from '../quote';
|
|
6
|
+
const mapOrderDirectionToSide = (direction) => {
|
|
7
|
+
switch (direction) {
|
|
8
|
+
case 'OPEN_LONG':
|
|
9
|
+
case 'CLOSE_SHORT':
|
|
10
|
+
return 'buy';
|
|
11
|
+
case 'OPEN_SHORT':
|
|
12
|
+
case 'CLOSE_LONG':
|
|
13
|
+
return 'sell';
|
|
14
|
+
}
|
|
15
|
+
throw new Error(`Unknown direction: ${direction}`);
|
|
16
|
+
};
|
|
17
|
+
const mapOrderDirectionToPosSide = (direction) => {
|
|
18
|
+
switch (direction) {
|
|
19
|
+
case 'OPEN_LONG':
|
|
20
|
+
case 'CLOSE_LONG':
|
|
21
|
+
return 'long';
|
|
22
|
+
case 'CLOSE_SHORT':
|
|
23
|
+
case 'OPEN_SHORT':
|
|
24
|
+
return 'short';
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`Unknown direction: ${direction}`);
|
|
27
|
+
};
|
|
28
|
+
const mapOrderTypeToOrdType = (order_type) => {
|
|
29
|
+
switch (order_type) {
|
|
30
|
+
case 'LIMIT':
|
|
31
|
+
return 'limit';
|
|
32
|
+
case 'MARKET':
|
|
33
|
+
return 'market';
|
|
34
|
+
case 'MAKER':
|
|
35
|
+
return 'post_only';
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Unknown order type: ${order_type}`);
|
|
38
|
+
};
|
|
39
|
+
export const submitOrder = async (credential, order) => {
|
|
40
|
+
var _a, _b, _c;
|
|
41
|
+
const [instType, instId] = decodePath(order.product_id);
|
|
42
|
+
// 交易数量,表示要购买或者出售的数量。
|
|
43
|
+
// 当币币/币币杠杆以限价买入和卖出时,指交易货币数量。
|
|
44
|
+
// 当币币杠杆以市价买入时,指计价货币的数量。
|
|
45
|
+
// 当币币杠杆以市价卖出时,指交易货币的数量。
|
|
46
|
+
// 对于币币市价单,单位由 tgtCcy 决定
|
|
47
|
+
// 当交割、永续、期权买入和卖出时,指合约张数。
|
|
48
|
+
const mapOrderVolumeToSz = async (order) => {
|
|
49
|
+
if (instType === 'SWAP') {
|
|
50
|
+
return order.volume;
|
|
51
|
+
}
|
|
52
|
+
if (instType === 'MARGIN') {
|
|
53
|
+
if (order.order_type === 'LIMIT') {
|
|
54
|
+
return order.volume;
|
|
55
|
+
}
|
|
56
|
+
if (order.order_type === 'MAKER') {
|
|
57
|
+
return order.volume;
|
|
58
|
+
}
|
|
59
|
+
if (order.order_type === 'MARKET') {
|
|
60
|
+
if (order.order_direction === 'OPEN_SHORT' || order.order_direction === 'CLOSE_LONG') {
|
|
61
|
+
return order.volume;
|
|
62
|
+
}
|
|
63
|
+
//
|
|
64
|
+
const price = await firstValueFrom(spotMarketTickers$.pipe(map((x) => mapOrderDirectionToPosSide(order.order_direction) === 'long'
|
|
65
|
+
? +x[instId].askPx
|
|
66
|
+
: +x[instId].bidPx)));
|
|
67
|
+
if (!price) {
|
|
68
|
+
throw new Error(`invalid tick: ${price}`);
|
|
69
|
+
}
|
|
70
|
+
console.info(formatTime(Date.now()), 'SubmitOrder', 'price', price);
|
|
71
|
+
const theProduct = await firstValueFrom(productService.mapProductIdToProduct$.pipe(map((x) => x.get(order.product_id))));
|
|
72
|
+
if (!theProduct) {
|
|
73
|
+
throw new Error(`Unknown product: ${order.position_id}`);
|
|
74
|
+
}
|
|
75
|
+
return roundToStep(order.volume * price, theProduct.volume_step);
|
|
76
|
+
}
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
if (instType === 'SPOT') {
|
|
80
|
+
return order.volume;
|
|
81
|
+
}
|
|
82
|
+
throw new Error(`Unknown instType: ${instType}`);
|
|
83
|
+
};
|
|
84
|
+
const params = {
|
|
85
|
+
instId,
|
|
86
|
+
tdMode: instType === 'SPOT' ? 'cash' : 'cross',
|
|
87
|
+
side: mapOrderDirectionToSide(order.order_direction),
|
|
88
|
+
posSide: instType === 'MARGIN' || instType === 'SPOT'
|
|
89
|
+
? 'net'
|
|
90
|
+
: mapOrderDirectionToPosSide(order.order_direction),
|
|
91
|
+
ordType: mapOrderTypeToOrdType(order.order_type),
|
|
92
|
+
sz: (await mapOrderVolumeToSz(order)).toString(),
|
|
93
|
+
tgtCcy: instType === 'SPOT' && order.order_type === 'MARKET' ? 'base_ccy' : undefined,
|
|
94
|
+
reduceOnly: instType === 'MARGIN' && ['CLOSE_LONG', 'CLOSE_SHORT'].includes((_a = order.order_direction) !== null && _a !== void 0 ? _a : '')
|
|
95
|
+
? 'true'
|
|
96
|
+
: undefined,
|
|
97
|
+
px: order.order_type === 'LIMIT' || order.order_type === 'MAKER' ? order.price.toString() : undefined,
|
|
98
|
+
ccy: instType === 'MARGIN' ? 'USDT' : undefined,
|
|
99
|
+
};
|
|
100
|
+
console.info(formatTime(Date.now()), 'SubmitOrder', 'params', JSON.stringify(params));
|
|
101
|
+
const res = await postTradeOrder(credential, params);
|
|
102
|
+
if (res.code === '0' && ((_c = (_b = res.data) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.ordId)) {
|
|
103
|
+
return res.data[0].ordId;
|
|
104
|
+
}
|
|
105
|
+
throw `Failed to submit order: ${res.code} ${res.msg}`;
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=submitOrder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submitOrder.js","sourceRoot":"","sources":["../../src/orders/submitOrder.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { decodePath, formatTime, roundToStep } from '@yuants/utils';\nimport { firstValueFrom, map } from 'rxjs';\nimport { ICredential, postTradeOrder } from '../api';\nimport { productService } from '../product';\nimport { spotMarketTickers$ } from '../quote';\n\nconst mapOrderDirectionToSide = (direction?: string) => {\n switch (direction) {\n case 'OPEN_LONG':\n case 'CLOSE_SHORT':\n return 'buy';\n case 'OPEN_SHORT':\n case 'CLOSE_LONG':\n return 'sell';\n }\n throw new Error(`Unknown direction: ${direction}`);\n};\n\nconst mapOrderDirectionToPosSide = (direction?: string) => {\n switch (direction) {\n case 'OPEN_LONG':\n case 'CLOSE_LONG':\n return 'long';\n case 'CLOSE_SHORT':\n case 'OPEN_SHORT':\n return 'short';\n }\n throw new Error(`Unknown direction: ${direction}`);\n};\n\nconst mapOrderTypeToOrdType = (order_type?: string) => {\n switch (order_type) {\n case 'LIMIT':\n return 'limit';\n case 'MARKET':\n return 'market';\n case 'MAKER':\n return 'post_only';\n }\n throw new Error(`Unknown order type: ${order_type}`);\n};\n\nexport const submitOrder = async (credential: ICredential, order: IOrder): Promise<string> => {\n const [instType, instId] = decodePath(order.product_id);\n\n // 交易数量,表示要购买或者出售的数量。\n // 当币币/币币杠杆以限价买入和卖出时,指交易货币数量。\n // 当币币杠杆以市价买入时,指计价货币的数量。\n // 当币币杠杆以市价卖出时,指交易货币的数量。\n // 对于币币市价单,单位由 tgtCcy 决定\n // 当交割、永续、期权买入和卖出时,指合约张数。\n const mapOrderVolumeToSz = async (order: IOrder) => {\n if (instType === 'SWAP') {\n return order.volume;\n }\n if (instType === 'MARGIN') {\n if (order.order_type === 'LIMIT') {\n return order.volume;\n }\n if (order.order_type === 'MAKER') {\n return order.volume;\n }\n if (order.order_type === 'MARKET') {\n if (order.order_direction === 'OPEN_SHORT' || order.order_direction === 'CLOSE_LONG') {\n return order.volume;\n }\n //\n const price = await firstValueFrom(\n spotMarketTickers$.pipe(\n map((x) =>\n mapOrderDirectionToPosSide(order.order_direction) === 'long'\n ? +x[instId].askPx\n : +x[instId].bidPx,\n ),\n ),\n );\n if (!price) {\n throw new Error(`invalid tick: ${price}`);\n }\n console.info(formatTime(Date.now()), 'SubmitOrder', 'price', price);\n const theProduct = await firstValueFrom(\n productService.mapProductIdToProduct$.pipe(map((x) => x.get(order.product_id))),\n );\n if (!theProduct) {\n throw new Error(`Unknown product: ${order.position_id}`);\n }\n return roundToStep(order.volume * price, theProduct.volume_step!);\n }\n\n return 0;\n }\n\n if (instType === 'SPOT') {\n return order.volume;\n }\n\n throw new Error(`Unknown instType: ${instType}`);\n };\n\n const params = {\n instId,\n tdMode: instType === 'SPOT' ? 'cash' : 'cross',\n side: mapOrderDirectionToSide(order.order_direction),\n posSide:\n instType === 'MARGIN' || instType === 'SPOT'\n ? 'net'\n : mapOrderDirectionToPosSide(order.order_direction),\n ordType: mapOrderTypeToOrdType(order.order_type),\n sz: (await mapOrderVolumeToSz(order)).toString(),\n tgtCcy: instType === 'SPOT' && order.order_type === 'MARKET' ? 'base_ccy' : undefined,\n reduceOnly:\n instType === 'MARGIN' && ['CLOSE_LONG', 'CLOSE_SHORT'].includes(order.order_direction ?? '')\n ? 'true'\n : undefined,\n px: order.order_type === 'LIMIT' || order.order_type === 'MAKER' ? order.price!.toString() : undefined,\n ccy: instType === 'MARGIN' ? 'USDT' : undefined,\n };\n console.info(formatTime(Date.now()), 'SubmitOrder', 'params', JSON.stringify(params));\n const res = await postTradeOrder(credential, params);\n if (res.code === '0' && res.data?.[0]?.ordId) {\n return res.data[0].ordId;\n }\n throw `Failed to submit order: ${res.code} ${res.msg}`;\n};\n"]}
|
package/dist/public-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatTime } from '@yuants/utils';\n\n/**\n * 基础公共请求函数\n */\nasync function publicRequest(method: string, path: string, params?: any) {\n const url = new URL('https://www.okx.com');\n url.pathname = path;\n if (method === 'GET') {\n for (const key in params) {\n url.searchParams.set(key, params[key]);\n }\n }\n\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n return res.json();\n}\n\n/**\n * 获取所有产品行情信息\n *\n * 获取产品行情信息\n *\n * 限速:20次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-tickers\n */\nexport const getMarketTickers = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instType: string;\n instId: string;\n last: string;\n lastSz: string;\n askPx: string;\n askSz: string;\n bidPx: string;\n bidSz: string;\n open24h: string;\n high24h: string;\n low24h: string;\n volCcy24h: string;\n vol24h: string;\n sodUtc0: string;\n sodUtc8: string;\n ts: string;\n }>;\n}> => publicRequest('GET', '/api/v5/market/tickers', params);\n\n/**\n * 获取交易产品基础信息\n *\n * 获取所有可交易产品的信息列表。\n *\n * 限速:20次/2s\n * 限速规则:IP +instType\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-instruments\n */\nexport const getInstruments = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n alias: string;\n baseCcy: string;\n category: string;\n ctMult: string;\n ctType: string;\n ctVal: string;\n ctValCcy: string;\n expTime: string;\n instFamily: string;\n instId: string;\n instType: string;\n lever: string;\n listTime: string;\n lotSz: string;\n maxIcebergSz: string;\n maxLmtAmt: string;\n maxLmtSz: string;\n maxMktAmt: string;\n maxMktSz: string;\n maxStopSz: string;\n maxTriggerSz: string;\n maxTwapSz: string;\n minSz: string;\n optType: string;\n quoteCcy: string;\n settleCcy: string;\n state: string;\n stk: string;\n tickSz: string;\n uly: string;\n }>;\n}> => publicRequest('GET', '/api/v5/public/instruments', params);\n\n/**\n * 获取永续合约当前资金费率\n *\n * 获取当前资金费率\n *\n * 限速:20次/2s\n * 限速规则:IP +instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate\n */\nexport const getFundingRate = (params: {\n instId: string;\n}): Promise<{\n code: string;\n data: Array<{\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n maxFundingRate: string;\n minFundingRate: string;\n nextFundingRate: string;\n nextFundingTime: string;\n premium: string;\n settFundingRate: string;\n settState: string;\n ts: string;\n }>;\n msg: string;\n}> => publicRequest('GET', '/api/v5/public/funding-rate', params);\n\n/**\n * 获取永续合约历史资金费率\n *\n * 获取最近3个月的历史资金费率\n *\n * 限速:10次/2s\n * 限速规则:IP +instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate-history\n */\nexport const getFundingRateHistory = (params: {\n instId: string;\n before?: string;\n after?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n realizedRate: string;\n }>;\n}> => publicRequest('GET', '/api/v5/public/funding-rate-history', params);\n\n/**\n * 获取标记价格历史K线数据\n *\n * 获取最近几年的标记价格K线数据\n *\n * 限速:10次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-mark-price-candlesticks-history\n */\nexport const getHistoryMarkPriceCandles = (params: {\n instId: string;\n bar?: string;\n after?: string;\n before?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<[ts: string, o: string, h: string, l: string, c: string, confirm: string]>;\n}> => publicRequest('GET', '/api/v5/market/history-mark-price-candles', params);\n\n/**\n * 获取交易产品历史K线数据\n *\n * 获取最近几年的历史k线数据(1s k线支持查询最近3个月的数据)\n *\n * 限速:20次/2s\n * 限速规则:IP\n *\n * 期权不支持 1s K线, 其他业务线 (币币, 杠杆, 交割和永续)支持\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-candlesticks-history\n */\nexport const getHistoryCandles = (params: {\n instId: string;\n bar?: string;\n after?: string;\n before?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<\n [\n ts: string,\n o: string,\n h: string,\n l: string,\n c: string,\n vol: string,\n volCcy: string,\n volCcyQuote: string,\n confirm: string,\n ]\n >;\n}> => publicRequest('GET', '/api/v5/market/history-candles', params);\n\n/**\n * 获取持仓总量\n *\n * 查询单个交易产品的市场的持仓总量\n *\n * 限速:20次/2s\n * 限速规则:IP + instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-open-interest\n */\nexport const getOpenInterest = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n instId: string;\n oi: string;\n oiCcy: string;\n ts: string;\n }[];\n}> => publicRequest('GET', '/api/v5/public/open-interest', params);\n\n/**\n * 获取市场借币杠杆利率和借币限额\n *\n * 限速:2次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-interest-rate-and-loan-quota\n */\nexport const getInterestRateLoanQuota = (): Promise<{\n code: string;\n data?: Array<{\n basic: Array<{\n ccy: string;\n rate: string;\n quota: string;\n }>;\n vip: Array<{\n loanQuotaCoef: string;\n level: string;\n }>;\n regular: Array<{\n loanQuotaCoef: string;\n level: string;\n }>;\n }>;\n}> => publicRequest('GET', '/api/v5/public/interest-rate-loan-quota');\n\n/**\n * 获取市场借贷历史(公共)\n *\n * 公共接口无须鉴权\n *\n * 返回2021年12月14日后的记录\n *\n * 限速:6次/s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-public-borrow-history-public\n */\nexport const getLendingRateHistory = (params: {\n ccy?: string;\n after?: string;\n before?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n ccy: string;\n amt: string;\n rate: string;\n ts: string;\n }>;\n}> => publicRequest('GET', '/api/v5/finance/savings/lending-rate-history', params);\n\n/**\n * 获取指数行情数据\n *\n * 限速:20次/2s\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-index-tickers\n */\nexport const getMarketIndexTicker = (params?: {\n quoteCcy?: string;\n instId?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: {\n instId: string;\n idxPx: string;\n high24h: string;\n sodUtc0: string;\n open24h: string;\n low24h: string;\n sodUtc8: string;\n ts: string;\n }[];\n}> => publicRequest('GET', '/api/v5/market/index-tickers', params);\n\n/**\n * 获取产品深度\n *\n * 限速:40次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-order-book\n */\nexport const getMarketBooks = (params: {\n sz?: string;\n instId: string;\n}): Promise<{\n code: string;\n data: {\n asks: [price: string, volume: string, abandon: string, order_number: string][];\n bids: [price: string, volume: string, abandon: string, order_number: string][];\n ts: string;\n }[];\n msg: string;\n}> => publicRequest('GET', '/api/v5/market/books', params);\n\n/**\n * 获取衍生品仓位档位\n *\n * 获取全部仓位档位对应信息\n *\n * 限速:10次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-position-tiers\n */\nexport const getPositionTiers = (params: {\n instType: string;\n tdMode: string;\n instFamily?: string;\n instId?: string;\n uly?: string;\n ccy?: string;\n tier?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n uly: string;\n instFamily: string;\n instId: string;\n tier: string;\n minSz: string;\n maxSz: string;\n mmr: string;\n imr: string;\n maxLever: string;\n optMgnFactor: string;\n quoteMaxLoan: string;\n baseMaxLoan: string;\n }>;\n}> => publicRequest('GET', '/api/v5/public/position-tiers', params);\n"]}
|
|
1
|
+
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatTime } from '@yuants/utils';\n\n/**\n * 基础公共请求函数\n */\nasync function publicRequest(method: string, path: string, params?: Record<string, string>) {\n const url = new URL('https://www.okx.com');\n url.pathname = path;\n if (method === 'GET') {\n for (const key in params) {\n url.searchParams.set(key, params[key]);\n }\n }\n\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n return res.json();\n}\n\n/**\n * 获取所有产品行情信息\n *\n * 获取产品行情信息\n *\n * 限速:20次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-tickers\n */\nexport const getMarketTickers = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instType: string;\n instId: string;\n last: string;\n lastSz: string;\n askPx: string;\n askSz: string;\n bidPx: string;\n bidSz: string;\n open24h: string;\n high24h: string;\n low24h: string;\n volCcy24h: string;\n vol24h: string;\n sodUtc0: string;\n sodUtc8: string;\n ts: string;\n }>;\n}> => publicRequest('GET', '/api/v5/market/tickers', params);\n\n/**\n * 获取交易产品基础信息\n *\n * 获取所有可交易产品的信息列表。\n *\n * 限速:20次/2s\n * 限速规则:IP +instType\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-instruments\n */\nexport const getInstruments = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n alias: string;\n baseCcy: string;\n category: string;\n ctMult: string;\n ctType: string;\n ctVal: string;\n ctValCcy: string;\n expTime: string;\n instFamily: string;\n instId: string;\n instType: string;\n lever: string;\n listTime: string;\n lotSz: string;\n maxIcebergSz: string;\n maxLmtAmt: string;\n maxLmtSz: string;\n maxMktAmt: string;\n maxMktSz: string;\n maxStopSz: string;\n maxTriggerSz: string;\n maxTwapSz: string;\n minSz: string;\n optType: string;\n quoteCcy: string;\n settleCcy: string;\n state: string;\n stk: string;\n tickSz: string;\n uly: string;\n }>;\n}> => publicRequest('GET', '/api/v5/public/instruments', params);\n\n/**\n * 获取永续合约当前资金费率\n *\n * 获取当前资金费率\n *\n * 限速:20次/2s\n * 限速规则:IP +instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate\n */\nexport const getFundingRate = (params: {\n instId: string;\n}): Promise<{\n code: string;\n data: Array<{\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n maxFundingRate: string;\n minFundingRate: string;\n nextFundingRate: string;\n nextFundingTime: string;\n premium: string;\n settFundingRate: string;\n settState: string;\n ts: string;\n }>;\n msg: string;\n}> => publicRequest('GET', '/api/v5/public/funding-rate', params);\n\n/**\n * 获取永续合约历史资金费率\n *\n * 获取最近3个月的历史资金费率\n *\n * 限速:10次/2s\n * 限速规则:IP +instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-funding-rate-history\n */\nexport const getFundingRateHistory = (params: {\n instId: string;\n before?: string;\n after?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n fundingRate: string;\n fundingTime: string;\n instId: string;\n instType: string;\n method: string;\n realizedRate: string;\n }>;\n}> => publicRequest('GET', '/api/v5/public/funding-rate-history', params);\n\n/**\n * 获取标记价格历史K线数据\n *\n * 获取最近几年的标记价格K线数据\n *\n * 限速:10次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-mark-price-candlesticks-history\n */\nexport const getHistoryMarkPriceCandles = (params: {\n instId: string;\n bar?: string;\n after?: string;\n before?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<[ts: string, o: string, h: string, l: string, c: string, confirm: string]>;\n}> => publicRequest('GET', '/api/v5/market/history-mark-price-candles', params);\n\n/**\n * 获取交易产品历史K线数据\n *\n * 获取最近几年的历史k线数据(1s k线支持查询最近3个月的数据)\n *\n * 限速:20次/2s\n * 限速规则:IP\n *\n * 期权不支持 1s K线, 其他业务线 (币币, 杠杆, 交割和永续)支持\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-candlesticks-history\n */\nexport const getHistoryCandles = (params: {\n instId: string;\n bar?: string;\n after?: string;\n before?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<\n [\n ts: string,\n o: string,\n h: string,\n l: string,\n c: string,\n vol: string,\n volCcy: string,\n volCcyQuote: string,\n confirm: string,\n ]\n >;\n}> => publicRequest('GET', '/api/v5/market/history-candles', params);\n\n/**\n * 获取持仓总量\n *\n * 查询单个交易产品的市场的持仓总量\n *\n * 限速:20次/2s\n * 限速规则:IP + instrumentID\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-open-interest\n */\nexport const getOpenInterest = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n instId: string;\n oi: string;\n oiCcy: string;\n ts: string;\n }[];\n}> => publicRequest('GET', '/api/v5/public/open-interest', params);\n\n/**\n * 获取市场借币杠杆利率和借币限额\n *\n * 限速:2次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-interest-rate-and-loan-quota\n */\nexport const getInterestRateLoanQuota = (): Promise<{\n code: string;\n data?: Array<{\n basic: Array<{\n ccy: string;\n rate: string;\n quota: string;\n }>;\n vip: Array<{\n loanQuotaCoef: string;\n level: string;\n }>;\n regular: Array<{\n loanQuotaCoef: string;\n level: string;\n }>;\n }>;\n}> => publicRequest('GET', '/api/v5/public/interest-rate-loan-quota');\n\n/**\n * 获取市场借贷历史(公共)\n *\n * 公共接口无须鉴权\n *\n * 返回2021年12月14日后的记录\n *\n * 限速:6次/s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-public-borrow-history-public\n */\nexport const getLendingRateHistory = (params: {\n ccy?: string;\n after?: string;\n before?: string;\n limit?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n ccy: string;\n amt: string;\n rate: string;\n ts: string;\n }>;\n}> => publicRequest('GET', '/api/v5/finance/savings/lending-rate-history', params);\n\n/**\n * 获取指数行情数据\n *\n * 限速:20次/2s\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-index-tickers\n */\nexport const getMarketIndexTicker = (params?: {\n quoteCcy?: string;\n instId?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: {\n instId: string;\n idxPx: string;\n high24h: string;\n sodUtc0: string;\n open24h: string;\n low24h: string;\n sodUtc8: string;\n ts: string;\n }[];\n}> => publicRequest('GET', '/api/v5/market/index-tickers', params);\n\n/**\n * 获取产品深度\n *\n * 限速:40次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-market-data-get-order-book\n */\nexport const getMarketBooks = (params: {\n sz?: string;\n instId: string;\n}): Promise<{\n code: string;\n data: {\n asks: [price: string, volume: string, abandon: string, order_number: string][];\n bids: [price: string, volume: string, abandon: string, order_number: string][];\n ts: string;\n }[];\n msg: string;\n}> => publicRequest('GET', '/api/v5/market/books', params);\n\n/**\n * 获取衍生品仓位档位\n *\n * 获取全部仓位档位对应信息\n *\n * 限速:10次/2s\n * 限速规则:IP\n *\n * https://www.okx.com/docs-v5/zh/#public-data-rest-api-get-position-tiers\n */\nexport const getPositionTiers = (params: {\n instType: string;\n tdMode: string;\n instFamily?: string;\n instId?: string;\n uly?: string;\n ccy?: string;\n tier?: string;\n}): Promise<{\n code: string;\n msg: string;\n data: Array<{\n uly: string;\n instFamily: string;\n instId: string;\n tier: string;\n minSz: string;\n maxSz: string;\n mmr: string;\n imr: string;\n maxLever: string;\n optMgnFactor: string;\n quoteMaxLoan: string;\n baseMaxLoan: string;\n }>;\n}> => publicRequest('GET', '/api/v5/public/position-tiers', params);\n"]}
|
package/dist/quote.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote.js","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,EACL,oBAAoB,EACpB,KAAK,EACL,MAAM,EACN,KAAK,EACL,cAAc,EACd,IAAI,EACJ,OAAO,EACP,GAAG,EACH,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,WAAW,EACX,SAAS,EACT,GAAG,EACH,OAAO,GACR,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAoB,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAClD,4DAA4D;AAE5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7E,MAAM,CAAC,EAAE,KAAK,EAAE,OAAQ,EAAE,CAAC,EAC3B,KAAK,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAClB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AACF,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7E,MAAM,CAAC,EAAE,KAAK,EAAE,OAAQ,EAAE,CAAC,EAC3B,KAAK,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAClB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1G,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAChD,oBAAoB,CAAC,YAAY,CAAC,EAClC,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAC3E,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,yBAAyB;AACzB,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,CAC9D,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAU,CAAC,EAClC,OAAO,EAAE,EACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAClC,CACF,EACD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;IACR,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC,CAAC,EACF,SAAS,CACP,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EACf,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAC1B,GAAG,EAAE,CAAC,IAAI,CACX,EACD,KAAK,EAAE,CACR,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CACnF,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAC7B,GAAG,CACD,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC;IACvB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,IAAI;IAClB,SAAS,EAAE,CAAC,CAAC,KAAK;IAClB,SAAS,EAAE,CAAC,CAAC,KAAK;IAClB,UAAU,EAAE,CAAC,CAAC,KAAK;IACnB,UAAU,EAAE,CAAC,CAAC,KAAK;CACpB,CAAC,CACH,EACD,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACvB,CAAC;AAEF,MAAM,6BAA6B,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5F,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAC7B,QAAQ,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC;IACjC;QACE,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACxC,UAAU,EAAE,CAAC,CAAC,IAAI;QAClB,SAAS,EAAE,CAAC,CAAC,KAAK;QAClB,SAAS,EAAE,CAAC,CAAC,KAAK;QAClB,UAAU,EAAE,CAAC,CAAC,KAAK;QACnB,UAAU,EAAE,CAAC,CAAC,KAAK;KACpB;IACD;QACE,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,IAAI;QAClB,SAAS,EAAE,CAAC,CAAC,KAAK;QAClB,SAAS,EAAE,CAAC,CAAC,KAAK;QAClB,UAAU,EAAE,CAAC,CAAC,KAAK;QACnB,UAAU,EAAE,CAAC,CAAC,KAAK;KACpB;CACF,CAAC,EACF,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACvB,CAAC;AAEF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,IAAI,CAC9C,SAAS,CACP,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EACf,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAC1B,GAAG,EAAE,CAAC,IAAI,CACX,EACD,GAAG,CACD,CAAC,MAAM,EAAmB,EAAE,CAAC,CAAC;IAC5B,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChD,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;IAC1B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;IAC1B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;IAC1B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;IAC3B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;CAC5B,CAAC,CACH,CACF,CAAC;AAEF,MAAM,2BAA2B,GAAG,WAAW,CAAC,IAAI,CAClD,QAAQ,CAAC,CAAC,MAAM,EAAqB,EAAE,CAAC;IACtC;QACE,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAChD,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QAC1B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QAC1B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QAC3B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;KAC5B;IACD;QACE,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClD,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QAC1B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QAC1B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QAC3B,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;KAC5B;CACF,CAAC,CACH,CAAC;AAEF,MAAM,kBAAkB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAChF,MAAM,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACzB,KAAK,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACxB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,MAAM,yBAAyB,GAAG,gBAAgB,CAAC,IAAI,CACrD,SAAS,CACP,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EACf,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,EAChC,GAAG,EAAE,CAAC,IAAI,CACX,EACD,GAAG,CACD,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC;IACvB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3C,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;CACvB,CAAC,CACH,EACD,KAAK,EAAE,CACR,CAAC;AAKF,MAAM,uBAAuB,GAAG,KAAK,CAAC,GAAG,EAAE,CACzC,YAAY,CAAC,IAAI,CACf,KAAK,EAAE,EACP,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EACpF,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;IACpB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACvB,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CACnB,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,sBAAsB,CAGxD,mBAAmB,EAAE;YACrB,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,OAAO;YACf,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAA,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;SAC9E;QACD,OAAO;YACL,MAAM;YACN,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAChC,EACD,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAChC,SAAS,IAAI,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CACV,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,gCAAgC,SAAS,IAAI,KAAK,KAAK,MAAM,GAAG,CACjE,CAAC;QACF,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE;YACf,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;SAC7B;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,IAAI,GAAG,EAA8B,CAAC,CAC1C,CAAC;AACJ,CAAC,CAAC,CACH,CACF,CAAC,IAAI;AACJ,EAAE;AACF,KAAK,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACxB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAS,EAAE,CAAC,EAC5B,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,4CAA4C;AAC5C,oCAAoC;AACpC,2BAA2B;AAC3B,kEAAkE;AAClE,wCAAwC;AACxC,MAAM,mBAAmB,GAAG,YAAY,CAAC,IAAI,CAC3C,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CACnB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAChB,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAClB,KAAK,CAAC,KAAK,IAAI,EAAE;;IACf,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,CAAA,EAAE;QAClB,OAAO,IAAI,CAAC;KACb;IAED,MAAM,WAAW,GAAG,KAAK;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;SACxD,MAAM,CAAC,CAAC,iBAAiB,EAAE,QAAQ,EAAE,EAAE;QACtC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACxD,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;SAChD;QACD,OAAO,iBAAiB,CAAC;IAC3B,CAAC,EAAE,IAAI,GAAG,EAAkC,CAAC,CAAC;IAChD,sBAAsB;IACtB,MAAM,YAAY,GAAG,CAAC,CAAC,CAAA,MAAA,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,0CAAE,YAAY,KAAI,CAAC,CAAC,CAAC;IAEhE,OAAO;QACL,MAAM;QACN,YAAY;KACb,CAAC;AACJ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,CAAC,CAC7D,CACF,CACF,EACD,MAAM,CAAC,CAAC,MAAM,EAAsD,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,EACvF,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE;IAC/B,MAAM,OAAO,GAAoB;QAC/B,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;KACzC,CAAC;IACF,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;QACrE,OAAO,CAAC,aAAa,GAAG,GAAG,YAAY,EAAE,CAAC;KAC3C;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC,EACF,KAAK,EAAE,CACR,CAAC;AAEF,mBAAmB,CAAC,SAAS,EAAE,CAAC;AAEhC,MAAM,aAAa,GAAG;IACpB,kBAAkB;IAClB,yBAAyB;IACzB,oBAAoB;IACpB,2BAA2B;IAC3B,6BAA6B;IAC7B,mBAAmB;CACpB,CAAC;AAEF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,CACxB,KAAK,CACH,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC1B,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI;AAClB,gBAAgB;AAChB,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CACxB,CACF,CACF,CACF,CAAC,IAAI,CACJ,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,EACzD,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;IAClB,OAAO,MAAM,CAAC,IAAI;IAChB,EAAE;IACF,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAqB,CAAC,CACnE,CAAC;AACJ,CAAC,CAAC,EACF,KAAK,EAAE,CACR,CAAC;AAEF,sBAAsB;AACtB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,MAAM,EAAE;IAC7C,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE;QAC5E,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,aAAa,EAAE;YAClB,MAAM,2BAA2B,CAAC;SACnC;QACD,IAAI,CAAC,UAAU,EAAE;YACf,MAAM,wBAAwB,CAAC;SAChC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,MAAM;SACH,IAAI,CACH,UAAU,CAAC;QACT,QAAQ;QACR,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,OAAO;QAClB,YAAY,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC;KAC9C,CAAC,CACH;SACA,SAAS,EAAE,CAAC;CAChB;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,CACnE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAU,CAAC,CAAC,CAAC,EACvE,WAAW,CAAC,CAAC,CAAC,CACf,CAAC","sourcesContent":["import { IQuote } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { decodePath, encodePath, formatTime, listWatch } from '@yuants/utils';\nimport {\n catchError,\n concatMap,\n defer,\n distinctUntilChanged,\n EMPTY,\n filter,\n first,\n firstValueFrom,\n from,\n groupBy,\n map,\n merge,\n mergeMap,\n reduce,\n repeat,\n retry,\n scan,\n share,\n shareReplay,\n switchMap,\n tap,\n toArray,\n} from 'rxjs';\nimport { getInstruments, getMarketTickers, getOpenInterest, getPositionTiers } from './public-api';\nimport { useOpenInterest, useTicker } from './ws';\n// import { useOpenInterest, useTicker } from './websocket';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst swapInstruments$ = defer(() => getInstruments({ instType: 'SWAP' })).pipe(\n repeat({ delay: 3600_000 }),\n retry({ delay: 10_000 }),\n map((x) => x.data),\n shareReplay(1),\n);\nconst spotInstruments$ = defer(() => getInstruments({ instType: 'SPOT' })).pipe(\n repeat({ delay: 3600_000 }),\n retry({ delay: 10_000 }),\n map((x) => x.data),\n shareReplay(1),\n);\n\nconst shallowEqual = (a: string[], b: string[]) => a.length === b.length && a.every((v, i) => v === b[i]);\n\nconst spotInstIds$ = spotInstruments$.pipe(\n map((items) => items.map((item) => item.instId)),\n distinctUntilChanged(shallowEqual),\n shareReplay(1),\n);\n\nconst spotTickers$ = defer(() => getMarketTickers({ instType: 'SPOT' })).pipe(\n repeat({ delay: 5000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\n// depend by SubmitOrders\nexport const spotMarketTickers$ = defer(() => spotTickers$).pipe(\n mergeMap((x) =>\n from(x.data).pipe(\n map((x) => [x.instId, x] as const),\n toArray(),\n map((x) => Object.fromEntries(x)),\n ),\n ),\n repeat({ delay: 5000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\nconst spotTicker$ = spotInstruments$.pipe(\n tap((x) => {\n console.info('SPOT INSTRUMENTS', x.length);\n }),\n listWatch(\n (x) => x.instId,\n (x) => useTicker(x.instId),\n () => true,\n ),\n share(),\n);\n\nconst quoteOfSwapFromRest$ = defer(() => getMarketTickers({ instType: 'SWAP' })).pipe(\n mergeMap((x) => x.data || []),\n map(\n (x): Partial<IQuote> => ({\n datasource_id: 'OKX',\n product_id: encodePath(x.instType, x.instId),\n last_price: x.last,\n ask_price: x.askPx,\n bid_price: x.bidPx,\n ask_volume: x.askSz,\n bid_volume: x.bidSz,\n }),\n ),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n);\n\nconst quoteOfSpotAndMarginFromRest$ = defer(() => getMarketTickers({ instType: 'SPOT' })).pipe(\n mergeMap((x) => x.data || []),\n mergeMap((x): Partial<IQuote>[] => [\n {\n datasource_id: 'OKX',\n product_id: encodePath('SPOT', x.instId),\n last_price: x.last,\n ask_price: x.askPx,\n bid_price: x.bidPx,\n ask_volume: x.askSz,\n bid_volume: x.bidSz,\n },\n {\n datasource_id: 'OKX',\n product_id: encodePath('MARGIN', x.instId),\n last_price: x.last,\n ask_price: x.askPx,\n bid_price: x.bidPx,\n ask_volume: x.askSz,\n bid_volume: x.bidSz,\n },\n ]),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n);\n\nconst quoteOfSwapFromWs$ = swapInstruments$.pipe(\n listWatch(\n (x) => x.instId,\n (x) => useTicker(x.instId),\n () => true,\n ),\n map(\n (ticker): Partial<IQuote> => ({\n datasource_id: 'OKX',\n product_id: encodePath('SWAP', ticker[0].instId),\n last_price: ticker[0].last,\n ask_price: ticker[0].askPx,\n bid_price: ticker[0].bidPx,\n ask_volume: ticker[0].askSz,\n bid_volume: ticker[0].bidSz,\n }),\n ),\n);\n\nconst quoteOfSpotAndMarginFromWs$ = spotTicker$.pipe(\n mergeMap((ticker): Partial<IQuote>[] => [\n {\n datasource_id: 'OKX',\n product_id: encodePath('SPOT', ticker[0].instId),\n last_price: ticker[0].last,\n ask_price: ticker[0].askPx,\n bid_price: ticker[0].bidPx,\n ask_volume: ticker[0].askSz,\n bid_volume: ticker[0].bidSz,\n },\n {\n datasource_id: 'OKX',\n product_id: encodePath('MARGIN', ticker[0].instId),\n last_price: ticker[0].last,\n ask_price: ticker[0].askPx,\n bid_price: ticker[0].bidPx,\n ask_volume: ticker[0].askSz,\n bid_volume: ticker[0].bidSz,\n },\n ]),\n);\n\nconst swapOpenInterests$ = defer(() => getOpenInterest({ instType: 'SWAP' })).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nconst interestRateOfSwapFromWS$ = swapInstruments$.pipe(\n listWatch(\n (x) => x.instId,\n (x) => useOpenInterest(x.instId),\n () => true,\n ),\n map(\n (x): Partial<IQuote> => ({\n datasource_id: 'OKX',\n product_id: encodePath('SWAP', x[0].instId),\n open_interest: x[0].oi,\n }),\n ),\n share(),\n);\n\ntype PositionTiersResponse = Awaited<ReturnType<typeof getPositionTiers>>;\ntype PositionTiersEntry = PositionTiersResponse['data'];\n\nconst marginPositionTiersMap$ = defer(() =>\n spotInstIds$.pipe(\n first(),\n map((instIds) => instIds.filter((id) => id.endsWith('USDT') || id.endsWith('USDC'))),\n switchMap((instIds) => {\n const total = instIds.length;\n let processed = 0;\n return from(instIds).pipe(\n concatMap((instId) =>\n defer(async () => {\n const tiers = await terminal.client.requestForResponseData<\n { instType: string; tdMode: string; instId: string },\n PositionTiersResponse\n >('OKX/PositionTiers', {\n instType: 'MARGIN',\n tdMode: 'cross',\n instId,\n });\n if (!tiers?.data) {\n throw new Error(`Failed to load position tiers for ${instId}: ${tiers.msg}`);\n }\n return {\n instId,\n tiers,\n };\n }).pipe(retry({ delay: 2000 })),\n ),\n reduce((map, { instId, tiers }) => {\n processed += 1;\n console.info(\n formatTime(Date.now()),\n `Loaded margin position tiers ${processed}/${total} (${instId})`,\n );\n if (tiers?.data) {\n map.set(instId, tiers.data);\n }\n return map;\n }, new Map<string, PositionTiersEntry>()),\n );\n }),\n ),\n).pipe(\n //\n retry({ delay: 60_000 }),\n repeat({ delay: 86400_000 }),\n shareReplay(1),\n);\n\n// Margin 的 open interest 只依赖 position-tier:\n// 1) 启动时先拉全量 MARGIN 仓位档位并缓存,下次直接命中;\n// 2) 档位内只保留同 tier 杠杆最高的记录;\n// 3) 当前策略只使用 tier=1 的 quoteMaxLoan 作为持仓上限,不再混合 /account/max-size;\n// 4) 每个 instId 60 秒刷新一次,并在接口报错时 10 秒重试。\nconst marginOpenInterest$ = spotInstIds$.pipe(\n mergeMap((instIds) =>\n from(instIds).pipe(\n mergeMap((instId) =>\n defer(async () => {\n const tiersMap = await firstValueFrom(marginPositionTiersMap$);\n const tiers = tiersMap.get(instId);\n if (!tiers?.length) {\n return null;\n }\n\n const tierByLevel = tiers\n .filter((tier) => !tier.instId || tier.instId === instId)\n .reduce((mapTierToTierInfo, tierInfo) => {\n const existing = mapTierToTierInfo.get(tierInfo.tier);\n if (!existing || +tierInfo.maxLever > +existing.maxLever) {\n mapTierToTierInfo.set(tierInfo.tier, tierInfo);\n }\n return mapTierToTierInfo;\n }, new Map<string, (typeof tiers)[number]>());\n // 获取一级杠杆的最大可借贷额度作为持仓量\n const openInterest = +(tierByLevel.get('1')?.quoteMaxLoan || 0);\n\n return {\n instId,\n openInterest,\n };\n }).pipe(retry({ delay: 10_000 }), repeat({ delay: 60_000 })),\n ),\n ),\n ),\n filter((result): result is { instId: string; openInterest: number } => result !== null),\n map(({ instId, openInterest }) => {\n const partial: Partial<IQuote> = {\n datasource_id: 'OKX',\n product_id: encodePath('MARGIN', instId),\n };\n if (typeof openInterest === 'number' && Number.isFinite(openInterest)) {\n partial.open_interest = `${openInterest}`;\n }\n return partial;\n }),\n share(),\n);\n\nmarginOpenInterest$.subscribe();\n\nconst quoteSources$ = [\n quoteOfSwapFromWs$,\n interestRateOfSwapFromWS$,\n quoteOfSwapFromRest$,\n quoteOfSpotAndMarginFromWs$,\n quoteOfSpotAndMarginFromRest$,\n marginOpenInterest$,\n];\n\nconst quote$ = defer(() =>\n merge(\n ...quoteSources$.map((x$) =>\n defer(() => x$).pipe(\n // 防止单个流关闭导致整体关闭\n catchError(() => EMPTY),\n ),\n ),\n ),\n).pipe(\n groupBy((x) => encodePath(x.datasource_id, x.product_id)),\n mergeMap((group$) => {\n return group$.pipe(\n //\n scan((acc, cur) => Object.assign(acc, cur), {} as Partial<IQuote>),\n );\n }),\n share(),\n);\n\n// 合并不同来源的数据并进行合并,避免死锁\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n terminal.channel.publishChannel('quote', { pattern: `^OKX/` }, (channel_id) => {\n const [datasource_id, product_id] = decodePath(channel_id);\n if (!datasource_id) {\n throw 'datasource_id is required';\n }\n if (!product_id) {\n throw 'product_id is required';\n }\n return quote$.pipe(filter((x) => x.product_id === product_id));\n });\n\n quote$\n .pipe(\n writeToSQL({\n terminal,\n writeInterval: 1000,\n tableName: 'quote',\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n}\n\nexport const swapOpenInterest$ = defer(() => swapOpenInterests$).pipe(\n map((x) => new Map(x.data.map((x: any) => [x.instId, +x.oi] as const))),\n shareReplay(1),\n);\n"]}
|
|
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, formatTime, listWatch } from '@yuants/utils';\nimport {\n catchError,\n concatMap,\n defer,\n distinctUntilChanged,\n EMPTY,\n filter,\n first,\n firstValueFrom,\n from,\n groupBy,\n map,\n merge,\n mergeMap,\n reduce,\n repeat,\n retry,\n scan,\n share,\n shareReplay,\n switchMap,\n tap,\n toArray,\n} from 'rxjs';\nimport { getInstruments, getMarketTickers, getOpenInterest, getPositionTiers } from './public-api';\nimport { useOpenInterest, useTicker } from './ws';\n// import { useOpenInterest, useTicker } from './websocket';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst swapInstruments$ = defer(() => getInstruments({ instType: 'SWAP' })).pipe(\n repeat({ delay: 3600_000 }),\n retry({ delay: 10_000 }),\n map((x) => x.data),\n shareReplay(1),\n);\nconst spotInstruments$ = defer(() => getInstruments({ instType: 'SPOT' })).pipe(\n repeat({ delay: 3600_000 }),\n retry({ delay: 10_000 }),\n map((x) => x.data),\n shareReplay(1),\n);\n\nconst shallowEqual = (a: string[], b: string[]) => a.length === b.length && a.every((v, i) => v === b[i]);\n\nconst spotInstIds$ = spotInstruments$.pipe(\n map((items) => items.map((item) => item.instId)),\n distinctUntilChanged(shallowEqual),\n shareReplay(1),\n);\n\nconst spotTickers$ = defer(() => getMarketTickers({ instType: 'SPOT' })).pipe(\n repeat({ delay: 5000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\n// depend by SubmitOrders\nexport const spotMarketTickers$ = defer(() => spotTickers$).pipe(\n mergeMap((x) =>\n from(x.data).pipe(\n map((x) => [x.instId, x] as const),\n toArray(),\n map((x) => Object.fromEntries(x)),\n ),\n ),\n repeat({ delay: 5000 }),\n retry({ delay: 5000 }),\n shareReplay(1),\n);\n\nconst spotTicker$ = spotInstruments$.pipe(\n tap((x) => {\n console.info('SPOT INSTRUMENTS', x.length);\n }),\n listWatch(\n (x) => x.instId,\n (x) => useTicker(x.instId),\n () => true,\n ),\n share(),\n);\n\nconst quoteOfSwapFromRest$ = defer(() => getMarketTickers({ instType: 'SWAP' })).pipe(\n mergeMap((x) => x.data || []),\n map(\n (x): Partial<IQuote> => ({\n datasource_id: 'OKX',\n product_id: encodePath(x.instType, x.instId),\n last_price: x.last,\n ask_price: x.askPx,\n bid_price: x.bidPx,\n ask_volume: x.askSz,\n bid_volume: x.bidSz,\n }),\n ),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n);\n\nconst quoteOfSpotAndMarginFromRest$ = defer(() => getMarketTickers({ instType: 'SPOT' })).pipe(\n mergeMap((x) => x.data || []),\n mergeMap((x): Partial<IQuote>[] => [\n {\n datasource_id: 'OKX',\n product_id: encodePath('SPOT', x.instId),\n last_price: x.last,\n ask_price: x.askPx,\n bid_price: x.bidPx,\n ask_volume: x.askSz,\n bid_volume: x.bidSz,\n },\n {\n datasource_id: 'OKX',\n product_id: encodePath('MARGIN', x.instId),\n last_price: x.last,\n ask_price: x.askPx,\n bid_price: x.bidPx,\n ask_volume: x.askSz,\n bid_volume: x.bidSz,\n },\n ]),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n);\n\nconst quoteOfSwapFromWs$ = swapInstruments$.pipe(\n listWatch(\n (x) => x.instId,\n (x) => useTicker(x.instId),\n () => true,\n ),\n map(\n (ticker): Partial<IQuote> => ({\n datasource_id: 'OKX',\n product_id: encodePath('SWAP', ticker[0].instId),\n last_price: ticker[0].last,\n ask_price: ticker[0].askPx,\n bid_price: ticker[0].bidPx,\n ask_volume: ticker[0].askSz,\n bid_volume: ticker[0].bidSz,\n }),\n ),\n);\n\nconst quoteOfSpotAndMarginFromWs$ = spotTicker$.pipe(\n mergeMap((ticker): Partial<IQuote>[] => [\n {\n datasource_id: 'OKX',\n product_id: encodePath('SPOT', ticker[0].instId),\n last_price: ticker[0].last,\n ask_price: ticker[0].askPx,\n bid_price: ticker[0].bidPx,\n ask_volume: ticker[0].askSz,\n bid_volume: ticker[0].bidSz,\n },\n {\n datasource_id: 'OKX',\n product_id: encodePath('MARGIN', ticker[0].instId),\n last_price: ticker[0].last,\n ask_price: ticker[0].askPx,\n bid_price: ticker[0].bidPx,\n ask_volume: ticker[0].askSz,\n bid_volume: ticker[0].bidSz,\n },\n ]),\n);\n\nconst swapOpenInterests$ = defer(() => getOpenInterest({ instType: 'SWAP' })).pipe(\n repeat({ delay: 10_000 }),\n retry({ delay: 10_000 }),\n shareReplay(1),\n);\n\nconst interestRateOfSwapFromWS$ = swapInstruments$.pipe(\n listWatch(\n (x) => x.instId,\n (x) => useOpenInterest(x.instId),\n () => true,\n ),\n map(\n (x): Partial<IQuote> => ({\n datasource_id: 'OKX',\n product_id: encodePath('SWAP', x[0].instId),\n open_interest: x[0].oi,\n }),\n ),\n share(),\n);\n\ntype PositionTiersResponse = Awaited<ReturnType<typeof getPositionTiers>>;\ntype PositionTiersEntry = PositionTiersResponse['data'];\n\nconst marginPositionTiersMap$ = defer(() =>\n spotInstIds$.pipe(\n first(),\n map((instIds) => instIds.filter((id) => id.endsWith('USDT') || id.endsWith('USDC'))),\n switchMap((instIds) => {\n const total = instIds.length;\n let processed = 0;\n return from(instIds).pipe(\n concatMap((instId) =>\n defer(async () => {\n const tiers = await terminal.client.requestForResponseData<\n { instType: string; tdMode: string; instId: string },\n PositionTiersResponse\n >('OKX/PositionTiers', {\n instType: 'MARGIN',\n tdMode: 'cross',\n instId,\n });\n if (!tiers?.data) {\n throw new Error(`Failed to load position tiers for ${instId}: ${tiers.msg}`);\n }\n return {\n instId,\n tiers,\n };\n }).pipe(retry({ delay: 2000 })),\n ),\n reduce((map, { instId, tiers }) => {\n processed += 1;\n console.info(\n formatTime(Date.now()),\n `Loaded margin position tiers ${processed}/${total} (${instId})`,\n );\n if (tiers?.data) {\n map.set(instId, tiers.data);\n }\n return map;\n }, new Map<string, PositionTiersEntry>()),\n );\n }),\n ),\n).pipe(\n //\n retry({ delay: 60_000 }),\n repeat({ delay: 86400_000 }),\n shareReplay(1),\n);\n\n// Margin 的 open interest 只依赖 position-tier:\n// 1) 启动时先拉全量 MARGIN 仓位档位并缓存,下次直接命中;\n// 2) 档位内只保留同 tier 杠杆最高的记录;\n// 3) 当前策略只使用 tier=1 的 quoteMaxLoan 作为持仓上限,不再混合 /account/max-size;\n// 4) 每个 instId 60 秒刷新一次,并在接口报错时 10 秒重试。\nconst marginOpenInterest$ = spotInstIds$.pipe(\n mergeMap((instIds) =>\n from(instIds).pipe(\n mergeMap((instId) =>\n defer(async () => {\n const tiersMap = await firstValueFrom(marginPositionTiersMap$);\n const tiers = tiersMap.get(instId);\n if (!tiers?.length) {\n return null;\n }\n\n const tierByLevel = tiers\n .filter((tier) => !tier.instId || tier.instId === instId)\n .reduce((mapTierToTierInfo, tierInfo) => {\n const existing = mapTierToTierInfo.get(tierInfo.tier);\n if (!existing || +tierInfo.maxLever > +existing.maxLever) {\n mapTierToTierInfo.set(tierInfo.tier, tierInfo);\n }\n return mapTierToTierInfo;\n }, new Map<string, (typeof tiers)[number]>());\n // 获取一级杠杆的最大可借贷额度作为持仓量\n const openInterest = +(tierByLevel.get('1')?.quoteMaxLoan || 0);\n\n return {\n instId,\n openInterest,\n };\n }).pipe(retry({ delay: 10_000 }), repeat({ delay: 60_000 })),\n ),\n ),\n ),\n filter((result): result is { instId: string; openInterest: number } => result !== null),\n map(({ instId, openInterest }) => {\n const partial: Partial<IQuote> = {\n datasource_id: 'OKX',\n product_id: encodePath('MARGIN', instId),\n };\n if (typeof openInterest === 'number' && Number.isFinite(openInterest)) {\n partial.open_interest = `${openInterest}`;\n }\n return partial;\n }),\n share(),\n);\n\nmarginOpenInterest$.subscribe();\n\nconst quoteSources$ = [\n quoteOfSwapFromWs$,\n interestRateOfSwapFromWS$,\n quoteOfSwapFromRest$,\n quoteOfSpotAndMarginFromWs$,\n quoteOfSpotAndMarginFromRest$,\n marginOpenInterest$,\n];\n\nconst quote$ = defer(() =>\n merge(\n ...quoteSources$.map((x$) =>\n defer(() => x$).pipe(\n // 防止单个流关闭导致整体关闭\n catchError(() => EMPTY),\n ),\n ),\n ),\n).pipe(\n groupBy((x) => encodePath(x.datasource_id, x.product_id)),\n mergeMap((group$) => {\n return group$.pipe(\n //\n scan((acc, cur) => Object.assign(acc, cur), {} as Partial<IQuote>),\n );\n }),\n share(),\n);\n\n// 合并不同来源的数据并进行合并,避免死锁\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n terminal.channel.publishChannel('quote', { pattern: `^OKX/` }, (channel_id) => {\n const [datasource_id, product_id] = decodePath(channel_id);\n if (!datasource_id) {\n throw 'datasource_id is required';\n }\n if (!product_id) {\n throw 'product_id is required';\n }\n return quote$.pipe(filter((x) => x.product_id === product_id));\n });\n\n quote$\n .pipe(\n writeToSQL({\n terminal,\n writeInterval: 1000,\n tableName: 'quote',\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n}\n\nexport const swapOpenInterest$ = defer(() => swapOpenInterests$).pipe(\n map((x) => new Map(x.data.map((x) => [x.instId, +x.oi] as const))),\n shareReplay(1),\n);\n"]}
|
package/dist/services.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Terminal } from '@yuants/protocol';
|
|
2
2
|
import { defer, firstValueFrom } from 'rxjs';
|
|
3
3
|
import { tradingAccountId$ } from './account';
|
|
4
|
-
import {
|
|
4
|
+
import { getDefaultCredential, postGridAlgoOrder } from './api';
|
|
5
5
|
const terminal = Terminal.fromNodeEnv();
|
|
6
6
|
defer(async () => {
|
|
7
7
|
const tradingAccountId = await firstValueFrom(tradingAccountId$);
|
|
8
|
+
const credential = getDefaultCredential();
|
|
8
9
|
terminal.server.provideService('Grid/Algo-Order', {
|
|
9
10
|
required: ['account_id'],
|
|
10
11
|
properties: {
|
|
@@ -12,7 +13,7 @@ defer(async () => {
|
|
|
12
13
|
},
|
|
13
14
|
}, async (msg) => {
|
|
14
15
|
if (msg.req) {
|
|
15
|
-
const result = await
|
|
16
|
+
const result = await postGridAlgoOrder(credential, msg.req);
|
|
16
17
|
return { res: { code: 0, message: 'OK', data: result } };
|
|
17
18
|
}
|
|
18
19
|
return { res: { code: 0, message: 'No Params' } };
|
package/dist/services.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../src/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,KAAK,CAAC,KAAK,IAAI,EAAE;IACf,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAE1C,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,iBAAiB,EACjB;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;SACxC;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,IAAI,GAAG,CAAC,GAAG,EAAE;YACX,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,GAAU,CAAC,CAAC;YACnE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;SAC1D;QACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC;IACpD,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC","sourcesContent":["import { Terminal } from '@yuants/protocol';\nimport { defer, firstValueFrom } from 'rxjs';\nimport { tradingAccountId$ } from './account';\nimport { getDefaultCredential, postGridAlgoOrder } from './api';\n\nconst terminal = Terminal.fromNodeEnv();\n\ndefer(async () => {\n const tradingAccountId = await firstValueFrom(tradingAccountId$);\n const credential = getDefaultCredential();\n\n terminal.server.provideService(\n 'Grid/Algo-Order',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: tradingAccountId },\n },\n },\n async (msg) => {\n if (msg.req) {\n const result = await postGridAlgoOrder(credential, msg.req as any);\n return { res: { code: 0, message: 'OK', data: result } };\n }\n return { res: { code: 0, message: 'No Params' } };\n },\n );\n}).subscribe();\n"]}
|
package/dist/strategy-account.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';
|
|
2
2
|
import { Terminal } from '@yuants/protocol';
|
|
3
|
-
import { encodePath } from '@yuants/utils';
|
|
4
3
|
import { defer, filter, first, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';
|
|
5
|
-
import {
|
|
4
|
+
import { getAccountConfig, getDefaultCredential, getGridPositions } from './api';
|
|
5
|
+
import { getStrategyAccountInfo } from './accountInfos';
|
|
6
6
|
const terminal = Terminal.fromNodeEnv();
|
|
7
|
-
|
|
7
|
+
const credential = getDefaultCredential();
|
|
8
|
+
export const accountConfig$ = defer(() => getAccountConfig(credential)).pipe(repeat({ delay: 10000 }), retry({ delay: 10000 }), shareReplay(1));
|
|
8
9
|
export const accountUid$ = accountConfig$.pipe(map((x) => x.data[0].uid), filter((x) => !!x), shareReplay(1));
|
|
9
10
|
export const strategyAccountId$ = accountUid$.pipe(map((uid) => `okx/${uid}/strategy`), shareReplay(1));
|
|
10
11
|
defer(async () => {
|
|
@@ -21,70 +22,16 @@ defer(async () => {
|
|
|
21
22
|
res: {
|
|
22
23
|
code: 0,
|
|
23
24
|
message: 'OK',
|
|
24
|
-
data: await
|
|
25
|
+
data: await getGridPositions(credential, { algoOrdType: 'contract_grid', algoId: msg.req.algoId }),
|
|
25
26
|
},
|
|
26
27
|
};
|
|
27
28
|
}, {
|
|
28
29
|
egress_token_capacity: 20,
|
|
29
30
|
egress_token_refill_interval: 4000, // 每 4 秒恢复 20 个令牌 (双倍冗余限流)
|
|
30
31
|
});
|
|
31
|
-
provideAccountInfoService(terminal, strategyAccountId,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
client.getGridOrdersAlgoPending({
|
|
35
|
-
algoOrdType: 'contract_grid',
|
|
36
|
-
}),
|
|
37
|
-
]);
|
|
38
|
-
let totalEquity = 0;
|
|
39
|
-
const positions = [];
|
|
40
|
-
const gridPositionsRes = await Promise.all(gridAlgoOrders.data.map((item) => terminal.client.requestForResponseData('OKX/QueryGridPositions', {
|
|
41
|
-
account_id: strategyAccountId,
|
|
42
|
-
algoId: item.algoId,
|
|
43
|
-
})));
|
|
44
|
-
gridPositionsRes.forEach((gridPositions, index) => {
|
|
45
|
-
var _a, _b, _c, _d;
|
|
46
|
-
let positionValuation = 0;
|
|
47
|
-
const leverage = +((_a = gridAlgoOrders.data) === null || _a === void 0 ? void 0 : _a[index].actualLever);
|
|
48
|
-
(_b = gridPositions === null || gridPositions === void 0 ? void 0 : gridPositions.data) === null || _b === void 0 ? void 0 : _b.forEach((position) => {
|
|
49
|
-
var _a, _b, _c;
|
|
50
|
-
if (+position.pos !== 0) {
|
|
51
|
-
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 : '';
|
|
52
|
-
const direction = directionRaw ? directionRaw.toUpperCase() : 'LONG';
|
|
53
|
-
positions.push({
|
|
54
|
-
position_id: encodePath(position.algoId, position.instId),
|
|
55
|
-
datasource_id: 'OKX',
|
|
56
|
-
product_id: encodePath(position.instType, position.instId),
|
|
57
|
-
direction,
|
|
58
|
-
volume: Math.abs(+position.pos),
|
|
59
|
-
free_volume: +position.pos,
|
|
60
|
-
position_price: +position.avgPx,
|
|
61
|
-
floating_profit: +position.upl,
|
|
62
|
-
closable_price: +position.last,
|
|
63
|
-
valuation: +position.notionalUsd,
|
|
64
|
-
});
|
|
65
|
-
positionValuation += +position.notionalUsd;
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
if (leverage === 0) {
|
|
69
|
-
// 实际杠杆为 0,说明没有持仓,直接把投资金额和累计盈亏算到净值里
|
|
70
|
-
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);
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
// 历史提取金额不会从 investment, totalPnl 扣减
|
|
74
|
-
// 计算净值需要通过仓位的名义价值和实际杠杆计算
|
|
75
|
-
totalEquity += positionValuation / leverage;
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
return {
|
|
79
|
-
money: {
|
|
80
|
-
currency: 'USDT',
|
|
81
|
-
equity: totalEquity,
|
|
82
|
-
// TODO: 累计策略的可提取资金作为 free
|
|
83
|
-
free: 0,
|
|
84
|
-
},
|
|
85
|
-
positions,
|
|
86
|
-
};
|
|
87
|
-
}, { auto_refresh_interval: 5000 });
|
|
32
|
+
provideAccountInfoService(terminal, strategyAccountId, () => getStrategyAccountInfo(credential), {
|
|
33
|
+
auto_refresh_interval: 5000,
|
|
34
|
+
});
|
|
88
35
|
}).subscribe();
|
|
89
36
|
const sub = defer(() => accountUid$)
|
|
90
37
|
.pipe(first())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strategy-account.js","sourceRoot":"","sources":["../src/strategy-account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"strategy-account.js","sourceRoot":"","sources":["../src/strategy-account.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { defer, filter, first, firstValueFrom, map, repeat, retry, shareReplay } from 'rxjs';\nimport { getAccountConfig, getDefaultCredential, getGridPositions } from './api';\nimport { getStrategyAccountInfo } from './accountInfos';\n\nconst terminal = Terminal.fromNodeEnv();\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\nexport const accountUid$ = accountConfig$.pipe(\n map((x) => x.data[0].uid),\n filter((x) => !!x),\n shareReplay(1),\n);\n\nexport const strategyAccountId$ = accountUid$.pipe(\n map((uid) => `okx/${uid}/strategy`),\n shareReplay(1),\n);\n\ndefer(async () => {\n const strategyAccountId = await firstValueFrom(strategyAccountId$);\n\n type InferPromise<T> = T extends Promise<infer U> ? U : T;\n\n terminal.server.provideService<\n { account_id: string; algoId: string },\n InferPromise<ReturnType<typeof getGridPositions>>\n >(\n `OKX/QueryGridPositions`,\n {\n required: ['account_id', 'algoId'],\n properties: {\n account_id: { type: 'string', const: strategyAccountId },\n algoId: { type: 'string' },\n },\n },\n async (msg) => {\n //\n return {\n res: {\n code: 0,\n message: 'OK',\n data: await getGridPositions(credential, { algoOrdType: 'contract_grid', algoId: msg.req.algoId }),\n },\n };\n },\n {\n egress_token_capacity: 20,\n egress_token_refill_interval: 4000, // 每 4 秒恢复 20 个令牌 (双倍冗余限流)\n },\n );\n\n provideAccountInfoService(terminal, strategyAccountId, () => getStrategyAccountInfo(credential), {\n auto_refresh_interval: 5000,\n });\n}).subscribe();\n\nconst sub = defer(() => accountUid$)\n .pipe(first())\n .subscribe((uid) => {\n addAccountMarket(terminal, { account_id: `okx/${uid}/strategy`, market_id: 'OKX' });\n });\ndefer(() => terminal.dispose$).subscribe(() => sub.unsubscribe());\n"]}
|
package/dist/trade.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { Terminal } from '@yuants/protocol';
|
|
2
|
+
import { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';
|
|
3
|
+
import { encodePath, formatTime } from '@yuants/utils';
|
|
1
4
|
import { defer, first, repeat, retry, tap, timeout } from 'rxjs';
|
|
2
|
-
import { client } from './api';
|
|
3
5
|
import { accountUid$ } from './account';
|
|
4
|
-
import {
|
|
5
|
-
import { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';
|
|
6
|
-
import { Terminal } from '@yuants/protocol';
|
|
6
|
+
import { getAccountBillsArchive, getDefaultCredential } from './api';
|
|
7
7
|
const tradeParser = async (accountId, params) => {
|
|
8
8
|
const tradeList = [];
|
|
9
|
-
const
|
|
9
|
+
const credential = getDefaultCredential();
|
|
10
|
+
const result = await getAccountBillsArchive(credential, params);
|
|
10
11
|
const productIdToProduct = new Map();
|
|
11
12
|
const productIdSet = new Set();
|
|
12
13
|
if (result.code === '0' && result.data) {
|
package/dist/trade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trade.js","sourceRoot":"","sources":["../src/trade.ts"],"names":[],"mappings":"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","sourcesContent":["import { defer, first, of, repeat, retry, tap, timeout } from 'rxjs';\nimport { client } from './api';\nimport { ITrade } from '@yuants/data-trade';\nimport { accountUid$ } from './account';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';\nimport { Terminal } from '@yuants/protocol';\nimport { IProduct } from '@yuants/data-product';\nconst tradeParser = async (accountId: string, params: Record<string, string>): Promise<ITrade[]> => {\n const tradeList: ITrade[] = [];\n const result = await client.getAccountBillsArchive(params);\n const productIdToProduct = new Map<string, IProduct>();\n const productIdSet = new Set<string>();\n if (result.code === '0' && result.data) {\n const data = result.data;\n const mapTradeIdToBillList = new Map<string, typeof data>();\n data.forEach((item) => {\n productIdSet.add(encodePath(item.instType, item.instId));\n mapTradeIdToBillList.set(item.tradeId, [...(mapTradeIdToBillList.get(item.tradeId) ?? []), item]);\n });\n if (productIdSet.size > 0) {\n const productList = await requestSQL<IProduct[]>(\n Terminal.fromNodeEnv(),\n `\n select * from product where product_id in (${Array.from(productIdSet)\n .map((productId) => escapeSQL(productId))\n .join(',')})\n `,\n );\n if (productList.length > 0) {\n productList.forEach((p) => productIdToProduct.set(p.product_id, p));\n }\n }\n mapTradeIdToBillList.forEach(async (v, tradeId) => {\n if (!((v[0].instType === 'SPOT' && v.length === 2) || v[0].instType === 'SWAP')) return;\n\n const trade: ITrade = {\n id: tradeId,\n account_id: accountId,\n product_id: '',\n direction: '',\n traded_volume: '',\n traded_price: '',\n traded_value: '',\n post_volume: '',\n fee: '',\n fee_currency: '',\n created_at: '0',\n };\n\n v.forEach((bill) => {\n trade.created_at = Math.max(Number(trade.created_at), Number(bill.ts)).toString();\n trade.product_id = encodePath(bill.instType, bill.instId);\n trade.traded_price = bill.px;\n if (bill.instType === 'SWAP') {\n if (bill.subType === '1') trade.direction = 'OPEN_LONG';\n if (bill.subType === '2') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '3') trade.direction = 'OPEN_LONG';\n if (bill.subType === '4') trade.direction = 'OPEN_SHORT';\n if (bill.subType === '5') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '6') trade.direction = 'CLOSE_SHORT';\n trade.traded_volume = bill.sz;\n trade.traded_value = (Number(bill.sz) * Number(bill.px)).toString();\n }\n if (bill.instType === 'SPOT') {\n if (bill.subType === '1') {\n if (bill.ccy !== 'USDT') {\n trade.direction = 'OPEN_LONG';\n } else {\n trade.direction = 'CLOSE_LONG';\n }\n }\n\n if (bill.ccy !== 'USDT') {\n trade.traded_volume = bill.sz;\n }\n if (bill.ccy === 'USDT') {\n trade.traded_value = bill.sz;\n }\n }\n // fee\n if (bill.fee !== '0') {\n trade.fee = Math.abs(Number(bill.fee)).toString();\n trade.fee_currency = bill.ccy;\n }\n });\n trade.created_at = formatTime(Number(trade.created_at));\n if (productIdToProduct.has(trade.product_id)) {\n trade.traded_value = (\n +trade.traded_value * +(productIdToProduct.get(trade.product_id)?.value_scale ?? 1)\n ).toString();\n } else {\n throw new Error(`Not Found Product With Product Id: ${trade.product_id}`);\n }\n tradeList.push(trade);\n });\n }\n return tradeList;\n};\n\nconst getAccountTradeWithAccountId = async (accountId: string) => {\n const currentTrade = await requestSQL<ITrade[]>(\n Terminal.fromNodeEnv(),\n `\n select * from trade where account_id=${escapeSQL(accountId)} order by created_at desc limit 1;\n `,\n );\n const params: Record<string, string> = {\n type: '2',\n begin: (new Date().getTime() - 1000 * 60 * 60 * 24 * 30 * 3).toString(),\n };\n if (currentTrade.length === 1) {\n params['begin'] = new Date(currentTrade[0].created_at ?? 0).getTime().toString();\n }\n console.log(formatTime(Date.now()), 'getAccountTrade', `params: ${JSON.stringify(params)}`);\n const tradeList = await tradeParser(accountId, params);\n console.log(formatTime(Date.now()), 'getAccountTrade', `tradeList: ${JSON.stringify(tradeList)}`);\n await requestSQL(\n Terminal.fromNodeEnv(),\n buildInsertManyIntoTableSQL(tradeList, 'trade', {\n columns: [\n 'id',\n 'account_id',\n 'product_id',\n 'traded_volume',\n 'traded_value',\n 'traded_price',\n 'direction',\n 'fee',\n 'fee_currency',\n 'created_at',\n ],\n conflictKeys: ['id'],\n }),\n );\n};\n\ndefer(() => accountUid$)\n .pipe(first())\n .subscribe((uid) => {\n const account_id = `okx/${uid}/trading`;\n console.log(formatTime(Date.now()), 'getAccountTrade', `AccountID: ${account_id}`);\n defer(() => getAccountTradeWithAccountId(account_id))\n .pipe(\n //\n timeout(10_000), // 超时设定:10 秒\n tap({\n error: (err) => {\n console.error(formatTime(Date.now()), 'getAccountTradeError', err);\n },\n }),\n repeat({ delay: 30_000 }),\n retry({ delay: 5000 }),\n )\n .subscribe();\n });\n"]}
|
|
1
|
+
{"version":3,"file":"trade.js","sourceRoot":"","sources":["../src/trade.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAErE,MAAM,WAAW,GAAG,KAAK,EAAE,SAAiB,EAAE,MAA8B,EAAqB,EAAE;IACjG,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;;YACpB,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACzD,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAA,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACpG,CAAC,CAAC,CAAC;QACH,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE;YACzB,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,QAAQ,CAAC,WAAW,EAAE,EACtB;qDAC6C,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;iBAClE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;iBACxC,IAAI,CAAC,GAAG,CAAC;OACb,CACA,CAAC;YACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC1B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;aACrE;SACF;QACD,oBAAoB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE;;YAChD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;gBAAE,OAAO;YAExF,MAAM,KAAK,GAAW;gBACpB,EAAE,EAAE,OAAO;gBACX,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,EAAE;gBACd,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,EAAE;gBACjB,YAAY,EAAE,EAAE;gBAChB,YAAY,EAAE,EAAE;gBAChB,WAAW,EAAE,EAAE;gBACf,GAAG,EAAE,EAAE;gBACP,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,GAAG;aAChB,CAAC;YAEF,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACjB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAClF,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1D,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;oBAC5B,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;wBAAE,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC;oBACxD,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;wBAAE,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;oBACzD,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;wBAAE,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC;oBACxD,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;wBAAE,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;oBACzD,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;wBAAE,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;oBACzD,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;wBAAE,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;oBAC1D,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;iBACrE;gBACD,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;oBAC5B,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,EAAE;wBACxB,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,EAAE;4BACvB,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC;yBAC/B;6BAAM;4BACL,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;yBAChC;qBACF;oBAED,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,EAAE;wBACvB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC;qBAC/B;oBACD,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,EAAE;wBACvB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;qBAC9B;iBACF;gBACD,MAAM;gBACN,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE;oBACpB,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAClD,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC;iBAC/B;YACH,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACxD,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;gBAC5C,KAAK,CAAC,YAAY,GAAG,CACnB,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,MAAA,MAAA,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,0CAAE,WAAW,mCAAI,CAAC,CAAC,CACpF,CAAC,QAAQ,EAAE,CAAC;aACd;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;aAC3E;YACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;KACJ;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE;;IAC/D,MAAM,YAAY,GAAG,MAAM,UAAU,CACnC,QAAQ,CAAC,WAAW,EAAE,EACtB;2CACuC,SAAS,CAAC,SAAS,CAAC;GAC5D,CACA,CAAC;IACF,MAAM,MAAM,GAA2B;QACrC,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;KACxE,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7B,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAA,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,mCAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;KAClF;IACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,iBAAiB,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5F,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,iBAAiB,EAAE,cAAc,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClG,MAAM,UAAU,CACd,QAAQ,CAAC,WAAW,EAAE,EACtB,2BAA2B,CAAC,SAAS,EAAE,OAAO,EAAE;QAC9C,OAAO,EAAE;YACP,IAAI;YACJ,YAAY;YACZ,YAAY;YACZ,eAAe;YACf,cAAc;YACd,cAAc;YACd,WAAW;YACX,KAAK;YACL,cAAc;YACd,YAAY;SACb;QACD,YAAY,EAAE,CAAC,IAAI,CAAC;KACrB,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC;KACrB,IAAI,CAAC,KAAK,EAAE,CAAC;KACb,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,iBAAiB,EAAE,cAAc,UAAU,EAAE,CAAC,CAAC;IACnF,KAAK,CAAC,GAAG,EAAE,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC;SAClD,IAAI;IACH,EAAE;IACF,OAAO,CAAC,KAAM,CAAC,EAAE,aAAa;IAC9B,GAAG,CAAC;QACF,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;KACF,CAAC,EACF,MAAM,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACzB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACvB;SACA,SAAS,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC","sourcesContent":["import { IProduct } from '@yuants/data-product';\nimport { ITrade } from '@yuants/data-trade';\nimport { Terminal } from '@yuants/protocol';\nimport { buildInsertManyIntoTableSQL, escapeSQL, requestSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, first, repeat, retry, tap, timeout } from 'rxjs';\nimport { accountUid$ } from './account';\nimport { getAccountBillsArchive, getDefaultCredential } from './api';\n\nconst tradeParser = async (accountId: string, params: Record<string, string>): Promise<ITrade[]> => {\n const tradeList: ITrade[] = [];\n const credential = getDefaultCredential();\n const result = await getAccountBillsArchive(credential, params);\n const productIdToProduct = new Map<string, IProduct>();\n const productIdSet = new Set<string>();\n if (result.code === '0' && result.data) {\n const data = result.data;\n const mapTradeIdToBillList = new Map<string, typeof data>();\n data.forEach((item) => {\n productIdSet.add(encodePath(item.instType, item.instId));\n mapTradeIdToBillList.set(item.tradeId, [...(mapTradeIdToBillList.get(item.tradeId) ?? []), item]);\n });\n if (productIdSet.size > 0) {\n const productList = await requestSQL<IProduct[]>(\n Terminal.fromNodeEnv(),\n `\n select * from product where product_id in (${Array.from(productIdSet)\n .map((productId) => escapeSQL(productId))\n .join(',')})\n `,\n );\n if (productList.length > 0) {\n productList.forEach((p) => productIdToProduct.set(p.product_id, p));\n }\n }\n mapTradeIdToBillList.forEach(async (v, tradeId) => {\n if (!((v[0].instType === 'SPOT' && v.length === 2) || v[0].instType === 'SWAP')) return;\n\n const trade: ITrade = {\n id: tradeId,\n account_id: accountId,\n product_id: '',\n direction: '',\n traded_volume: '',\n traded_price: '',\n traded_value: '',\n post_volume: '',\n fee: '',\n fee_currency: '',\n created_at: '0',\n };\n\n v.forEach((bill) => {\n trade.created_at = Math.max(Number(trade.created_at), Number(bill.ts)).toString();\n trade.product_id = encodePath(bill.instType, bill.instId);\n trade.traded_price = bill.px;\n if (bill.instType === 'SWAP') {\n if (bill.subType === '1') trade.direction = 'OPEN_LONG';\n if (bill.subType === '2') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '3') trade.direction = 'OPEN_LONG';\n if (bill.subType === '4') trade.direction = 'OPEN_SHORT';\n if (bill.subType === '5') trade.direction = 'CLOSE_LONG';\n if (bill.subType === '6') trade.direction = 'CLOSE_SHORT';\n trade.traded_volume = bill.sz;\n trade.traded_value = (Number(bill.sz) * Number(bill.px)).toString();\n }\n if (bill.instType === 'SPOT') {\n if (bill.subType === '1') {\n if (bill.ccy !== 'USDT') {\n trade.direction = 'OPEN_LONG';\n } else {\n trade.direction = 'CLOSE_LONG';\n }\n }\n\n if (bill.ccy !== 'USDT') {\n trade.traded_volume = bill.sz;\n }\n if (bill.ccy === 'USDT') {\n trade.traded_value = bill.sz;\n }\n }\n // fee\n if (bill.fee !== '0') {\n trade.fee = Math.abs(Number(bill.fee)).toString();\n trade.fee_currency = bill.ccy;\n }\n });\n trade.created_at = formatTime(Number(trade.created_at));\n if (productIdToProduct.has(trade.product_id)) {\n trade.traded_value = (\n +trade.traded_value * +(productIdToProduct.get(trade.product_id)?.value_scale ?? 1)\n ).toString();\n } else {\n throw new Error(`Not Found Product With Product Id: ${trade.product_id}`);\n }\n tradeList.push(trade);\n });\n }\n return tradeList;\n};\n\nconst getAccountTradeWithAccountId = async (accountId: string) => {\n const currentTrade = await requestSQL<ITrade[]>(\n Terminal.fromNodeEnv(),\n `\n select * from trade where account_id=${escapeSQL(accountId)} order by created_at desc limit 1;\n `,\n );\n const params: Record<string, string> = {\n type: '2',\n begin: (new Date().getTime() - 1000 * 60 * 60 * 24 * 30 * 3).toString(),\n };\n if (currentTrade.length === 1) {\n params['begin'] = new Date(currentTrade[0].created_at ?? 0).getTime().toString();\n }\n console.log(formatTime(Date.now()), 'getAccountTrade', `params: ${JSON.stringify(params)}`);\n const tradeList = await tradeParser(accountId, params);\n console.log(formatTime(Date.now()), 'getAccountTrade', `tradeList: ${JSON.stringify(tradeList)}`);\n await requestSQL(\n Terminal.fromNodeEnv(),\n buildInsertManyIntoTableSQL(tradeList, 'trade', {\n columns: [\n 'id',\n 'account_id',\n 'product_id',\n 'traded_volume',\n 'traded_value',\n 'traded_price',\n 'direction',\n 'fee',\n 'fee_currency',\n 'created_at',\n ],\n conflictKeys: ['id'],\n }),\n );\n};\n\ndefer(() => accountUid$)\n .pipe(first())\n .subscribe((uid) => {\n const account_id = `okx/${uid}/trading`;\n console.log(formatTime(Date.now()), 'getAccountTrade', `AccountID: ${account_id}`);\n defer(() => getAccountTradeWithAccountId(account_id))\n .pipe(\n //\n timeout(10_000), // 超时设定:10 秒\n tap({\n error: (err) => {\n console.error(formatTime(Date.now()), 'getAccountTradeError', err);\n },\n }),\n repeat({ delay: 30_000 }),\n retry({ delay: 5000 }),\n )\n .subscribe();\n });\n"]}
|