wickchart 1.6.0 → 1.7.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/README.md +198 -5
- package/package.json +17 -4
- package/src/core.js +3012 -2882
- package/src/feeds.js +333 -1
- package/src/react-core.js +7 -1
- package/src/report.js +309 -0
- package/src/wick-chart.js +553 -52
- package/src/wick-feed.js +213 -2
- package/src/worker-core.js +89 -0
- package/src/worker.js +128 -0
- package/types/core.d.ts +60 -17
- package/types/feeds.d.ts +165 -0
- package/types/report.d.ts +114 -0
- package/types/wick-chart.d.ts +108 -5
- package/types/wick-feed.d.ts +19 -0
- package/types/worker-core.d.ts +11 -0
- package/types/worker.d.ts +36 -0
package/types/feeds.d.ts
CHANGED
|
@@ -40,6 +40,131 @@ export declare function genSynthetic(key: string, sec: number, n: number, base?:
|
|
|
40
40
|
* @param {number} [startPrice] bridge continuity from the last known price
|
|
41
41
|
*/
|
|
42
42
|
export declare function makeSynthStream(sec: number, startPrice?: number): () => any;
|
|
43
|
+
/** Default thresholds per kind. They are per-instrument — there is no
|
|
44
|
+
* universal "one bar" size, treat these as starting points to tune. */
|
|
45
|
+
export declare const AGG_DEFAULTS: {
|
|
46
|
+
tick: number;
|
|
47
|
+
volume: number;
|
|
48
|
+
dollar: number;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Parse an `aggregate` spec — `tick`, `volume:50`, `dollar:25000` (case and
|
|
52
|
+
* whitespace tolerant; the value is the bar size in trades / base units /
|
|
53
|
+
* quote units respectively).
|
|
54
|
+
* @param {string} spec attribute value
|
|
55
|
+
* @returns {{kind: 'tick'|'volume'|'dollar', threshold: number}|null} null when invalid
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseAggregate(spec: string): {
|
|
58
|
+
kind: 'tick' | 'volume' | 'dollar';
|
|
59
|
+
threshold: number;
|
|
60
|
+
} | null;
|
|
61
|
+
/**
|
|
62
|
+
* Streaming aggregator: feed it trades, get bars back. `add()` returns a
|
|
63
|
+
* bar the moment the threshold is crossed ({@link current} keeps exposing
|
|
64
|
+
* the forming bar meanwhile). The completing trade belongs entirely to the
|
|
65
|
+
* closing bar — a whale print is never split across two bars.
|
|
66
|
+
*/
|
|
67
|
+
export declare class TickBarAggregator {
|
|
68
|
+
kind: string;
|
|
69
|
+
threshold: any;
|
|
70
|
+
_bar: {
|
|
71
|
+
time: number;
|
|
72
|
+
open: number;
|
|
73
|
+
high: number;
|
|
74
|
+
low: number;
|
|
75
|
+
close: number;
|
|
76
|
+
volume: number;
|
|
77
|
+
n: number;
|
|
78
|
+
notional: number;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* @param {'tick'|'volume'|'dollar'} kind what the threshold counts
|
|
82
|
+
* @param {number} threshold bar size (trades / base units / quote units)
|
|
83
|
+
*/
|
|
84
|
+
constructor(kind?: 'tick' | 'volume' | 'dollar', threshold?: number);
|
|
85
|
+
/**
|
|
86
|
+
* Feed one trade `{ time, price, size }` (seconds auto-upgraded to ms,
|
|
87
|
+
* same heuristic as the chart). Returns the completed bar —
|
|
88
|
+
* `{ time, open, high, low, close, volume, closed: true }` — when the
|
|
89
|
+
* threshold is reached, else null.
|
|
90
|
+
* @returns {object|null}
|
|
91
|
+
*/
|
|
92
|
+
add(trade: any): object | null;
|
|
93
|
+
/** The forming bar as plain chart-bar fields (no internals), or null. */
|
|
94
|
+
current(): {
|
|
95
|
+
time: number;
|
|
96
|
+
open: number;
|
|
97
|
+
high: number;
|
|
98
|
+
low: number;
|
|
99
|
+
close: number;
|
|
100
|
+
volume: number;
|
|
101
|
+
};
|
|
102
|
+
/** Close the forming bar as-is (end of tape / teardown), or null. */
|
|
103
|
+
flush(): {
|
|
104
|
+
time: number;
|
|
105
|
+
open: number;
|
|
106
|
+
high: number;
|
|
107
|
+
low: number;
|
|
108
|
+
close: number;
|
|
109
|
+
volume: number;
|
|
110
|
+
closed: boolean;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* One-pass batch aggregation of a trade history. Returns the closed bars,
|
|
115
|
+
* the still-forming remainder, and the live aggregator positioned at the end
|
|
116
|
+
* of the tape so streaming can continue without a seam.
|
|
117
|
+
* @param {Array<object>} trades `{ time, price, size }` prints
|
|
118
|
+
* @param {'tick'|'volume'|'dollar'} kind
|
|
119
|
+
* @param {number} threshold
|
|
120
|
+
*/
|
|
121
|
+
export declare function aggregateTrades(trades: Array<object>, kind: 'tick' | 'volume' | 'dollar', threshold: number): {
|
|
122
|
+
bars: any[];
|
|
123
|
+
pending: {
|
|
124
|
+
time: number;
|
|
125
|
+
open: number;
|
|
126
|
+
high: number;
|
|
127
|
+
low: number;
|
|
128
|
+
close: number;
|
|
129
|
+
volume: number;
|
|
130
|
+
};
|
|
131
|
+
aggregator: TickBarAggregator;
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Coerce a generic JSON trades array into plain `{ time, price, size }`
|
|
135
|
+
* (ms, seconds auto-upgraded; `size` also read from `qty`/`amount`).
|
|
136
|
+
* Invalid entries are dropped, never thrown — same contract as the chart's
|
|
137
|
+
* other normalizers. Output is sorted by time.
|
|
138
|
+
*/
|
|
139
|
+
export declare function normalizeTrades(list: any): any[];
|
|
140
|
+
/**
|
|
141
|
+
* Deterministic synthetic trade prints (random-walk price with volatility
|
|
142
|
+
* regimes, heavy-tailed sizes). Same key → same tape.
|
|
143
|
+
* @param {string} key seed key
|
|
144
|
+
* @param {number} [n=24000] print count
|
|
145
|
+
* @param {number} [base=100] starting price
|
|
146
|
+
*/
|
|
147
|
+
export declare function genSyntheticTrades(key: string, n?: number, base?: number): any[];
|
|
148
|
+
/**
|
|
149
|
+
* Stateful synthetic live tape: one print per call, bridging from
|
|
150
|
+
* `startPrice` (e.g. the last price of a seeded history).
|
|
151
|
+
* @param {number} [startPrice=100]
|
|
152
|
+
*/
|
|
153
|
+
export declare function makeSynthTradeStream(startPrice?: number): () => {
|
|
154
|
+
time: number;
|
|
155
|
+
price: number;
|
|
156
|
+
size: number;
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Expected synthetic prints per bar — used to size the offline seed so a
|
|
160
|
+
* demo chart starts with roughly the requested bar count.
|
|
161
|
+
* @param {{kind: string, threshold: number}} agg
|
|
162
|
+
* @param {number} [base=100]
|
|
163
|
+
*/
|
|
164
|
+
export declare function synthTradesPerBar(agg: {
|
|
165
|
+
kind: string;
|
|
166
|
+
threshold: number;
|
|
167
|
+
}, base?: number): number;
|
|
43
168
|
/**
|
|
44
169
|
* Fetch klines from Binance's public REST API.
|
|
45
170
|
* @param {string} symbol e.g. 'BTCUSDT'
|
|
@@ -56,3 +181,43 @@ export declare function fetchBinanceKlines(symbol: string, tfId: string, limit?:
|
|
|
56
181
|
export declare function openBinanceSocket(symbol: any, tfId: any, onBar: any, onDown: any, timeoutMs?: number): {
|
|
57
182
|
close(): void;
|
|
58
183
|
};
|
|
184
|
+
/**
|
|
185
|
+
* Fetch Binance aggTrades, paging backwards from the newest prints (or from
|
|
186
|
+
* below `beforeId`) until `minTrades` prints / `maxPages` requests / the
|
|
187
|
+
* start of the symbol's history. Returns `{ trades, oldestId }` ascending by
|
|
188
|
+
* time; each print carries its Binance id so live streams can resume without
|
|
189
|
+
* overlaps.
|
|
190
|
+
* @param {string} symbol e.g. 'BTCUSDT'
|
|
191
|
+
* @param {number} [minTrades=1000] stop once at least this many prints are held
|
|
192
|
+
* @param {number} [maxPages=25] hard request cap (1000 prints per page)
|
|
193
|
+
* @param {number} [beforeId] only fetch prints with an id lower than this
|
|
194
|
+
*/
|
|
195
|
+
export declare function fetchBinanceAggTrades(symbol: string, minTrades?: number, maxPages?: number, beforeId?: number): Promise<{
|
|
196
|
+
trades: any[];
|
|
197
|
+
oldestId: number;
|
|
198
|
+
}>;
|
|
199
|
+
/**
|
|
200
|
+
* One forward window of aggTrades starting at `fromId` — the catch-up call
|
|
201
|
+
* for REST polling after a trade socket drops. Returns `{ trades, latestId }`.
|
|
202
|
+
* @param {string} symbol
|
|
203
|
+
* @param {number} fromId first print id to fetch (use lastSeenId + 1)
|
|
204
|
+
*/
|
|
205
|
+
export declare function fetchBinanceAggTradesSince(symbol: string, fromId: number): Promise<{
|
|
206
|
+
trades: {
|
|
207
|
+
id: any;
|
|
208
|
+
time: any;
|
|
209
|
+
price: number;
|
|
210
|
+
size: number;
|
|
211
|
+
}[];
|
|
212
|
+
latestId: any;
|
|
213
|
+
}>;
|
|
214
|
+
/**
|
|
215
|
+
* Open a Binance aggTrade WebSocket — raw prints for information-based bar
|
|
216
|
+
* aggregation. Same lifecycle contract as openBinanceSocket: `onDown(err)`
|
|
217
|
+
* fires on error/close/timeout, after which the socket is dead and the
|
|
218
|
+
* caller should fall back.
|
|
219
|
+
* @returns {{close(): void}}
|
|
220
|
+
*/
|
|
221
|
+
export declare function openBinanceTradeSocket(symbol: any, onTrade: any, onDown: any, timeoutMs?: number): {
|
|
222
|
+
close(): void;
|
|
223
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/** Decimals worth showing for a price of this magnitude. */
|
|
2
|
+
export declare function decimalsFor(price: any): 2 | 3 | 6;
|
|
3
|
+
/** 1234 → '1.2k', 1234567 → '1.23M', 12 → '12'. */
|
|
4
|
+
export declare function compact(v: any): string;
|
|
5
|
+
export declare function pct(v: any, digits?: number): string;
|
|
6
|
+
/** Greatest index whose time is <= t (binary search; bars are ascending). */
|
|
7
|
+
export declare function indexForTime(bars: any, t: any): number;
|
|
8
|
+
/** Resolve the report colors: theme palettes, overridden by the chart's own
|
|
9
|
+
* --wick-* variables when readable (browser) and theme is 'auto'. */
|
|
10
|
+
export declare function reportColors(chart: any, theme?: string): {
|
|
11
|
+
bg: string;
|
|
12
|
+
panel: string;
|
|
13
|
+
text: string;
|
|
14
|
+
muted: string;
|
|
15
|
+
up: string;
|
|
16
|
+
down: string;
|
|
17
|
+
accent: string;
|
|
18
|
+
} | {
|
|
19
|
+
bg: string;
|
|
20
|
+
panel: string;
|
|
21
|
+
text: string;
|
|
22
|
+
muted: string;
|
|
23
|
+
up: string;
|
|
24
|
+
down: string;
|
|
25
|
+
accent: string;
|
|
26
|
+
};
|
|
27
|
+
/** Relative luminance of a #hex / rgb() string (0..1, best effort). */
|
|
28
|
+
export declare function luminance(color: any): number;
|
|
29
|
+
/**
|
|
30
|
+
* Build the whole report as data: sizes, bands, stat rows, colors, labels.
|
|
31
|
+
* @param {object} chart a <wick-chart> (public API only: data,
|
|
32
|
+
* getVisibleRange, exportPNG, clientWidth/Height, getAttribute)
|
|
33
|
+
* @param {{title?: string, source?: string, brand?: string, theme?: string,
|
|
34
|
+
* scale?: number, precision?: number}} [opts]
|
|
35
|
+
*/
|
|
36
|
+
export declare function reportModel(chart: object, opts?: {
|
|
37
|
+
title?: string;
|
|
38
|
+
source?: string;
|
|
39
|
+
brand?: string;
|
|
40
|
+
theme?: string;
|
|
41
|
+
scale?: number;
|
|
42
|
+
precision?: number;
|
|
43
|
+
}): {
|
|
44
|
+
scale: number;
|
|
45
|
+
width: number;
|
|
46
|
+
height: number;
|
|
47
|
+
bands: {
|
|
48
|
+
header: number;
|
|
49
|
+
stats: number;
|
|
50
|
+
footer: number;
|
|
51
|
+
chart: number;
|
|
52
|
+
};
|
|
53
|
+
grid: {
|
|
54
|
+
cols: number;
|
|
55
|
+
};
|
|
56
|
+
title: any;
|
|
57
|
+
brand: string;
|
|
58
|
+
source: string;
|
|
59
|
+
range: {
|
|
60
|
+
from: any;
|
|
61
|
+
to: any;
|
|
62
|
+
};
|
|
63
|
+
last: any;
|
|
64
|
+
precision: number;
|
|
65
|
+
rows: ({
|
|
66
|
+
label: string;
|
|
67
|
+
value: string;
|
|
68
|
+
color: string;
|
|
69
|
+
} | {
|
|
70
|
+
color?: undefined;
|
|
71
|
+
label: string;
|
|
72
|
+
value: string;
|
|
73
|
+
})[];
|
|
74
|
+
generatedAt: number;
|
|
75
|
+
colors: {
|
|
76
|
+
bg: string;
|
|
77
|
+
panel: string;
|
|
78
|
+
text: string;
|
|
79
|
+
muted: string;
|
|
80
|
+
up: string;
|
|
81
|
+
down: string;
|
|
82
|
+
accent: string;
|
|
83
|
+
} | {
|
|
84
|
+
bg: string;
|
|
85
|
+
panel: string;
|
|
86
|
+
text: string;
|
|
87
|
+
muted: string;
|
|
88
|
+
up: string;
|
|
89
|
+
down: string;
|
|
90
|
+
accent: string;
|
|
91
|
+
};
|
|
92
|
+
stats: {
|
|
93
|
+
n: number;
|
|
94
|
+
changePct: number;
|
|
95
|
+
min: number;
|
|
96
|
+
max: number;
|
|
97
|
+
maxDDPct: number;
|
|
98
|
+
annVolPct: number;
|
|
99
|
+
up: number;
|
|
100
|
+
dn: number;
|
|
101
|
+
avgVolume: number;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Compose the branded report and return it as a PNG data URL (default), a
|
|
106
|
+
* Blob, or the canvas itself.
|
|
107
|
+
* @returns {Promise<string|Blob|HTMLCanvasElement>}
|
|
108
|
+
*/
|
|
109
|
+
export declare function exportReport(chart: any, opts?: {}): Promise<string | Blob | HTMLCanvasElement>;
|
|
110
|
+
/**
|
|
111
|
+
* Compose and trigger a download (browser only).
|
|
112
|
+
* @returns {Promise<void>}
|
|
113
|
+
*/
|
|
114
|
+
export declare function downloadReport(chart: any, filename?: string, opts?: {}): Promise<void>;
|
package/types/wick-chart.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ declare class WickChart extends HTMLElementBase {
|
|
|
21
21
|
_hover: {
|
|
22
22
|
index: any;
|
|
23
23
|
x: number;
|
|
24
|
-
y:
|
|
24
|
+
y: any;
|
|
25
25
|
} | {
|
|
26
26
|
index: number;
|
|
27
27
|
x: number;
|
|
@@ -164,6 +164,19 @@ declare class WickChart extends HTMLElementBase {
|
|
|
164
164
|
panes: any[];
|
|
165
165
|
volume: boolean;
|
|
166
166
|
};
|
|
167
|
+
_workerOn: boolean;
|
|
168
|
+
_epoch: number;
|
|
169
|
+
_workerCache: {
|
|
170
|
+
epoch: number;
|
|
171
|
+
map: {};
|
|
172
|
+
pending: {};
|
|
173
|
+
sent: number;
|
|
174
|
+
};
|
|
175
|
+
_sid: number;
|
|
176
|
+
_onlineSeries: {
|
|
177
|
+
epoch: number;
|
|
178
|
+
map: {};
|
|
179
|
+
};
|
|
167
180
|
_pointers: Map<any, any>;
|
|
168
181
|
_pan: {
|
|
169
182
|
x: number;
|
|
@@ -176,6 +189,13 @@ declare class WickChart extends HTMLElementBase {
|
|
|
176
189
|
idxAtMid: number;
|
|
177
190
|
midX: number;
|
|
178
191
|
};
|
|
192
|
+
_scrub: boolean;
|
|
193
|
+
_pressTimer: number;
|
|
194
|
+
_pressOrigin: {
|
|
195
|
+
pointerId: any;
|
|
196
|
+
x: any;
|
|
197
|
+
y: any;
|
|
198
|
+
};
|
|
179
199
|
_layers: any[];
|
|
180
200
|
_layerClaim: {
|
|
181
201
|
layer: any;
|
|
@@ -187,6 +207,10 @@ declare class WickChart extends HTMLElementBase {
|
|
|
187
207
|
_positions: any[];
|
|
188
208
|
_alerts: any[];
|
|
189
209
|
_seq: number;
|
|
210
|
+
_alertEval: string;
|
|
211
|
+
_lastClosedIdx: number;
|
|
212
|
+
_tz: string;
|
|
213
|
+
_vwapAnchor: string;
|
|
190
214
|
_overlays: any[];
|
|
191
215
|
_scenario: {
|
|
192
216
|
path: {
|
|
@@ -219,8 +243,11 @@ declare class WickChart extends HTMLElementBase {
|
|
|
219
243
|
_onWheel: (e: any) => void;
|
|
220
244
|
_onDbl: () => void;
|
|
221
245
|
_onKey: (e: any) => void;
|
|
246
|
+
_onTouchMove: (e: any) => void;
|
|
247
|
+
_onDprChange: () => void;
|
|
222
248
|
tabIndex: number;
|
|
223
249
|
_ro: any;
|
|
250
|
+
_dprMq: MediaQueryList;
|
|
224
251
|
_posVersion: any;
|
|
225
252
|
_pendingRange: {
|
|
226
253
|
from: number;
|
|
@@ -237,9 +264,18 @@ declare class WickChart extends HTMLElementBase {
|
|
|
237
264
|
rawHi: number;
|
|
238
265
|
};
|
|
239
266
|
static get observedAttributes(): string[];
|
|
267
|
+
/**
|
|
268
|
+
* Shared ChartWorkerPool for the worker compute path (set by importing
|
|
269
|
+
* 'wickchart/worker'; null — everything sync — until then).
|
|
270
|
+
* @type {object|null}
|
|
271
|
+
*/
|
|
272
|
+
static _workerPool: object | null;
|
|
240
273
|
constructor();
|
|
241
274
|
connectedCallback(): void;
|
|
242
275
|
disconnectedCallback(): void;
|
|
276
|
+
/** (Re)arm the devicePixelRatio watcher for the current ratio. */
|
|
277
|
+
_watchDpr(): void;
|
|
278
|
+
_unwatchDpr(): void;
|
|
243
279
|
attributeChangedCallback(name: any, _old: any, val: any): void;
|
|
244
280
|
/** Indicator registry (module scope — shared with the legacy alias tag). */
|
|
245
281
|
static _registry(): Map<string, {
|
|
@@ -282,7 +318,7 @@ declare class WickChart extends HTMLElementBase {
|
|
|
282
318
|
smooth?: undefined;
|
|
283
319
|
period?: undefined;
|
|
284
320
|
};
|
|
285
|
-
compute: (bars: any) => number[];
|
|
321
|
+
compute: (bars: any, p: any) => number[];
|
|
286
322
|
color?: undefined;
|
|
287
323
|
guides?: undefined;
|
|
288
324
|
range?: undefined;
|
|
@@ -497,7 +533,8 @@ declare class WickChart extends HTMLElementBase {
|
|
|
497
533
|
*/
|
|
498
534
|
/** @param {import('./core.js').IndicatorDef} def */
|
|
499
535
|
static registerIndicator(name: any, def: import('./core.js').IndicatorDef): void;
|
|
500
|
-
/** The
|
|
536
|
+
/** The tag this class registers as. (<hab-chart> is a deprecated alias
|
|
537
|
+
* registered from the HabChart subclass, not this name.) */
|
|
501
538
|
static get elementName(): string;
|
|
502
539
|
get data(): any[];
|
|
503
540
|
/**
|
|
@@ -712,6 +749,24 @@ declare class WickChart extends HTMLElementBase {
|
|
|
712
749
|
/** Check alerts against an incoming bar (prev close → new close).
|
|
713
750
|
* Scripted (`when`) alerts evaluate their predicate series, cached per
|
|
714
751
|
* data version, and fire on the false→true edge. */
|
|
752
|
+
/**
|
|
753
|
+
* Index of the newest bar known to be final: any bar with a newer bar
|
|
754
|
+
* behind it, plus the front bar when the feed flagged it `closed: true`
|
|
755
|
+
* (Binance's `k.x`). -1 when nothing has closed yet.
|
|
756
|
+
*/
|
|
757
|
+
_lastClosedIndex(): number;
|
|
758
|
+
/** Re-baseline the closed-bar cursor without firing anything. */
|
|
759
|
+
_syncClosedIdx(): void;
|
|
760
|
+
/**
|
|
761
|
+
* Resolve an alert's evaluation mode: an explicit 'close' / 'live' on the
|
|
762
|
+
* alert wins, otherwise the chart-level `alert-evaluate` default (itself
|
|
763
|
+
* 'live', so 1.x behaviour is unchanged unless asked for).
|
|
764
|
+
* @param {string|undefined} v
|
|
765
|
+
* @returns {'live'|'close'}
|
|
766
|
+
*/
|
|
767
|
+
_evalMode(v: string | undefined): 'live' | 'close';
|
|
768
|
+
/** Dispatch one alert, retiring it when it was a `once` alert. */
|
|
769
|
+
_fireAlert(alert: any, detail: any): void;
|
|
715
770
|
_checkAlerts(prevClose: any, bar: any): void;
|
|
716
771
|
/** Cached boolean series for a scripted alert's predicate (per data version). */
|
|
717
772
|
_predicateCache(alert: any): any;
|
|
@@ -724,14 +779,18 @@ declare class WickChart extends HTMLElementBase {
|
|
|
724
779
|
get indicators(): any;
|
|
725
780
|
set indicators(v: any);
|
|
726
781
|
static _MAX_SP: number;
|
|
782
|
+
/** Hold this long on a touchscreen to open the crosshair (ms). */
|
|
783
|
+
static _PRESS_MS: number;
|
|
784
|
+
/** Finger travel that cancels the press and makes it a pan (px). */
|
|
785
|
+
static _PRESS_SLOP: number;
|
|
727
786
|
/**
|
|
728
787
|
* Lowest allowed px/bar: either 0.35, or whatever fits the entire
|
|
729
788
|
* dataset on screen — so any history can be zoomed out fully.
|
|
730
789
|
*/
|
|
731
790
|
_minSpacing(): number;
|
|
732
|
-
static _timeToMs(t: any):
|
|
791
|
+
static _timeToMs(t: any): number;
|
|
733
792
|
static _normBar(b: any): {
|
|
734
|
-
time:
|
|
793
|
+
time: number;
|
|
735
794
|
open: any;
|
|
736
795
|
high: any;
|
|
737
796
|
low: any;
|
|
@@ -759,6 +818,33 @@ declare class WickChart extends HTMLElementBase {
|
|
|
759
818
|
_volShadeCache(): any;
|
|
760
819
|
/** Compute (and cache per data version) an indicator entry's series. */
|
|
761
820
|
_indicatorSeries(entry: any): any;
|
|
821
|
+
/**
|
|
822
|
+
* After a live stream tick (append or forming-bar replace), patch every
|
|
823
|
+
* online-capable series by recomputing a bounded tail with the same
|
|
824
|
+
* batch definition — O(warm-up) instead of a full-history recompute per
|
|
825
|
+
* indicator per tick. Bases are seeded by the sync or worker path; bulk
|
|
826
|
+
* loads (epoch changes) reseed automatically.
|
|
827
|
+
*/
|
|
828
|
+
_onlineTick(): void;
|
|
829
|
+
/** Recompute the last K bars of one series in place (K = max(400,
|
|
830
|
+
* 10×period), clamped to the data). False when the series and data
|
|
831
|
+
* lengths can't line up — the caller drops the base and reseeds. */
|
|
832
|
+
_patchSeriesTail(res: any, entry: any, d: any): boolean;
|
|
833
|
+
/** Remember a fresh series as the base for incremental tick updates
|
|
834
|
+
* (online-capable builtins only). */
|
|
835
|
+
_seedOnline(k: any, entry: any, res: any): void;
|
|
836
|
+
/** Bar count from which the worker path engages (below it, sync wins). */
|
|
837
|
+
_workerCols(): {
|
|
838
|
+
time: Float64Array<ArrayBuffer>;
|
|
839
|
+
open: Float64Array<ArrayBuffer>;
|
|
840
|
+
high: Float64Array<ArrayBuffer>;
|
|
841
|
+
low: Float64Array<ArrayBuffer>;
|
|
842
|
+
close: Float64Array<ArrayBuffer>;
|
|
843
|
+
volume: Float64Array<ArrayBuffer>;
|
|
844
|
+
};
|
|
845
|
+
/** Kick an off-thread compute for one indicator (idempotent per epoch). */
|
|
846
|
+
_workerCompute(pool: any, entry: any, k: any): void;
|
|
847
|
+
_workerArrived(k: any, epoch: any, res: any, entry: any): void;
|
|
762
848
|
/** Resolve a line color: #hex / rgb() / CSS name / palette key ('rsi', 'up', …) / cycle.
|
|
763
849
|
* Untrusted values (URL/attribute-sourced) are validated — never interpolated raw. */
|
|
764
850
|
_lineColor(entry: any, line: any, pal: any, cycleIdx: any): any;
|
|
@@ -782,6 +868,8 @@ declare class WickChart extends HTMLElementBase {
|
|
|
782
868
|
* the walk to those bars — used at deep zoom where bars are aggregated
|
|
783
869
|
* into pixel columns (keeps this O(screen) instead of O(visible bars)).
|
|
784
870
|
*/
|
|
871
|
+
/** An instant shifted into the chart's display zone, for the formatters. */
|
|
872
|
+
_zt(t: any): any;
|
|
785
873
|
_timeTicks(i0: any, i1: any, sampleIdx: any): any[];
|
|
786
874
|
_render(): void;
|
|
787
875
|
_pill(x: any, y: any, text: any, bg: any, fg: any, align: string, widthOverride: any): void;
|
|
@@ -873,6 +961,21 @@ declare class WickChart extends HTMLElementBase {
|
|
|
873
961
|
x: number;
|
|
874
962
|
y: number;
|
|
875
963
|
};
|
|
964
|
+
/**
|
|
965
|
+
* Put the crosshair on the bar under a point and announce it. Shared by
|
|
966
|
+
* mouse hover, keyboard walking and the touch scrub gesture.
|
|
967
|
+
*/
|
|
968
|
+
_hoverAt(pt: any): void;
|
|
969
|
+
/**
|
|
970
|
+
* Start the long-press timer for a touch. A touchscreen has no hover, so
|
|
971
|
+
* without this there is no way to read a bar's values on a phone: a tap
|
|
972
|
+
* selects, a drag pans, and the legend never leaves the last candle.
|
|
973
|
+
* Holding still opens the crosshair; moving first cancels and pans.
|
|
974
|
+
*/
|
|
975
|
+
_armPress(pointerId: any, pt: any): void;
|
|
976
|
+
_disarmPress(): void;
|
|
977
|
+
/** Leave scrub mode and put the crosshair away. */
|
|
978
|
+
_endScrub(): void;
|
|
876
979
|
_pointerDown(e: any): void;
|
|
877
980
|
_pointerMove(e: any): void;
|
|
878
981
|
_pointerUp(e: any): void;
|
package/types/wick-feed.d.ts
CHANGED
|
@@ -25,7 +25,26 @@ declare class WickFeed extends HTMLElementBase {
|
|
|
25
25
|
_binance(gen: any, chart: any, sym: any, tfId: any, limit: any, live: any): Promise<void>;
|
|
26
26
|
_pollBinance(gen: any, chart: any, sym: any, tfId: any): void;
|
|
27
27
|
_degrade(gen: any, chart: any, sym: any, tfId: any, limit: any, live: any, err: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Wrap chart.update for aggregated bars: the chart keys bars by timestamp,
|
|
30
|
+
* and two groups can close inside the same millisecond, so emitted times
|
|
31
|
+
* are nudged +1ms to stay strictly increasing (keeps the one-bar-per-
|
|
32
|
+
* timestamp integrity invariant; display-only, values are untouched).
|
|
33
|
+
*/
|
|
34
|
+
_aggEmit(gen: any, chart: any): (bar: any) => void;
|
|
35
|
+
/** Seed + stream one aggregator onto the chart (shared by all sources). */
|
|
36
|
+
_aggAttach(gen: any, chart: any, res: any, bars: any, limit: any, status: any): {
|
|
37
|
+
emit: (bar: any) => void;
|
|
38
|
+
aggregator: any;
|
|
39
|
+
/** Push one print through; emits the closed bar, then the forming one. */
|
|
40
|
+
push(t: any): void;
|
|
41
|
+
};
|
|
42
|
+
_syntheticTrades(gen: any, chart: any, key: any, agg: any, limit: any, live: any, status?: string): void;
|
|
43
|
+
_binanceTrades(gen: any, chart: any, sym: any, agg: any, limit: any, live: any): Promise<void>;
|
|
44
|
+
_pollBinanceTrades(gen: any, chart: any, sym: any, handle: any, fromId: any, agg: any, limit: any, live: any): void;
|
|
45
|
+
_restTrades(gen: any, chart: any, url: any, agg: any, limit: any, live: any): Promise<void>;
|
|
28
46
|
_rest(gen: any, chart: any, url: any, limit: any, live: any): Promise<void>;
|
|
29
47
|
}
|
|
30
48
|
export default WickFeed;
|
|
31
49
|
export { WickFeed };
|
|
50
|
+
export { parseAggregate, TickBarAggregator, aggregateTrades, normalizeTrades, genSyntheticTrades, makeSynthTradeStream, } from './feeds.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Rebuild the bar-object tape from a columnar snapshot (worker-side only —
|
|
2
|
+
* this cost never touches the main thread). */
|
|
3
|
+
export declare function barsFromCols(cols: any): any[];
|
|
4
|
+
/**
|
|
5
|
+
* Create a worker-core state + dispatcher.
|
|
6
|
+
* @returns {{sessions: Map, handle(message: object): object}} the reply object
|
|
7
|
+
*/
|
|
8
|
+
export declare function createWorkerCore(): {
|
|
9
|
+
sessions: Map<any, any>;
|
|
10
|
+
handle(message: object): object;
|
|
11
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { WickChart } from './wick-chart.js';
|
|
2
|
+
export { WickChart };
|
|
3
|
+
/**
|
|
4
|
+
* A single-Worker task runner. The factory is injectable so tests can drive
|
|
5
|
+
* the protocol with a fake Worker; the default spawns the module worker
|
|
6
|
+
* sitting next to this file.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ChartWorkerPool {
|
|
9
|
+
_factory: () => Worker;
|
|
10
|
+
available: boolean;
|
|
11
|
+
_worker: Worker;
|
|
12
|
+
_seq: number;
|
|
13
|
+
_pending: Map<any, any>;
|
|
14
|
+
/** @param {() => Worker} [factory] */
|
|
15
|
+
constructor(factory?: () => Worker);
|
|
16
|
+
/**
|
|
17
|
+
* Post a task; resolves with the reply's `res`, rejects on failure or
|
|
18
|
+
* worker death (a `stale` rejection means: resend the epoch data first).
|
|
19
|
+
* @param {object} msg task message without the id
|
|
20
|
+
* @returns {Promise<any>}
|
|
21
|
+
*/
|
|
22
|
+
run(msg: object): Promise<any>;
|
|
23
|
+
_spawn(): void;
|
|
24
|
+
/** Reject everything in flight and drop the worker; the next run() respawns
|
|
25
|
+
* — a transient worker crash must not permanently kill the mode. */
|
|
26
|
+
_die(): void;
|
|
27
|
+
/** Shut the pool down for good (in-flight tasks reject). */
|
|
28
|
+
terminate(): void;
|
|
29
|
+
}
|
|
30
|
+
/** The page-wide pool (created on first use). */
|
|
31
|
+
export declare function getSharedPool(): any;
|
|
32
|
+
/**
|
|
33
|
+
* Point the chart class at a pool (or null to disable the worker path).
|
|
34
|
+
* @param {ChartWorkerPool|null} pool
|
|
35
|
+
*/
|
|
36
|
+
export declare function setChartWorkerPool(pool: ChartWorkerPool | null): ChartWorkerPool;
|