@yuants/vendor-binance 0.14.10 → 0.14.11
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/api/public-api.js +41 -0
- package/dist/api/public-api.js.map +1 -1
- package/dist/services/ohlc-service.js +10 -6
- package/dist/services/ohlc-service.js.map +1 -1
- package/lib/api/public-api.d.ts +37 -0
- package/lib/api/public-api.d.ts.map +1 -1
- package/lib/api/public-api.js +44 -1
- package/lib/api/public-api.js.map +1 -1
- package/lib/services/ohlc-service.js +10 -6
- package/lib/services/ohlc-service.js.map +1 -1
- package/package.json +6 -6
- package/temp/build/typescript/ts_tQj2bmGB.json +1 -1
- package/temp/package-deps.json +6 -6
- package/temp/test/jest/haste-map-f37bc94525b36254e573de220443d250-dc922b21f2d35e7315abf4c3159e25a5-63b40dbcff306581344a73f9073894a1 +0 -0
package/dist/api/public-api.js
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
import { scopeError, tokenBucket } from '@yuants/utils';
|
|
2
2
|
import { createRequestContext, getTokenBucketOptions, requestPublic } from './client';
|
|
3
|
+
const requestPublicWithRateLimit = async (endpoint, weight, params) => {
|
|
4
|
+
const url = new URL(endpoint);
|
|
5
|
+
const baseKey = url.host;
|
|
6
|
+
const requestContext = await createRequestContext(baseKey, weight);
|
|
7
|
+
const bucketKey = requestContext.bucketKey;
|
|
8
|
+
scopeError('BINANCE_API_RATE_LIMIT', { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight }, () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight));
|
|
9
|
+
return requestPublic('GET', endpoint, params, requestContext);
|
|
10
|
+
};
|
|
11
|
+
const getFutureKlineWeight = (limit) => {
|
|
12
|
+
const normalizedLimit = Math.max(1, limit !== null && limit !== void 0 ? limit : 500);
|
|
13
|
+
if (normalizedLimit < 100)
|
|
14
|
+
return 1;
|
|
15
|
+
if (normalizedLimit < 500)
|
|
16
|
+
return 2;
|
|
17
|
+
if (normalizedLimit <= 1000)
|
|
18
|
+
return 5;
|
|
19
|
+
return 10;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 获取 Kline/Candlestick 数据 (Futures)
|
|
23
|
+
*
|
|
24
|
+
* 权重: [1,100)=1, [100,500)=2, [500,1000]=5, >1000=10
|
|
25
|
+
*
|
|
26
|
+
* https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Kline-Candlestick-Data
|
|
27
|
+
*/
|
|
28
|
+
export const getFutureKlines = async (params) => {
|
|
29
|
+
const endpoint = 'https://fapi.binance.com/fapi/v1/klines';
|
|
30
|
+
const weight = getFutureKlineWeight(params.limit);
|
|
31
|
+
return requestPublicWithRateLimit(endpoint, weight, params);
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 获取 Kline/Candlestick 数据 (Spot/Margin)
|
|
35
|
+
*
|
|
36
|
+
* 权重: 2
|
|
37
|
+
*
|
|
38
|
+
* https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#k线数据
|
|
39
|
+
*/
|
|
40
|
+
export const getSpotKlines = async (params) => {
|
|
41
|
+
const endpoint = 'https://api.binance.com/api/v3/klines';
|
|
42
|
+
return requestPublicWithRateLimit(endpoint, 2, params);
|
|
43
|
+
};
|
|
3
44
|
/**
|
|
4
45
|
* 获取交易规则和交易对
|
|
5
46
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { scopeError, tokenBucket } from '@yuants/utils';\nimport { createRequestContext, getTokenBucketOptions, requestPublic } from './client';\n\nexport interface IFutureExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface IFutureExchangeSymbol {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: IFutureExchangeFilter[];\n orderTypes: string[];\n timeInForce: string[];\n}\n\nexport interface IFutureExchangeInfo {\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: IFutureExchangeSymbol[];\n}\n\nexport interface IFutureFundingRateEntry {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n}\n\nexport interface IFutureFundingInfoEntry {\n symbol: string;\n adjustedFundingRateCap: string;\n adjustedFundingRateFloor: string;\n fundingIntervalHours: number;\n disclaimer: boolean;\n}\n\nexport interface IFuturePremiumIndexEntry {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n}\n\nexport interface IFutureBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n}\n\nexport interface IFutureOpenInterest {\n openInterest: string;\n symbol: string;\n time: number;\n}\n\nexport interface IMarginPair {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n}\n\n/**\n * 获取交易规则和交易对\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Exchange-Information\n */\nexport const getFutureExchangeInfo = async (): Promise<IFutureExchangeInfo> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 查询资金费率历史\n *\n * 权重: /fapi/v1/fundingInfo共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-History\n */\nexport const getFutureFundingRate = async (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}): Promise<IFutureFundingRateEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingRate';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingRateEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 查询资金费率信息\n *\n * 权重: /fapi/v1/fundingRate共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-Info\n */\nexport const getFutureFundingInfo = async (): Promise<IFutureFundingInfoEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingInfo';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingInfoEntry[]>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\nexport const getFuturePremiumIndex = async (params: {\n symbol?: string;\n}): Promise<IFuturePremiumIndexEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/premiumIndex';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 1 : 10;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFuturePremiumIndexEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\nexport const getFutureBookTicker = async (params?: {\n symbol?: string;\n}): Promise<IFutureBookTickerEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 5;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\nexport const getFutureOpenInterest = async (params: { symbol: string }): Promise<IFutureOpenInterest> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/openInterest';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureOpenInterest>('GET', endpoint, params, requestContext);\n};\nexport interface ISpotBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n}\n\n/**\n * 当前最优挂单 (Spot)\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E4%BC%98%E6%8C%82%E5%8D%95%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotBookTicker = async (params?: { symbol?: string }): Promise<ISpotBookTickerEntry[]> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\nexport interface ISpotExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface ISpotExchangeSymbol {\n symbol: string;\n status: string;\n baseAsset: string;\n baseAssetPrecision: number;\n quoteAsset: string;\n quotePrecision: number;\n baseCommissionPrecision: number;\n quoteCommissionPrecision: number;\n orderTypes: string[];\n icebergAllowed: boolean;\n ocoAllowed: boolean;\n quoteOrderQtyMarketAllowed: boolean;\n allowTrailingStop: boolean;\n cancelReplaceAllowed: boolean;\n isSpotTradingAllowed: boolean;\n isMarginTradingAllowed: boolean;\n filters: ISpotExchangeFilter[];\n permissions: string[];\n}\n\nexport interface ISpotExchangeInfo {\n timezone: string;\n serverTime: number;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n symbols: ISpotExchangeSymbol[];\n}\n\n/**\n * 获取现货交易规则和交易对\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/general-endpoints#%E4%BA%A4%E6%98%93%E8%A7%84%E8%8C%83%E4%BF%A1%E6%81%AF\n */\nexport const getSpotExchangeInfo = async (): Promise<ISpotExchangeInfo> => {\n const endpoint = 'https://api.binance.com/api/v3/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 20;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 获取当前现货报价\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E6%96%B0%E4%BB%B7%E6%A0%BC%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotTickerPrice = async (params?: {\n symbol?: string;\n symbols?: string;\n symbolStatus?: string;\n}): Promise<\n {\n symbol: string;\n price: string;\n }[]\n> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/price';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic('GET', endpoint, params, requestContext);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { scopeError, tokenBucket } from '@yuants/utils';\nimport { createRequestContext, getTokenBucketOptions, requestPublic } from './client';\n\nexport type IBinanceKline = [\n number, // Open time\n string, // Open\n string, // High\n string, // Low\n string, // Close\n string, // Volume\n number, // Close time\n string, // Quote asset volume\n number, // Number of trades\n string, // Taker buy base asset volume\n string, // Taker buy quote asset volume\n string, // Ignore\n];\n\nexport interface IBinanceKlineParams extends Record<string, string | number | boolean | undefined> {\n symbol: string;\n interval: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}\n\ntype PublicRequestParams = Record<string, string | number | boolean | undefined>;\n\nconst requestPublicWithRateLimit = async <T, TParams extends PublicRequestParams = PublicRequestParams>(\n endpoint: string,\n weight: number,\n params?: TParams,\n) => {\n const url = new URL(endpoint);\n const baseKey = url.host;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<T>('GET', endpoint, params, requestContext);\n};\n\nconst getFutureKlineWeight = (limit?: number) => {\n const normalizedLimit = Math.max(1, limit ?? 500);\n if (normalizedLimit < 100) return 1;\n if (normalizedLimit < 500) return 2;\n if (normalizedLimit <= 1000) return 5;\n return 10;\n};\n\n/**\n * 获取 Kline/Candlestick 数据 (Futures)\n *\n * 权重: [1,100)=1, [100,500)=2, [500,1000]=5, >1000=10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Kline-Candlestick-Data\n */\nexport const getFutureKlines = async (params: IBinanceKlineParams): Promise<IBinanceKline[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/klines';\n const weight = getFutureKlineWeight(params.limit);\n return requestPublicWithRateLimit<IBinanceKline[]>(endpoint, weight, params);\n};\n\n/**\n * 获取 Kline/Candlestick 数据 (Spot/Margin)\n *\n * 权重: 2\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#k线数据\n */\nexport const getSpotKlines = async (params: IBinanceKlineParams): Promise<IBinanceKline[]> => {\n const endpoint = 'https://api.binance.com/api/v3/klines';\n return requestPublicWithRateLimit<IBinanceKline[]>(endpoint, 2, params);\n};\n\nexport interface IFutureExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface IFutureExchangeSymbol {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: IFutureExchangeFilter[];\n orderTypes: string[];\n timeInForce: string[];\n}\n\nexport interface IFutureExchangeInfo {\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: IFutureExchangeSymbol[];\n}\n\nexport interface IFutureFundingRateEntry {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n}\n\nexport interface IFutureFundingInfoEntry {\n symbol: string;\n adjustedFundingRateCap: string;\n adjustedFundingRateFloor: string;\n fundingIntervalHours: number;\n disclaimer: boolean;\n}\n\nexport interface IFuturePremiumIndexEntry {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n}\n\nexport interface IFutureBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n}\n\nexport interface IFutureOpenInterest {\n openInterest: string;\n symbol: string;\n time: number;\n}\n\nexport interface IMarginPair {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n}\n\n/**\n * 获取交易规则和交易对\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Exchange-Information\n */\nexport const getFutureExchangeInfo = async (): Promise<IFutureExchangeInfo> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 查询资金费率历史\n *\n * 权重: /fapi/v1/fundingInfo共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-History\n */\nexport const getFutureFundingRate = async (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}): Promise<IFutureFundingRateEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingRate';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingRateEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 查询资金费率信息\n *\n * 权重: /fapi/v1/fundingRate共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-Info\n */\nexport const getFutureFundingInfo = async (): Promise<IFutureFundingInfoEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingInfo';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingInfoEntry[]>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\nexport const getFuturePremiumIndex = async (params: {\n symbol?: string;\n}): Promise<IFuturePremiumIndexEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/premiumIndex';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 1 : 10;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFuturePremiumIndexEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\nexport const getFutureBookTicker = async (params?: {\n symbol?: string;\n}): Promise<IFutureBookTickerEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 5;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\nexport const getFutureOpenInterest = async (params: { symbol: string }): Promise<IFutureOpenInterest> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/openInterest';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureOpenInterest>('GET', endpoint, params, requestContext);\n};\nexport interface ISpotBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n}\n\n/**\n * 当前最优挂单 (Spot)\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E4%BC%98%E6%8C%82%E5%8D%95%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotBookTicker = async (params?: { symbol?: string }): Promise<ISpotBookTickerEntry[]> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\nexport interface ISpotExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface ISpotExchangeSymbol {\n symbol: string;\n status: string;\n baseAsset: string;\n baseAssetPrecision: number;\n quoteAsset: string;\n quotePrecision: number;\n baseCommissionPrecision: number;\n quoteCommissionPrecision: number;\n orderTypes: string[];\n icebergAllowed: boolean;\n ocoAllowed: boolean;\n quoteOrderQtyMarketAllowed: boolean;\n allowTrailingStop: boolean;\n cancelReplaceAllowed: boolean;\n isSpotTradingAllowed: boolean;\n isMarginTradingAllowed: boolean;\n filters: ISpotExchangeFilter[];\n permissions: string[];\n}\n\nexport interface ISpotExchangeInfo {\n timezone: string;\n serverTime: number;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n symbols: ISpotExchangeSymbol[];\n}\n\n/**\n * 获取现货交易规则和交易对\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/general-endpoints#%E4%BA%A4%E6%98%93%E8%A7%84%E8%8C%83%E4%BF%A1%E6%81%AF\n */\nexport const getSpotExchangeInfo = async (): Promise<ISpotExchangeInfo> => {\n const endpoint = 'https://api.binance.com/api/v3/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 20;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 获取当前现货报价\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E6%96%B0%E4%BB%B7%E6%A0%BC%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotTickerPrice = async (params?: {\n symbol?: string;\n symbols?: string;\n symbolStatus?: string;\n}): Promise<\n {\n symbol: string;\n price: string;\n }[]\n> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/price';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<\n {\n symbol: string;\n price: string;\n }[]\n >('GET', endpoint, params, requestContext);\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { provideOHLCService } from '@yuants/exchange';
|
|
2
2
|
import { Terminal } from '@yuants/protocol';
|
|
3
3
|
import { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';
|
|
4
|
-
import {
|
|
4
|
+
import { getFutureKlines, getSpotKlines } from '../api/public-api';
|
|
5
5
|
const terminal = Terminal.fromNodeEnv();
|
|
6
6
|
const DURATION_TO_BINANCE_INTERVAL = {
|
|
7
7
|
PT1M: '1m',
|
|
@@ -29,15 +29,19 @@ const fetchOHLCPageBackward = async (req) => {
|
|
|
29
29
|
throw new Error(`Unsupported duration: ${req.duration}`);
|
|
30
30
|
const offset = convertDurationToOffset(req.duration);
|
|
31
31
|
const endedAtMs = req.time;
|
|
32
|
-
const
|
|
33
|
-
? 'https://fapi.binance.com/fapi/v1/klines'
|
|
34
|
-
: 'https://api.binance.com/api/v3/klines';
|
|
35
|
-
const res = await requestPublic('GET', baseUrl, {
|
|
32
|
+
const params = {
|
|
36
33
|
symbol,
|
|
37
34
|
interval,
|
|
38
35
|
endTime: endedAtMs,
|
|
39
36
|
limit: 1000,
|
|
40
|
-
}
|
|
37
|
+
};
|
|
38
|
+
const res = instType === 'USDT-FUTURE'
|
|
39
|
+
? await getFutureKlines(params)
|
|
40
|
+
: instType === 'SPOT' || instType === 'MARGIN'
|
|
41
|
+
? await getSpotKlines(params)
|
|
42
|
+
: (() => {
|
|
43
|
+
throw new Error(`Unsupported instType for OHLC: ${instType}`);
|
|
44
|
+
})();
|
|
41
45
|
return (res !== null && res !== void 0 ? res : [])
|
|
42
46
|
.map((k) => ({
|
|
43
47
|
series_id: req.series_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ohlc-service.js","sourceRoot":"","sources":["../../src/services/ohlc-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ohlc-service.js","sourceRoot":"","sources":["../../src/services/ohlc-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOHLC } from '@yuants/data-ohlc';\nimport { provideOHLCService } from '@yuants/exchange';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { getFutureKlines, getSpotKlines } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_BINANCE_INTERVAL: Record<string, string> = {\n PT1M: '1m',\n PT3M: '3m',\n PT5M: '5m',\n PT15M: '15m',\n PT30M: '30m',\n PT1H: '1h',\n PT2H: '2h',\n PT4H: '4h',\n PT6H: '6h',\n PT8H: '8h',\n PT12H: '12h',\n P1D: '1d',\n P3D: '3d',\n P1W: '1w',\n P1M: '1M',\n};\n\nconst fetchOHLCPageBackward = async (req: {\n product_id: string;\n duration: string;\n time: number;\n series_id: string;\n}): Promise<IOHLC[]> => {\n const [, instType, symbol] = decodePath(req.product_id);\n if (!instType || !symbol) throw new Error(`Invalid product_id: ${req.product_id}`);\n\n const interval = DURATION_TO_BINANCE_INTERVAL[req.duration];\n if (!interval) throw new Error(`Unsupported duration: ${req.duration}`);\n\n const offset = convertDurationToOffset(req.duration);\n const endedAtMs = req.time;\n\n const params = {\n symbol,\n interval,\n endTime: endedAtMs,\n limit: 1000,\n };\n\n const res =\n instType === 'USDT-FUTURE'\n ? await getFutureKlines(params)\n : instType === 'SPOT' || instType === 'MARGIN'\n ? await getSpotKlines(params)\n : (() => {\n throw new Error(`Unsupported instType for OHLC: ${instType}`);\n })();\n\n return (res ?? [])\n .map(\n (k): IOHLC => ({\n series_id: req.series_id,\n datasource_id: 'BINANCE',\n product_id: req.product_id,\n duration: req.duration,\n created_at: formatTime(k[0]),\n closed_at: formatTime(k[0] + offset),\n open: `${k[1]}`,\n high: `${k[2]}`,\n low: `${k[3]}`,\n close: `${k[4]}`,\n volume: `${k[5]}`,\n open_interest: '0',\n }),\n )\n .filter((x) => Date.parse(x.created_at) < endedAtMs);\n};\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'BINANCE/USDT-FUTURE/',\n duration_list: Object.keys(DURATION_TO_BINANCE_INTERVAL),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'BINANCE/SPOT/',\n duration_list: Object.keys(DURATION_TO_BINANCE_INTERVAL),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'BINANCE/MARGIN/',\n duration_list: Object.keys(DURATION_TO_BINANCE_INTERVAL),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n);\n"]}
|
package/lib/api/public-api.d.ts
CHANGED
|
@@ -1,3 +1,40 @@
|
|
|
1
|
+
export type IBinanceKline = [
|
|
2
|
+
number,
|
|
3
|
+
string,
|
|
4
|
+
string,
|
|
5
|
+
string,
|
|
6
|
+
string,
|
|
7
|
+
string,
|
|
8
|
+
number,
|
|
9
|
+
string,
|
|
10
|
+
number,
|
|
11
|
+
string,
|
|
12
|
+
string,
|
|
13
|
+
string
|
|
14
|
+
];
|
|
15
|
+
export interface IBinanceKlineParams extends Record<string, string | number | boolean | undefined> {
|
|
16
|
+
symbol: string;
|
|
17
|
+
interval: string;
|
|
18
|
+
startTime?: number;
|
|
19
|
+
endTime?: number;
|
|
20
|
+
limit?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 获取 Kline/Candlestick 数据 (Futures)
|
|
24
|
+
*
|
|
25
|
+
* 权重: [1,100)=1, [100,500)=2, [500,1000]=5, >1000=10
|
|
26
|
+
*
|
|
27
|
+
* https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Kline-Candlestick-Data
|
|
28
|
+
*/
|
|
29
|
+
export declare const getFutureKlines: (params: IBinanceKlineParams) => Promise<IBinanceKline[]>;
|
|
30
|
+
/**
|
|
31
|
+
* 获取 Kline/Candlestick 数据 (Spot/Margin)
|
|
32
|
+
*
|
|
33
|
+
* 权重: 2
|
|
34
|
+
*
|
|
35
|
+
* https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#k线数据
|
|
36
|
+
*/
|
|
37
|
+
export declare const getSpotKlines: (params: IBinanceKlineParams) => Promise<IBinanceKline[]>;
|
|
1
38
|
export interface IFutureExchangeFilter extends Record<string, string | number | boolean | undefined> {
|
|
2
39
|
filterType: string;
|
|
3
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACP,CAAC;AAEF,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAChG,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6BD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAU,QAAQ,mBAAmB,KAAG,OAAO,CAAC,aAAa,EAAE,CAI1F,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAU,QAAQ,mBAAmB,KAAG,OAAO,CAAC,aAAa,EAAE,CAGxF,CAAC;AAEF,MAAM,WAAW,qBAAsB,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAClG,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,EAAE,OAAO,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,EAAE,CAAC;IACJ,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wBAAwB,EAAE,MAAM,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,mBAAmB,CAazE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAU,QAAQ;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,OAAO,CAAC,uBAAuB,EAAE,CAkBpC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,uBAAuB,EAAE,CAkB9E,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAU,QAAQ;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,KAAG,OAAO,CAAC,wBAAwB,EAAE,CAqBrC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAU,SAAS;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,KAAG,OAAO,CAAC,sBAAsB,EAAE,CAqBnC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAU,QAAQ;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,mBAAmB,CAanG,CAAC;AACF,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,SAAS;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,oBAAoB,EAAE,CAqBpG,CAAC;AAEF,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAChG,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,wBAAwB,EAAE,MAAM,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,0BAA0B,EAAE,OAAO,CAAC;IACpC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAAC,iBAAiB,CAarE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAU,SAAS;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,KAAG,OAAO,CACT;IACE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,EAAE,CAmBJ,CAAC"}
|
package/lib/api/public-api.js
CHANGED
|
@@ -1,8 +1,51 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSpotTickerPrice = exports.getSpotExchangeInfo = exports.getSpotBookTicker = exports.getFutureOpenInterest = exports.getFutureBookTicker = exports.getFuturePremiumIndex = exports.getFutureFundingInfo = exports.getFutureFundingRate = exports.getFutureExchangeInfo = void 0;
|
|
3
|
+
exports.getSpotTickerPrice = exports.getSpotExchangeInfo = exports.getSpotBookTicker = exports.getFutureOpenInterest = exports.getFutureBookTicker = exports.getFuturePremiumIndex = exports.getFutureFundingInfo = exports.getFutureFundingRate = exports.getFutureExchangeInfo = exports.getSpotKlines = exports.getFutureKlines = void 0;
|
|
4
4
|
const utils_1 = require("@yuants/utils");
|
|
5
5
|
const client_1 = require("./client");
|
|
6
|
+
const requestPublicWithRateLimit = async (endpoint, weight, params) => {
|
|
7
|
+
const url = new URL(endpoint);
|
|
8
|
+
const baseKey = url.host;
|
|
9
|
+
const requestContext = await (0, client_1.createRequestContext)(baseKey, weight);
|
|
10
|
+
const bucketKey = requestContext.bucketKey;
|
|
11
|
+
(0, utils_1.scopeError)('BINANCE_API_RATE_LIMIT', { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight }, () => (0, utils_1.tokenBucket)(bucketKey, (0, client_1.getTokenBucketOptions)(url.host)).acquireSync(requestContext.acquireWeight));
|
|
12
|
+
return (0, client_1.requestPublic)('GET', endpoint, params, requestContext);
|
|
13
|
+
};
|
|
14
|
+
const getFutureKlineWeight = (limit) => {
|
|
15
|
+
const normalizedLimit = Math.max(1, limit !== null && limit !== void 0 ? limit : 500);
|
|
16
|
+
if (normalizedLimit < 100)
|
|
17
|
+
return 1;
|
|
18
|
+
if (normalizedLimit < 500)
|
|
19
|
+
return 2;
|
|
20
|
+
if (normalizedLimit <= 1000)
|
|
21
|
+
return 5;
|
|
22
|
+
return 10;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* 获取 Kline/Candlestick 数据 (Futures)
|
|
26
|
+
*
|
|
27
|
+
* 权重: [1,100)=1, [100,500)=2, [500,1000]=5, >1000=10
|
|
28
|
+
*
|
|
29
|
+
* https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Kline-Candlestick-Data
|
|
30
|
+
*/
|
|
31
|
+
const getFutureKlines = async (params) => {
|
|
32
|
+
const endpoint = 'https://fapi.binance.com/fapi/v1/klines';
|
|
33
|
+
const weight = getFutureKlineWeight(params.limit);
|
|
34
|
+
return requestPublicWithRateLimit(endpoint, weight, params);
|
|
35
|
+
};
|
|
36
|
+
exports.getFutureKlines = getFutureKlines;
|
|
37
|
+
/**
|
|
38
|
+
* 获取 Kline/Candlestick 数据 (Spot/Margin)
|
|
39
|
+
*
|
|
40
|
+
* 权重: 2
|
|
41
|
+
*
|
|
42
|
+
* https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#k线数据
|
|
43
|
+
*/
|
|
44
|
+
const getSpotKlines = async (params) => {
|
|
45
|
+
const endpoint = 'https://api.binance.com/api/v3/klines';
|
|
46
|
+
return requestPublicWithRateLimit(endpoint, 2, params);
|
|
47
|
+
};
|
|
48
|
+
exports.getSpotKlines = getSpotKlines;
|
|
6
49
|
/**
|
|
7
50
|
* 获取交易规则和交易对
|
|
8
51
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { scopeError, tokenBucket } from '@yuants/utils';\nimport { createRequestContext, getTokenBucketOptions, requestPublic } from './client';\n\nexport interface IFutureExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface IFutureExchangeSymbol {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: IFutureExchangeFilter[];\n orderTypes: string[];\n timeInForce: string[];\n}\n\nexport interface IFutureExchangeInfo {\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: IFutureExchangeSymbol[];\n}\n\nexport interface IFutureFundingRateEntry {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n}\n\nexport interface IFutureFundingInfoEntry {\n symbol: string;\n adjustedFundingRateCap: string;\n adjustedFundingRateFloor: string;\n fundingIntervalHours: number;\n disclaimer: boolean;\n}\n\nexport interface IFuturePremiumIndexEntry {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n}\n\nexport interface IFutureBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n}\n\nexport interface IFutureOpenInterest {\n openInterest: string;\n symbol: string;\n time: number;\n}\n\nexport interface IMarginPair {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n}\n\n/**\n * 获取交易规则和交易对\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Exchange-Information\n */\nexport const getFutureExchangeInfo = async (): Promise<IFutureExchangeInfo> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 查询资金费率历史\n *\n * 权重: /fapi/v1/fundingInfo共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-History\n */\nexport const getFutureFundingRate = async (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}): Promise<IFutureFundingRateEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingRate';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingRateEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 查询资金费率信息\n *\n * 权重: /fapi/v1/fundingRate共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-Info\n */\nexport const getFutureFundingInfo = async (): Promise<IFutureFundingInfoEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingInfo';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingInfoEntry[]>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\nexport const getFuturePremiumIndex = async (params: {\n symbol?: string;\n}): Promise<IFuturePremiumIndexEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/premiumIndex';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 1 : 10;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFuturePremiumIndexEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\nexport const getFutureBookTicker = async (params?: {\n symbol?: string;\n}): Promise<IFutureBookTickerEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 5;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\nexport const getFutureOpenInterest = async (params: { symbol: string }): Promise<IFutureOpenInterest> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/openInterest';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureOpenInterest>('GET', endpoint, params, requestContext);\n};\nexport interface ISpotBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n}\n\n/**\n * 当前最优挂单 (Spot)\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E4%BC%98%E6%8C%82%E5%8D%95%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotBookTicker = async (params?: { symbol?: string }): Promise<ISpotBookTickerEntry[]> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\nexport interface ISpotExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface ISpotExchangeSymbol {\n symbol: string;\n status: string;\n baseAsset: string;\n baseAssetPrecision: number;\n quoteAsset: string;\n quotePrecision: number;\n baseCommissionPrecision: number;\n quoteCommissionPrecision: number;\n orderTypes: string[];\n icebergAllowed: boolean;\n ocoAllowed: boolean;\n quoteOrderQtyMarketAllowed: boolean;\n allowTrailingStop: boolean;\n cancelReplaceAllowed: boolean;\n isSpotTradingAllowed: boolean;\n isMarginTradingAllowed: boolean;\n filters: ISpotExchangeFilter[];\n permissions: string[];\n}\n\nexport interface ISpotExchangeInfo {\n timezone: string;\n serverTime: number;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n symbols: ISpotExchangeSymbol[];\n}\n\n/**\n * 获取现货交易规则和交易对\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/general-endpoints#%E4%BA%A4%E6%98%93%E8%A7%84%E8%8C%83%E4%BF%A1%E6%81%AF\n */\nexport const getSpotExchangeInfo = async (): Promise<ISpotExchangeInfo> => {\n const endpoint = 'https://api.binance.com/api/v3/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 20;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 获取当前现货报价\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E6%96%B0%E4%BB%B7%E6%A0%BC%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotTickerPrice = async (params?: {\n symbol?: string;\n symbols?: string;\n symbolStatus?: string;\n}): Promise<\n {\n symbol: string;\n price: string;\n }[]\n> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/price';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic('GET', endpoint, params, requestContext);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { scopeError, tokenBucket } from '@yuants/utils';\nimport { createRequestContext, getTokenBucketOptions, requestPublic } from './client';\n\nexport type IBinanceKline = [\n number, // Open time\n string, // Open\n string, // High\n string, // Low\n string, // Close\n string, // Volume\n number, // Close time\n string, // Quote asset volume\n number, // Number of trades\n string, // Taker buy base asset volume\n string, // Taker buy quote asset volume\n string, // Ignore\n];\n\nexport interface IBinanceKlineParams extends Record<string, string | number | boolean | undefined> {\n symbol: string;\n interval: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}\n\ntype PublicRequestParams = Record<string, string | number | boolean | undefined>;\n\nconst requestPublicWithRateLimit = async <T, TParams extends PublicRequestParams = PublicRequestParams>(\n endpoint: string,\n weight: number,\n params?: TParams,\n) => {\n const url = new URL(endpoint);\n const baseKey = url.host;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<T>('GET', endpoint, params, requestContext);\n};\n\nconst getFutureKlineWeight = (limit?: number) => {\n const normalizedLimit = Math.max(1, limit ?? 500);\n if (normalizedLimit < 100) return 1;\n if (normalizedLimit < 500) return 2;\n if (normalizedLimit <= 1000) return 5;\n return 10;\n};\n\n/**\n * 获取 Kline/Candlestick 数据 (Futures)\n *\n * 权重: [1,100)=1, [100,500)=2, [500,1000]=5, >1000=10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Kline-Candlestick-Data\n */\nexport const getFutureKlines = async (params: IBinanceKlineParams): Promise<IBinanceKline[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/klines';\n const weight = getFutureKlineWeight(params.limit);\n return requestPublicWithRateLimit<IBinanceKline[]>(endpoint, weight, params);\n};\n\n/**\n * 获取 Kline/Candlestick 数据 (Spot/Margin)\n *\n * 权重: 2\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#k线数据\n */\nexport const getSpotKlines = async (params: IBinanceKlineParams): Promise<IBinanceKline[]> => {\n const endpoint = 'https://api.binance.com/api/v3/klines';\n return requestPublicWithRateLimit<IBinanceKline[]>(endpoint, 2, params);\n};\n\nexport interface IFutureExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface IFutureExchangeSymbol {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: IFutureExchangeFilter[];\n orderTypes: string[];\n timeInForce: string[];\n}\n\nexport interface IFutureExchangeInfo {\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: IFutureExchangeSymbol[];\n}\n\nexport interface IFutureFundingRateEntry {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n}\n\nexport interface IFutureFundingInfoEntry {\n symbol: string;\n adjustedFundingRateCap: string;\n adjustedFundingRateFloor: string;\n fundingIntervalHours: number;\n disclaimer: boolean;\n}\n\nexport interface IFuturePremiumIndexEntry {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n}\n\nexport interface IFutureBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n}\n\nexport interface IFutureOpenInterest {\n openInterest: string;\n symbol: string;\n time: number;\n}\n\nexport interface IMarginPair {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n}\n\n/**\n * 获取交易规则和交易对\n *\n * 权重: 1\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Exchange-Information\n */\nexport const getFutureExchangeInfo = async (): Promise<IFutureExchangeInfo> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 查询资金费率历史\n *\n * 权重: /fapi/v1/fundingInfo共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-History\n */\nexport const getFutureFundingRate = async (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}): Promise<IFutureFundingRateEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingRate';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingRateEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 查询资金费率信息\n *\n * 权重: /fapi/v1/fundingRate共享500/5min/IP\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Get-Funding-Rate-Info\n */\nexport const getFutureFundingInfo = async (): Promise<IFutureFundingInfoEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/fundingInfo';\n const url = new URL(endpoint);\n const baseKey = `${url.host}fundingRate`;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () =>\n tokenBucket(bucketKey, {\n capacity: 500,\n refillAmount: 500,\n refillInterval: 300_000,\n }).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureFundingInfoEntry[]>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\nexport const getFuturePremiumIndex = async (params: {\n symbol?: string;\n}): Promise<IFuturePremiumIndexEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/premiumIndex';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 1 : 10;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFuturePremiumIndexEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\nexport const getFutureBookTicker = async (params?: {\n symbol?: string;\n}): Promise<IFutureBookTickerEntry[]> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 5;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\n/**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\nexport const getFutureOpenInterest = async (params: { symbol: string }): Promise<IFutureOpenInterest> => {\n const endpoint = 'https://fapi.binance.com/fapi/v1/openInterest';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 1;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<IFutureOpenInterest>('GET', endpoint, params, requestContext);\n};\nexport interface ISpotBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n}\n\n/**\n * 当前最优挂单 (Spot)\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E4%BC%98%E6%8C%82%E5%8D%95%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotBookTicker = async (params?: { symbol?: string }): Promise<ISpotBookTickerEntry[]> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/bookTicker';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n {\n method: 'GET',\n endpoint,\n host: url.host,\n path: url.pathname,\n bucketId: bucketKey,\n weight,\n hasSymbol: !!params?.symbol,\n },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotBookTickerEntry[]>('GET', endpoint, params, requestContext);\n};\n\nexport interface ISpotExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface ISpotExchangeSymbol {\n symbol: string;\n status: string;\n baseAsset: string;\n baseAssetPrecision: number;\n quoteAsset: string;\n quotePrecision: number;\n baseCommissionPrecision: number;\n quoteCommissionPrecision: number;\n orderTypes: string[];\n icebergAllowed: boolean;\n ocoAllowed: boolean;\n quoteOrderQtyMarketAllowed: boolean;\n allowTrailingStop: boolean;\n cancelReplaceAllowed: boolean;\n isSpotTradingAllowed: boolean;\n isMarginTradingAllowed: boolean;\n filters: ISpotExchangeFilter[];\n permissions: string[];\n}\n\nexport interface ISpotExchangeInfo {\n timezone: string;\n serverTime: number;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n symbols: ISpotExchangeSymbol[];\n}\n\n/**\n * 获取现货交易规则和交易对\n *\n * 权重: 20\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/general-endpoints#%E4%BA%A4%E6%98%93%E8%A7%84%E8%8C%83%E4%BF%A1%E6%81%AF\n */\nexport const getSpotExchangeInfo = async (): Promise<ISpotExchangeInfo> => {\n const endpoint = 'https://api.binance.com/api/v3/exchangeInfo';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = 20;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<ISpotExchangeInfo>('GET', endpoint, undefined, requestContext);\n};\n\n/**\n * 获取当前现货报价\n *\n * 权重: 单交易对 2,不带 symbol 4\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/market-data-endpoints#%E6%9C%80%E6%96%B0%E4%BB%B7%E6%A0%BC%E6%8E%A5%E5%8F%A3\n */\nexport const getSpotTickerPrice = async (params?: {\n symbol?: string;\n symbols?: string;\n symbolStatus?: string;\n}): Promise<\n {\n symbol: string;\n price: string;\n }[]\n> => {\n const endpoint = 'https://api.binance.com/api/v3/ticker/price';\n const url = new URL(endpoint);\n const baseKey = url.host;\n const weight = params?.symbol ? 2 : 4;\n const requestContext = await createRequestContext(baseKey, weight);\n const bucketKey = requestContext.bucketKey;\n scopeError(\n 'BINANCE_API_RATE_LIMIT',\n { method: 'GET', endpoint, host: url.host, path: url.pathname, bucketId: bucketKey, weight },\n () => tokenBucket(bucketKey, getTokenBucketOptions(url.host)).acquireSync(requestContext.acquireWeight),\n );\n return requestPublic<\n {\n symbol: string;\n price: string;\n }[]\n >('GET', endpoint, params, requestContext);\n};\n"]}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const exchange_1 = require("@yuants/exchange");
|
|
4
4
|
const protocol_1 = require("@yuants/protocol");
|
|
5
5
|
const utils_1 = require("@yuants/utils");
|
|
6
|
-
const
|
|
6
|
+
const public_api_1 = require("../api/public-api");
|
|
7
7
|
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
8
8
|
const DURATION_TO_BINANCE_INTERVAL = {
|
|
9
9
|
PT1M: '1m',
|
|
@@ -31,15 +31,19 @@ const fetchOHLCPageBackward = async (req) => {
|
|
|
31
31
|
throw new Error(`Unsupported duration: ${req.duration}`);
|
|
32
32
|
const offset = (0, utils_1.convertDurationToOffset)(req.duration);
|
|
33
33
|
const endedAtMs = req.time;
|
|
34
|
-
const
|
|
35
|
-
? 'https://fapi.binance.com/fapi/v1/klines'
|
|
36
|
-
: 'https://api.binance.com/api/v3/klines';
|
|
37
|
-
const res = await (0, client_1.requestPublic)('GET', baseUrl, {
|
|
34
|
+
const params = {
|
|
38
35
|
symbol,
|
|
39
36
|
interval,
|
|
40
37
|
endTime: endedAtMs,
|
|
41
38
|
limit: 1000,
|
|
42
|
-
}
|
|
39
|
+
};
|
|
40
|
+
const res = instType === 'USDT-FUTURE'
|
|
41
|
+
? await (0, public_api_1.getFutureKlines)(params)
|
|
42
|
+
: instType === 'SPOT' || instType === 'MARGIN'
|
|
43
|
+
? await (0, public_api_1.getSpotKlines)(params)
|
|
44
|
+
: (() => {
|
|
45
|
+
throw new Error(`Unsupported instType for OHLC: ${instType}`);
|
|
46
|
+
})();
|
|
43
47
|
return (res !== null && res !== void 0 ? res : [])
|
|
44
48
|
.map((k) => ({
|
|
45
49
|
series_id: req.series_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ohlc-service.js","sourceRoot":"","sources":["../../src/services/ohlc-service.ts"],"names":[],"mappings":";;AACA,+CAAsD;AACtD,+CAA4C;AAC5C,yCAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"ohlc-service.js","sourceRoot":"","sources":["../../src/services/ohlc-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOHLC } from '@yuants/data-ohlc';\nimport { provideOHLCService } from '@yuants/exchange';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { getFutureKlines, getSpotKlines } from '../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_BINANCE_INTERVAL: Record<string, string> = {\n PT1M: '1m',\n PT3M: '3m',\n PT5M: '5m',\n PT15M: '15m',\n PT30M: '30m',\n PT1H: '1h',\n PT2H: '2h',\n PT4H: '4h',\n PT6H: '6h',\n PT8H: '8h',\n PT12H: '12h',\n P1D: '1d',\n P3D: '3d',\n P1W: '1w',\n P1M: '1M',\n};\n\nconst fetchOHLCPageBackward = async (req: {\n product_id: string;\n duration: string;\n time: number;\n series_id: string;\n}): Promise<IOHLC[]> => {\n const [, instType, symbol] = decodePath(req.product_id);\n if (!instType || !symbol) throw new Error(`Invalid product_id: ${req.product_id}`);\n\n const interval = DURATION_TO_BINANCE_INTERVAL[req.duration];\n if (!interval) throw new Error(`Unsupported duration: ${req.duration}`);\n\n const offset = convertDurationToOffset(req.duration);\n const endedAtMs = req.time;\n\n const params = {\n symbol,\n interval,\n endTime: endedAtMs,\n limit: 1000,\n };\n\n const res =\n instType === 'USDT-FUTURE'\n ? await getFutureKlines(params)\n : instType === 'SPOT' || instType === 'MARGIN'\n ? await getSpotKlines(params)\n : (() => {\n throw new Error(`Unsupported instType for OHLC: ${instType}`);\n })();\n\n return (res ?? [])\n .map(\n (k): IOHLC => ({\n series_id: req.series_id,\n datasource_id: 'BINANCE',\n product_id: req.product_id,\n duration: req.duration,\n created_at: formatTime(k[0]),\n closed_at: formatTime(k[0] + offset),\n open: `${k[1]}`,\n high: `${k[2]}`,\n low: `${k[3]}`,\n close: `${k[4]}`,\n volume: `${k[5]}`,\n open_interest: '0',\n }),\n )\n .filter((x) => Date.parse(x.created_at) < endedAtMs);\n};\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'BINANCE/USDT-FUTURE/',\n duration_list: Object.keys(DURATION_TO_BINANCE_INTERVAL),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'BINANCE/SPOT/',\n duration_list: Object.keys(DURATION_TO_BINANCE_INTERVAL),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'BINANCE/MARGIN/',\n duration_list: Object.keys(DURATION_TO_BINANCE_INTERVAL),\n direction: 'backward',\n },\n fetchOHLCPageBackward,\n);\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuants/vendor-binance",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.11",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -11,17 +11,17 @@
|
|
|
11
11
|
"rxjs": "~7.5.6",
|
|
12
12
|
"@yuants/protocol": "0.55.0",
|
|
13
13
|
"@yuants/data-account": "0.11.12",
|
|
14
|
-
"@yuants/data-quote": "0.4.12",
|
|
15
|
-
"@yuants/utils": "0.19.7",
|
|
16
14
|
"@yuants/cache": "0.3.15",
|
|
15
|
+
"@yuants/utils": "0.19.7",
|
|
16
|
+
"@yuants/data-quote": "0.4.12",
|
|
17
|
+
"@yuants/data-series": "0.3.65",
|
|
17
18
|
"@yuants/sql": "0.9.43",
|
|
18
19
|
"@yuants/data-product": "0.5.13",
|
|
19
|
-
"@yuants/data-ohlc": "0.6.8",
|
|
20
|
-
"@yuants/data-order": "0.7.13",
|
|
21
|
-
"@yuants/data-series": "0.3.65",
|
|
22
20
|
"@yuants/data-interest-rate": "0.2.13",
|
|
23
21
|
"@yuants/transfer": "0.2.52",
|
|
24
22
|
"@yuants/exchange": "0.8.23",
|
|
23
|
+
"@yuants/data-order": "0.7.13",
|
|
24
|
+
"@yuants/data-ohlc": "0.6.8",
|
|
25
25
|
"@yuants/data-trade": "0.1.38",
|
|
26
26
|
"@yuants/http-services": "0.5.3"
|
|
27
27
|
},
|