@christtrade/depth 0.12.21

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.
Files changed (171) hide show
  1. package/LICENSE.md +201 -0
  2. package/NOTICE +15 -0
  3. package/README.md +159 -0
  4. package/depth.cjs +1136 -0
  5. package/depth.css +2 -0
  6. package/depth.mjs +1136 -0
  7. package/depth.nopreflight.css +2 -0
  8. package/index.d.ts +1 -0
  9. package/package.json +32 -0
  10. package/types/ChartInner.d.ts +114 -0
  11. package/types/ChartOuter.d.ts +31 -0
  12. package/types/components/account/AccountSummary.d.ts +8 -0
  13. package/types/components/chart/chart-context-menu.d.ts +30 -0
  14. package/types/components/chart/chart-settings-dialog.d.ts +15 -0
  15. package/types/components/chart/chart-status-overlay.d.ts +24 -0
  16. package/types/components/chart/data-status.d.ts +10 -0
  17. package/types/components/chart/pane-legend.d.ts +37 -0
  18. package/types/components/chart/session-status-badge.d.ts +14 -0
  19. package/types/components/chart/status-bar.d.ts +9 -0
  20. package/types/components/chart/symbol-icon.d.ts +9 -0
  21. package/types/components/chart/tz.d.ts +10 -0
  22. package/types/components/drawings/drawing-icons.d.ts +2 -0
  23. package/types/components/drawings/drawing-settings-bar.d.ts +15 -0
  24. package/types/components/drawings/drawing-settings-dialog.d.ts +268 -0
  25. package/types/components/drawings/drawing-toolbar.d.ts +14 -0
  26. package/types/components/drawings/drawing-tools.d.ts +23 -0
  27. package/types/components/indicators/indicators-dialog.d.ts +20 -0
  28. package/types/components/indicators/indicators-settings-dialog.d.ts +164 -0
  29. package/types/components/multi-chart/GridDividers.d.ts +12 -0
  30. package/types/components/multi-chart/LayoutPicker.d.ts +19 -0
  31. package/types/components/plugin-panels/BottomBarPluginHost.d.ts +7 -0
  32. package/types/components/plugin-panels/PluginFixedPanelHost.d.ts +18 -0
  33. package/types/components/plugin-panels/PluginToolbarHost.d.ts +7 -0
  34. package/types/components/plugin-panels/PluginWindowsDropdown.d.ts +7 -0
  35. package/types/components/plugins/plugin-manager-dialog.d.ts +14 -0
  36. package/types/components/toolbar/SymbolSwitcher.d.ts +8 -0
  37. package/types/components/toolbar/chart-icons.d.ts +16 -0
  38. package/types/components/toolbar/chart-type-selector.d.ts +11 -0
  39. package/types/components/toolbar/timeframe-selector.d.ts +15 -0
  40. package/types/components/trading/OrderPanel.d.ts +36 -0
  41. package/types/components/trading/QuickTradingButtons.d.ts +7 -0
  42. package/types/components/trading/order-math.d.ts +94 -0
  43. package/types/components/ui/button.d.ts +11 -0
  44. package/types/components/ui/checkbox.d.ts +4 -0
  45. package/types/components/ui/color-picker.d.ts +12 -0
  46. package/types/components/ui/dialog.d.ts +19 -0
  47. package/types/components/ui/dropdown-menu.d.ts +27 -0
  48. package/types/components/ui/hover-card.d.ts +6 -0
  49. package/types/components/ui/input.d.ts +4 -0
  50. package/types/components/ui/popover.d.ts +7 -0
  51. package/types/components/ui/resizable.d.ts +23 -0
  52. package/types/components/ui/separator.d.ts +4 -0
  53. package/types/components/ui/slider.d.ts +4 -0
  54. package/types/components/ui/switch.d.ts +4 -0
  55. package/types/components/ui/tooltip.d.ts +7 -0
  56. package/types/core/AccountManager.d.ts +142 -0
  57. package/types/core/ChartModel.d.ts +84 -0
  58. package/types/core/ChartState.d.ts +51 -0
  59. package/types/core/ChartTypeRegistry.d.ts +27 -0
  60. package/types/core/DataEngine.d.ts +143 -0
  61. package/types/core/DataSourceRegistry.d.ts +106 -0
  62. package/types/core/DepthChart.d.ts +458 -0
  63. package/types/core/DrawingRegistry.d.ts +133 -0
  64. package/types/core/DrawingStore.d.ts +26 -0
  65. package/types/core/ExecutionEngine.d.ts +95 -0
  66. package/types/core/GlobalChartBus.d.ts +32 -0
  67. package/types/core/Playback.d.ts +48 -0
  68. package/types/core/PlaybackStateRegistry.d.ts +25 -0
  69. package/types/core/PluginRegistry.d.ts +67 -0
  70. package/types/core/PluginSchedule.d.ts +15 -0
  71. package/types/core/RenderEngine.d.ts +143 -0
  72. package/types/core/ScriptedPlugin.d.ts +153 -0
  73. package/types/core/SessionMapper.d.ts +54 -0
  74. package/types/core/SessionUtils.d.ts +53 -0
  75. package/types/core/TypedEventBus.d.ts +691 -0
  76. package/types/core/WasmPluginHost.d.ts +39 -0
  77. package/types/core/index.d.ts +70 -0
  78. package/types/core/plugin-startup.d.ts +33 -0
  79. package/types/core/processing/data-chunk.d.ts +37 -0
  80. package/types/core/processing/data-level.d.ts +13 -0
  81. package/types/core/processing/l2-processor.d.ts +10 -0
  82. package/types/core/processing/l3-processor.d.ts +26 -0
  83. package/types/core/processing/ohlcv-processor.d.ts +14 -0
  84. package/types/core/processing/tick-processor.d.ts +14 -0
  85. package/types/core/script-dsl.d.ts +20 -0
  86. package/types/core/script-scope.d.ts +4 -0
  87. package/types/core/script.worker.d.ts +1 -0
  88. package/types/hooks/useCellBridges.d.ts +36 -0
  89. package/types/hooks/useChartData.d.ts +153 -0
  90. package/types/hooks/useChartHandlers.d.ts +94 -0
  91. package/types/hooks/useChartInteraction.d.ts +160 -0
  92. package/types/hooks/useChartLayout.d.ts +21 -0
  93. package/types/hooks/useChartPlugin.d.ts +34 -0
  94. package/types/hooks/useChartSettings.d.ts +44 -0
  95. package/types/hooks/useChartSubscriptions.d.ts +64 -0
  96. package/types/hooks/useChartView.d.ts +47 -0
  97. package/types/hooks/usePlaybackEngine.d.ts +85 -0
  98. package/types/hooks/useRenderEngine.d.ts +64 -0
  99. package/types/hooks/useTradeLines.d.ts +80 -0
  100. package/types/hooks/useTradingState.d.ts +135 -0
  101. package/types/interfaces/IAccountAdapter.d.ts +38 -0
  102. package/types/interfaces/ICoordinateTransformer.d.ts +105 -0
  103. package/types/interfaces/IDataAdapter.d.ts +402 -0
  104. package/types/interfaces/IExecutionAdapter.d.ts +71 -0
  105. package/types/interfaces/plugins/IChartPlugin.d.ts +254 -0
  106. package/types/interfaces/plugins/IChartTypePlugin.d.ts +126 -0
  107. package/types/interfaces/plugins/IDataSourcePlugin.d.ts +20 -0
  108. package/types/interfaces/plugins/IDrawingPlugin.d.ts +62 -0
  109. package/types/interfaces/plugins/IIndicatorPlugin.d.ts +97 -0
  110. package/types/interfaces/plugins/index.d.ts +5 -0
  111. package/types/lib/bar-grid.d.ts +6 -0
  112. package/types/lib/book.d.ts +5 -0
  113. package/types/lib/clock.d.ts +7 -0
  114. package/types/lib/compact-buffer.d.ts +66 -0
  115. package/types/lib/constants.d.ts +5 -0
  116. package/types/lib/createSimulatedAdapter.d.ts +42 -0
  117. package/types/lib/dpr.d.ts +27 -0
  118. package/types/lib/heatmap.worker.d.ts +1 -0
  119. package/types/lib/indicator-stdlib.d.ts +426 -0
  120. package/types/lib/indicator-worker.d.ts +65 -0
  121. package/types/lib/matchingEngine.d.ts +144 -0
  122. package/types/lib/notifications/tradeToast.d.ts +31 -0
  123. package/types/lib/pointer-lock.d.ts +5 -0
  124. package/types/lib/priceFormat.d.ts +17 -0
  125. package/types/lib/priceTransition.d.ts +22 -0
  126. package/types/lib/renderers/drawFootprintChart.d.ts +5 -0
  127. package/types/lib/renderers/drawTradeLines.d.ts +112 -0
  128. package/types/lib/renderers/drawings-renderer.d.ts +57 -0
  129. package/types/lib/renderers/renderer.d.ts +113 -0
  130. package/types/lib/sampler.d.ts +7 -0
  131. package/types/lib/series/japaneseCharts.d.ts +88 -0
  132. package/types/lib/slice-worker-client.d.ts +138 -0
  133. package/types/lib/slice.worker.d.ts +139 -0
  134. package/types/lib/storage.d.ts +108 -0
  135. package/types/lib/symbol-info.d.ts +12 -0
  136. package/types/lib/symbol-search.d.ts +29 -0
  137. package/types/lib/timeframes.d.ts +46 -0
  138. package/types/lib/tradingview-import.d.ts +32 -0
  139. package/types/lib/types/chart-settings.d.ts +90 -0
  140. package/types/lib/types/drawing-types.d.ts +393 -0
  141. package/types/lib/types/footprint.d.ts +119 -0
  142. package/types/lib/types/heatmap-types.d.ts +30 -0
  143. package/types/lib/types/index.d.ts +147 -0
  144. package/types/lib/types/indicator-types.d.ts +123 -0
  145. package/types/lib/types/layout-sync.d.ts +43 -0
  146. package/types/lib/types/trading-types.d.ts +323 -0
  147. package/types/lib/use-forwarded-ref.d.ts +1 -0
  148. package/types/lib/utils.d.ts +2 -0
  149. package/types/plugins/alligator.d.ts +1 -0
  150. package/types/plugins/atr.d.ts +1 -0
  151. package/types/plugins/awesome-oscillator.d.ts +1 -0
  152. package/types/plugins/bollinger-bands.d.ts +1 -0
  153. package/types/plugins/cci.d.ts +1 -0
  154. package/types/plugins/cvd.d.ts +1 -0
  155. package/types/plugins/donchian.d.ts +1 -0
  156. package/types/plugins/ichimoku.d.ts +1 -0
  157. package/types/plugins/index.d.ts +25 -0
  158. package/types/plugins/keltner.d.ts +1 -0
  159. package/types/plugins/macd.d.ts +1 -0
  160. package/types/plugins/mfi.d.ts +1 -0
  161. package/types/plugins/moving-average.d.ts +1 -0
  162. package/types/plugins/obv.d.ts +1 -0
  163. package/types/plugins/psar.d.ts +1 -0
  164. package/types/plugins/rsi.d.ts +1 -0
  165. package/types/plugins/sessions.d.ts +1 -0
  166. package/types/plugins/stochastic.d.ts +1 -0
  167. package/types/plugins/supertrend.d.ts +1 -0
  168. package/types/plugins/volume.d.ts +1 -0
  169. package/types/plugins/vwap.d.ts +1 -0
  170. package/types/plugins/williams-r.d.ts +1 -0
  171. package/types/react/useDepthChart.d.ts +6 -0
