@yuants/vendor-trading-view 0.3.52 → 0.4.1

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/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { provideOHLCDurationService } from '@yuants/data-ohlc';
2
- import { createSeriesProvider } from '@yuants/data-series';
3
2
  import { Terminal } from '@yuants/protocol';
4
3
  import { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';
5
4
  import { Observable, firstValueFrom } from 'rxjs';
6
5
  //@ts-ignore
7
6
  import TradingView from '@mathieuc/tradingview';
7
+ import { provideOHLCService } from '@yuants/exchange';
8
8
  const terminal = Terminal.fromNodeEnv();
9
9
  const DURATION_TO_TRADINGVIEW_PERIOD = {
10
10
  PT1M: '1',
@@ -26,67 +26,62 @@ const DURATION_TO_TRADINGVIEW_PERIOD = {
26
26
  };
27
27
  provideOHLCDurationService(terminal, 'TradingView', // datasource_id
28
28
  () => Object.keys(DURATION_TO_TRADINGVIEW_PERIOD));
29
- createSeriesProvider(terminal, {
30
- tableName: 'ohlc',
31
- series_id_prefix_parts: ['TradingView'],
32
- reversed: false,
33
- serviceOptions: { concurrent: +(process.env.CONCURRENCY || 2) },
34
- queryFn: async ({ series_id, started_at, ended_at }) => {
35
- const [datasource_id, product_id, duration] = decodePath(series_id);
36
- const offset = convertDurationToOffset(duration);
37
- if (!offset)
38
- throw new Error(`Unsupported duration: ${duration}`);
39
- const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];
40
- if (!timeframe)
41
- throw new Error(`Unsupported timeframe: ${duration}`);
42
- const range = Math.ceil((ended_at - started_at) / offset);
43
- if (range <= 0) {
44
- throw `range=${range} is invalid`;
45
- }
46
- console.info(formatTime(Date.now()), 'queryChartRequest', JSON.stringify({ series_id, product_id, duration, range }));
47
- const data = await firstValueFrom(new Observable((subscriber) => {
48
- const client = new TradingView.Client();
49
- const chart = new client.Session.Chart();
50
- chart.setMarket(product_id, {
51
- timeframe,
52
- range,
53
- to: ended_at,
54
- });
55
- chart.onError((e) => {
56
- subscriber.error(e);
57
- });
58
- chart.onUpdate(() => {
59
- const rawPeriods = chart.periods;
60
- if (rawPeriods.length !== 0) {
61
- const periods = rawPeriods.map((v) => ({
62
- series_id,
63
- created_at: formatTime(v.time * 1000),
64
- datasource_id,
65
- product_id,
66
- duration,
67
- closed_at: formatTime(v.time * 1000 + offset),
68
- open: `${v.open}`,
69
- high: `${v.max}`,
70
- low: `${v.min}`,
71
- close: `${v.close}`,
72
- volume: `${v.volume}`,
73
- open_interest: '0',
74
- }));
75
- subscriber.next(periods);
76
- subscriber.complete();
77
- }
78
- });
79
- return () => {
80
- client.end();
81
- };
82
- }));
83
- console.info(formatTime(Date.now()), 'queryChartResponse', JSON.stringify({
84
- series_id,
85
- product_id,
86
- duration,
87
- data_length: data.length,
88
- }));
89
- return data;
90
- },
91
- });
29
+ provideOHLCService(terminal, {
30
+ product_id_prefix: 'TradingView/',
31
+ direction: 'backward',
32
+ duration_list: Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),
33
+ }, async ({ product_id, duration, series_id, time }) => {
34
+ const [datasource_id, symbol] = decodePath(product_id);
35
+ const offset = convertDurationToOffset(duration);
36
+ if (!offset)
37
+ throw new Error(`Unsupported duration: ${duration}`);
38
+ const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];
39
+ if (!timeframe)
40
+ throw new Error(`Unsupported timeframe: ${duration}`);
41
+ const range = 5000;
42
+ console.info(formatTime(Date.now()), 'queryChartRequest', JSON.stringify({ series_id, product_id, duration, range }));
43
+ const data = await firstValueFrom(new Observable((subscriber) => {
44
+ const client = new TradingView.Client();
45
+ const chart = new client.Session.Chart();
46
+ chart.setMarket(symbol, {
47
+ timeframe,
48
+ range,
49
+ to: time,
50
+ });
51
+ chart.onError((e) => {
52
+ subscriber.error(e);
53
+ });
54
+ chart.onUpdate(() => {
55
+ const rawPeriods = chart.periods;
56
+ if (rawPeriods.length !== 0) {
57
+ const periods = rawPeriods.map((v) => ({
58
+ series_id,
59
+ created_at: formatTime(v.time * 1000),
60
+ datasource_id,
61
+ product_id,
62
+ duration,
63
+ closed_at: formatTime(v.time * 1000 + offset),
64
+ open: `${v.open}`,
65
+ high: `${v.max}`,
66
+ low: `${v.min}`,
67
+ close: `${v.close}`,
68
+ volume: `${v.volume}`,
69
+ open_interest: '0',
70
+ }));
71
+ subscriber.next(periods);
72
+ subscriber.complete();
73
+ }
74
+ });
75
+ return () => {
76
+ client.end();
77
+ };
78
+ }));
79
+ console.info(formatTime(Date.now()), 'queryChartResponse', JSON.stringify({
80
+ series_id,
81
+ product_id,
82
+ duration,
83
+ data_length: data.length,
84
+ }));
85
+ return data;
86
+ }, { concurrent: +(process.env.CONCURRENCY || 2) });
92
87
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAClD,YAAY;AACZ,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAEhD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,8BAA8B,GAA2B;IAC7D,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,0BAA0B,CACxB,QAAQ,EACR,aAAa,EAAE,gBAAgB;AAC/B,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAClD,CAAC;AAEF,oBAAoB,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,MAAM;IACjB,sBAAsB,EAAE,CAAC,aAAa,CAAC;IACvC,QAAQ,EAAE,KAAK;IACf,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE;IAC/D,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrD,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QAElE,MAAM,SAAS,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAEtE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC;QAC1D,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,MAAM,SAAS,KAAK,aAAa,CAAC;SACnC;QAED,OAAO,CAAC,IAAI,CACV,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,mBAAmB,EACnB,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAC3D,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,IAAI,UAAU,CAAU,CAAC,UAAU,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACzC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE;gBAC1B,SAAS;gBACT,KAAK;gBACL,EAAE,EAAE,QAAQ;aACb,CAAC,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;gBACvB,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAClB,MAAM,UAAU,GAAU,KAAK,CAAC,OAAO,CAAC;gBACxC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAC5B,CAAC,CAAC,EAAS,EAAE,CAAC,CAAC;wBACb,SAAS;wBACT,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;wBACrC,aAAa;wBACb,UAAU;wBACV,QAAQ;wBACR,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;wBAC7C,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;wBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;wBAChB,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;wBACf,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE;wBACnB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE;wBACrB,aAAa,EAAE,GAAG;qBACnB,CAAC,CACH,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzB,UAAU,CAAC,QAAQ,EAAE,CAAC;iBACvB;YACH,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,EAAE;gBACV,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,CAAC,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,CAAC,IAAI,CACV,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,oBAAoB,EACpB,IAAI,CAAC,SAAS,CAAC;YACb,SAAS;YACT,UAAU;YACV,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,MAAM;SACzB,CAAC,CACH,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { IOHLC, provideOHLCDurationService } from '@yuants/data-ohlc';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { Observable, firstValueFrom } from 'rxjs';\n//@ts-ignore\nimport TradingView from '@mathieuc/tradingview';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_TRADINGVIEW_PERIOD: Record<string, string> = {\n PT1M: '1',\n PT3M: '3',\n PT5M: '5',\n PT15M: '15',\n PT30M: '30',\n PT45M: '45',\n PT1H: '60',\n PT2H: '120',\n PT3H: '180',\n PT4H: '240',\n P1D: '1D',\n P1W: '1W',\n P1M: '1M',\n P3M: '3M',\n P6M: '6M',\n P1Y: '12M',\n};\n\nprovideOHLCDurationService(\n terminal,\n 'TradingView', // datasource_id\n () => Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),\n);\n\ncreateSeriesProvider(terminal, {\n tableName: 'ohlc',\n series_id_prefix_parts: ['TradingView'],\n reversed: false,\n serviceOptions: { concurrent: +(process.env.CONCURRENCY || 2) },\n queryFn: async ({ series_id, started_at, ended_at }) => {\n const [datasource_id, product_id, duration] = decodePath(series_id);\n const offset = convertDurationToOffset(duration);\n if (!offset) throw new Error(`Unsupported duration: ${duration}`);\n\n const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];\n if (!timeframe) throw new Error(`Unsupported timeframe: ${duration}`);\n\n const range = Math.ceil((ended_at - started_at) / offset);\n if (range <= 0) {\n throw `range=${range} is invalid`;\n }\n\n console.info(\n formatTime(Date.now()),\n 'queryChartRequest',\n JSON.stringify({ series_id, product_id, duration, range }),\n );\n\n const data = await firstValueFrom(\n new Observable<IOHLC[]>((subscriber) => {\n const client = new TradingView.Client();\n const chart = new client.Session.Chart();\n chart.setMarket(product_id, {\n timeframe,\n range,\n to: ended_at,\n });\n chart.onError((e: any) => {\n subscriber.error(e);\n });\n chart.onUpdate(() => {\n const rawPeriods: any[] = chart.periods;\n if (rawPeriods.length !== 0) {\n const periods = rawPeriods.map(\n (v): IOHLC => ({\n series_id,\n created_at: formatTime(v.time * 1000),\n datasource_id,\n product_id,\n duration,\n closed_at: formatTime(v.time * 1000 + offset),\n open: `${v.open}`,\n high: `${v.max}`,\n low: `${v.min}`,\n close: `${v.close}`,\n volume: `${v.volume}`,\n open_interest: '0',\n }),\n );\n subscriber.next(periods);\n subscriber.complete();\n }\n });\n return () => {\n client.end();\n };\n }),\n );\n\n console.info(\n formatTime(Date.now()),\n 'queryChartResponse',\n JSON.stringify({\n series_id,\n product_id,\n duration,\n data_length: data.length,\n }),\n );\n\n return data;\n },\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOHLC, provideOHLCDurationService } from '@yuants/data-ohlc';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { Observable, firstValueFrom } from 'rxjs';\n//@ts-ignore\nimport TradingView from '@mathieuc/tradingview';\nimport { provideOHLCService } from '@yuants/exchange';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_TRADINGVIEW_PERIOD: Record<string, string> = {\n PT1M: '1',\n PT3M: '3',\n PT5M: '5',\n PT15M: '15',\n PT30M: '30',\n PT45M: '45',\n PT1H: '60',\n PT2H: '120',\n PT3H: '180',\n PT4H: '240',\n P1D: '1D',\n P1W: '1W',\n P1M: '1M',\n P3M: '3M',\n P6M: '6M',\n P1Y: '12M',\n};\n\nprovideOHLCDurationService(\n terminal,\n 'TradingView', // datasource_id\n () => Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'TradingView/',\n direction: 'backward',\n duration_list: Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),\n },\n async ({ product_id, duration, series_id, time }) => {\n const [datasource_id, symbol] = decodePath(product_id);\n const offset = convertDurationToOffset(duration);\n if (!offset) throw new Error(`Unsupported duration: ${duration}`);\n\n const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];\n if (!timeframe) throw new Error(`Unsupported timeframe: ${duration}`);\n\n const range = 5000;\n\n console.info(\n formatTime(Date.now()),\n 'queryChartRequest',\n JSON.stringify({ series_id, product_id, duration, range }),\n );\n\n const data = await firstValueFrom(\n new Observable<IOHLC[]>((subscriber) => {\n const client = new TradingView.Client();\n const chart = new client.Session.Chart();\n chart.setMarket(symbol, {\n timeframe,\n range,\n to: time,\n });\n chart.onError((e: any) => {\n subscriber.error(e);\n });\n chart.onUpdate(() => {\n const rawPeriods: any[] = chart.periods;\n if (rawPeriods.length !== 0) {\n const periods = rawPeriods.map(\n (v): IOHLC => ({\n series_id,\n created_at: formatTime(v.time * 1000),\n datasource_id,\n product_id,\n duration,\n closed_at: formatTime(v.time * 1000 + offset),\n open: `${v.open}`,\n high: `${v.max}`,\n low: `${v.min}`,\n close: `${v.close}`,\n volume: `${v.volume}`,\n open_interest: '0',\n }),\n );\n subscriber.next(periods);\n subscriber.complete();\n }\n });\n return () => {\n client.end();\n };\n }),\n );\n\n console.info(\n formatTime(Date.now()),\n 'queryChartResponse',\n JSON.stringify({\n series_id,\n product_id,\n duration,\n data_length: data.length,\n }),\n );\n\n return data;\n },\n { concurrent: +(process.env.CONCURRENCY || 2) },\n);\n"]}
package/lib/index.js CHANGED
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const data_ohlc_1 = require("@yuants/data-ohlc");
7
- const data_series_1 = require("@yuants/data-series");
8
7
  const protocol_1 = require("@yuants/protocol");
