@yuants/vendor-okx 0.28.1 → 0.28.3
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.
|
@@ -13,13 +13,13 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
|
|
|
13
13
|
import { createSeriesProvider } from '@yuants/data-series';
|
|
14
14
|
import { Terminal } from '@yuants/protocol';
|
|
15
15
|
import { createSQLWriter } from '@yuants/sql';
|
|
16
|
-
import { decodePath,
|
|
16
|
+
import { decodePath, formatTime } from '@yuants/utils';
|
|
17
17
|
import { firstValueFrom, map, mergeAll, timer } from 'rxjs';
|
|
18
18
|
import { getFundingRateHistory, getLendingRateHistory } from '../api/public-api';
|
|
19
19
|
import { productService } from './product';
|
|
20
20
|
createSQLWriter(Terminal.fromNodeEnv(), {
|
|
21
21
|
data$: productService.products$.pipe(mergeAll(), map((x) => ({
|
|
22
|
-
series_id:
|
|
22
|
+
series_id: x.product_id,
|
|
23
23
|
table_name: 'interest_rate',
|
|
24
24
|
cron_pattern: '0 * * * *',
|
|
25
25
|
cron_timezone: 'UTC',
|
|
@@ -39,8 +39,7 @@ createSeriesProvider(Terminal.fromNodeEnv(), {
|
|
|
39
39
|
return __asyncGenerator(this, arguments, function* () {
|
|
40
40
|
const start = started_at || 0;
|
|
41
41
|
const end = ended_at || Date.now();
|
|
42
|
-
const [
|
|
43
|
-
const [instType, instId] = decodePath(product_id);
|
|
42
|
+
const [, instType, instId] = decodePath(series_id);
|
|
44
43
|
if (instType === 'SWAP') {
|
|
45
44
|
let current_end = end;
|
|
46
45
|
while (true) {
|
|
@@ -59,8 +58,8 @@ createSeriesProvider(Terminal.fromNodeEnv(), {
|
|
|
59
58
|
console.info(formatTime(Date.now()), 'getFundingRateHistory', JSON.stringify(res.data));
|
|
60
59
|
const data = res.data.map((v) => ({
|
|
61
60
|
series_id: series_id,
|
|
62
|
-
product_id,
|
|
63
|
-
datasource_id,
|
|
61
|
+
product_id: series_id,
|
|
62
|
+
datasource_id: 'OKX',
|
|
64
63
|
created_at: formatTime(+v.fundingTime),
|
|
65
64
|
long_rate: `${-v.fundingRate}`,
|
|
66
65
|
short_rate: `${v.fundingRate}`,
|
|
@@ -110,8 +109,8 @@ createSeriesProvider(Terminal.fromNodeEnv(), {
|
|
|
110
109
|
const short_rate = +mapTsToBaseRate.get(v.ts) / 365 / 24; // 转换为小时利率
|
|
111
110
|
data.push({
|
|
112
111
|
series_id,
|
|
113
|
-
product_id,
|
|
114
|
-
datasource_id,
|
|
112
|
+
product_id: series_id,
|
|
113
|
+
datasource_id: 'OKX',
|
|
115
114
|
created_at: formatTime(+v.ts),
|
|
116
115
|
long_rate: `${-long_rate}`,
|
|
117
116
|
short_rate: `${-short_rate}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interest_rate.js","sourceRoot":"","sources":["../../src/public-data/interest_rate.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"interest_rate.js","sourceRoot":"","sources":["../../src/public-data/interest_rate.ts"],"names":[],"mappings":"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","sourcesContent":["import { IInterestRate } from '@yuants/data-interest-rate';\nimport { createSeriesProvider, ISeriesCollectingTask } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { createSQLWriter } from '@yuants/sql';\nimport { decodePath, encodePath, formatTime } from '@yuants/utils';\nimport { firstValueFrom, map, mergeAll, timer } from 'rxjs';\nimport { getFundingRateHistory, getLendingRateHistory } from '../api/public-api';\nimport { productService } from './product';\n\ncreateSQLWriter<ISeriesCollectingTask>(Terminal.fromNodeEnv(), {\n data$: productService.products$.pipe(\n mergeAll(),\n map(\n (x): ISeriesCollectingTask => ({\n series_id: x.product_id,\n table_name: 'interest_rate',\n cron_pattern: '0 * * * *', // 每小时执行一次\n cron_timezone: 'UTC',\n disabled: false,\n replay_count: 0,\n }),\n ),\n ),\n tableName: 'series_collecting_task',\n writeInterval: 1000,\n conflictKeys: ['series_id', 'table_name'],\n});\n\ncreateSeriesProvider<IInterestRate>(Terminal.fromNodeEnv(), {\n tableName: 'interest_rate',\n series_id_prefix_parts: ['OKX'],\n reversed: true,\n serviceOptions: { concurrent: 1 },\n queryFn: async function* ({ series_id, started_at, ended_at }) {\n const start = started_at || 0;\n const end = ended_at || Date.now();\n const [, instType, instId] = decodePath(series_id);\n\n if (instType === 'SWAP') {\n let current_end = end;\n while (true) {\n // 接口行为备注:向前翻页,时间降序,不含 after 当前时间点\n const res = await getFundingRateHistory({\n instId: instId,\n after: `${current_end}`,\n });\n if (res.code !== '0') {\n throw `getFundingRateHistory failed: ${res.code} ${res.msg}`;\n }\n // 如果没有数据了,就退出\n if (res.data.length === 0) {\n break;\n }\n console.info(formatTime(Date.now()), 'getFundingRateHistory', JSON.stringify(res.data));\n const data = res.data.map(\n (v): IInterestRate => ({\n series_id: series_id,\n product_id: series_id,\n datasource_id: 'OKX',\n created_at: formatTime(+v.fundingTime),\n long_rate: `${-v.fundingRate}`,\n short_rate: `${v.fundingRate}`,\n settlement_price: '',\n }),\n );\n yield data;\n current_end = +res.data[res.data.length - 1].fundingTime;\n if (current_end <= start) {\n break;\n }\n // for API rate limit\n await firstValueFrom(timer(1000));\n }\n }\n\n if (instType === 'MARGIN') {\n // MARGIN/BTC-USDT\n const [base, quote] = instId.split('-');\n let current_end = end;\n while (true) {\n const resBase = await getLendingRateHistory({ ccy: base, after: `${current_end}` });\n const resQuote = await getLendingRateHistory({ ccy: quote, after: `${current_end}` });\n\n if (resBase.code !== '0') {\n throw `getLendingRateHistory failed: ${resBase.code} ${resBase.msg}`;\n }\n if (resBase.data.length === 0) {\n break;\n }\n console.info(formatTime(Date.now()), 'getLendingRateHistory', JSON.stringify(resBase.data));\n\n if (resQuote.code !== '0') {\n throw `getLendingRateHistory failed: ${resQuote.code} ${resQuote.msg}`;\n }\n if (resQuote.data.length === 0) {\n break;\n }\n console.info(formatTime(Date.now()), 'getLendingRateHistory', JSON.stringify(resQuote.data));\n\n // 做多时,借入 quote 的资金,做空时,借入 base 的资金\n // 用 quote 的 rate 作为 long_rate,base 的 rate 作为 short_rate\n\n const mapTsToBaseRate = new Map<string, string>();\n resBase.data.forEach((v) => {\n mapTsToBaseRate.set(v.ts, v.rate);\n });\n\n const data: IInterestRate[] = [];\n\n resQuote.data.forEach((v) => {\n if (!mapTsToBaseRate.has(v.ts)) return;\n const long_rate = +v.rate / 365 / 24; // 转换为小时利率\n const short_rate = +mapTsToBaseRate.get(v.ts)! / 365 / 24; // 转换为小时利率\n data.push({\n series_id,\n product_id: series_id,\n datasource_id: 'OKX',\n created_at: formatTime(+v.ts),\n long_rate: `${-long_rate}`,\n short_rate: `${-short_rate}`,\n settlement_price: '',\n });\n });\n\n yield data;\n current_end = new Date(data[data.length - 1].created_at).getTime();\n if (current_end <= start) {\n break;\n }\n // for API rate limit\n await firstValueFrom(timer(1000));\n }\n }\n },\n});\n"]}
|
|
@@ -21,7 +21,7 @@ const public_api_1 = require("../api/public-api");
|
|
|
21
21
|
const product_1 = require("./product");
|
|
22
22
|
(0, sql_1.createSQLWriter)(protocol_1.Terminal.fromNodeEnv(), {
|
|
23
23
|
data$: product_1.productService.products$.pipe((0, rxjs_1.mergeAll)(), (0, rxjs_1.map)((x) => ({
|
|
24
|
-
series_id:
|
|
24
|
+
series_id: x.product_id,
|
|
25
25
|
table_name: 'interest_rate',
|
|
26
26
|
cron_pattern: '0 * * * *',
|
|
27
27
|
cron_timezone: 'UTC',
|
|
@@ -41,8 +41,7 @@ const product_1 = require("./product");
|
|
|
41
41
|
return __asyncGenerator(this, arguments, function* () {
|
|
42
42
|
const start = started_at || 0;
|
|
43
43
|
const end = ended_at || Date.now();
|
|
44
|
-
const [
|
|
45
|
-
const [instType, instId] = (0, utils_1.decodePath)(product_id);
|
|
44
|
+
const [, instType, instId] = (0, utils_1.decodePath)(series_id);
|
|
46
45
|
if (instType === 'SWAP') {
|
|
47
46
|
let current_end = end;
|
|
48
47
|
while (true) {
|
|
@@ -61,8 +60,8 @@ const product_1 = require("./product");
|
|
|
61
60
|
console.info((0, utils_1.formatTime)(Date.now()), 'getFundingRateHistory', JSON.stringify(res.data));
|
|
62
61
|
const data = res.data.map((v) => ({
|
|
63
62
|
series_id: series_id,
|
|
64
|
-
product_id,
|
|
65
|
-
datasource_id,
|
|
63
|
+
product_id: series_id,
|
|
64
|
+
datasource_id: 'OKX',
|
|
66
65
|
created_at: (0, utils_1.formatTime)(+v.fundingTime),
|
|
67
66
|
long_rate: `${-v.fundingRate}`,
|
|
68
67
|
short_rate: `${v.fundingRate}`,
|
|
@@ -112,8 +111,8 @@ const product_1 = require("./product");
|
|
|
112
111
|
const short_rate = +mapTsToBaseRate.get(v.ts) / 365 / 24; // 转换为小时利率
|
|
113
112
|
data.push({
|
|
114
113
|
series_id,
|
|
115
|
-
product_id,
|
|
116
|
-
datasource_id,
|
|
114
|
+
product_id: series_id,
|
|
115
|
+
datasource_id: 'OKX',
|
|
117
116
|
created_at: (0, utils_1.formatTime)(+v.ts),
|
|
118
117
|
long_rate: `${-long_rate}`,
|
|
119
118
|
short_rate: `${-short_rate}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interest_rate.js","sourceRoot":"","sources":["../../src/public-data/interest_rate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,qDAAkF;AAClF,+CAA4C;AAC5C,qCAA8C;AAC9C,yCAAmE;AACnE,+BAA4D;AAC5D,kDAAiF;AACjF,uCAA2C;AAE3C,IAAA,qBAAe,EAAwB,mBAAQ,CAAC,WAAW,EAAE,EAAE;IAC7D,KAAK,EAAE,wBAAc,CAAC,SAAS,CAAC,IAAI,CAClC,IAAA,eAAQ,GAAE,EACV,IAAA,UAAG,EACD,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC;QAC7B,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"interest_rate.js","sourceRoot":"","sources":["../../src/public-data/interest_rate.ts"],"names":[],"mappings":"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","sourcesContent":["import { IInterestRate } from '@yuants/data-interest-rate';\nimport { createSeriesProvider, ISeriesCollectingTask } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { createSQLWriter } from '@yuants/sql';\nimport { decodePath, encodePath, formatTime } from '@yuants/utils';\nimport { firstValueFrom, map, mergeAll, timer } from 'rxjs';\nimport { getFundingRateHistory, getLendingRateHistory } from '../api/public-api';\nimport { productService } from './product';\n\ncreateSQLWriter<ISeriesCollectingTask>(Terminal.fromNodeEnv(), {\n data$: productService.products$.pipe(\n mergeAll(),\n map(\n (x): ISeriesCollectingTask => ({\n series_id: x.product_id,\n table_name: 'interest_rate',\n cron_pattern: '0 * * * *', // 每小时执行一次\n cron_timezone: 'UTC',\n disabled: false,\n replay_count: 0,\n }),\n ),\n ),\n tableName: 'series_collecting_task',\n writeInterval: 1000,\n conflictKeys: ['series_id', 'table_name'],\n});\n\ncreateSeriesProvider<IInterestRate>(Terminal.fromNodeEnv(), {\n tableName: 'interest_rate',\n series_id_prefix_parts: ['OKX'],\n reversed: true,\n serviceOptions: { concurrent: 1 },\n queryFn: async function* ({ series_id, started_at, ended_at }) {\n const start = started_at || 0;\n const end = ended_at || Date.now();\n const [, instType, instId] = decodePath(series_id);\n\n if (instType === 'SWAP') {\n let current_end = end;\n while (true) {\n // 接口行为备注:向前翻页,时间降序,不含 after 当前时间点\n const res = await getFundingRateHistory({\n instId: instId,\n after: `${current_end}`,\n });\n if (res.code !== '0') {\n throw `getFundingRateHistory failed: ${res.code} ${res.msg}`;\n }\n // 如果没有数据了,就退出\n if (res.data.length === 0) {\n break;\n }\n console.info(formatTime(Date.now()), 'getFundingRateHistory', JSON.stringify(res.data));\n const data = res.data.map(\n (v): IInterestRate => ({\n series_id: series_id,\n product_id: series_id,\n datasource_id: 'OKX',\n created_at: formatTime(+v.fundingTime),\n long_rate: `${-v.fundingRate}`,\n short_rate: `${v.fundingRate}`,\n settlement_price: '',\n }),\n );\n yield data;\n current_end = +res.data[res.data.length - 1].fundingTime;\n if (current_end <= start) {\n break;\n }\n // for API rate limit\n await firstValueFrom(timer(1000));\n }\n }\n\n if (instType === 'MARGIN') {\n // MARGIN/BTC-USDT\n const [base, quote] = instId.split('-');\n let current_end = end;\n while (true) {\n const resBase = await getLendingRateHistory({ ccy: base, after: `${current_end}` });\n const resQuote = await getLendingRateHistory({ ccy: quote, after: `${current_end}` });\n\n if (resBase.code !== '0') {\n throw `getLendingRateHistory failed: ${resBase.code} ${resBase.msg}`;\n }\n if (resBase.data.length === 0) {\n break;\n }\n console.info(formatTime(Date.now()), 'getLendingRateHistory', JSON.stringify(resBase.data));\n\n if (resQuote.code !== '0') {\n throw `getLendingRateHistory failed: ${resQuote.code} ${resQuote.msg}`;\n }\n if (resQuote.data.length === 0) {\n break;\n }\n console.info(formatTime(Date.now()), 'getLendingRateHistory', JSON.stringify(resQuote.data));\n\n // 做多时,借入 quote 的资金,做空时,借入 base 的资金\n // 用 quote 的 rate 作为 long_rate,base 的 rate 作为 short_rate\n\n const mapTsToBaseRate = new Map<string, string>();\n resBase.data.forEach((v) => {\n mapTsToBaseRate.set(v.ts, v.rate);\n });\n\n const data: IInterestRate[] = [];\n\n resQuote.data.forEach((v) => {\n if (!mapTsToBaseRate.has(v.ts)) return;\n const long_rate = +v.rate / 365 / 24; // 转换为小时利率\n const short_rate = +mapTsToBaseRate.get(v.ts)! / 365 / 24; // 转换为小时利率\n data.push({\n series_id,\n product_id: series_id,\n datasource_id: 'OKX',\n created_at: formatTime(+v.ts),\n long_rate: `${-long_rate}`,\n short_rate: `${-short_rate}`,\n settlement_price: '',\n });\n });\n\n yield data;\n current_end = new Date(data[data.length - 1].created_at).getTime();\n if (current_end <= start) {\n break;\n }\n // for API rate limit\n await firstValueFrom(timer(1000));\n }\n }\n },\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuants/vendor-okx",
|
|
3
|
-
"version": "0.28.
|
|
3
|
+
"version": "0.28.3",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@yuants/data-interest-rate": "0.1.48",
|
|
23
23
|
"@yuants/data-quote": "0.2.43",
|
|
24
24
|
"@yuants/data-trade": "0.1.21",
|
|
25
|
-
"@yuants/exchange": "0.3.
|
|
25
|
+
"@yuants/exchange": "0.3.1",
|
|
26
26
|
"rxjs": "~7.5.6",
|
|
27
27
|
"ws": "~8.8.1"
|
|
28
28
|
},
|
package/temp/package-deps.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"apps/vendor-okx/CHANGELOG.json": "
|
|
3
|
-
"apps/vendor-okx/CHANGELOG.md": "
|
|
2
|
+
"apps/vendor-okx/CHANGELOG.json": "1274e028ebf58bc46c9e18bfd846b975d885a4c5",
|
|
3
|
+
"apps/vendor-okx/CHANGELOG.md": "2059225e33a0b10915c8aa0c2224bc46e635a587",
|
|
4
4
|
"apps/vendor-okx/README.md": "68caeb8e383d77ece973cd70f4b167b86abb54c3",
|
|
5
5
|
"apps/vendor-okx/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
|
|
6
6
|
"apps/vendor-okx/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
|
|
7
7
|
"apps/vendor-okx/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
|
|
8
8
|
"apps/vendor-okx/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
|
|
9
9
|
"apps/vendor-okx/etc/vendor-okx.api.md": "92c54ccd547d2ad81ca6088158ca193e85c208df",
|
|
10
|
-
"apps/vendor-okx/package.json": "
|
|
10
|
+
"apps/vendor-okx/package.json": "22fafd82ef91efaaf51cadd778cefc8fd76f5e1e",
|
|
11
11
|
"apps/vendor-okx/src/account-actions-with-credential.ts": "1a2de787b588e98ceef60b3ffb951f298504bf12",
|
|
12
12
|
"apps/vendor-okx/src/account.ts": "672014c974457b438cf026f763d6eecfe585c82b",
|
|
13
13
|
"apps/vendor-okx/src/accountInfos/earning.ts": "62aaeb3b62fa9197d07ee14155625530cdb9b1cd",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"apps/vendor-okx/src/orders/listOrders.ts": "c4739eb4c0f54391164a7d8e6c7fde44b41cb268",
|
|
37
37
|
"apps/vendor-okx/src/orders/modifyOrder.ts": "ab30a4b204bcf08c2762541a4bbbf01d0e0f2d1a",
|
|
38
38
|
"apps/vendor-okx/src/orders/submitOrder.ts": "d9200e3cfb2dd2bef090cab768e61c15e5d044d7",
|
|
39
|
-
"apps/vendor-okx/src/public-data/interest_rate.ts": "
|
|
39
|
+
"apps/vendor-okx/src/public-data/interest_rate.ts": "a03083ef520c0aba6e0b01e0e24147a858e164f4",
|
|
40
40
|
"apps/vendor-okx/src/public-data/market-order.ts": "c7269e9fe1f339b320e8b4cd98652854446a245c",
|
|
41
41
|
"apps/vendor-okx/src/public-data/ohlc.ts": "0b5a568e30b3070f74b0e64614e8c1cc9ba507fb",
|
|
42
42
|
"apps/vendor-okx/src/public-data/product.ts": "9caa1b0d9fa621800870ef47086767f6f5810ad9",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"libraries/data-interest-rate/temp/package-deps.json": "cef1e1cb0116ad593c24635684e0cbf03488d67c",
|
|
65
65
|
"libraries/data-quote/temp/package-deps.json": "34d079eab44d2bf65e07b112ac2099c6e92a015e",
|
|
66
66
|
"libraries/data-trade/temp/package-deps.json": "aa7929cce3f5a00f2cfb250e7aa4c442e3858517",
|
|
67
|
-
"libraries/exchange/temp/package-deps.json": "
|
|
67
|
+
"libraries/exchange/temp/package-deps.json": "ee94ff641b8afcd48484829a1d6d66ffede2a69c",
|
|
68
68
|
"libraries/extension/temp/package-deps.json": "9569c553c2f9a7d50b70d8f101fc2d3825aaccb9",
|
|
69
69
|
"tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
|
|
70
70
|
}
|