@yuants/vendor-huobi 0.17.4 → 0.17.6

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.
@@ -20,7 +20,7 @@ export const getSuperMarginAccountInfo = async (credential) => {
20
20
  if (currencyData.balance === '0')
21
21
  continue;
22
22
  const product_id = encodePath('HTX', 'SPOT', currencyData.currency + 'usdt');
23
- const quote = await quoteCache.query(product_id);
23
+ const quote = await quoteCache.query(currencyData.currency);
24
24
  const closable_price = currencyData.currency === 'usdt' ? 1 : +((_b = quote === null || quote === void 0 ? void 0 : quote.ask_price) !== null && _b !== void 0 ? _b : 0);
25
25
  positions.push(makeSpotPosition({
26
26
  position_id: `${currencyData.currency}/usdt/spot`,
@@ -1 +1 @@
1
- {"version":3,"file":"super-margin.js","sourceRoot":"","sources":["../../../src/services/accounts/super-margin.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAe,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,QAAQ,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAgD,KAAK,EAAE,UAAU,EAAE,EAAE;;IACzG,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,sBAAsB;IACtB,MAAM,qBAAqB,GAAG,MAAM,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,qBAAqB;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtF,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAE,IAAI,KAAI,EAAE,CAAC;IAEpD,kCAAkC;IAClC,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE;QACtC,IAAI,YAAY,CAAC,OAAO,KAAK,GAAG;YAAE,SAAS;QAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,mCAAI,CAAC,CAAC,CAAC;QAEvF,SAAS,CAAC,IAAI,CACZ,gBAAgB,CAAC;YACf,WAAW,EAAE,GAAG,YAAY,CAAC,QAAQ,YAAY;YACjD,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO;YAC7B,WAAW,EAAE,CAAC,YAAY,CAAC,OAAO;YAClC,cAAc,EAAE,cAAc;SAC/B,CAAC,CACH,CAAC;KACH;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC","sourcesContent":["import { IActionHandlerOfGetAccountInfo, IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { getSpotAccountBalance, ICredential } from '../../api/private-api';\nimport { quoteCache } from '../market-data/quote';\nimport { superMarginAccountUidCache } from '../uid';\n\n/**\n * 全仓杠杆账户 (Super Margin Account)\n */\nexport const getSuperMarginAccountInfo: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n const positions: IPosition[] = [];\n // get account balance\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Failed to get Super Margin Account UID');\n const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // get prices and create positions\n for (const currencyData of balanceList) {\n if (currencyData.balance === '0') continue;\n const product_id = encodePath('HTX', 'SPOT', currencyData.currency + 'usdt');\n const quote = await quoteCache.query(product_id);\n const closable_price = currencyData.currency === 'usdt' ? 1 : +(quote?.ask_price ?? 0);\n\n positions.push(\n makeSpotPosition({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: product_id,\n volume: +currencyData.balance,\n free_volume: +currencyData.balance,\n closable_price: closable_price,\n }),\n );\n }\n\n return positions;\n};\n"]}
1
+ {"version":3,"file":"super-margin.js","sourceRoot":"","sources":["../../../src/services/accounts/super-margin.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAe,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,QAAQ,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAgD,KAAK,EAAE,UAAU,EAAE,EAAE;;IACzG,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,sBAAsB;IACtB,MAAM,qBAAqB,GAAG,MAAM,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,qBAAqB;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtF,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAE,IAAI,KAAI,EAAE,CAAC;IAEpD,kCAAkC;IAClC,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE;QACtC,IAAI,YAAY,CAAC,OAAO,KAAK,GAAG;YAAE,SAAS;QAC3C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,mCAAI,CAAC,CAAC,CAAC;QAEvF,SAAS,CAAC,IAAI,CACZ,gBAAgB,CAAC;YACf,WAAW,EAAE,GAAG,YAAY,CAAC,QAAQ,YAAY;YACjD,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO;YAC7B,WAAW,EAAE,CAAC,YAAY,CAAC,OAAO;YAClC,cAAc,EAAE,cAAc;SAC/B,CAAC,CACH,CAAC;KACH;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC","sourcesContent":["import { IActionHandlerOfGetAccountInfo, IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { getSpotAccountBalance, ICredential } from '../../api/private-api';\nimport { quoteCache } from '../market-data/quote';\nimport { superMarginAccountUidCache } from '../uid';\n\n/**\n * 全仓杠杆账户 (Super Margin Account)\n */\nexport const getSuperMarginAccountInfo: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n const positions: IPosition[] = [];\n // get account balance\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Failed to get Super Margin Account UID');\n const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // get prices and create positions\n for (const currencyData of balanceList) {\n if (currencyData.balance === '0') continue;\n const product_id = encodePath('HTX', 'SPOT', currencyData.currency + 'usdt');\n const quote = await quoteCache.query(currencyData.currency);\n const closable_price = currencyData.currency === 'usdt' ? 1 : +(quote?.ask_price ?? 0);\n\n positions.push(\n makeSpotPosition({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: product_id,\n volume: +currencyData.balance,\n free_volume: +currencyData.balance,\n closable_price: closable_price,\n }),\n );\n }\n\n return positions;\n};\n"]}
@@ -1,7 +1,7 @@
1
1
  import { createCache } from '@yuants/cache';
2
- import { queryQuotes, setMetricsQuoteState } from '@yuants/data-quote';
2
+ import { setMetricsQuoteState } from '@yuants/data-quote';
3
3
  import { Terminal } from '@yuants/protocol';
4
- import { writeToSQL } from '@yuants/sql';
4
+ import { escapeSQL, requestSQL, writeToSQL } from '@yuants/sql';
5
5
  import { encodePath, formatTime } from '@yuants/utils';
6
6
  import { defer, from, groupBy, map, merge, mergeMap, repeat, retry, scan, shareReplay, toArray } from 'rxjs';
7
7
  import { getSpotMarketTickers, getSwapBatchFundingRate, getSwapMarketBbo, getSwapMarketTrade, getSwapOpenInterest, } from '../../api/public-api';
@@ -67,8 +67,11 @@ if (process.env.WRITE_QUOTE_TO_SQL === 'true') {
67
67
  }
68
68
  const mapSwapContractCodeToOpenInterest$ = defer(() => swapOpenInterest$).pipe(mergeMap((res) => from(res.data).pipe(map((tick) => [tick.contract_code, tick]), toArray(), map((ticks) => Object.fromEntries(ticks)))), repeat({ delay: 1000 }), retry({ delay: 1000 }), shareReplay(1));
69
69
  export const quoteCache = createCache(async (product_id) => {
70
- const quoteRecord = await queryQuotes(terminal, [product_id], ['ask_price', 'bid_price', 'last_price'], Date.now());
71
- return quoteRecord[product_id];
70
+ const sql = `select * from quote where product_id = ${escapeSQL(product_id)}`;
71
+ console.info('QuoteSQL', sql);
72
+ const [quote] = await requestSQL(terminal, sql);
73
+ console.info('QuoteFetched', product_id, JSON.stringify(quote));
74
+ return quote;
72
75
  }, { expire: 10000 });
73
76
  // provideTicks(Terminal.fromNodeEnv(), 'HUOBI-SWAP', (product_id) => {
74
77
  // return defer(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/services/market-data/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IQuote, queryQuotes, setMetricsQuoteState } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, from, groupBy, map, merge, mergeMap, repeat, retry, scan, shareReplay, toArray } from 'rxjs';\nimport {\n getSpotMarketTickers,\n getSwapBatchFundingRate,\n getSwapMarketBbo,\n getSwapMarketTrade,\n getSwapOpenInterest,\n} from '../../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst swapBboTick$ = defer(() => getSwapMarketBbo({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote1$ = swapBboTick$.pipe(\n mergeMap((res) => res.ticks || []),\n map((tick): Partial<IQuote> => {\n const [ask_price = '', ask_volume = ''] = tick.ask || [];\n const [bid_price = '', bid_volume = ''] = tick.bid || [];\n return {\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n ask_price: `${ask_price}`,\n bid_price: `${bid_price}`,\n ask_volume: `${ask_volume}`,\n bid_volume: `${bid_volume}`,\n };\n }),\n);\n\nconst mapSwapContractCodeToBboTick$ = defer(() => swapBboTick$).pipe(\n mergeMap((res) =>\n from(res.ticks).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapTradeTick$ = defer(() => getSwapMarketTrade({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote2$ = swapTradeTick$.pipe(\n mergeMap((res) => res.tick?.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n last_price: `${tick.price}`,\n }),\n ),\n);\n\nconst quote5$ = defer(() => getSpotMarketTickers()).pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SPOT', tick.symbol),\n ask_price: `${tick.ask}`,\n bid_price: `${tick.bid}`,\n ask_volume: `${tick.askSize}`,\n bid_volume: `${tick.bidSize}`,\n last_price: `${tick.close}`,\n }),\n ),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst mapSwapContractCodeToTradeTick$ = defer(() => swapTradeTick$).pipe(\n mergeMap((res) =>\n from(res.tick.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\nconst swapFundingRateTick$ = defer(() => getSwapBatchFundingRate({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote3$ = swapFundingRateTick$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n interest_rate_long: `${-tick.funding_rate}`,\n interest_rate_short: `${tick.funding_rate}`,\n interest_rate_next_settled_at: formatTime(+tick.funding_time),\n }),\n ),\n);\n\nconst mapSwapContractCodeToFundingRateTick$ = defer(() => swapFundingRateTick$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapOpenInterest$ = defer(() => getSwapOpenInterest({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote4$ = swapOpenInterest$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n open_interest: `${tick.volume}`,\n }),\n ),\n);\n\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n // 合并不同来源的数据并进行合并,避免死锁\n merge(quote1$, quote2$, quote3$, quote4$, quote5$)\n .pipe(\n groupBy((x) => encodePath(x.datasource_id, x.product_id)),\n mergeMap((group$) => {\n return group$.pipe(scan((acc, cur) => Object.assign(acc, cur), {} as Partial<IQuote>));\n }),\n )\n .pipe(\n setMetricsQuoteState(terminal.terminal_id),\n writeToSQL({\n terminal,\n tableName: 'quote',\n writeInterval: 1000,\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n}\n\nconst mapSwapContractCodeToOpenInterest$ = defer(() => swapOpenInterest$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nexport const quoteCache = createCache<Partial<IQuote> | undefined>(\n async (product_id) => {\n const quoteRecord = await queryQuotes(\n terminal,\n [product_id],\n ['ask_price', 'bid_price', 'last_price'],\n Date.now(),\n );\n return quoteRecord[product_id];\n },\n { expire: 10_000 },\n);\n\n// provideTicks(Terminal.fromNodeEnv(), 'HUOBI-SWAP', (product_id) => {\n// return defer(async () => {\n// const products = await firstValueFrom(perpetualContractProducts$);\n// const theProduct = products.find((x) => x.product_id === product_id);\n// if (!theProduct) throw `No Found ProductID ${product_id}`;\n\n// return [\n// of(theProduct),\n// mapSwapContractCodeToBboTick$,\n// mapSwapContractCodeToTradeTick$,\n// mapSwapContractCodeToFundingRateTick$,\n// mapSwapContractCodeToOpenInterest$,\n// ] as const;\n// }).pipe(\n// catchError(() => EMPTY),\n// mergeMap((x) =>\n// combineLatest(x).pipe(\n// map(([theProduct, bboTick, tradeTick, fundingRateTick, openInterest]): ITick => {\n// return {\n// datasource_id: 'HUOBI-SWAP',\n// product_id,\n// updated_at: Date.now(),\n// settlement_scheduled_at: +fundingRateTick[product_id].funding_time,\n// price: +tradeTick[product_id].price,\n// ask: bboTick[product_id].ask?.[0] ?? undefined,\n// bid: bboTick[product_id].bid?.[0] ?? undefined,\n// volume: +tradeTick[product_id].amount,\n// interest_rate_for_long: -+fundingRateTick[product_id].funding_rate,\n// interest_rate_for_short: +fundingRateTick[product_id].funding_rate,\n// open_interest: +openInterest[product_id]?.volume,\n// };\n// }),\n// ),\n// ),\n// );\n// });\n"]}
1
+ {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/services/market-data/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IQuote, setMetricsQuoteState } from '@yuants/data-quote';\nimport { GlobalPrometheusRegistry, Terminal } from '@yuants/protocol';\nimport { escapeSQL, requestSQL, writeToSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, from, groupBy, map, merge, mergeMap, repeat, retry, scan, shareReplay, toArray } from 'rxjs';\nimport {\n getSpotMarketTickers,\n getSwapBatchFundingRate,\n getSwapMarketBbo,\n getSwapMarketTrade,\n getSwapOpenInterest,\n} from '../../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst swapBboTick$ = defer(() => getSwapMarketBbo({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote1$ = swapBboTick$.pipe(\n mergeMap((res) => res.ticks || []),\n map((tick): Partial<IQuote> => {\n const [ask_price = '', ask_volume = ''] = tick.ask || [];\n const [bid_price = '', bid_volume = ''] = tick.bid || [];\n return {\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n ask_price: `${ask_price}`,\n bid_price: `${bid_price}`,\n ask_volume: `${ask_volume}`,\n bid_volume: `${bid_volume}`,\n };\n }),\n);\n\nconst mapSwapContractCodeToBboTick$ = defer(() => swapBboTick$).pipe(\n mergeMap((res) =>\n from(res.ticks).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapTradeTick$ = defer(() => getSwapMarketTrade({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote2$ = swapTradeTick$.pipe(\n mergeMap((res) => res.tick?.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n last_price: `${tick.price}`,\n }),\n ),\n);\n\nconst quote5$ = defer(() => getSpotMarketTickers()).pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SPOT', tick.symbol),\n ask_price: `${tick.ask}`,\n bid_price: `${tick.bid}`,\n ask_volume: `${tick.askSize}`,\n bid_volume: `${tick.bidSize}`,\n last_price: `${tick.close}`,\n }),\n ),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst mapSwapContractCodeToTradeTick$ = defer(() => swapTradeTick$).pipe(\n mergeMap((res) =>\n from(res.tick.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\nconst swapFundingRateTick$ = defer(() => getSwapBatchFundingRate({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote3$ = swapFundingRateTick$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n interest_rate_long: `${-tick.funding_rate}`,\n interest_rate_short: `${tick.funding_rate}`,\n interest_rate_next_settled_at: formatTime(+tick.funding_time),\n }),\n ),\n);\n\nconst mapSwapContractCodeToFundingRateTick$ = defer(() => swapFundingRateTick$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapOpenInterest$ = defer(() => getSwapOpenInterest({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote4$ = swapOpenInterest$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n open_interest: `${tick.volume}`,\n }),\n ),\n);\n\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n // 合并不同来源的数据并进行合并,避免死锁\n merge(quote1$, quote2$, quote3$, quote4$, quote5$)\n .pipe(\n groupBy((x) => encodePath(x.datasource_id, x.product_id)),\n mergeMap((group$) => {\n return group$.pipe(scan((acc, cur) => Object.assign(acc, cur), {} as Partial<IQuote>));\n }),\n )\n .pipe(\n setMetricsQuoteState(terminal.terminal_id),\n writeToSQL({\n terminal,\n tableName: 'quote',\n writeInterval: 1000,\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n}\n\nconst mapSwapContractCodeToOpenInterest$ = defer(() => swapOpenInterest$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nexport const quoteCache = createCache<IQuote>(\n async (product_id) => {\n const sql = `select * from quote where product_id = ${escapeSQL(product_id)}`;\n console.info('QuoteSQL', sql);\n const [quote] = await requestSQL<IQuote[]>(terminal, sql);\n console.info('QuoteFetched', product_id, JSON.stringify(quote));\n return quote;\n },\n { expire: 10_000 },\n);\n\n// provideTicks(Terminal.fromNodeEnv(), 'HUOBI-SWAP', (product_id) => {\n// return defer(async () => {\n// const products = await firstValueFrom(perpetualContractProducts$);\n// const theProduct = products.find((x) => x.product_id === product_id);\n// if (!theProduct) throw `No Found ProductID ${product_id}`;\n\n// return [\n// of(theProduct),\n// mapSwapContractCodeToBboTick$,\n// mapSwapContractCodeToTradeTick$,\n// mapSwapContractCodeToFundingRateTick$,\n// mapSwapContractCodeToOpenInterest$,\n// ] as const;\n// }).pipe(\n// catchError(() => EMPTY),\n// mergeMap((x) =>\n// combineLatest(x).pipe(\n// map(([theProduct, bboTick, tradeTick, fundingRateTick, openInterest]): ITick => {\n// return {\n// datasource_id: 'HUOBI-SWAP',\n// product_id,\n// updated_at: Date.now(),\n// settlement_scheduled_at: +fundingRateTick[product_id].funding_time,\n// price: +tradeTick[product_id].price,\n// ask: bboTick[product_id].ask?.[0] ?? undefined,\n// bid: bboTick[product_id].bid?.[0] ?? undefined,\n// volume: +tradeTick[product_id].amount,\n// interest_rate_for_long: -+fundingRateTick[product_id].funding_rate,\n// interest_rate_for_short: +fundingRateTick[product_id].funding_rate,\n// open_interest: +openInterest[product_id]?.volume,\n// };\n// }),\n// ),\n// ),\n// );\n// });\n"]}
@@ -23,7 +23,7 @@ const getSuperMarginAccountInfo = async (credential) => {
23
23
  if (currencyData.balance === '0')
24
24
  continue;
25
25
  const product_id = (0, utils_1.encodePath)('HTX', 'SPOT', currencyData.currency + 'usdt');
26
- const quote = await quote_1.quoteCache.query(product_id);
26
+ const quote = await quote_1.quoteCache.query(currencyData.currency);
27
27
  const closable_price = currencyData.currency === 'usdt' ? 1 : +((_b = quote === null || quote === void 0 ? void 0 : quote.ask_price) !== null && _b !== void 0 ? _b : 0);
28
28
  positions.push((0, data_account_1.makeSpotPosition)({
29
29
  position_id: `${currencyData.currency}/usdt/spot`,
@@ -1 +1 @@
1
- {"version":3,"file":"super-margin.js","sourceRoot":"","sources":["../../../src/services/accounts/super-margin.ts"],"names":[],"mappings":";;;AAAA,uDAAmG;AACnG,yCAA2C;AAC3C,uDAA2E;AAC3E,gDAAkD;AAClD,gCAAoD;AAEpD;;GAEG;AACI,MAAM,yBAAyB,GAAgD,KAAK,EAAE,UAAU,EAAE,EAAE;;IACzG,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,sBAAsB;IACtB,MAAM,qBAAqB,GAAG,MAAM,gCAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,qBAAqB;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtF,MAAM,cAAc,GAAG,MAAM,IAAA,mCAAqB,EAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAE,IAAI,KAAI,EAAE,CAAC;IAEpD,kCAAkC;IAClC,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE;QACtC,IAAI,YAAY,CAAC,OAAO,KAAK,GAAG;YAAE,SAAS;QAC3C,MAAM,UAAU,GAAG,IAAA,kBAAU,EAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,kBAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,mCAAI,CAAC,CAAC,CAAC;QAEvF,SAAS,CAAC,IAAI,CACZ,IAAA,+BAAgB,EAAC;YACf,WAAW,EAAE,GAAG,YAAY,CAAC,QAAQ,YAAY;YACjD,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO;YAC7B,WAAW,EAAE,CAAC,YAAY,CAAC,OAAO;YAClC,cAAc,EAAE,cAAc;SAC/B,CAAC,CACH,CAAC;KACH;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AA3BW,QAAA,yBAAyB,6BA2BpC","sourcesContent":["import { IActionHandlerOfGetAccountInfo, IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { getSpotAccountBalance, ICredential } from '../../api/private-api';\nimport { quoteCache } from '../market-data/quote';\nimport { superMarginAccountUidCache } from '../uid';\n\n/**\n * 全仓杠杆账户 (Super Margin Account)\n */\nexport const getSuperMarginAccountInfo: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n const positions: IPosition[] = [];\n // get account balance\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Failed to get Super Margin Account UID');\n const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // get prices and create positions\n for (const currencyData of balanceList) {\n if (currencyData.balance === '0') continue;\n const product_id = encodePath('HTX', 'SPOT', currencyData.currency + 'usdt');\n const quote = await quoteCache.query(product_id);\n const closable_price = currencyData.currency === 'usdt' ? 1 : +(quote?.ask_price ?? 0);\n\n positions.push(\n makeSpotPosition({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: product_id,\n volume: +currencyData.balance,\n free_volume: +currencyData.balance,\n closable_price: closable_price,\n }),\n );\n }\n\n return positions;\n};\n"]}
1
+ {"version":3,"file":"super-margin.js","sourceRoot":"","sources":["../../../src/services/accounts/super-margin.ts"],"names":[],"mappings":";;;AAAA,uDAAmG;AACnG,yCAA2C;AAC3C,uDAA2E;AAC3E,gDAAkD;AAClD,gCAAoD;AAEpD;;GAEG;AACI,MAAM,yBAAyB,GAAgD,KAAK,EAAE,UAAU,EAAE,EAAE;;IACzG,MAAM,SAAS,GAAgB,EAAE,CAAC;IAClC,sBAAsB;IACtB,MAAM,qBAAqB,GAAG,MAAM,gCAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,qBAAqB;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtF,MAAM,cAAc,GAAG,MAAM,IAAA,mCAAqB,EAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAE,IAAI,KAAI,EAAE,CAAC;IAEpD,kCAAkC;IAClC,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE;QACtC,IAAI,YAAY,CAAC,OAAO,KAAK,GAAG;YAAE,SAAS;QAC3C,MAAM,UAAU,GAAG,IAAA,kBAAU,EAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,kBAAU,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,mCAAI,CAAC,CAAC,CAAC;QAEvF,SAAS,CAAC,IAAI,CACZ,IAAA,+BAAgB,EAAC;YACf,WAAW,EAAE,GAAG,YAAY,CAAC,QAAQ,YAAY;YACjD,UAAU,EAAE,UAAU;YACtB,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO;YAC7B,WAAW,EAAE,CAAC,YAAY,CAAC,OAAO;YAClC,cAAc,EAAE,cAAc;SAC/B,CAAC,CACH,CAAC;KACH;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AA3BW,QAAA,yBAAyB,6BA2BpC","sourcesContent":["import { IActionHandlerOfGetAccountInfo, IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { encodePath } from '@yuants/utils';\nimport { getSpotAccountBalance, ICredential } from '../../api/private-api';\nimport { quoteCache } from '../market-data/quote';\nimport { superMarginAccountUidCache } from '../uid';\n\n/**\n * 全仓杠杆账户 (Super Margin Account)\n */\nexport const getSuperMarginAccountInfo: IActionHandlerOfGetAccountInfo<ICredential> = async (credential) => {\n const positions: IPosition[] = [];\n // get account balance\n const superMarginAccountUid = await superMarginAccountUidCache.query(JSON.stringify(credential));\n if (!superMarginAccountUid) throw new Error('Failed to get Super Margin Account UID');\n const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // get prices and create positions\n for (const currencyData of balanceList) {\n if (currencyData.balance === '0') continue;\n const product_id = encodePath('HTX', 'SPOT', currencyData.currency + 'usdt');\n const quote = await quoteCache.query(currencyData.currency);\n const closable_price = currencyData.currency === 'usdt' ? 1 : +(quote?.ask_price ?? 0);\n\n positions.push(\n makeSpotPosition({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: product_id,\n volume: +currencyData.balance,\n free_volume: +currencyData.balance,\n closable_price: closable_price,\n }),\n );\n }\n\n return positions;\n};\n"]}
@@ -1,3 +1,3 @@
1
1
  import { IQuote } from '@yuants/data-quote';
2
- export declare const quoteCache: import("@yuants/cache").ICache<Partial<IQuote> | undefined>;
2
+ export declare const quoteCache: import("@yuants/cache").ICache<IQuote>;
3
3
  //# sourceMappingURL=quote.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../../src/services/market-data/quote.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqC,MAAM,oBAAoB,CAAC;AAwL/E,eAAO,MAAM,UAAU,6DAWtB,CAAC"}
1
+ {"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../../src/services/market-data/quote.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAwB,MAAM,oBAAoB,CAAC;AAwLlE,eAAO,MAAM,UAAU,wCAStB,CAAC"}
@@ -70,8 +70,11 @@ if (process.env.WRITE_QUOTE_TO_SQL === 'true') {
70
70
  }
71
71
  const mapSwapContractCodeToOpenInterest$ = (0, rxjs_1.defer)(() => swapOpenInterest$).pipe((0, rxjs_1.mergeMap)((res) => (0, rxjs_1.from)(res.data).pipe((0, rxjs_1.map)((tick) => [tick.contract_code, tick]), (0, rxjs_1.toArray)(), (0, rxjs_1.map)((ticks) => Object.fromEntries(ticks)))), (0, rxjs_1.repeat)({ delay: 1000 }), (0, rxjs_1.retry)({ delay: 1000 }), (0, rxjs_1.shareReplay)(1));
72
72
  exports.quoteCache = (0, cache_1.createCache)(async (product_id) => {
73
- const quoteRecord = await (0, data_quote_1.queryQuotes)(terminal, [product_id], ['ask_price', 'bid_price', 'last_price'], Date.now());
74
- return quoteRecord[product_id];
73
+ const sql = `select * from quote where product_id = ${(0, sql_1.escapeSQL)(product_id)}`;
74
+ console.info('QuoteSQL', sql);
75
+ const [quote] = await (0, sql_1.requestSQL)(terminal, sql);
76
+ console.info('QuoteFetched', product_id, JSON.stringify(quote));
77
+ return quote;
75
78
  }, { expire: 10000 });
76
79
  // provideTicks(Terminal.fromNodeEnv(), 'HUOBI-SWAP', (product_id) => {
77
80
  // return defer(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/services/market-data/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IQuote, queryQuotes, setMetricsQuoteState } from '@yuants/data-quote';\nimport { Terminal } from '@yuants/protocol';\nimport { writeToSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, from, groupBy, map, merge, mergeMap, repeat, retry, scan, shareReplay, toArray } from 'rxjs';\nimport {\n getSpotMarketTickers,\n getSwapBatchFundingRate,\n getSwapMarketBbo,\n getSwapMarketTrade,\n getSwapOpenInterest,\n} from '../../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst swapBboTick$ = defer(() => getSwapMarketBbo({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote1$ = swapBboTick$.pipe(\n mergeMap((res) => res.ticks || []),\n map((tick): Partial<IQuote> => {\n const [ask_price = '', ask_volume = ''] = tick.ask || [];\n const [bid_price = '', bid_volume = ''] = tick.bid || [];\n return {\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n ask_price: `${ask_price}`,\n bid_price: `${bid_price}`,\n ask_volume: `${ask_volume}`,\n bid_volume: `${bid_volume}`,\n };\n }),\n);\n\nconst mapSwapContractCodeToBboTick$ = defer(() => swapBboTick$).pipe(\n mergeMap((res) =>\n from(res.ticks).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapTradeTick$ = defer(() => getSwapMarketTrade({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote2$ = swapTradeTick$.pipe(\n mergeMap((res) => res.tick?.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n last_price: `${tick.price}`,\n }),\n ),\n);\n\nconst quote5$ = defer(() => getSpotMarketTickers()).pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SPOT', tick.symbol),\n ask_price: `${tick.ask}`,\n bid_price: `${tick.bid}`,\n ask_volume: `${tick.askSize}`,\n bid_volume: `${tick.bidSize}`,\n last_price: `${tick.close}`,\n }),\n ),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst mapSwapContractCodeToTradeTick$ = defer(() => swapTradeTick$).pipe(\n mergeMap((res) =>\n from(res.tick.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\nconst swapFundingRateTick$ = defer(() => getSwapBatchFundingRate({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote3$ = swapFundingRateTick$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n interest_rate_long: `${-tick.funding_rate}`,\n interest_rate_short: `${tick.funding_rate}`,\n interest_rate_next_settled_at: formatTime(+tick.funding_time),\n }),\n ),\n);\n\nconst mapSwapContractCodeToFundingRateTick$ = defer(() => swapFundingRateTick$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapOpenInterest$ = defer(() => getSwapOpenInterest({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote4$ = swapOpenInterest$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n open_interest: `${tick.volume}`,\n }),\n ),\n);\n\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n // 合并不同来源的数据并进行合并,避免死锁\n merge(quote1$, quote2$, quote3$, quote4$, quote5$)\n .pipe(\n groupBy((x) => encodePath(x.datasource_id, x.product_id)),\n mergeMap((group$) => {\n return group$.pipe(scan((acc, cur) => Object.assign(acc, cur), {} as Partial<IQuote>));\n }),\n )\n .pipe(\n setMetricsQuoteState(terminal.terminal_id),\n writeToSQL({\n terminal,\n tableName: 'quote',\n writeInterval: 1000,\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n}\n\nconst mapSwapContractCodeToOpenInterest$ = defer(() => swapOpenInterest$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nexport const quoteCache = createCache<Partial<IQuote> | undefined>(\n async (product_id) => {\n const quoteRecord = await queryQuotes(\n terminal,\n [product_id],\n ['ask_price', 'bid_price', 'last_price'],\n Date.now(),\n );\n return quoteRecord[product_id];\n },\n { expire: 10_000 },\n);\n\n// provideTicks(Terminal.fromNodeEnv(), 'HUOBI-SWAP', (product_id) => {\n// return defer(async () => {\n// const products = await firstValueFrom(perpetualContractProducts$);\n// const theProduct = products.find((x) => x.product_id === product_id);\n// if (!theProduct) throw `No Found ProductID ${product_id}`;\n\n// return [\n// of(theProduct),\n// mapSwapContractCodeToBboTick$,\n// mapSwapContractCodeToTradeTick$,\n// mapSwapContractCodeToFundingRateTick$,\n// mapSwapContractCodeToOpenInterest$,\n// ] as const;\n// }).pipe(\n// catchError(() => EMPTY),\n// mergeMap((x) =>\n// combineLatest(x).pipe(\n// map(([theProduct, bboTick, tradeTick, fundingRateTick, openInterest]): ITick => {\n// return {\n// datasource_id: 'HUOBI-SWAP',\n// product_id,\n// updated_at: Date.now(),\n// settlement_scheduled_at: +fundingRateTick[product_id].funding_time,\n// price: +tradeTick[product_id].price,\n// ask: bboTick[product_id].ask?.[0] ?? undefined,\n// bid: bboTick[product_id].bid?.[0] ?? undefined,\n// volume: +tradeTick[product_id].amount,\n// interest_rate_for_long: -+fundingRateTick[product_id].funding_rate,\n// interest_rate_for_short: +fundingRateTick[product_id].funding_rate,\n// open_interest: +openInterest[product_id]?.volume,\n// };\n// }),\n// ),\n// ),\n// );\n// });\n"]}
1
+ {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/services/market-data/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { IQuote, setMetricsQuoteState } from '@yuants/data-quote';\nimport { GlobalPrometheusRegistry, Terminal } from '@yuants/protocol';\nimport { escapeSQL, requestSQL, writeToSQL } from '@yuants/sql';\nimport { encodePath, formatTime } from '@yuants/utils';\nimport { defer, from, groupBy, map, merge, mergeMap, repeat, retry, scan, shareReplay, toArray } from 'rxjs';\nimport {\n getSpotMarketTickers,\n getSwapBatchFundingRate,\n getSwapMarketBbo,\n getSwapMarketTrade,\n getSwapOpenInterest,\n} from '../../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst swapBboTick$ = defer(() => getSwapMarketBbo({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote1$ = swapBboTick$.pipe(\n mergeMap((res) => res.ticks || []),\n map((tick): Partial<IQuote> => {\n const [ask_price = '', ask_volume = ''] = tick.ask || [];\n const [bid_price = '', bid_volume = ''] = tick.bid || [];\n return {\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n ask_price: `${ask_price}`,\n bid_price: `${bid_price}`,\n ask_volume: `${ask_volume}`,\n bid_volume: `${bid_volume}`,\n };\n }),\n);\n\nconst mapSwapContractCodeToBboTick$ = defer(() => swapBboTick$).pipe(\n mergeMap((res) =>\n from(res.ticks).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapTradeTick$ = defer(() => getSwapMarketTrade({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote2$ = swapTradeTick$.pipe(\n mergeMap((res) => res.tick?.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n last_price: `${tick.price}`,\n }),\n ),\n);\n\nconst quote5$ = defer(() => getSpotMarketTickers()).pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SPOT', tick.symbol),\n ask_price: `${tick.ask}`,\n bid_price: `${tick.bid}`,\n ask_volume: `${tick.askSize}`,\n bid_volume: `${tick.bidSize}`,\n last_price: `${tick.close}`,\n }),\n ),\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst mapSwapContractCodeToTradeTick$ = defer(() => swapTradeTick$).pipe(\n mergeMap((res) =>\n from(res.tick.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\nconst swapFundingRateTick$ = defer(() => getSwapBatchFundingRate({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote3$ = swapFundingRateTick$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n interest_rate_long: `${-tick.funding_rate}`,\n interest_rate_short: `${tick.funding_rate}`,\n interest_rate_next_settled_at: formatTime(+tick.funding_time),\n }),\n ),\n);\n\nconst mapSwapContractCodeToFundingRateTick$ = defer(() => swapFundingRateTick$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst swapOpenInterest$ = defer(() => getSwapOpenInterest({})).pipe(\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nconst quote4$ = swapOpenInterest$.pipe(\n mergeMap((res) => res.data || []),\n map(\n (tick): Partial<IQuote> => ({\n datasource_id: 'HTX',\n product_id: encodePath('HTX', 'SWAP', tick.contract_code),\n open_interest: `${tick.volume}`,\n }),\n ),\n);\n\nif (process.env.WRITE_QUOTE_TO_SQL === 'true') {\n // 合并不同来源的数据并进行合并,避免死锁\n merge(quote1$, quote2$, quote3$, quote4$, quote5$)\n .pipe(\n groupBy((x) => encodePath(x.datasource_id, x.product_id)),\n mergeMap((group$) => {\n return group$.pipe(scan((acc, cur) => Object.assign(acc, cur), {} as Partial<IQuote>));\n }),\n )\n .pipe(\n setMetricsQuoteState(terminal.terminal_id),\n writeToSQL({\n terminal,\n tableName: 'quote',\n writeInterval: 1000,\n conflictKeys: ['datasource_id', 'product_id'],\n }),\n )\n .subscribe();\n}\n\nconst mapSwapContractCodeToOpenInterest$ = defer(() => swapOpenInterest$).pipe(\n mergeMap((res) =>\n from(res.data).pipe(\n map((tick) => [tick.contract_code, tick] as const),\n toArray(),\n map((ticks) => Object.fromEntries(ticks)),\n ),\n ),\n\n repeat({ delay: 1000 }),\n retry({ delay: 1000 }),\n shareReplay(1),\n);\n\nexport const quoteCache = createCache<IQuote>(\n async (product_id) => {\n const sql = `select * from quote where product_id = ${escapeSQL(product_id)}`;\n console.info('QuoteSQL', sql);\n const [quote] = await requestSQL<IQuote[]>(terminal, sql);\n console.info('QuoteFetched', product_id, JSON.stringify(quote));\n return quote;\n },\n { expire: 10_000 },\n);\n\n// provideTicks(Terminal.fromNodeEnv(), 'HUOBI-SWAP', (product_id) => {\n// return defer(async () => {\n// const products = await firstValueFrom(perpetualContractProducts$);\n// const theProduct = products.find((x) => x.product_id === product_id);\n// if (!theProduct) throw `No Found ProductID ${product_id}`;\n\n// return [\n// of(theProduct),\n// mapSwapContractCodeToBboTick$,\n// mapSwapContractCodeToTradeTick$,\n// mapSwapContractCodeToFundingRateTick$,\n// mapSwapContractCodeToOpenInterest$,\n// ] as const;\n// }).pipe(\n// catchError(() => EMPTY),\n// mergeMap((x) =>\n// combineLatest(x).pipe(\n// map(([theProduct, bboTick, tradeTick, fundingRateTick, openInterest]): ITick => {\n// return {\n// datasource_id: 'HUOBI-SWAP',\n// product_id,\n// updated_at: Date.now(),\n// settlement_scheduled_at: +fundingRateTick[product_id].funding_time,\n// price: +tradeTick[product_id].price,\n// ask: bboTick[product_id].ask?.[0] ?? undefined,\n// bid: bboTick[product_id].bid?.[0] ?? undefined,\n// volume: +tradeTick[product_id].amount,\n// interest_rate_for_long: -+fundingRateTick[product_id].funding_rate,\n// interest_rate_for_short: +fundingRateTick[product_id].funding_rate,\n// open_interest: +openInterest[product_id]?.volume,\n// };\n// }),\n// ),\n// ),\n// );\n// });\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuants/vendor-huobi",
3
- "version": "0.17.4",
3
+ "version": "0.17.6",
4
4
  "main": "lib/index.js",
5
5
  "files": [
6
6
  "dist",
@@ -19,7 +19,7 @@
19
19
  "@yuants/data-series": "0.3.53",
20
20
  "@yuants/data-interest-rate": "0.1.49",
21
21
  "@yuants/data-quote": "0.4.0",
22
- "@yuants/exchange": "0.7.1",
22
+ "@yuants/exchange": "0.8.0",
23
23
  "rxjs": "~7.5.6"
24
24
  },
25
25
  "devDependencies": {
@@ -1,13 +1,13 @@
1
1
  {
2
- "apps/vendor-huobi/CHANGELOG.json": "7f6bf668fcdadb159fdce08327e87a5c359709b8",
3
- "apps/vendor-huobi/CHANGELOG.md": "263aa03746c72256c491d22bc018b045b733528d",
2
+ "apps/vendor-huobi/CHANGELOG.json": "aaad0c1d296476e667ce9bb39467e87fa6261df0",
3
+ "apps/vendor-huobi/CHANGELOG.md": "52bb536e92d42262c411af244fa46ef436306a37",
4
4
  "apps/vendor-huobi/README.md": "d7bf0149513114eab5500a6b5c9e7cba10565572",
5
5
  "apps/vendor-huobi/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
6
6
  "apps/vendor-huobi/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
7
7
  "apps/vendor-huobi/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
8
8
  "apps/vendor-huobi/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
9
9
  "apps/vendor-huobi/etc/vendor-huobi.api.md": "dc8cbf2a044a227b30a4ee9701b0c97328244724",
10
- "apps/vendor-huobi/package.json": "009f3a8ae59aa46438a436d9f5ba280a1d59a085",
10
+ "apps/vendor-huobi/package.json": "19dc4d7f5d3c9e5dcbe0fef94719fea8d4019eea",
11
11
  "apps/vendor-huobi/src/__archived/account-info.ts": "5c325d3bb8839476c11f25693326ce05f3321ebd",
12
12
  "apps/vendor-huobi/src/__archived/api.ts": "8366151dc881b177d0478fb328a601a11e33cd35",
13
13
  "apps/vendor-huobi/src/__archived/transfer.ts": "fd299ad82ff31344460967f2a938b8f36c879259",
@@ -15,11 +15,11 @@
15
15
  "apps/vendor-huobi/src/api/public-api.ts": "c8c6c380118d1282d16a3b5342060f3f82ed14af",
16
16
  "apps/vendor-huobi/src/index.ts": "d3979bbfa38c0b88be8854dbdea2d7833c89ec9c",
17
17
  "apps/vendor-huobi/src/services/accounts/spot.ts": "9b214135dd375822ea5ef03c0fee108873ccc264",
18
- "apps/vendor-huobi/src/services/accounts/super-margin.ts": "57d00a7f9c024fad8a612143838a1ef40a96b4a0",
18
+ "apps/vendor-huobi/src/services/accounts/super-margin.ts": "ff885947334f43085aacb6e8c37b997afee2b7f6",
19
19
  "apps/vendor-huobi/src/services/accounts/swap.ts": "91ef044f09ed3dddd7b0d32116a16c78f74ba9be",
20
20
  "apps/vendor-huobi/src/services/exchange.ts": "6fed94206a22c43d3c6890cf52ff054a24d98d82",
21
21
  "apps/vendor-huobi/src/services/market-data/interest_rate.ts": "79aa362f9fa90e612f9813d0b45d357b96189f3e",
22
- "apps/vendor-huobi/src/services/market-data/quote.ts": "839ea6d4a0a46da219c338c83562e9fd946f17b2",
22
+ "apps/vendor-huobi/src/services/market-data/quote.ts": "2f5883a95b11cf19c1a9a595567f9369b360cccf",
23
23
  "apps/vendor-huobi/src/services/orders/listOrders.ts": "1cf4621727fb290f8e5fd1439765fd73387bda7a",
24
24
  "apps/vendor-huobi/src/services/orders/submitOrder.ts": "c6b0625d4922d5188ef042893865e029f5123f24",
25
25
  "apps/vendor-huobi/src/services/product.ts": "096feb6e1348910242e814ca45848afa3b5bff98",
@@ -38,7 +38,7 @@
38
38
  "libraries/data-series/temp/package-deps.json": "a94e2f373c448a6205ee6c47e41d9283a76ee352",
39
39
  "libraries/data-interest-rate/temp/package-deps.json": "5a1011b097b18b96c2d8c932d874f69472621efd",
40
40
  "libraries/data-quote/temp/package-deps.json": "c2f009f818a503342bef588da21c9abd52beea00",
41
- "libraries/exchange/temp/package-deps.json": "8e1be9c0b37755b28288f53265acf9e27f99c943",
41
+ "libraries/exchange/temp/package-deps.json": "98f6e1318166102a07cf64b69399b35cb4575222",
42
42
  "libraries/extension/temp/package-deps.json": "3e0a81b0c863c2daf342dfaf284b8fd7d18c8562",
43
43
  "tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
44
44
  }