9
8
  const utils_1 = require("@yuants/utils");
10
9
  const rxjs_1 = require("rxjs");
11
10
  //@ts-ignore
12
11
  const tradingview_1 = __importDefault(require("@mathieuc/tradingview"));
12
+ const exchange_1 = require("@yuants/exchange");
13
13
  const terminal = protocol_1.Terminal.fromNodeEnv();
14
14
  const DURATION_TO_TRADINGVIEW_PERIOD = {
15
15
  PT1M: '1',
@@ -31,67 +31,62 @@ const DURATION_TO_TRADINGVIEW_PERIOD = {
31
31
  };
32
32
  (0, data_ohlc_1.provideOHLCDurationService)(terminal, 'TradingView', // datasource_id
33
33
  () => Object.keys(DURATION_TO_TRADINGVIEW_PERIOD));
34
- (0, data_series_1.createSeriesProvider)(terminal, {
35
- tableName: 'ohlc',
36
- series_id_prefix_parts: ['TradingView'],
37
- reversed: false,
38
- serviceOptions: { concurrent: +(process.env.CONCURRENCY || 2) },
39
- queryFn: async ({ series_id, started_at, ended_at }) => {
40
- const [datasource_id, product_id, duration] = (0, utils_1.decodePath)(series_id);
41
- const offset = (0, utils_1.convertDurationToOffset)(duration);
42
- if (!offset)
43
- throw new Error(`Unsupported duration: ${duration}`);
44
- const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];
45
- if (!timeframe)
46
- throw new Error(`Unsupported timeframe: ${duration}`);
47
- const range = Math.ceil((ended_at - started_at) / offset);
48
- if (range <= 0) {
49
- throw `range=${range} is invalid`;
50
- }
51
- console.info((0, utils_1.formatTime)(Date.now()), 'queryChartRequest', JSON.stringify({ series_id, product_id, duration, range }));
52
- const data = await (0, rxjs_1.firstValueFrom)(new rxjs_1.Observable((subscriber) => {
53
- const client = new tradingview_1.default.Client();
54
- const chart = new client.Session.Chart();
55
- chart.setMarket(product_id, {
56
- timeframe,
57
- range,
58
- to: ended_at,
59
- });
60
- chart.onError((e) => {
61
- subscriber.error(e);
62
- });
63
- chart.onUpdate(() => {
64
- const rawPeriods = chart.periods;
65
- if (rawPeriods.length !== 0) {
66
- const periods = rawPeriods.map((v) => ({
67
- series_id,
68
- created_at: (0, utils_1.formatTime)(v.time * 1000),
69
- datasource_id,
70
- product_id,
71
- duration,
72
- closed_at: (0, utils_1.formatTime)(v.time * 1000 + offset),
73
- open: `${v.open}`,
74
- high: `${v.max}`,
75
- low: `${v.min}`,
76
- close: `${v.close}`,
77
- volume: `${v.volume}`,
78
- open_interest: '0',
79
- }));
80
- subscriber.next(periods);
81
- subscriber.complete();
82
- }
83
- });
84
- return () => {
85
- client.end();
86
- };
87
- }));
88
- console.info((0, utils_1.formatTime)(Date.now()), 'queryChartResponse', JSON.stringify({
89
- series_id,
90
- product_id,
91
- duration,
92
- data_length: data.length,
93
- }));
94
- return data;
95
- },
96
- });
34
+ (0, exchange_1.provideOHLCService)(terminal, {
35
+ product_id_prefix: 'TradingView/',
36
+ direction: 'backward',
37
+ duration_list: Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),
38
+ }, async ({ product_id, duration, series_id, time }) => {
39
+ const [datasource_id, symbol] = (0, utils_1.decodePath)(product_id);
40
+ const offset = (0, utils_1.convertDurationToOffset)(duration);
41
+ if (!offset)
42
+ throw new Error(`Unsupported duration: ${duration}`);
43
+ const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];
44
+ if (!timeframe)
45
+ throw new Error(`Unsupported timeframe: ${duration}`);
46
+ const range = 5000;
47
+ console.info((0, utils_1.formatTime)(Date.now()), 'queryChartRequest', JSON.stringify({ series_id, product_id, duration, range }));
48
+ const data = await (0, rxjs_1.firstValueFrom)(new rxjs_1.Observable((subscriber) => {
49
+ const client = new tradingview_1.default.Client();
50
+ const chart = new client.Session.Chart();
51
+ chart.setMarket(symbol, {
52
+ timeframe,
53
+ range,
54
+ to: time,
55
+ });
56
+ chart.onError((e) => {
57
+ subscriber.error(e);
58
+ });
59
+ chart.onUpdate(() => {
60
+ const rawPeriods = chart.periods;
61
+ if (rawPeriods.length !== 0) {
62
+ const periods = rawPeriods.map((v) => ({
63
+ series_id,
64
+ created_at: (0, utils_1.formatTime)(v.time * 1000),
65
+ datasource_id,
66
+ product_id,
67
+ duration,
68
+ closed_at: (0, utils_1.formatTime)(v.time * 1000 + offset),
69
+ open: `${v.open}`,
70
+ high: `${v.max}`,
71
+ low: `${v.min}`,
72
+ close: `${v.close}`,
73
+ volume: `${v.volume}`,
74
+ open_interest: '0',
75
+ }));
76
+ subscriber.next(periods);
77
+ subscriber.complete();
78
+ }
79
+ });
80
+ return () => {
81
+ client.end();
82
+ };
83
+ }));
84
+ console.info((0, utils_1.formatTime)(Date.now()), 'queryChartResponse', JSON.stringify({
85
+ series_id,
86
+ product_id,
87
+ duration,
88
+ data_length: data.length,
89
+ }));
90
+ return data;
91
+ }, { concurrent: +(process.env.CONCURRENCY || 2) });
97
92
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IOHLC, provideOHLCDurationService } from '@yuants/data-ohlc';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { Observable, firstValueFrom } from 'rxjs';\n//@ts-ignore\nimport TradingView from '@mathieuc/tradingview';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_TRADINGVIEW_PERIOD: Record<string, string> = {\n PT1M: '1',\n PT3M: '3',\n PT5M: '5',\n PT15M: '15',\n PT30M: '30',\n PT45M: '45',\n PT1H: '60',\n PT2H: '120',\n PT3H: '180',\n PT4H: '240',\n P1D: '1D',\n P1W: '1W',\n P1M: '1M',\n P3M: '3M',\n P6M: '6M',\n P1Y: '12M',\n};\n\nprovideOHLCDurationService(\n terminal,\n 'TradingView', // datasource_id\n () => Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),\n);\n\ncreateSeriesProvider(terminal, {\n tableName: 'ohlc',\n series_id_prefix_parts: ['TradingView'],\n reversed: false,\n serviceOptions: { concurrent: +(process.env.CONCURRENCY || 2) },\n queryFn: async ({ series_id, started_at, ended_at }) => {\n const [datasource_id, product_id, duration] = decodePath(series_id);\n const offset = convertDurationToOffset(duration);\n if (!offset) throw new Error(`Unsupported duration: ${duration}`);\n\n const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];\n if (!timeframe) throw new Error(`Unsupported timeframe: ${duration}`);\n\n const range = Math.ceil((ended_at - started_at) / offset);\n if (range <= 0) {\n throw `range=${range} is invalid`;\n }\n\n console.info(\n formatTime(Date.now()),\n 'queryChartRequest',\n JSON.stringify({ series_id, product_id, duration, range }),\n );\n\n const data = await firstValueFrom(\n new Observable<IOHLC[]>((subscriber) => {\n const client = new TradingView.Client();\n const chart = new client.Session.Chart();\n chart.setMarket(product_id, {\n timeframe,\n range,\n to: ended_at,\n });\n chart.onError((e: any) => {\n subscriber.error(e);\n });\n chart.onUpdate(() => {\n const rawPeriods: any[] = chart.periods;\n if (rawPeriods.length !== 0) {\n const periods = rawPeriods.map(\n (v): IOHLC => ({\n series_id,\n created_at: formatTime(v.time * 1000),\n datasource_id,\n product_id,\n duration,\n closed_at: formatTime(v.time * 1000 + offset),\n open: `${v.open}`,\n high: `${v.max}`,\n low: `${v.min}`,\n close: `${v.close}`,\n volume: `${v.volume}`,\n open_interest: '0',\n }),\n );\n subscriber.next(periods);\n subscriber.complete();\n }\n });\n return () => {\n client.end();\n };\n }),\n );\n\n console.info(\n formatTime(Date.now()),\n 'queryChartResponse',\n JSON.stringify({\n series_id,\n product_id,\n duration,\n data_length: data.length,\n }),\n );\n\n return data;\n },\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,iDAAsE;AACtE,+CAA4C;AAC5C,yCAAgF;AAChF,+BAAkD;AAClD,YAAY;AACZ,wEAAgD;AAChD,+CAAsD;AAEtD,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,8BAA8B,GAA2B;IAC7D,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,IAAA,sCAA0B,EACxB,QAAQ,EACR,aAAa,EAAE,gBAAgB;AAC/B,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAClD,CAAC;AAEF,IAAA,6BAAkB,EAChB,QAAQ,EACR;IACE,iBAAiB,EAAE,cAAc;IACjC,SAAS,EAAE,UAAU;IACrB,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC;CAC3D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;IAClD,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,UAAU,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAA,+BAAuB,EAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IAElE,MAAM,SAAS,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IAEtE,MAAM,KAAK,GAAG,IAAI,CAAC;IAEnB,OAAO,CAAC,IAAI,CACV,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,mBAAmB,EACnB,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAC3D,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,IAAA,qBAAc,EAC/B,IAAI,iBAAU,CAAU,CAAC,UAAU,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,qBAAW,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;YACtB,SAAS;YACT,KAAK;YACL,EAAE,EAAE,IAAI;SACT,CAAC,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;YACvB,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;YAClB,MAAM,UAAU,GAAU,KAAK,CAAC,OAAO,CAAC;YACxC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAC5B,CAAC,CAAC,EAAS,EAAE,CAAC,CAAC;oBACb,SAAS;oBACT,UAAU,EAAE,IAAA,kBAAU,EAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;oBACrC,aAAa;oBACb,UAAU;oBACV,QAAQ;oBACR,SAAS,EAAE,IAAA,kBAAU,EAAC,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;oBAC7C,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;oBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;oBAChB,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;oBACf,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE;oBACnB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE;oBACrB,aAAa,EAAE,GAAG;iBACnB,CAAC,CACH,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,UAAU,CAAC,QAAQ,EAAE,CAAC;aACvB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,CAAC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,IAAI,CACV,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,oBAAoB,EACpB,IAAI,CAAC,SAAS,CAAC;QACb,SAAS;QACT,UAAU;QACV,QAAQ;QACR,WAAW,EAAE,IAAI,CAAC,MAAM;KACzB,CAAC,CACH,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC,EACD,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAChD,CAAC","sourcesContent":["import { IOHLC, provideOHLCDurationService } from '@yuants/data-ohlc';\nimport { Terminal } from '@yuants/protocol';\nimport { convertDurationToOffset, decodePath, formatTime } from '@yuants/utils';\nimport { Observable, firstValueFrom } from 'rxjs';\n//@ts-ignore\nimport TradingView from '@mathieuc/tradingview';\nimport { provideOHLCService } from '@yuants/exchange';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst DURATION_TO_TRADINGVIEW_PERIOD: Record<string, string> = {\n PT1M: '1',\n PT3M: '3',\n PT5M: '5',\n PT15M: '15',\n PT30M: '30',\n PT45M: '45',\n PT1H: '60',\n PT2H: '120',\n PT3H: '180',\n PT4H: '240',\n P1D: '1D',\n P1W: '1W',\n P1M: '1M',\n P3M: '3M',\n P6M: '6M',\n P1Y: '12M',\n};\n\nprovideOHLCDurationService(\n terminal,\n 'TradingView', // datasource_id\n () => Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),\n);\n\nprovideOHLCService(\n terminal,\n {\n product_id_prefix: 'TradingView/',\n direction: 'backward',\n duration_list: Object.keys(DURATION_TO_TRADINGVIEW_PERIOD),\n },\n async ({ product_id, duration, series_id, time }) => {\n const [datasource_id, symbol] = decodePath(product_id);\n const offset = convertDurationToOffset(duration);\n if (!offset) throw new Error(`Unsupported duration: ${duration}`);\n\n const timeframe = DURATION_TO_TRADINGVIEW_PERIOD[duration];\n if (!timeframe) throw new Error(`Unsupported timeframe: ${duration}`);\n\n const range = 5000;\n\n console.info(\n formatTime(Date.now()),\n 'queryChartRequest',\n JSON.stringify({ series_id, product_id, duration, range }),\n );\n\n const data = await firstValueFrom(\n new Observable<IOHLC[]>((subscriber) => {\n const client = new TradingView.Client();\n const chart = new client.Session.Chart();\n chart.setMarket(symbol, {\n timeframe,\n range,\n to: time,\n });\n chart.onError((e: any) => {\n subscriber.error(e);\n });\n chart.onUpdate(() => {\n const rawPeriods: any[] = chart.periods;\n if (rawPeriods.length !== 0) {\n const periods = rawPeriods.map(\n (v): IOHLC => ({\n series_id,\n created_at: formatTime(v.time * 1000),\n datasource_id,\n product_id,\n duration,\n closed_at: formatTime(v.time * 1000 + offset),\n open: `${v.open}`,\n high: `${v.max}`,\n low: `${v.min}`,\n close: `${v.close}`,\n volume: `${v.volume}`,\n open_interest: '0',\n }),\n );\n subscriber.next(periods);\n subscriber.complete();\n }\n });\n return () => {\n client.end();\n };\n }),\n );\n\n console.info(\n formatTime(Date.now()),\n 'queryChartResponse',\n JSON.stringify({\n series_id,\n product_id,\n duration,\n data_length: data.length,\n }),\n );\n\n return data;\n },\n { concurrent: +(process.env.CONCURRENCY || 2) },\n);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuants/vendor-trading-view",
3
- "version": "0.3.52",
3
+ "version": "0.4.1",
4
4
  "main": "lib/index.js",