@@ -0,0 +1,66 @@
1
+ /**
2
+ * A flat typed-array store for MBO events, in place of an MboEvent[]. Rather
3
+ * than a heap object per event at 150-200 bytes each, every event packs into 20
4
+ * bytes:
5
+ *
6
+ * [0..7] ts_ns BigInt64, absolute nanoseconds
7
+ * [8..11] pricex100 Int32, null becomes the INT32_MIN sentinel
8
+ * [12..15] size Uint32
9
+ * [16..18] order_id Uint24, little-endian
10
+ * [19] packed bits 7-4 action, bits 3-2 side, bits 1-0 spare
11
+ *
12
+ * At 30M events that's about 600MB instead of ~5GB.
13
+ * findFloorIndex() - binary search by nanosecond timestamp
14
+ */
15
+ import type { MboEvent } from './types';
16
+ export interface CompactBuffer {
17
+ /** Raw backing storage. Do not read directly - use the accessor functions. */
18
+ _buf: ArrayBuffer;
19
+ /** DataView over _buf. */
20
+ _view: DataView;
21
+ /** Number of events currently stored. */
22
+ length: number;
23
+ /** Capacity in events (buf.byteLength / BYTES_PER_EVENT). */
24
+ capacity: number;
25
+ /** Absolute ns timestamp of the first stored event (or 0n if empty). */
26
+ firstTs: bigint;
27
+ /** Absolute ns timestamp of the last stored event (or 0n if empty). */
28
+ lastTs: bigint;
29
+ }
30
+ export declare function createCompactBuffer(initialCapacity?: number): CompactBuffer;
31
+ /**
32
+ * Append an array of MboEvents to the buffer.
33
+ * Events must already be sorted ascending by ts_event (they come from fetchChunk
34
+ * in order, so this is always true).
35
+ *
36
+ * `isoToNs` is passed in to avoid a circular import - use the one from sampler.ts.
37
+ */
38
+ export declare function appendEvents(cb: CompactBuffer, events: MboEvent[], isoToNs: (iso: string) => bigint): void;
39
+ /**
40
+ * Decode event at index `idx` into a scratch object.
41
+ * The returned reference is reused on the next call - copy fields if you need
42
+ * to store the result.
43
+ */
44
+ export declare function getEvent(cb: CompactBuffer, idx: number): Readonly<MboEvent>;
45
+ /**
46
+ * Read just the nanosecond timestamp of event at index `idx`.
47
+ * Faster than getEvent() when you only need the time (e.g., binary search).
48
+ */
49
+ export declare function getTsNs(cb: CompactBuffer, idx: number): bigint;
50
+ /**
51
+ * Returns the index of the last event with ts <= `targetNs`, or -1 if none.
52
+ * Equivalent to the existing binary-search pattern in chart.tsx.
53
+ */
54
+ export declare function findFloorIndex(cb: CompactBuffer, targetNs: bigint): number;
55
+ /**
56
+ * Remove the first `count` events from the buffer.
57
+ * This does a single memmove - O(N) but infrequent (only called on hour boundary).
58
+ */
59
+ export declare function trimFront(cb: CompactBuffer, count: number): void;
60
+ /**
61
+ * Decode a range [start, end) of the buffer back to MboEvent[].
62
+ * Used when workers need the full event objects (heatmap worker init,
63
+ * footprint rebuild on TF change, etc).
64
+ * Keep calls infrequent - this allocates one object per event.
65
+ */
66
+ export declare function sliceToMboEvents(cb: CompactBuffer, start: number, end: number): MboEvent[];
@@ -0,0 +1,5 @@
1
+ export declare const MIN_TRADE_SIZE = 1;
2
+ export declare const MAX_DOT_RADIUS = 8;
3
+ export declare const MIN_DOT_RADIUS = 1.5;
4
+ export declare const MIN_TIME_SPAN = 10000000n;
5
+ export declare const MAX_TIME_SPAN = 86400000000000n;
@@ -0,0 +1,42 @@
1
+ import type { IDataAdapter, FetchRequest, BarResponse, SymbolInfo } from '../interfaces/IDataAdapter';
2
+ export interface SimulatedAdapterConfig {
3
+ /** Reproducible seed. Omit for random. */
4
+ seed?: number;
5
+ /** Starting mid-price. Default 21000. */
6
+ startPrice?: number;
7
+ /** Bar duration in nanoseconds. Default 60_000_000_000n (1 min). */
8
+ barDurationNs?: bigint;
9
+ /** Number of intra-bar ticks used to construct H/L. Default 20. */
10
+ intrabbarTicks?: number;
11
+ /** Tick size for price rounding. Default 0.25. */
12
+ tickSize?: number;
13
+ /** Override regime parameters if you want to tune the sim. */
14
+ regimes?: Partial<Record<Regime, Partial<RegimeParams>>>;
15
+ }
16
+ type Regime = 'TRENDING' | 'MEAN_REVERTING' | 'VOLATILE';
17
+ interface RegimeParams {
18
+ /** Annualised drift (log-return). Positive = uptrend. */
19
+ drift: number;
20
+ /** Baseline annualised volatility (used as GARCH long-run vol). */
21
+ baseVol: number;
22
+ /** OU mean-reversion speed (0 = pure GBM, higher = stronger pull). */
23
+ ouSpeed: number;
24
+ /** GARCH alpha (shock persistence weight). */
25
+ garchAlpha: number;
26
+ /** GARCH beta (variance persistence weight). alpha+beta < 1 for stationarity. */
27
+ garchBeta: number;
28
+ /** Student-t degrees of freedom for innovations (Infinity = Gaussian). */
29
+ tDof: number;
30
+ /** Average bars before regime transitions (geometric dist). */
31
+ avgDuration: number;
32
+ }
33
+ export declare class SimulatedMarketAdapter implements IDataAdapter {
34
+ private readonly cfg;
35
+ constructor(cfg?: SimulatedAdapterConfig);
36
+ searchSymbols(): Promise<SymbolInfo[]>;
37
+ resolveSymbol(): SymbolInfo;
38
+ fetchBars(request: FetchRequest): Promise<BarResponse>;
39
+ }
40
+ /** Convenience factory matching the naming convention used in ChartPageClient. */
41
+ export declare function createSimulatedAdapter(cfg?: SimulatedAdapterConfig): SimulatedMarketAdapter;
42
+ export {};
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Device pixel ratio for canvas rendering.
3
+ *
4
+ * All canvas sizing (handleResize) and context transforms (setTransform) must
5
+ * use this value so the physical-pixel count and the draw-coordinate scale stay
6
+ * in sync. Anywhere that derives cssW/cssH from canvas.width must also divide
7
+ * by this value, not window.devicePixelRatio directly.
8
+ *
9
+ * Sharpness on any DPR comes from coordinate snapping (Math.floor(x)+0.5),
10
+ * not from overriding the DPR here.
11
+ */
12
+ export declare function getEffectiveDpr(): number;
13
+ /**
14
+ * Round a css-px coordinate onto a whole device pixel.
15
+ *
16
+ * The canvas is drawn through a `setTransform(dpr, …)`, so a css coordinate of
17
+ * 493.6 at dpr 1.25 lands on device pixel 617.0 - a *fraction* of a pixel off.
18
+ * Fills absorb that as a soft edge; text does not. An 11px label whose baseline
19
+ * sits half a device pixel low is antialiased across two rows of pixels and
20
+ * reads as blurry, which is why axis labels are the first thing to look wrong.
21
+ *
22
+ * Use for text origins and for the edges of axis background bands. Do NOT use it
23
+ * for data-driven geometry (candles, lines) - those need the sub-pixel precision
24
+ * to stay where the data says they are; they use the `Math.floor(x) + 0.5`
25
+ * stroke convention instead.
26
+ */
27
+ export declare function snapToDevicePx(v: number, dpr?: number): number;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,426 @@
1
+ import type { RenderContext } from './types/indicator-types';
2
+ export interface OhlcvBar {
3
+ ts: bigint;
4
+ open: number;
5
+ high: number;
6
+ low: number;
7
+ close: number;
8
+ volume: number;
9
+ }
10
+ type Series = number[] | OhlcvBar[];
11
+ export declare function sma(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
12
+ export declare function ema(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
13
+ export declare function wma(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
14
+ export declare function hma(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
15
+ export declare function rma(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
16
+ export declare function linreg(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
17
+ export declare function rsi(bars: OhlcvBar[], period?: number): number[];
18
+ export declare function stoch(bars: OhlcvBar[], kPeriod?: number, dPeriod?: number, smooth?: number): {
19
+ k: number[];
20
+ d: number[];
21
+ };
22
+ export declare function macd(bars: OhlcvBar[], fast?: number, slow?: number, signal?: number): {
23
+ macd: number[];
24
+ signal: number[];
25
+ histogram: number[];
26
+ };
27
+ export declare function atr(bars: OhlcvBar[], period?: number): number[];
28
+ export declare function tr(bars: OhlcvBar[]): number[];
29
+ export declare function crossover(a: number[], b: number[] | number): boolean[];
30
+ export declare function crossunder(a: number[], b: number[] | number): boolean[];
31
+ export declare function cross(a: number[], b: number[] | number): boolean[];
32
+ export declare function rising(series: number[], lookback?: number): boolean[];
33
+ export declare function falling(series: number[], lookback?: number): boolean[];
34
+ export declare function change(series: number[], length?: number): number[];
35
+ export declare function barssince(condition: boolean[]): number[];
36
+ export declare function valuewhen(condition: boolean[], series: number[], occurrence?: number): number[];
37
+ export declare function highest(series: number[], length: number): number[];
38
+ export declare function lowest(series: number[], length: number): number[];
39
+ export declare function pivotHigh(bars: OhlcvBar[], left?: number, right?: number): number[];
40
+ export declare function pivotLow(bars: OhlcvBar[], left?: number, right?: number): number[];
41
+ export declare function bb(bars: OhlcvBar[], period?: number, mult?: number, getValue?: (b: OhlcvBar) => number): {
42
+ upper: number[];
43
+ mid: number[];
44
+ lower: number[];
45
+ };
46
+ export declare function bbw(bars: OhlcvBar[], period?: number, mult?: number): number[];
47
+ export declare function donchian(bars: OhlcvBar[], period?: number): {
48
+ upper: number[];
49
+ mid: number[];
50
+ lower: number[];
51
+ };
52
+ export declare function keltner(bars: OhlcvBar[], emaPeriod?: number, atrPeriod?: number, mult?: number): {
53
+ upper: number[];
54
+ mid: number[];
55
+ lower: number[];
56
+ };
57
+ export declare function vwap(bars: OhlcvBar[], sessionStartHour?: number): number[];
58
+ export declare function alligator(bars: OhlcvBar[]): {
59
+ jaw: number[];
60
+ teeth: number[];
61
+ lips: number[];
62
+ };
63
+ export declare function stdev(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
64
+ export declare function variance(series: Series, period: number, getValue?: (b: OhlcvBar) => number): number[];
65
+ export declare function dev(series: number[], period: number): number[];
66
+ export declare function correlation(a: number[], b: number[], period: number): number[];
67
+ export declare const max: typeof highest;
68
+ export declare const min: typeof lowest;
69
+ export declare function median(series: number[], period: number): number[];
70
+ /**
71
+ * toPoints(bars, values)
72
+ *
73
+ * Zips a bar array with a computed number[] into plot-ready { t, price } points.
74
+ * Automatically filters NaN/Infinity. This is what draw() iterates over.
75
+ *
76
+ * const pts = toPoints(data.ohlcv, sma(data.ohlcv, 20))
77
+ */
78
+ export declare function toPoints(timestamps: bigint[], values: number[]): Array<{
79
+ t: bigint;
80
+ price: number;
81
+ }>;
82
+ export declare function last<T>(arr: T[]): T | undefined;
83
+ /** nz(value, replacement) - replace NaN/undefined/null with replacement (default 0). */
84
+ export declare function nz(value: number | undefined | null, replacement?: number): number;
85
+ export type DrawCommand = {
86
+ type: 'line';
87
+ pts: Array<{
88
+ t: bigint;
89
+ price: number;
90
+ }>;
91
+ /** Uniform color string, or one color per point (segment i uses color[i]). */
92
+ color: string | string[];
93
+ width: number;
94
+ dash?: number[];
95
+ connect?: boolean;
96
+ } | {
97
+ type: 'hline';
98
+ price: number;
99
+ color: string;
100
+ width: number;
101
+ dash?: number[];
102
+ } | {
103
+ type: 'histogram';
104
+ pts: Array<{
105
+ t: bigint;
106
+ price: number;
107
+ }>;
108
+ /** Uniform color string, or one color per bar. */
109
+ color: string | string[];
110
+ base?: number;
111
+ gap?: number;
112
+ } | {
113
+ type: 'label';
114
+ text: string;
115
+ /** bigint timestamp when anchored to price space, number when anchored to screen */
116
+ x: bigint | number;
117
+ y: number;
118
+ color: string;
119
+ fontSize?: number;
120
+ bold?: boolean;
121
+ horzAlign?: 'left' | 'right' | 'center';
122
+ vertAlign?: 'bottom' | 'middle' | 'top';
123
+ /** true = x/y are raw screen pixels, false = x is ts, y is price */
124
+ anchored?: boolean;
125
+ maxWidth?: number;
126
+ } | {
127
+ type: 'fill';
128
+ pts1: Array<{
129
+ t: bigint;
130
+ price: number;
131
+ }> | number;
132
+ pts2: Array<{
133
+ t: bigint;
134
+ price: number;
135
+ }> | number;
136
+ opts: FillBetweenOpts;
137
+ } | {
138
+ /** Axis-aligned price-space rectangle anchored to two timestamps + two prices */
139
+ type: 'rect';
140
+ t1: bigint;
141
+ t2: bigint;
142
+ price1: number;
143
+ price2: number;
144
+ fillColor?: string;
145
+ borderColor?: string;
146
+ borderWidth?: number;
147
+ dash?: number[];
148
+ radius?: number;
149
+ } | {
150
+ /** Circle drawn at a price/time point */
151
+ type: 'circle';
152
+ t: bigint;
153
+ price: number;
154
+ radius: number;
155
+ fillColor?: string;
156
+ borderColor?: string;
157
+ borderWidth?: number;
158
+ } | {
159
+ /** Vertical line at a fixed timestamp spanning the full pane height */
160
+ type: 'vline';
161
+ t: bigint;
162
+ color: string;
163
+ width: number;
164
+ dash?: number[];
165
+ } | {
166
+ /** Arrow / marker pointing up or down at a price/time point */
167
+ type: 'arrow';
168
+ t: bigint;
169
+ price: number;
170
+ direction: 'up' | 'down';
171
+ color: string;
172
+ size?: number;
173
+ label?: string;
174
+ labelColor?: string;
175
+ } | {
176
+ /** Trend line between two price/time anchors - infinite extension optional */
177
+ type: 'trendline';
178
+ t1: bigint;
179
+ price1: number;
180
+ t2: bigint;
181
+ price2: number;
182
+ color: string;
183
+ width?: number;
184
+ dash?: number[];
185
+ extend?: 'none' | 'right' | 'both';
186
+ } | {
187
+ /** Horizontal band between two prices - like fillBetween but dead simple */
188
+ type: 'band';
189
+ priceHigh: number;
190
+ priceLow: number;
191
+ fillColor: string;
192
+ borderColor?: string;
193
+ borderWidth?: number;
194
+ } | {
195
+ /** Multi-point polygon in price/time space, filled and/or stroked */
196
+ type: 'polygon';
197
+ pts: Array<{
198
+ t: bigint;
199
+ price: number;
200
+ }>;
201
+ fillColor?: string;
202
+ borderColor?: string;
203
+ borderWidth?: number;
204
+ dash?: number[];
205
+ } | {
206
+ /** Dotted/painted series - individual dots at each point */
207
+ type: 'dots';
208
+ pts: Array<{
209
+ t: bigint;
210
+ price: number;
211
+ }>;
212
+ /** Uniform color string, or one color per dot. */
213
+ color: string | string[];
214
+ radius?: number;
215
+ } | {
216
+ /** Text box with background pill - like a label but with a background */
217
+ type: 'badge';
218
+ t: bigint;
219
+ price: number;
220
+ text: string;
221
+ textColor: string;
222
+ bgColor: string;
223
+ fontSize?: number;
224
+ padding?: number;
225
+ radius?: number;
226
+ anchored?: boolean;
227
+ };
228
+ /**
229
+ * drawLine(pts, color, width, dash?, connect?)
230
+ *
231
+ * Draws a line connecting { t: bigint, price: number } points.
232
+ * Gaps in the line are inserted automatically at bar boundaries unless connect=true.
233
+ */
234
+ export declare function drawLine(pts: Array<{
235
+ t: bigint;
236
+ price: number;
237
+ }>, color: string | string[], width: number, dash?: number[], connect?: boolean): DrawCommand;
238
+ /**
239
+ * drawHLine(price, color, width, dash?)
240
+ *
241
+ * Draws a horizontal line at a fixed price level spanning the full pane width.
242
+ */
243
+ export declare function drawHLine(price: number, color: string, width: number, dash?: number[]): DrawCommand;
244
+ /**
245
+ * drawHistogram(pts, color, base?, gap?)
246
+ *
247
+ * Draws a bar histogram. Each point { t, price } is one bar.
248
+ * base = the zero line price (default 0).
249
+ * gap = fraction of bar width left as spacing (default 0.2).
250
+ */
251
+ export declare function drawHistogram(pts: Array<{
252
+ t: bigint;
253
+ price: number;
254
+ }>, color: string | string[], base?: number, gap?: number): DrawCommand;
255
+ /**
256
+ * drawLabel(text, x, y, color, fontSize?, bold?, horzAlign?, vertAlign?, anchored?, maxWidth?)
257
+ *
258
+ * anchored=false (default): x is a bigint timestamp, y is a price value.
259
+ * anchored=true: x and y are raw screen pixel coordinates.
260
+ */
261
+ export declare function drawLabel(text: string, x: bigint | number, y: number, color: string, fontSize?: number, bold?: boolean, horzAlign?: 'left' | 'right' | 'center', vertAlign?: 'bottom' | 'middle' | 'top', anchored?: boolean, maxWidth?: number): DrawCommand;
262
+ export type FillBetweenOpts = {
263
+ mode: 'solid';
264
+ color: string;
265
+ } | {
266
+ mode: 'screen';
267
+ stops: Array<{
268
+ offset: number;
269
+ color: string;
270
+ }>;
271
+ } | {
272
+ mode: 'vertical';
273
+ stops: Array<{
274
+ price: number;
275
+ color: string;
276
+ }>;
277
+ } | {
278
+ mode: 'data';
279
+ stops: Array<{
280
+ offset: number;
281
+ color: string;
282
+ }>;
283
+ };
284
+ /**
285
+ * fillBetween(pts1, pts2, opts)
286
+ *
287
+ * Fills the region between two price series (or between a series and a flat price).
288
+ * pts1 / pts2 can each be Array<{t,price}> or a plain number (flat level).
289
+ * opts.mode: 'solid' | 'screen' | 'vertical' | 'data' (same API as before)
290
+ */
291
+ export declare function fillBetween(pts1: Array<{
292
+ t: bigint;
293
+ price: number;
294
+ }> | number, pts2: Array<{
295
+ t: bigint;
296
+ price: number;
297
+ }> | number, opts: FillBetweenOpts): DrawCommand;
298
+ /**
299
+ * drawRect(t1, price1, t2, price2, opts?)
300
+ *
301
+ * Draws a rectangle anchored to two timestamps and two price levels.
302
+ * Useful for highlighting ranges, supply/demand zones, etc.
303
+ */
304
+ export declare function drawRect(t1: bigint, price1: number, t2: bigint, price2: number, opts?: {
305
+ fillColor?: string;
306
+ borderColor?: string;
307
+ borderWidth?: number;
308
+ dash?: number[];
309
+ radius?: number;
310
+ }): DrawCommand;
311
+ /**
312
+ * drawCircle(t, price, radius, opts?)
313
+ *
314
+ * Draws a circle at a price/time point. radius is in pixels.
315
+ */
316
+ export declare function drawCircle(t: bigint, price: number, radius: number, opts?: {
317
+ fillColor?: string;
318
+ borderColor?: string;
319
+ borderWidth?: number;
320
+ }): DrawCommand;
321
+ /**
322
+ * drawVLine(t, color, width, dash?)
323
+ *
324
+ * Draws a vertical line at a fixed timestamp spanning the full pane height.
325
+ * Great for marking events, session opens, etc.
326
+ */
327
+ export declare function drawVLine(t: bigint, color: string, width?: number, dash?: number[]): DrawCommand;
328
+ /**
329
+ * drawArrow(t, price, direction, color, size?, label?, labelColor?)
330
+ *
331
+ * Draws an up or down arrow marker at a price/time point.
332
+ * Optionally attach a text label above/below the arrow.
333
+ */
334
+ export declare function drawArrow(t: bigint, price: number, direction: 'up' | 'down', color: string, size?: number, label?: string, labelColor?: string): DrawCommand;
335
+ /**
336
+ * drawTrendLine(t1, price1, t2, price2, color, width?, dash?, extend?)
337
+ *
338
+ * Draws a line between two anchors. extend='right' continues to the right edge,
339
+ * extend='both' extends in both directions.
340
+ */
341
+ export declare function drawTrendLine(t1: bigint, price1: number, t2: bigint, price2: number, color: string, width?: number, dash?: number[], extend?: 'none' | 'right' | 'both'): DrawCommand;
342
+ /**
343
+ * drawBand(priceHigh, priceLow, fillColor, borderColor?, borderWidth?)
344
+ *
345
+ * Draws a horizontal price band across the full pane width.
346
+ * Simpler than fillBetween - just two price levels.
347
+ */
348
+ export declare function drawBand(priceHigh: number, priceLow: number, fillColor: string, borderColor?: string, borderWidth?: number): DrawCommand;
349
+ /**
350
+ * drawPolygon(pts, opts?)
351
+ *
352
+ * Draws a closed polygon through a series of price/time points.
353
+ */
354
+ export declare function drawPolygon(pts: Array<{
355
+ t: bigint;
356
+ price: number;
357
+ }>, opts?: {
358
+ fillColor?: string;
359
+ borderColor?: string;
360
+ borderWidth?: number;
361
+ dash?: number[];
362
+ }): DrawCommand;
363
+ /**
364
+ * drawDots(pts, color, radius?)
365
+ *
366
+ * Draws a filled circle at each point in the series.
367
+ * Good for scatter plots, signal markers, etc.
368
+ */
369
+ export declare function drawDots(pts: Array<{
370
+ t: bigint;
371
+ price: number;
372
+ }>, color: string | string[], radius?: number): DrawCommand;
373
+ /**
374
+ * drawBadge(t, price, text, textColor, bgColor, opts?)
375
+ *
376
+ * Draws a pill-shaped text badge anchored to a price/time point.
377
+ * Great for labeling signals, patterns, indicator values etc.
378
+ */
379
+ export declare function drawBadge(t: bigint, price: number, text: string, textColor: string, bgColor: string, opts?: {
380
+ fontSize?: number;
381
+ padding?: number;
382
+ radius?: number;
383
+ anchored?: boolean;
384
+ }): DrawCommand;
385
+ export declare function executeDrawCommands(commands: DrawCommand[], renderCtx: RenderContext): void;
386
+ export declare function obv(bars: OhlcvBar[]): number[];
387
+ export declare function mfi(bars: OhlcvBar[], period?: number): number[];
388
+ export declare function cci(bars: OhlcvBar[], period?: number): number[];
389
+ export declare function williamsR(bars: OhlcvBar[], period?: number): number[];
390
+ export declare function supertrend(bars: OhlcvBar[], period?: number, multiplier?: number): {
391
+ trend: number[];
392
+ upper: number[];
393
+ lower: number[];
394
+ };
395
+ export interface SessionDef {
396
+ label: string;
397
+ startHour: number;
398
+ startMinute: number;
399
+ endHour: number;
400
+ endMinute: number;
401
+ color: string;
402
+ /**
403
+ * IANA timezone for this session's hours (e.g. 'America/New_York',
404
+ * 'Europe/London'). When set, startHour/endHour are interpreted in this
405
+ * zone and Luxon handles DST automatically - no manual offset tweaking.
406
+ * Falls back to options.tz, then 'UTC' (preserving pre-existing behaviour).
407
+ */
408
+ tz?: string;
409
+ }
410
+ export interface SessionBoundariesOptions {
411
+ /**
412
+ * Default IANA timezone for all sessions that don't carry their own `tz`.
413
+ * Defaults to 'UTC'.
414
+ */
415
+ tz?: string;
416
+ }
417
+ export declare function sessionBoundaries(bars: OhlcvBar[], sessions: SessionDef[], options?: SessionBoundariesOptions): Array<{
418
+ startTs: bigint;
419
+ endTs: bigint;
420
+ high: number;
421
+ low: number;
422
+ label: string;
423
+ color: string;
424
+ }>;
425
+ export declare const STDLIB: Record<string, Function>;
426
+ export {};
@@ -0,0 +1,65 @@
1
+ import { SerialTrade } from './types';
2
+ export type { SerialTrade };
3
+ /**
4
+ * Full recompute. Sent on load / backward seek / timeframe change.
5
+ * workerInit is called with ALL trades up to horizon.
6
+ * The return value of workerInit is both stored as state AND returned as
7
+ * the hydrate() payload so ChartInner can replace all existing output data.
8
+ */
9
+ export interface ComputeRequest {
10
+ type: 'compute';
11
+ requestId: string;
12
+ trades: SerialTrade[];
13
+ barNs: bigint;
14
+ horizon: bigint;
15
+ ohlcv?: any[];
16
+ ticks?: any[];
17
+ snapshots?: any[];
18
+ indicators: Array<{
19
+ id: string;
20
+ workerInit: string;
21
+ params?: unknown;
22
+ }>;
23
+ }
24
+ /**
25
+ * Register workerUpdate functions. Sent once after each 'compute'.
26
+ * Separating this from 'compute' means we never re-parse source strings on
27
+ * the hot path (horizon:advance sends only indicatorIds, no source).
28
+ */
29
+ export interface RegisterUpdateFnsRequest {
30
+ type: 'register-update-fns';
31
+ indicators: Array<{
32
+ id: string;
33
+ /** Serialized pure fn: ({ newTrades, state, barNs, horizon, params }) => { points, state } */
34
+ workerUpdate: string;
35
+ }>;
36
+ }
37
+ /**
38
+ * Incremental update. Hot path - called every horizon tick.
39
+ * workerUpdate receives only new trades since the last call.
40
+ * Returns new output points for appendHydrate().
41
+ */
42
+ export interface HorizonAdvanceRequest {
43
+ type: 'horizon:advance';
44
+ requestId: string;
45
+ newTrades: SerialTrade[];
46
+ horizon: bigint;
47
+ barNs: bigint;
48
+ indicatorIds: Array<{
49
+ id: string;
50
+ params?: unknown;
51
+ workerInit?: string;
52
+ }>;
53
+ }
54
+ export interface ComputeResponse {
55
+ type: 'compute';
56
+ requestId: string;
57
+ results: Record<string, unknown>;
58
+ errors: Record<string, string>;
59
+ }
60
+ export interface HorizonAdvanceResponse {
61
+ type: 'horizon:advance';
62
+ requestId: string;
63
+ points: Record<string, unknown>;
64
+ errors: Record<string, string>;
65
+ }