@qtsurfer/sveltecharts 0.7.0 → 0.9.0
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/LightweightTimeSeriesChartBuilder.d.ts +5 -1
- package/dist/LightweightTimeSeriesChartBuilder.d.ts.map +1 -1
- package/dist/LightweightTimeSeriesChartBuilder.js +48 -1
- package/dist/TimeSeriesChartBuilder.d.ts +16 -1
- package/dist/TimeSeriesChartBuilder.d.ts.map +1 -1
- package/dist/TimeSeriesChartBuilder.js +66 -0
- package/dist/chartAdapter.d.ts +7 -0
- package/dist/chartAdapter.d.ts.map +1 -1
- package/dist/mockDataSet.d.ts +7 -0
- package/dist/mockDataSet.d.ts.map +1 -1
- package/dist/mockDataSet.js +22 -0
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IChartApi } from 'lightweight-charts';
|
|
2
|
-
import type { ChartDataset, ChartDatasetFormatSimpleObject, ChartMarkerPointOptions, TimeSeriesChartAdapter } from './chartAdapter';
|
|
2
|
+
import type { ChartDataset, ChartDatasetFormatSimpleObject, ChartMarkerPointOptions, OHLCDimensions, TimeSeriesChartAdapter } from './chartAdapter';
|
|
3
3
|
type ConfigBuilder = {
|
|
4
4
|
externalManagerLegend?: boolean;
|
|
5
5
|
};
|
|
@@ -14,6 +14,8 @@ export declare class LightweightTimeSeriesChartBuilder implements TimeSeriesChar
|
|
|
14
14
|
private _tsColumn;
|
|
15
15
|
private selected;
|
|
16
16
|
private series;
|
|
17
|
+
private _candlestickSeries;
|
|
18
|
+
private _ohlcDims;
|
|
17
19
|
private markersPlugins;
|
|
18
20
|
private markers;
|
|
19
21
|
private _dataDirty;
|
|
@@ -22,6 +24,7 @@ export declare class LightweightTimeSeriesChartBuilder implements TimeSeriesChar
|
|
|
22
24
|
constructor(instance: IChartApi, builderConfig?: ConfigBuilder);
|
|
23
25
|
setLegendIcon(_icon: string): this;
|
|
24
26
|
setDataset(data: ChartDataset, yDimensionsNames?: string[]): this;
|
|
27
|
+
setCandlestickSeries(data: ChartDatasetFormatSimpleObject, dims: OHLCDimensions): this;
|
|
25
28
|
addDimension(data: ChartDatasetFormatSimpleObject, dimName: string): this;
|
|
26
29
|
addMarkerPoint(id: number, data: {
|
|
27
30
|
dimName: string;
|
|
@@ -46,6 +49,7 @@ export declare class LightweightTimeSeriesChartBuilder implements TimeSeriesChar
|
|
|
46
49
|
private syncSeriesMarkers;
|
|
47
50
|
private expandTimeRangeForMarkers;
|
|
48
51
|
private clearSeries;
|
|
52
|
+
private toCandlestickData;
|
|
49
53
|
private toLineData;
|
|
50
54
|
private toChartTime;
|
|
51
55
|
private forceTimeRangeToDataset;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LightweightTimeSeriesChartBuilder.d.ts","sourceRoot":"","sources":["../src/lib/LightweightTimeSeriesChartBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"LightweightTimeSeriesChartBuilder.d.ts","sourceRoot":"","sources":["../src/lib/LightweightTimeSeriesChartBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,SAAS,EAUd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACX,YAAY,EAGZ,8BAA8B,EAC9B,uBAAuB,EACvB,cAAc,EACd,sBAAsB,EACtB,MAAM,gBAAgB,CAAC;AAExB,KAAK,aAAa,GAAG;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AA6BF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,UAWjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,UAW/C;AAED,qBAAa,iCAAkC,YAAW,sBAAsB;IACxE,gBAAgB,EAAE,SAAS,CAAC;IACnC,OAAO,CAAC,aAAa,CAEnB;IACF,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,kBAAkB,CAAgD;IAC1E,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,cAAc,CAAoD;IAC1E,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,aAAa;IAK9D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIlC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAejE,oBAAoB,CAAC,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IA4BtF,YAAY,CAAC,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,MAAM;IAclE,cAAc,CACb,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACd,EACD,OAAO,CAAC,EAAE,uBAAuB,GAC/B,IAAI;IAmBP,KAAK;IAqCL,eAAe;IAIf,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAWlC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAuB1C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAqBrC,YAAY;IAIZ,cAAc,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAQlC,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAmBxD,YAAY,IAAI,IAAI;IAQpB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,yBAAyB;IA4BjC,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,uBAAuB;IA4B/B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;CAWzB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LineSeries, createSeriesMarkers } from 'lightweight-charts';
|
|
1
|
+
import { LineSeries, CandlestickSeries, createSeriesMarkers } from 'lightweight-charts';
|
|
2
2
|
const SERIES_COLORS = ['#2563eb', '#16a34a', '#dc2626', '#7c3aed', '#d97706', '#0891b2'];
|
|
3
3
|
const DEFAULT_PRICE_PRECISION = 2;
|
|
4
4
|
const MAX_PRICE_PRECISION = 12;
|
|
@@ -42,6 +42,8 @@ export class LightweightTimeSeriesChartBuilder {
|
|
|
42
42
|
_tsColumn = '_ts';
|
|
43
43
|
selected = {};
|
|
44
44
|
series = new Map();
|
|
45
|
+
_candlestickSeries = null;
|
|
46
|
+
_ohlcDims = null;
|
|
45
47
|
markersPlugins = new Map();
|
|
46
48
|
markers = new Map();
|
|
47
49
|
_dataDirty = false;
|
|
@@ -66,6 +68,28 @@ export class LightweightTimeSeriesChartBuilder {
|
|
|
66
68
|
this.createSeriesData();
|
|
67
69
|
return this.build();
|
|
68
70
|
}
|
|
71
|
+
setCandlestickSeries(data, dims) {
|
|
72
|
+
this._tsColumn = Object.keys(data)[0];
|
|
73
|
+
this.dataset = data;
|
|
74
|
+
this._ohlcDims = dims;
|
|
75
|
+
// Remove existing candlestick series before recreating
|
|
76
|
+
if (this._candlestickSeries) {
|
|
77
|
+
this.LightweightChart.removeSeries(this._candlestickSeries);
|
|
78
|
+
this._candlestickSeries = null;
|
|
79
|
+
}
|
|
80
|
+
this._candlestickSeries = this.LightweightChart.addSeries(CandlestickSeries, {
|
|
81
|
+
upColor: '#26a69a',
|
|
82
|
+
downColor: '#ef5350',
|
|
83
|
+
borderVisible: false,
|
|
84
|
+
wickUpColor: '#26a69a',
|
|
85
|
+
wickDownColor: '#ef5350'
|
|
86
|
+
});
|
|
87
|
+
this.selected['Candlestick'] = true;
|
|
88
|
+
const candleData = this.toCandlestickData(dims);
|
|
89
|
+
this._candlestickSeries.setData(candleData);
|
|
90
|
+
this.LightweightChart.timeScale().fitContent();
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
69
93
|
addDimension(data, dimName) {
|
|
70
94
|
if (!this.dataset[this._tsColumn]?.length) {
|
|
71
95
|
throw new Error('No source data or dimensions found. Before loading data');
|
|
@@ -377,12 +401,35 @@ export class LightweightTimeSeriesChartBuilder {
|
|
|
377
401
|
for (const series of this.series.values()) {
|
|
378
402
|
this.LightweightChart.removeSeries(series);
|
|
379
403
|
}
|
|
404
|
+
if (this._candlestickSeries) {
|
|
405
|
+
this.LightweightChart.removeSeries(this._candlestickSeries);
|
|
406
|
+
this._candlestickSeries = null;
|
|
407
|
+
this._ohlcDims = null;
|
|
408
|
+
}
|
|
380
409
|
this.series.clear();
|
|
381
410
|
this.markersPlugins.clear();
|
|
382
411
|
this.markers.clear();
|
|
383
412
|
this._timeRangeForced = false;
|
|
384
413
|
this._building = false;
|
|
385
414
|
}
|
|
415
|
+
toCandlestickData(dims) {
|
|
416
|
+
const timestamps = this.dataset[this._tsColumn] ?? [];
|
|
417
|
+
const opens = this.dataset[dims.open] ?? [];
|
|
418
|
+
const highs = this.dataset[dims.high] ?? [];
|
|
419
|
+
const lows = this.dataset[dims.low] ?? [];
|
|
420
|
+
const closes = this.dataset[dims.close] ?? [];
|
|
421
|
+
const seen = new Set();
|
|
422
|
+
const result = [];
|
|
423
|
+
for (let i = 0; i < timestamps.length; i++) {
|
|
424
|
+
const t = this.toChartTime(timestamps[i]);
|
|
425
|
+
const tNum = t;
|
|
426
|
+
if (seen.has(tNum))
|
|
427
|
+
continue;
|
|
428
|
+
seen.add(tNum);
|
|
429
|
+
result.push({ time: t, open: opens[i], high: highs[i], low: lows[i], close: closes[i] });
|
|
430
|
+
}
|
|
431
|
+
return result;
|
|
432
|
+
}
|
|
386
433
|
toLineData(dim) {
|
|
387
434
|
const timestamps = this.dataset[this._tsColumn] ?? [];
|
|
388
435
|
const values = this.dataset[dim] ?? [];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type LineSeriesOption, type DataZoomComponentOption } from 'echarts';
|
|
2
2
|
import { type ECharts } from './';
|
|
3
|
-
import type { ChartMarkerPointOptions } from './chartAdapter';
|
|
3
|
+
import type { ChartDatasetFormatSimpleObject, ChartMarkerPointOptions, OHLCDimensions } from './chartAdapter';
|
|
4
4
|
import type { GridOption } from 'echarts/types/dist/shared';
|
|
5
5
|
import type { ZRColor } from 'echarts/types/src/util/types.js';
|
|
6
6
|
type IconType = 'circle' | 'rect' | 'roundRect' | 'triangle' | 'diamond' | 'pin' | 'arrowUp' | 'arrowDown' | 'none';
|
|
@@ -35,12 +35,27 @@ export declare class TimeSeriesChartBuilder {
|
|
|
35
35
|
private yDimensions;
|
|
36
36
|
private yDimensionNames?;
|
|
37
37
|
private _tsColumn;
|
|
38
|
+
private _ohlcDims;
|
|
38
39
|
constructor(instance: ECharts, builderConfig?: ConfigBuilder);
|
|
39
40
|
/**
|
|
40
41
|
* Accepts data as rows: [timestamp, v1, v2, ...]
|
|
41
42
|
* Automatically generates line series for each value column (>=1).
|
|
42
43
|
*/
|
|
43
44
|
setDataset(data: DatasetFormatArray | DatasetFormatObject | DatasetFormatSimpleObject, yDimensionsNames?: string[]): this;
|
|
45
|
+
/**
|
|
46
|
+
* Loads OHLC data and renders a candlestick series.
|
|
47
|
+
* data must be a columnar object: { _ts: number[], open: number[], high: number[], low: number[], close: number[] }
|
|
48
|
+
* dims specifies the column names for each OHLC role.
|
|
49
|
+
*
|
|
50
|
+
* Calling this method multiple times replaces any existing candlestick series in place.
|
|
51
|
+
*/
|
|
52
|
+
setCandlestickSeries(data: ChartDatasetFormatSimpleObject, dims: OHLCDimensions): this;
|
|
53
|
+
/**
|
|
54
|
+
* Removes the candlestick series (if any) and clears OHLC state.
|
|
55
|
+
* Useful before switching back to line rendering on the same builder instance.
|
|
56
|
+
*/
|
|
57
|
+
clearCandlestickSeries(): this;
|
|
58
|
+
private removeCandlestickSeries;
|
|
44
59
|
toggleLegend(column: string): this;
|
|
45
60
|
goToZoom(start: number, end: number): this;
|
|
46
61
|
scrollToTime(timestamp: number): this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeSeriesChartBuilder.d.ts","sourceRoot":"","sources":["../src/lib/TimeSeriesChartBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE5B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AACxD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"TimeSeriesChartBuilder.d.ts","sourceRoot":"","sources":["../src/lib/TimeSeriesChartBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {} from 'echarts';
|
|
2
2
|
import {} from './';
|
|
3
|
+
const CANDLESTICK_SERIES_ID = 'candlestick';
|
|
3
4
|
export class TimeSeriesChartBuilder {
|
|
4
5
|
ECharts;
|
|
5
6
|
builderConfig = {
|
|
@@ -9,6 +10,7 @@ export class TimeSeriesChartBuilder {
|
|
|
9
10
|
yDimensions;
|
|
10
11
|
yDimensionNames;
|
|
11
12
|
_tsColumn = '_ts';
|
|
13
|
+
_ohlcDims = null;
|
|
12
14
|
constructor(instance, builderConfig) {
|
|
13
15
|
this.ECharts = instance;
|
|
14
16
|
this.builderConfig = { ...this.builderConfig, ...builderConfig };
|
|
@@ -116,6 +118,70 @@ export class TimeSeriesChartBuilder {
|
|
|
116
118
|
}
|
|
117
119
|
return this.build();
|
|
118
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Loads OHLC data and renders a candlestick series.
|
|
123
|
+
* data must be a columnar object: { _ts: number[], open: number[], high: number[], low: number[], close: number[] }
|
|
124
|
+
* dims specifies the column names for each OHLC role.
|
|
125
|
+
*
|
|
126
|
+
* Calling this method multiple times replaces any existing candlestick series in place.
|
|
127
|
+
*/
|
|
128
|
+
setCandlestickSeries(data, dims) {
|
|
129
|
+
this._tsColumn = Object.keys(data)[0];
|
|
130
|
+
this.yDimensions = [dims.open, dims.high, dims.low, dims.close];
|
|
131
|
+
this.yDimensionNames = [dims.open, dims.high, dims.low, dims.close];
|
|
132
|
+
this._ohlcDims = dims;
|
|
133
|
+
if (this.option.dataset && !Array.isArray(this.option.dataset)) {
|
|
134
|
+
this.option.dataset.dimensions = [this._tsColumn, dims.open, dims.high, dims.low, dims.close];
|
|
135
|
+
this.option.dataset.source = data;
|
|
136
|
+
}
|
|
137
|
+
const selected = this.option.legend.selected;
|
|
138
|
+
Object.assign(selected, { Candlestick: true });
|
|
139
|
+
this.removeCandlestickSeries();
|
|
140
|
+
this.option.series.push({
|
|
141
|
+
type: 'candlestick',
|
|
142
|
+
id: CANDLESTICK_SERIES_ID,
|
|
143
|
+
name: 'Candlestick',
|
|
144
|
+
encode: {
|
|
145
|
+
x: this._tsColumn,
|
|
146
|
+
// ECharts candlestick encode order: [open, close, low, high]
|
|
147
|
+
y: [dims.open, dims.close, dims.low, dims.high]
|
|
148
|
+
},
|
|
149
|
+
animation: false,
|
|
150
|
+
progressive: 4000,
|
|
151
|
+
progressiveThreshold: 3000,
|
|
152
|
+
itemStyle: {
|
|
153
|
+
color: '#26a69a',
|
|
154
|
+
color0: '#ef5350',
|
|
155
|
+
borderColor: '#26a69a',
|
|
156
|
+
borderColor0: '#ef5350'
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return this.build();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Removes the candlestick series (if any) and clears OHLC state.
|
|
163
|
+
* Useful before switching back to line rendering on the same builder instance.
|
|
164
|
+
*/
|
|
165
|
+
clearCandlestickSeries() {
|
|
166
|
+
if (!this._ohlcDims)
|
|
167
|
+
return this;
|
|
168
|
+
this.removeCandlestickSeries();
|
|
169
|
+
this._ohlcDims = null;
|
|
170
|
+
const selected = this.option.legend.selected;
|
|
171
|
+
delete selected['Candlestick'];
|
|
172
|
+
// Force ECharts to drop the removed candlestick from its internal state.
|
|
173
|
+
this.ECharts.setOption(this.option, {
|
|
174
|
+
lazyUpdate: true,
|
|
175
|
+
notMerge: false,
|
|
176
|
+
replaceMerge: ['dataset', 'series']
|
|
177
|
+
});
|
|
178
|
+
return this;
|
|
179
|
+
}
|
|
180
|
+
removeCandlestickSeries() {
|
|
181
|
+
if (!Array.isArray(this.option.series))
|
|
182
|
+
return;
|
|
183
|
+
this.option.series = this.option.series.filter((s) => s.id !== CANDLESTICK_SERIES_ID);
|
|
184
|
+
}
|
|
119
185
|
toggleLegend(column) {
|
|
120
186
|
if (!column || !this.ECharts)
|
|
121
187
|
return this;
|
package/dist/chartAdapter.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export type ChartDatasetFormatSimpleObject = Record<string, number[]>;
|
|
2
2
|
export type ChartDatasetFormatObject = Record<string, any>[];
|
|
3
3
|
export type ChartDatasetFormatArray = number[][];
|
|
4
|
+
export type OHLCDimensions = {
|
|
5
|
+
open: string;
|
|
6
|
+
high: string;
|
|
7
|
+
low: string;
|
|
8
|
+
close: string;
|
|
9
|
+
};
|
|
4
10
|
export type ChartDataset = ChartDatasetFormatArray | ChartDatasetFormatObject | ChartDatasetFormatSimpleObject;
|
|
5
11
|
export type ChartMarkerPoint = {
|
|
6
12
|
dimName: string;
|
|
@@ -16,6 +22,7 @@ export type ChartMarkerPointOptions = {
|
|
|
16
22
|
export interface TimeSeriesChartAdapter {
|
|
17
23
|
setLegendIcon(icon: string): this;
|
|
18
24
|
setDataset(data: ChartDataset, yDimensionsNames?: string[]): this;
|
|
25
|
+
setCandlestickSeries(data: ChartDatasetFormatSimpleObject, dims: OHLCDimensions): this;
|
|
19
26
|
build(): this;
|
|
20
27
|
addDimension(data: ChartDatasetFormatSimpleObject, dimName: string): this;
|
|
21
28
|
addMarkerPoint(id: number, data: ChartMarkerPoint, options?: ChartMarkerPointOptions): this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chartAdapter.d.ts","sourceRoot":"","sources":["../src/lib/chartAdapter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,8BAA8B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACtE,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;AAC7D,MAAM,MAAM,uBAAuB,GAAG,MAAM,EAAE,EAAE,CAAC;AAEjD,MAAM,MAAM,YAAY,GACrB,uBAAuB,GACvB,wBAAwB,GACxB,8BAA8B,CAAC;AAElC,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACtC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClE,KAAK,IAAI,IAAI,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1E,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5F,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,cAAc,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,YAAY,IAAI,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChE,YAAY,IAAI,IAAI,CAAC;CACrB"}
|
|
1
|
+
{"version":3,"file":"chartAdapter.d.ts","sourceRoot":"","sources":["../src/lib/chartAdapter.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,8BAA8B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACtE,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;AAC7D,MAAM,MAAM,uBAAuB,GAAG,MAAM,EAAE,EAAE,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,YAAY,GACrB,uBAAuB,GACvB,wBAAwB,GACxB,8BAA8B,CAAC;AAElC,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACtC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClE,oBAAoB,CAAC,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IACvF,KAAK,IAAI,IAAI,CAAC;IACd,YAAY,CAAC,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1E,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5F,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,cAAc,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,YAAY,IAAI,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChE,YAAY,IAAI,IAAI,CAAC;CACrB"}
|
package/dist/mockDataSet.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
export declare function createOHLCDataSet(bars: number, intervalMs?: number): {
|
|
2
|
+
_ts: number[];
|
|
3
|
+
open: number[];
|
|
4
|
+
high: number[];
|
|
5
|
+
low: number[];
|
|
6
|
+
close: number[];
|
|
7
|
+
};
|
|
1
8
|
export declare function createDataSet<T>(hours: number, type: 'object' | 'array'): {
|
|
2
9
|
data: T[];
|
|
3
10
|
yDimensionsNames: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockDataSet.d.ts","sourceRoot":"","sources":["../src/lib/mockDataSet.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;UA8BxD,CAAC,EAAE;;EAGlB"}
|
|
1
|
+
{"version":3,"file":"mockDataSet.d.ts","sourceRoot":"","sources":["../src/lib/mockDataSet.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,SAAS;;;;;;EA0BlE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;UA8BxD,CAAC,EAAE;;EAGlB"}
|
package/dist/mockDataSet.js
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
export function createOHLCDataSet(bars, intervalMs = 60_000) {
|
|
2
|
+
let startDate = new Date(2025, 9, 28, 14, 0, 0).getTime();
|
|
3
|
+
let price = 100;
|
|
4
|
+
const ts = [];
|
|
5
|
+
const open = [];
|
|
6
|
+
const high = [];
|
|
7
|
+
const low = [];
|
|
8
|
+
const close = [];
|
|
9
|
+
for (let i = 0; i < bars; i++) {
|
|
10
|
+
const o = price + (Math.random() - 0.5) * 2;
|
|
11
|
+
const c = o + (Math.random() - 0.5) * 3;
|
|
12
|
+
const h = Math.max(o, c) + Math.random() * 1.5;
|
|
13
|
+
const l = Math.min(o, c) - Math.random() * 1.5;
|
|
14
|
+
ts.push(startDate + i * intervalMs);
|
|
15
|
+
open.push(parseFloat(o.toFixed(4)));
|
|
16
|
+
high.push(parseFloat(h.toFixed(4)));
|
|
17
|
+
low.push(parseFloat(l.toFixed(4)));
|
|
18
|
+
close.push(parseFloat(c.toFixed(4)));
|
|
19
|
+
price = c;
|
|
20
|
+
}
|
|
21
|
+
return { _ts: ts, open, high, low, close };
|
|
22
|
+
}
|
|
1
23
|
export function createDataSet(hours, type) {
|
|
2
24
|
// Create random number between min and max
|
|
3
25
|
const random = (min = 45, max = 50) => Math.random() * max + min;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"private": false,
|
|
3
3
|
"name": "@qtsurfer/sveltecharts",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.9.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "QTSurfer (https://github.com/QTSurfer)",
|
|
7
7
|
"homepage": "https://github.com/QTSurfer/svelte-timeseries/tree/main/packages/sveltecharts",
|