5
5
  "files": [
6
6
  "dist",
@@ -13,12 +13,12 @@
13
13
  "@yuants/sql": "0.9.38",
14
14
  "@yuants/data-product": "0.5.8",
15
15
  "@yuants/utils": "0.19.3",
16
+ "@yuants/exchange": "0.8.10",
16
17
  "@yuants/data-ohlc": "0.6.3",
17
18
  "rxjs": "~7.5.6",
18
19
  "@mathieuc/tradingview": "~3.4.2"
19
20
  },
20
21
  "devDependencies": {
21
- "@microsoft/api-extractor": "~7.30.0",
22
22
  "@rushstack/heft": "~0.47.5",
23
23
  "@rushstack/heft-jest-plugin": "~0.16.8",
24
24
  "@rushstack/heft-node-rig": "~1.10.7",
@@ -34,6 +34,7 @@
34
34
  "access": "public"
35
35
  },
36
36
  "scripts": {
37
- "build": "heft test --clean && api-extractor run --local && yuan-toolkit post-build"
37
+ "build": "heft test --clean",
38
+ "test": "heft test"
38
39
  }
39
40
  }
package/dist/cli.js DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import './index';
3
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,CAAC","sourcesContent":["#!/usr/bin/env node\nimport './index';\n"]}
@@ -1 +0,0 @@
1
- export { }
package/lib/cli.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import './index';
3
- //# sourceMappingURL=cli.d.ts.map
package/lib/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,CAAC"}
package/lib/cli.js DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- require("./index");
5
- //# sourceMappingURL=cli.js.map
package/lib/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,mBAAiB","sourcesContent":["#!/usr/bin/env node\nimport './index';\n"]}
@@ -1,11 +0,0 @@
1
- // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
- // It should be published with your NPM package. It should not be tracked by Git.
3
- {
4
- "tsdocVersion": "0.12",
5
- "toolPackages": [
6
- {
7
- "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.30.1"
9
- }
10
- ]
11
- }
@@ -1,22 +0,0 @@
1
- {
2
- "apps/vendor-trading-view/CHANGELOG.json": "194728b6b429a77cf6e5c1a45af8d3f000ae0c36",
3
- "apps/vendor-trading-view/CHANGELOG.md": "e510a40dc2ab4098ec0d7a51b70d9e56b831e444",
4
- "apps/vendor-trading-view/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
5
- "apps/vendor-trading-view/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
6
- "apps/vendor-trading-view/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
7
- "apps/vendor-trading-view/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
8
- "apps/vendor-trading-view/etc/vendor-trading-view.api.md": "341d99a0258ce3dff77a871b518a458d33bb3df5",
9
- "apps/vendor-trading-view/package.json": "bb5091c6f06e3eb94878e50231decbd778b0053e",
10
- "apps/vendor-trading-view/src/cli.ts": "9bf6b5559a6c6f33da20e74cc6c5d702c60ec891",
11
- "apps/vendor-trading-view/src/index.ts": "dea893ca8ae94a70bc9ff8167e9ec53d5a93deb2",
12
- "apps/vendor-trading-view/tsconfig.json": "c96157f0fbf3503af6f84e03a0df4ac624a82d47",
13
- "apps/vendor-trading-view/.rush/temp/shrinkwrap-deps.json": "c7628aefb2275d409bfbd57b3355bd5f24683160",
14
- "libraries/protocol/temp/package-deps.json": "f9ac8a0412f63d53f93ce189a390eab4a74b772b",
15
- "libraries/data-series/temp/package-deps.json": "cc0091507594699dcba5a91b5068259c4776fffe",
16
- "libraries/sql/temp/package-deps.json": "d1a7297dec9849184bda8843800beae36c6b1f09",
17
- "libraries/data-product/temp/package-deps.json": "0eee98e9df8a5aa401aa1e87cefa141630973535",
18
- "libraries/utils/temp/package-deps.json": "16ee87f512cd903d59f2ce9935be22e5ed6d03a1",
19
- "libraries/data-ohlc/temp/package-deps.json": "d746fd7cc4964310a4f239d6c59538e7562d537a",
20
- "libraries/extension/temp/package-deps.json": "85f040a21803ec7d18c2730a13e0a2d79d5245fa",
21
- "tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
22
- }
@@ -1,177 +0,0 @@
1
- {
2
- "metadata": {
3
- "toolPackage": "@microsoft/api-extractor",
4
- "toolVersion": "7.30.1",
5
- "schemaVersion": 1009,
6
- "oldestForwardsCompatibleVersion": 1001,
7
- "tsdocConfig": {
8
- "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json",
9
- "noStandardTags": true,
10
- "tagDefinitions": [
11
- {
12
- "tagName": "@alpha",
13
- "syntaxKind": "modifier"
14
- },
15
- {
16
- "tagName": "@beta",
17
- "syntaxKind": "modifier"
18
- },
19
- {
20
- "tagName": "@defaultValue",
21
- "syntaxKind": "block"
22
- },
23
- {
24
- "tagName": "@decorator",
25
- "syntaxKind": "block",
26
- "allowMultiple": true
27
- },
28
- {
29
- "tagName": "@deprecated",
30
- "syntaxKind": "block"
31
- },
32
- {
33
- "tagName": "@eventProperty",
34
- "syntaxKind": "modifier"
35
- },
36
- {
37
- "tagName": "@example",
38
- "syntaxKind": "block",
39
- "allowMultiple": true
40
- },
41
- {
42
- "tagName": "@experimental",
43
- "syntaxKind": "modifier"
44
- },
45
- {
46
- "tagName": "@inheritDoc",
47
- "syntaxKind": "inline"
48
- },
49
- {
50
- "tagName": "@internal",
51
- "syntaxKind": "modifier"
52
- },
53
- {
54
- "tagName": "@label",
55
- "syntaxKind": "inline"
56
- },
57
- {
58
- "tagName": "@link",
59
- "syntaxKind": "inline",
60
- "allowMultiple": true
61
- },
62
- {
63
- "tagName": "@override",
64
- "syntaxKind": "modifier"
65
- },
66
- {
67
- "tagName": "@packageDocumentation",
68
- "syntaxKind": "modifier"
69
- },
70
- {
71
- "tagName": "@param",
72
- "syntaxKind": "block",
73
- "allowMultiple": true
74
- },
75
- {
76
- "tagName": "@privateRemarks",
77
- "syntaxKind": "block"
78
- },
79
- {
80
- "tagName": "@public",
81
- "syntaxKind": "modifier"
82
- },
83
- {
84
- "tagName": "@readonly",
85
- "syntaxKind": "modifier"
86
- },
87
- {
88
- "tagName": "@remarks",
89
- "syntaxKind": "block"
90
- },
91
- {
92
- "tagName": "@returns",
93
- "syntaxKind": "block"
94
- },
95
- {
96
- "tagName": "@sealed",
97
- "syntaxKind": "modifier"
98
- },
99
- {
100
- "tagName": "@see",
101
- "syntaxKind": "block"
102
- },
103
- {
104
- "tagName": "@throws",
105
- "syntaxKind": "block",
106
- "allowMultiple": true
107
- },
108
- {
109
- "tagName": "@typeParam",
110
- "syntaxKind": "block",
111
- "allowMultiple": true
112
- },
113
- {
114
- "tagName": "@virtual",
115
- "syntaxKind": "modifier"
116
- },
117
- {
118
- "tagName": "@betaDocumentation",
119
- "syntaxKind": "modifier"
120
- },
121
- {
122
- "tagName": "@internalRemarks",
123
- "syntaxKind": "block"
124
- },
125
- {
126
- "tagName": "@preapproved",
127
- "syntaxKind": "modifier"
128
- }
129
- ],
130
- "supportForTags": {
131
- "@alpha": true,
132
- "@beta": true,
133
- "@defaultValue": true,
134
- "@decorator": true,
135
- "@deprecated": true,
136
- "@eventProperty": true,
137
- "@example": true,
138
- "@experimental": true,
139
- "@inheritDoc": true,
140
- "@internal": true,
141
- "@label": true,
142
- "@link": true,
143
- "@override": true,
144
- "@packageDocumentation": true,
145
- "@param": true,
146
- "@privateRemarks": true,
147
- "@public": true,
148
- "@readonly": true,
149
- "@remarks": true,
150
- "@returns": true,
151
- "@sealed": true,
152
- "@see": true,
153
- "@throws": true,
154
- "@typeParam": true,
155
- "@virtual": true,
156
- "@betaDocumentation": true,
157
- "@internalRemarks": true,
158
- "@preapproved": true
159
- },
160
- "reportUnsupportedHtmlElements": false
161
- }
162
- },
163
- "kind": "Package",
164
- "canonicalReference": "@yuants/vendor-trading-view!",
165
- "docComment": "",
166
- "name": "@yuants/vendor-trading-view",
167
- "preserveMemberOrder": false,
168
- "members": [
169
- {
170
- "kind": "EntryPoint",
171
- "canonicalReference": "@yuants/vendor-trading-view!",
172
- "name": "",
173
- "preserveMemberOrder": false,
174
- "members": []
175
- }
176
- ]
177
- }
@@ -1,9 +0,0 @@
1
- ## API Report File for "@yuants/vendor-trading-view"
2
-
3
- > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
-
5
- ```ts
6
-
7
- // (No @packageDocumentation comment for this package)
8
-
9
- ```