acttrader-charts 1.4.0-beta.1 → 1.4.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -69,7 +69,7 @@ const chart = new ChartEngine({
69
69
  // changes, and (unless `reloadOnPriceSourceChange: false`) whenever the price source changes.
70
70
  ```
71
71
 
72
- If the first fetch returns fewer than `minInitialBars` (default `10`), the engine automatically widens the lookback window and calls `dataLoader` again — up to the `maxLookbackMs` ceiling (default 365 days). This keeps the chart useful on weekends, holidays, or for instruments that just listed. If retries still yield zero bars, the engine shows a **"No data available"** overlay (customise the text via `labels.chart.noData`).
72
+ If the first fetch returns fewer than `minInitialBars` (default `10`), the engine automatically widens the lookback window and calls `dataLoader` again — up to the `maxLookbackMs` ceiling (default 365 days). That ceiling limits only the retries: with no duration selected, the first fetch always asks for `maxCandles` bars, so a 1W chart loads about four years rather than one. This keeps the chart useful on weekends, holidays, or for instruments that just listed. The engine keeps the retry that returned the most bars and stops widening once a wider window returns fewer, because feeds often return nothing for very large ranges (17 days of 1m). A failed retry keeps the bars already received. If no retry returned any bar, or the first request failed, the engine shows a **"No data available"** overlay (customise the text via `labels.chart.noData`). Scrolling back into older history follows the same rule.
73
73
 
74
74
  ---
75
75
 
@@ -107,6 +107,12 @@ specific instance via its pill **×** or the settings dialog's Remove button.
107
107
  Each instance has a unique `instanceId` (e.g. `"EMA#3"`). Listen for it via the `indicatorAdded`
108
108
  event and pass it to `removeIndicator` to target one instance:
109
109
 
110
+ `shortName` is always the menu / catalog short name (`"HammingMA"`, `"ZigZag"`,
111
+ `"EMACross"`), in events, `getState()`, the menu ticks and the mobile catalog,
112
+ even for indicators whose display name differs ("Hamming MA"). States saved
113
+ under the old display names still restore, and `removeIndicator` /
114
+ `addIndicatorByName` accept them too.
115
+
110
116
  ```ts
111
117
  chart.on('indicatorAdded', ({ instanceId, shortName, params }) => { /* track it */ });
112
118
  chart.removeIndicator('EMA#3'); // remove that one instance
@@ -206,6 +212,9 @@ const chart = new ChartEngine({
206
212
  await chart.addCompare('MSFT');
207
213
  chart.removeCompare('MSFT');
208
214
  chart.clearCompares();
215
+ // Open the built-in picker from your own header (the engine's Compare button
216
+ // lives in the advanced header only):
217
+ chart.openComparePicker();
209
218
  chart.getCompares(); // [{ symbol, color, status }]
210
219
 
211
220
  // Events
@@ -529,7 +538,7 @@ use `{symbol}` and `{count}`. The maths behind the pill is exported as
529
538
  | `tickActivityMs` | | `30000` | ms the stream dot stays green after last tick |
530
539
  | `maxCandles` | | `200` | Max bars fetched per data-load request |
531
540
  | `minInitialBars` | | `10` | If `dataLoader` returns fewer bars, the fetch window auto-widens and retries (handles weekends, market closures, and sparse symbols) |
532
- | `maxLookbackMs` | | `31_536_000_000` | Hard ceiling on auto-widening lookback (ms). Retries stop once the window reaches this. Default: 365 days |
541
+ | `maxLookbackMs` | | `31_536_000_000` | Hard ceiling on auto-widening lookback (ms). Retries stop once the window reaches this. Default: 365 days. The first request (no duration selected) always covers `maxCandles` bars even when that is longer, e.g. 200 × 1W ≈ 4 years, so long-period studies (TEMA, TRIX, KVO, CRSI) draw on weekly charts |
533
542
  | `prefetchThreshold` | | `80` | Bars from start of data at which historical fetch triggers (min 20) |
534
543
  | `mobileBarDivisor` | | `2` | Divide desktop visible bar count on touch devices (`2`, `3`, or `4`) |
535
544
  | `momentumScrollEnabled` | | `true` | Enable momentum (kinetic) scrolling — chart coasts after a fast flick |
@@ -983,6 +992,7 @@ chart.setVolume(show: boolean): this
983
992
 
984
993
  ```ts
985
994
  chart.addIndicator(indicator: IIndicator, initialParams?: IndicatorParams): this
995
+ chart.addIndicatorByName(shortName: string, params?: IndicatorParams): void // params from a host are normalised to the study's schema first: "20" → 20 (clamped to min/max), "Close" → 'close', TradingView's `length` → `period` — so a native settings sheet draws the same line as the web
986
996
  chart.addIndicatorByName(shortName: string, params?: IndicatorParams): void
987
997
  chart.removeIndicator(idOrShortName: string): this
988
998
  ```
@@ -1048,7 +1058,7 @@ name of the same flag and still works. Native wrappers get the same switch via t
1048
1058
 
1049
1059
  ### Native UI catalog (webview bridge only)
1050
1060
 
1051
- The webview bridge used by the Android and iOS wrappers posts a **`catalog`** event right after every `init` command, and again on the **`getCatalog`** command (which also works before `init`). It lists everything a native app needs to build its own header, drawing-tools sheet, indicators list and chart-settings screen: timeframes, chart types, cursors, drawing tool groups (with point counts and style fields), drawing-toolbar options, indicators (with pane and editable settings fields), the Chart Settings dialog (tabs → sections → items with types, options and defaults), canvas colour keys, price sources and limits. Every entry carries `available` (`true` = works in this version, `false` = planned). `catalogVersion` is the library version, stamped at build time.
1061
+ The webview bridge used by the Android and iOS wrappers posts a **`catalog`** event right after every `init` command, and again on the **`getCatalog`** command (which also works before `init`). It lists everything a native app needs to build its own header, drawing-tools sheet, indicators list and chart-settings screen: timeframes, chart types, cursors, drawing tool groups (with point counts and style fields), drawing-toolbar options, indicators (with pane and editable settings fields), the Chart Settings dialog (tabs → sections → items with types, options and defaults), canvas colour keys, price sources and limits. Every entry carries `available` (`true` = works in this version, `false` = planned). `catalogVersion` is the library version, stamped at build time. Each indicator's `name` and `category` are exactly what the web indicator menu shows. `multiInstance: false` (VOL, OBV, A/D, AO, VWAP, Ichimoku, PSAR, Pivot, Heikin Ashi and a few others) means adding it again removes it, as on the web — don't offer "add another" for those.
1052
1062
 
1053
1063
  Source: `src/core/mobileCatalog.ts`. `src/__tests__/mobileCatalog.test.ts` fails the build if an `available: true` id does not exist in the engine, or an engine tool / indicator is missing from the catalog — update the catalog together with any new chart type, tool or indicator. The web `ChartEngine` API is unchanged.
1054
1064
 
@@ -1202,7 +1212,7 @@ Sub-pane heights are user-resizable by dragging the separator between panes.
1202
1212
  | `horizontalLine` | Horizontal Line | Single click |
1203
1213
  | `verticalLine` | Vertical Line | Single click |
1204
1214
  | `trendLine` | Trend Line | 2 clicks |
1205
- | `trendAngle` | Trend Angle | 2 clicks (shows angle) |
1215
+ | `trendAngle` | Trend Angle | 2 clicks. The angle is the drawing's own property: measured when a point is placed or dragged, kept while zooming, and saved as `angle` on the serialized drawing — so a synced drawing shows the same degrees on web, Android and iOS. The line is drawn from the first point at that angle, as far as the second point projects; the stored points are never rewritten by rendering (before 1.4.0-beta.4 the second point was re-anchored onto the line on every render, which lengthened the line on every zoom or tick until it ran off the pane). |
1206
1216
  | `crossLine` | Cross Line | Single click (H+V) |
1207
1217
  | `parallelChannel` | Parallel Channel | 3 clicks |
1208
1218
  | `flatChannel` | Flat Channel | 2 clicks |
@@ -1383,6 +1393,7 @@ chart.on('dataLoaded', ({ timeframe, interval, start, end, priceSource }) =>
1383
1393
  chart.on('newBar', ({ completedBar, openingBar, intervalMs }) => {});
1384
1394
  chart.on('indicatorAdded', ({ instanceId, shortName, params }) => {}); // a study instance was added — keep instanceId to remove it later
1385
1395
  chart.on('indicatorRemoved', ({ instanceId, shortName }) => {});
1396
+ chart.on('indicatorLimitReached', ({ shortName, maxSubPanes }) => {});
1386
1397
  chart.on('stateChange', ({ symbol, state }) => {
1387
1398
  // Fires after every user-driven config change (timeframe, series, theme,
1388
1399
  // indicators, drawings, volume). `state` is a full serializable snapshot.
@@ -1887,9 +1898,45 @@ The existing `anchoredVP` *drawing tool* is a different thing: its bar heights
1887
1898
  come from a hardcoded bell curve, not from the feed.
1888
1899
 
1889
1900
  **`maxSubPanes` caps concurrent sub-pane indicators.** Most of these 78 live in
1890
- their own pane, so adding many at once silently stops at the cap. Raise
1901
+ their own pane, so adding one past the cap is refused: the chart shows a short
1902
+ notice and emits `indicatorLimitReached` `{ shortName, maxSubPanes }`. Raise
1891
1903
  `maxSubPanes` if you need more on screen together.
1892
1904
 
1905
+ ```ts
1906
+ chart.on('indicatorLimitReached', ({ shortName, maxSubPanes }) => {
1907
+ console.warn(`${shortName} not added: ${maxSubPanes} sub-panes in use`);
1908
+ });
1909
+ ```
1910
+
1911
+ **Compare-based studies say what they need.** Correlation Coefficient,
1912
+ Correlation - Log, Ratio and Spread need one Compare symbol and Advance/Decline
1913
+ needs two. Until then their pane shows *"Click Compare in the chart header to add a symbol for this
1914
+ indicator"* instead of staying blank, and they fill in as soon as the compare
1915
+ loads.
1916
+
1917
+ **No volume, no plot.** When no loaded bar has volume, volume studies are not
1918
+ plotted at all — no line, no pane, no pill — and the indicator menus leave them
1919
+ out (the Volume heading too, when it would be empty), in search as well. One
1920
+ added anyway (API, bridge, saved layout) is kept and shows a short notice; it
1921
+ appears by itself once data with volume loads. `dataLoaded` carries `hasVolume`
1922
+ and `barCount`; the WebView bridge also posts `volumeAvailability { hasVolume }`
1923
+ and marks catalog indicators `requiresVolume`.
1924
+
1925
+ **Bars without volume become gaps.** Volume studies (Volume, OBV, A/D, MFI, CMF,
1926
+ VWAP, EOM, EFI, Klinger, Volume Oscillator, Net Volume, PVT, Chaikin Oscillator)
1927
+ draw nothing on bars whose feed sent no volume (missing or 0). The line ends at
1928
+ the last bar with volume instead of going flat or reading MFI 100, and a pane with
1929
+ no volume in view says *"No volume data from the feed for these bars"*.
1930
+
1931
+ **52 Week High/Low** covers 52 weeks of time on every timeframe, or all the
1932
+ loaded history when that is shorter. **Zig Zag** always draws its latest leg,
1933
+ even when no swing has reached the deviation yet. Large sub-pane axis values are
1934
+ shortened (1.83M, -45.6B).
1935
+ **Chande Kroll Stop** follows the standard formula (stop short = highest of the
1936
+ high stop, stop long = lowest of the low stop), so both lines sit near price. The
1937
+ main pane's auto-scale includes the upper and lower lines of band studies (52W
1938
+ H/L, Chande Kroll, Bollinger, …), so those lines stay on screen.
1939
+
1893
1940
  ### Native wrapper parity
1894
1941
 
1895
1942
  All 78 are reachable through the existing `addIndicator` bridge command by short
@@ -2265,6 +2312,25 @@ Two details worth knowing:
2265
2312
  in hand. It deletes via select-then-delete, so it shares the undo history with
2266
2313
  every other delete.
2267
2314
 
2315
+ ### Touch gestures (iOS / Android)
2316
+
2317
+ | Gesture | Effect |
2318
+ | --- | --- |
2319
+ | One-finger drag on the chart | Scrolls through time (with momentum) |
2320
+ | Pinch | Zooms the time axis |
2321
+ | One-finger drag along the time (x) axis | Zooms the time axis the way TradingView does: the right edge (normally the latest bar) stays put, drag right to zoom in and left to zoom out. Zooming out stops when the oldest bar reaches the left edge, so the candles always fill the full width. The mouse drag on the time axis behaves the same way |
2322
+ | One-finger drag on the price (y) axis | Zooms the price axis |
2323
+ | One-finger **double tap** on the chart | Zooms the price axis in one step around the tapped price |
2324
+ | One-finger **double tap** on the price (y) axis | Resets the view, the same as the Reset view button |
2325
+ | One-finger **double tap, then drag** up/down | Zooms the price axis continuously: up zooms in, down zooms out (the same direction as the price-axis drag) |
2326
+ | Long press | Shows the crosshair |
2327
+
2328
+ Once the view has moved away from its default, a round **Reset view** button
2329
+ appears just above the time axis. It is part of the built-in UI, so it is not
2330
+ shown when `showUI: false` (the usual iOS / Android setup, where the app draws
2331
+ its own controls). On a bare chart, double tap the price axis or call
2332
+ `resetView()` to bring the view back.
2333
+
2268
2334
  ### Value tooltip on long press
2269
2335
 
2270
2336
  ```ts
@@ -2280,6 +2346,13 @@ It flips to the other side of the touch rather than running off an edge, never
2280
2346
  takes pointer events (the drag is still in progress), and omits volume rather
2281
2347
  than printing a zero when the feed carries none. Default `false`.
2282
2348
 
2349
+ The long press itself (500 ms, finger still within 6 px) arms the crosshair on
2350
+ every touch platform. The chart claims that touch with `preventDefault()` so a
2351
+ WebView's own long-press gesture — WebKit's text-selection / callout recogniser
2352
+ on iOS, which used to cancel the touch at the same moment and left iPhones with
2353
+ no crosshair at all — cannot take it over; a cancel that still arrives after
2354
+ 300 ms of holding counts as the long press.
2355
+
2283
2356
  ### Native wrapper parity
2284
2357
 
2285
2358
  The four line tools are new `DrawingToolType` strings, so `setDrawingTool('ray')`
@@ -2329,6 +2402,13 @@ Three consequences worth knowing:
2329
2402
  different number of elements.
2330
2403
  - **Market price still comes off the raw feed.** Trade levels and P&L price
2331
2404
  against the real last close, never a brick top.
2405
+ - **Live ticks move the element count both ways.** The forming bar completes a
2406
+ brick, line or column on one tick and takes it back on the next. The view
2407
+ keeps tracking the live edge either way — same width, same room past the
2408
+ last element — and a view scrolled into history stays put. Box and reversal
2409
+ sizes are measured over **closed** bars, so a tick never re-grids the series;
2410
+ an ATR box changes once per completed bar. (Before 1.4.0-beta.4 the view only
2411
+ ever moved forward, so these types went blank after a while on a live feed.)
2332
2412
 
2333
2413
  ### Parameters
2334
2414
 
@@ -2354,12 +2434,12 @@ Renko leaves Kagi and P&F alone.
2354
2434
 
2355
2435
  | `BoxSizeMode` | Meaning |
2356
2436
  | --- | --- |
2357
- | `{ kind: 'atr', length }` | Wilder ATR over the last `length` bars. Default `14`. |
2437
+ | `{ kind: 'atr', length }` | Wilder ATR over the last `length` closed bars (the forming bar is excluded). Default `14`. |
2358
2438
  | `{ kind: 'fixed', size }` | A fixed price distance. |
2359
- | `{ kind: 'percent', percent }` | A percentage of the latest close. |
2439
+ | `{ kind: 'percent', percent }` | A percentage of the last closed bar's close. |
2360
2440
 
2361
- When a box cannot be sized — fewer than `length + 1` bars for the ATR, or a
2362
- non-positive size — the transform returns **no elements** rather than guessing. A
2441
+ When a box cannot be sized — fewer than `length + 1` closed bars for the ATR, or
2442
+ a non-positive size — the transform returns **no elements** rather than guessing. A
2363
2443
  wrong box size does not look wrong; it looks like a different market.
2364
2444
 
2365
2445
  ### The rules each type implements
@@ -2983,6 +3063,16 @@ class MyIndicator implements IIndicator {
2983
3063
  chart.addIndicator(new MyIndicator());
2984
3064
  ```
2985
3065
 
3066
+ **Price fields.** A main-pane (`pane: 'main'`) indicator's `value`, `upper` and
3067
+ `lower` count as prices when the price scale auto-fits, so band lines stay in
3068
+ view. If your indicator stores something else in one of them, list only its
3069
+ price fields, or the scale stretches to that number and flattens the candles.
3070
+ Supertrend and Parabolic SAR keep the trend direction (+1 / -1) in `upper`:
3071
+
3072
+ ```ts
3073
+ readonly priceFields = ['value'] as const; // default: ['value', 'upper', 'lower']
3074
+ ```
3075
+
2986
3076
  ---
2987
3077
 
2988
3078
  ## Build & Dev
@@ -1465,7 +1465,9 @@ interface ChartConfig {
1465
1465
  /**
1466
1466
  * Hard ceiling (in milliseconds) on how far back auto-widening retries
1467
1467
  * can reach when chasing enough bars. Retries stop once the window meets
1468
- * or exceeds this value. Default: 365 days.
1468
+ * or exceeds this value. Default: 365 days. Without a duration, the first
1469
+ * request always covers `maxCandles` bars, even when that is longer
1470
+ * (e.g. 200 × 1W ≈ 4 years), so long-period studies have bars to draw.
1469
1471
  */
1470
1472
  maxLookbackMs?: number;
1471
1473
  /**
@@ -2325,6 +2327,21 @@ interface IIndicator {
2325
2327
  readonly pane?: "main" | "sub";
2326
2328
  readonly paneHeight?: number;
2327
2329
  compute(data: OHLCVBar[], context?: IndicatorComputeContext): IndicatorResult[];
2330
+ /**
2331
+ * True for studies built on bar volume (Volume, OBV, MFI, …). The engine
2332
+ * blanks their output on bars whose feed sent no volume (missing or 0), so
2333
+ * a feed that stops sending volume ends the line there instead of drawing a
2334
+ * flat line or a meaningless reading such as MFI 100.
2335
+ */
2336
+ readonly usesVolume?: boolean;
2337
+ /**
2338
+ * Result fields that hold prices, so a main-pane study keeps them in view
2339
+ * when the price scale auto-fits. Default: `value`, `upper` and `lower`.
2340
+ * A study that stores something else in a field — Supertrend and Parabolic
2341
+ * SAR keep the trend direction (+1 / -1) in `upper` — lists only its price
2342
+ * fields, or the scale would stretch to that number and flatten the candles.
2343
+ */
2344
+ readonly priceFields?: readonly ('value' | 'upper' | 'lower')[];
2328
2345
  /**
2329
2346
  * Returns the natural value range for the given results.
2330
2347
  * Used to render a price axis on the right side of sub-panes and to support draggable Y-scale.
@@ -2492,6 +2509,12 @@ interface IDrawing {
2492
2509
  visible?: boolean;
2493
2510
  locked?: boolean;
2494
2511
  text?: string;
2512
+ /**
2513
+ * Trend Angle only: the line's angle in degrees from the horizontal — the
2514
+ * drawing's defining property, kept through zooms and carried across
2515
+ * platforms so the label reads the same everywhere. Other tools leave it unset.
2516
+ */
2517
+ angle?: number;
2495
2518
  /** Optional per-instance style override; falls back to theme defaults when absent. */
2496
2519
  style?: AnyDrawingStyle;
2497
2520
  render(ctx: CanvasRenderingContext2D, scale: ScaleManager, viewport: Viewport, priceRange: PriceRange, chartW: number, chartH: number, isSelected: boolean, pricePrecision?: number, theme?: ChartTheme, context?: DrawingRenderContext): void;
@@ -2511,6 +2534,14 @@ interface IDrawing {
2511
2534
  * a third time.
2512
2535
  */
2513
2536
  onPlaced?(): void;
2537
+ /**
2538
+ * Called after the user moved this drawing's points — while placing it,
2539
+ * dragging the whole drawing, or dragging a handle. Not called when the
2540
+ * engine re-anchors points to new data (reload, scroll-back, timeframe
2541
+ * change), so a tool that derives a property from where the user put the
2542
+ * points — Trend Angle's angle — can tell the two apart.
2543
+ */
2544
+ onPointsEdited?(): void;
2514
2545
  /** Returns the handle under (x, y), or null if none */
2515
2546
  getHandle(x: number, y: number, scale: ScaleManager, viewport: Viewport, priceRange: PriceRange, chartW: number, chartH: number): DrawingHandle | null;
2516
2547
  /**
@@ -2564,6 +2595,8 @@ interface SerializedDrawing {
2564
2595
  visible?: boolean;
2565
2596
  text?: string;
2566
2597
  locked?: boolean;
2598
+ /** Trend Angle: degrees from the horizontal. Present once the angle has been measured; see `IDrawing.angle`. */
2599
+ angle?: number;
2567
2600
  /** Optional per-instance style override; absent for drawings using theme defaults. */
2568
2601
  style?: AnyDrawingStyle;
2569
2602
  }
@@ -2761,6 +2794,14 @@ type ChartEventMap = {
2761
2794
  end: Date;
2762
2795
  /** Candle price source the bars were requested with (see `DataLoaderParams.priceSource`). */
2763
2796
  priceSource: 'bid' | 'ask' | 'ltp';
2797
+ /** Bars on the chart after the load. */
2798
+ barCount: number;
2799
+ /**
2800
+ * Whether any loaded bar has volume. When false, volume studies
2801
+ * (Volume, VWAP, OBV, MFI, …) are not plotted; native menus can grey
2802
+ * them out — the catalog marks them `requiresVolume`.
2803
+ */
2804
+ hasVolume: boolean;
2764
2805
  };
2765
2806
  /** Emitted when the user clicks the × button on a trade, position, or bracket (SL/TP) level. */
2766
2807
  tradeLevelClose: {
@@ -3060,6 +3101,14 @@ type ChartEventMap = {
3060
3101
  shortName: string;
3061
3102
  params: IndicatorParams;
3062
3103
  };
3104
+ /**
3105
+ * Emitted when an indicator is refused because every sub-pane slot is in
3106
+ * use (`maxSubPanes`, default 3). The chart also shows a short notice.
3107
+ */
3108
+ indicatorLimitReached: {
3109
+ shortName: string;
3110
+ maxSubPanes: number;
3111
+ };
3063
3112
  /** Emitted after an indicator instance is removed (pill ×, settings dialog, or `removeIndicator`). */
3064
3113
  indicatorRemoved: {
3065
3114
  instanceId: string;
@@ -3601,6 +3650,15 @@ declare function mapSeries(a: Series, fn: (x: number, i: number) => number | nul
3601
3650
  /** Cumulative running sum, null-propagating from the first defined value. */
3602
3651
  declare function cumulative(values: Series): Series;
3603
3652
 
3653
+ /**
3654
+ * Writes a one-line notice in the middle of a pane that has nothing to draw.
3655
+ *
3656
+ * An empty pane with only a label looks like a bug; saying why it is empty
3657
+ * (no compare symbol, no volume from the feed) tells the user what to do.
3658
+ */
3659
+ declare function drawPaneHint(ctx: CanvasRenderingContext2D, text: string, chartHeight: number, color?: string): void;
3660
+ /** True when no result carries a value in `field` — the study drew nothing. */
3661
+ declare function allEmpty(results: readonly IndicatorResult[], field?: 'value'): boolean;
3604
3662
  /** One plotted line: where to read it from a result, and how to draw it. */
3605
3663
  interface LineSpec {
3606
3664
  /** Which field of `IndicatorResult` carries this line. */
@@ -3667,6 +3725,13 @@ declare abstract class HistogramIndicatorBase extends LineIndicatorBase {
3667
3725
  protected baseline(): number;
3668
3726
  /** Which field drives the bars. */
3669
3727
  protected barField(): 'value' | 'histogram';
3728
+ /**
3729
+ * The bars must count toward the range. Subclasses that draw only bars
3730
+ * declare no lines, so the line-only range collapsed to the baseline guide
3731
+ * and fell back to a fixed −1…1 axis, flattening the Accelerator and
3732
+ * clipping Net Volume.
3733
+ */
3734
+ getValueRange(results: IndicatorResult[]): PriceRange;
3670
3735
  render(ctx: CanvasRenderingContext2D, results: IndicatorResult[], scale: ScaleManager, viewport: Viewport, chartHeight: number, rangeOverride?: PriceRange): void;
3671
3736
  }
3672
3737
  /** Packs aligned series into the `IndicatorResult[]` shape the engine renders. */
@@ -3797,6 +3862,13 @@ interface IndicatorDef {
3797
3862
  /** Only one instance makes sense (e.g. a single volume pane). */
3798
3863
  singleInstance?: boolean;
3799
3864
  }
3865
+ /**
3866
+ * Indicator short names that need bar volume. The indicator menus disable
3867
+ * them when the loaded bars carry none, since they would draw nothing.
3868
+ */
3869
+ declare const VOLUME_STUDIES: ReadonlySet<string>;
3870
+ /** Tooltip on a volume study the menu has disabled. */
3871
+ declare const NO_VOLUME_TITLE = "Not available: this symbol's chart data has no volume";
3800
3872
  /** A period field. Shared so every indicator agrees on sane bounds. */
3801
3873
  declare const periodField: (def: number, key?: string, label?: string, max?: number) => ParamFieldDef;
3802
3874
  /** A colour field. */
@@ -3823,6 +3895,14 @@ declare function extraIndicatorPresets(): {
3823
3895
  shortName: string;
3824
3896
  factory: () => IIndicator;
3825
3897
  }[];
3898
+ /**
3899
+ * Maps the `name` an indicator instance reports (e.g. `'Hamming MA'`) to its
3900
+ * registry short name (`'HammingMA'`), for the indicators where the two differ.
3901
+ * The engine keys active indicators, menu ticks, saved state and bridge events
3902
+ * by the short name; layouts saved before that used the instance name, so
3903
+ * restoring them goes through this map too. Built once, from schema defaults.
3904
+ */
3905
+ declare function extraInstanceNameMap(): ReadonlyMap<string, string>;
3826
3906
  /** Short names that may only have one instance on a chart. */
3827
3907
  declare function extraSingleInstance(): string[];
3828
3908
 
@@ -3887,4 +3967,4 @@ declare class MACD implements IIndicator {
3887
3967
  render(ctx: CanvasRenderingContext2D, results: IndicatorResult[], scale: ScaleManager, viewport: Viewport, paneHeight: number, rangeOverride?: PriceRange): void;
3888
3968
  }
3889
3969
 
3890
- export { type ChartMiscLabels as $, type AccountSpec as A, type BarColorSource as B, type ChartTheme as C, type Duration as D, type PositionLevel as E, type AnyLevel as F, type DrawingPoint as G, type DrawingHandle as H, type IIndicator as I, type DrawingRenderContext as J, type Tick as K, type LayoutSyncState as L, type StreamStatus as M, type ActiveIndicatorState as N, type OHLCVBar as O, type PriceScaleMode as P, BollingerBands as Q, type ResolvedInstrument as R, type SeriesType as S, type Timeframe as T, type BottomBarColors as U, type Viewport as V, type BottomBarLabels as W, type BottomBarUiConfig as X, type BoxSizeMode as Y, type CanvasColorSettings as Z, type ChartLabels as _, type ChartConfig as a, type TransformedBarMeta as a$, type ChartThemeUi as a0, type CrosshairUiConfig as a1, DARK_THEME as a2, DEFAULT_BOTTOM_BAR_CONFIG as a3, DEFAULT_CROSSHAIR_CONFIG as a4, DEFAULT_DRAWING_TOOLBAR_CONFIG as a5, DEFAULT_INDICATOR_OVERLAY_CONFIG as a6, DEFAULT_LABELS as a7, DEFAULT_LAYOUT_SYNC as a8, DEFAULT_PRICE_AXIS_CONFIG as a9, PRESET_COUNTS as aA, PRESET_LABEL as aB, PRICE_TRANSFORM_SERIES as aC, type Padding as aD, type PendingOrderLevel as aE, type PnlPillConfig as aF, type PnlPillLabels as aG, type PointFigureOptions as aH, type PositionRenderStyle as aI, type PriceAxisUiConfig as aJ, RSI as aK, type RenkoOptions as aL, SMA as aM, type SavedLayoutPane as aN, type Series as aO, type Source as aP, type Theme as aQ, type ThemeOverrides as aR, type TimeAxisUiConfig as aS, type TopBarColors as aT, type TopBarUiConfig as aU, type TradeButtonUiConfig as aV, type TradeDisplayFilter as aW, type TradeLabels as aX, type TradeLevel as aY, type TradeLevelColors as aZ, type TradePanelColors as a_, DEFAULT_TIME_AXIS_CONFIG as aa, DEFAULT_TOP_BAR_CONFIG as ab, DEFAULT_TRADE_BUTTON_CONFIG as ac, DEFAULT_UI_CONFIG as ad, type DataLoaderParams as ae, type DeepPartial$1 as af, type DeepPartialChartTheme as ag, type DialogLabels as ah, type DrawingToolbarColors as ai, type DrawingToolbarLabels as aj, type DrawingToolbarUiConfig as ak, EMA as al, EXTRA_INDICATORS as am, type IndicatorComputeContext as an, type IndicatorDef as ao, type IndicatorOverlayColors as ap, type IndicatorOverlayUiConfig as aq, type IndicatorStateEntry as ar, type KagiOptions as as, LAYOUT_PRESETS as at, LIGHT_THEME as au, type LayoutPreset as av, type LineBreakOptions as aw, MACD as ax, type OrderSubmit as ay, PRESETS_BY_COUNT as az, type IndicatorParams as b, stdev as b$, type TransformedSeries as b0, type UiConfig as b1, alma as b2, atr as b3, atrValue as b4, captureIndicatorTemplate as b5, captureLayout as b6, captureSettingsTemplate as b7, change as b8, cloneSettings as b9, lsma as bA, makeLayoutId as bB, makeSettingsTemplateId as bC, makeTemplateId as bD, mcginley as bE, methodField as bF, numField as bG, periodField as bH, registerCustomPreset as bI, removeLayout as bJ, removeSettingsTemplate as bK, removeTemplate as bL, resolveBoxSize as bM, resolveCssVarsInTheme as bN, resolveInstrument as bO, resolveLabels as bP, resolveUiConfig as bQ, rma as bR, rocPct as bS, sanitizeLayouts as bT, sanitizeSettingsTemplates as bU, sanitizeTemplates as bV, sma as bW, sourceField as bX, sourceSeries as bY, sourceValue as bZ, standardError as b_, colorField as ba, correlation as bb, cumulative as bc, deepMergeTheme as bd, dema as be, ema as bf, extraIndicatorOptions as bg, extraIndicatorPresets as bh, extraIndicatorSchemas as bi, extraSingleInstance as bj, findLayout as bk, findSettingsTemplate as bl, findTemplate as bm, formatDuration as bn, formatVolume as bo, getAllPresets as bp, getCustomPresets as bq, getPreset as br, hammingMa as bs, highest as bt, hma as bu, inferPipSize as bv, isPriceTransformSeries as bw, linregAt as bx, linregSlope as by, lowest as bz, type IndicatorTemplate as c, tema as c0, toKagi as c1, toLineBreak as c2, toMoney as c3, toPips as c4, toPointFigure as c5, toRenko as c6, trueRange as c7, unregisterCustomPreset as c8, upsertLayout as c9, upsertSettingsTemplate as ca, upsertTemplate as cb, vwma as cc, wma as cd, type PriceSource as ce, HistogramIndicatorBase as cf, type LineSpec as cg, type GuideLevel as ch, LineIndicatorBase as ci, type MaMethod as cj, BandIndicatorBase as ck, AdaptiveMA as cl, MaChannel as cm, MovingAverage as cn, MultiMA as co, applyMa as cp, combine as cq, mapSeries as cr, toResults as cs, type ChartEventMap as d, type CursorMode as e, type ChartState as f, type InstrumentSpec as g, type StatusLineSettings as h, type ScalesSettings as i, type CanvasOptions as j, type DrawingToolType as k, type SerializedDrawing as l, type IDrawing as m, type AnyDrawingStyle as n, type IWebSocketAdapter as o, type TradeLevelType as p, type SavedLayout as q, type ChartSettingsSnapshot as r, type ChartSettingsTemplate as s, type TopBarLabels as t, type OhlcLabels as u, type CrosshairPosition as v, type PriceRange as w, ScaleManager as x, type SidePanelLabels as y, type IndicatorResult as z };
3970
+ export { type ChartMiscLabels as $, type AccountSpec as A, type BarColorSource as B, type ChartTheme as C, type Duration as D, type PositionLevel as E, type AnyLevel as F, type DrawingPoint as G, type DrawingHandle as H, type IIndicator as I, type DrawingRenderContext as J, type Tick as K, type LayoutSyncState as L, type StreamStatus as M, type ActiveIndicatorState as N, type OHLCVBar as O, type PriceScaleMode as P, BollingerBands as Q, type ResolvedInstrument as R, type SeriesType as S, type Timeframe as T, type BottomBarColors as U, type Viewport as V, type BottomBarLabels as W, type BottomBarUiConfig as X, type BoxSizeMode as Y, type CanvasColorSettings as Z, type ChartLabels as _, type ChartConfig as a, type TradePanelColors as a$, type ChartThemeUi as a0, type CrosshairUiConfig as a1, DARK_THEME as a2, DEFAULT_BOTTOM_BAR_CONFIG as a3, DEFAULT_CROSSHAIR_CONFIG as a4, DEFAULT_DRAWING_TOOLBAR_CONFIG as a5, DEFAULT_INDICATOR_OVERLAY_CONFIG as a6, DEFAULT_LABELS as a7, DEFAULT_LAYOUT_SYNC as a8, DEFAULT_PRICE_AXIS_CONFIG as a9, PRESETS_BY_COUNT as aA, PRESET_COUNTS as aB, PRESET_LABEL as aC, PRICE_TRANSFORM_SERIES as aD, type Padding as aE, type PendingOrderLevel as aF, type PnlPillConfig as aG, type PnlPillLabels as aH, type PointFigureOptions as aI, type PositionRenderStyle as aJ, type PriceAxisUiConfig as aK, RSI as aL, type RenkoOptions as aM, SMA as aN, type SavedLayoutPane as aO, type Series as aP, type Source as aQ, type Theme as aR, type ThemeOverrides as aS, type TimeAxisUiConfig as aT, type TopBarColors as aU, type TopBarUiConfig as aV, type TradeButtonUiConfig as aW, type TradeDisplayFilter as aX, type TradeLabels as aY, type TradeLevel as aZ, type TradeLevelColors as a_, DEFAULT_TIME_AXIS_CONFIG as aa, DEFAULT_TOP_BAR_CONFIG as ab, DEFAULT_TRADE_BUTTON_CONFIG as ac, DEFAULT_UI_CONFIG as ad, type DataLoaderParams as ae, type DeepPartial$1 as af, type DeepPartialChartTheme as ag, type DialogLabels as ah, type DrawingToolbarColors as ai, type DrawingToolbarLabels as aj, type DrawingToolbarUiConfig as ak, EMA as al, EXTRA_INDICATORS as am, type IndicatorComputeContext as an, type IndicatorDef as ao, type IndicatorOverlayColors as ap, type IndicatorOverlayUiConfig as aq, type IndicatorStateEntry as ar, type KagiOptions as as, LAYOUT_PRESETS as at, LIGHT_THEME as au, type LayoutPreset as av, type LineBreakOptions as aw, MACD as ax, NO_VOLUME_TITLE as ay, type OrderSubmit as az, type IndicatorParams as b, sourceSeries as b$, type TransformedBarMeta as b0, type TransformedSeries as b1, type UiConfig as b2, VOLUME_STUDIES as b3, alma as b4, atr as b5, atrValue as b6, captureIndicatorTemplate as b7, captureLayout as b8, captureSettingsTemplate as b9, linregAt as bA, linregSlope as bB, lowest as bC, lsma as bD, makeLayoutId as bE, makeSettingsTemplateId as bF, makeTemplateId as bG, mcginley as bH, methodField as bI, numField as bJ, periodField as bK, registerCustomPreset as bL, removeLayout as bM, removeSettingsTemplate as bN, removeTemplate as bO, resolveBoxSize as bP, resolveCssVarsInTheme as bQ, resolveInstrument as bR, resolveLabels as bS, resolveUiConfig as bT, rma as bU, rocPct as bV, sanitizeLayouts as bW, sanitizeSettingsTemplates as bX, sanitizeTemplates as bY, sma as bZ, sourceField as b_, change as ba, cloneSettings as bb, colorField as bc, correlation as bd, cumulative as be, deepMergeTheme as bf, dema as bg, ema as bh, extraIndicatorOptions as bi, extraIndicatorPresets as bj, extraIndicatorSchemas as bk, extraInstanceNameMap as bl, extraSingleInstance as bm, findLayout as bn, findSettingsTemplate as bo, findTemplate as bp, formatDuration as bq, formatVolume as br, getAllPresets as bs, getCustomPresets as bt, getPreset as bu, hammingMa as bv, highest as bw, hma as bx, inferPipSize as by, isPriceTransformSeries as bz, type IndicatorTemplate as c, sourceValue as c0, standardError as c1, stdev as c2, tema as c3, toKagi as c4, toLineBreak as c5, toMoney as c6, toPips as c7, toPointFigure as c8, toRenko as c9, trueRange as ca, unregisterCustomPreset as cb, upsertLayout as cc, upsertSettingsTemplate as cd, upsertTemplate as ce, vwma as cf, wma as cg, type PriceSource as ch, HistogramIndicatorBase as ci, type LineSpec as cj, type GuideLevel as ck, LineIndicatorBase as cl, type MaMethod as cm, BandIndicatorBase as cn, AdaptiveMA as co, MaChannel as cp, MovingAverage as cq, MultiMA as cr, allEmpty as cs, applyMa as ct, combine as cu, drawPaneHint as cv, mapSeries as cw, toResults as cx, type ChartEventMap as d, type CursorMode as e, type ChartState as f, type InstrumentSpec as g, type StatusLineSettings as h, type ScalesSettings as i, type CanvasOptions as j, type DrawingToolType as k, type SerializedDrawing as l, type IDrawing as m, type AnyDrawingStyle as n, type IWebSocketAdapter as o, type TradeLevelType as p, type SavedLayout as q, type ChartSettingsSnapshot as r, type ChartSettingsTemplate as s, type TopBarLabels as t, type OhlcLabels as u, type CrosshairPosition as v, type PriceRange as w, ScaleManager as x, type SidePanelLabels as y, type IndicatorResult as z };
@@ -1465,7 +1465,9 @@ interface ChartConfig {
1465
1465
  /**
1466
1466
  * Hard ceiling (in milliseconds) on how far back auto-widening retries
1467
1467
  * can reach when chasing enough bars. Retries stop once the window meets
1468
- * or exceeds this value. Default: 365 days.
1468
+ * or exceeds this value. Default: 365 days. Without a duration, the first
1469
+ * request always covers `maxCandles` bars, even when that is longer
1470
+ * (e.g. 200 × 1W ≈ 4 years), so long-period studies have bars to draw.
1469
1471
  */
1470
1472
  maxLookbackMs?: number;
1471
1473
  /**
@@ -2325,6 +2327,21 @@ interface IIndicator {
2325
2327
  readonly pane?: "main" | "sub";
2326
2328
  readonly paneHeight?: number;
2327
2329
  compute(data: OHLCVBar[], context?: IndicatorComputeContext): IndicatorResult[];
2330
+ /**
2331
+ * True for studies built on bar volume (Volume, OBV, MFI, …). The engine
2332
+ * blanks their output on bars whose feed sent no volume (missing or 0), so
2333
+ * a feed that stops sending volume ends the line there instead of drawing a
2334
+ * flat line or a meaningless reading such as MFI 100.
2335
+ */
2336
+ readonly usesVolume?: boolean;
2337
+ /**
2338
+ * Result fields that hold prices, so a main-pane study keeps them in view
2339
+ * when the price scale auto-fits. Default: `value`, `upper` and `lower`.
2340
+ * A study that stores something else in a field — Supertrend and Parabolic
2341
+ * SAR keep the trend direction (+1 / -1) in `upper` — lists only its price
2342
+ * fields, or the scale would stretch to that number and flatten the candles.
2343
+ */
2344
+ readonly priceFields?: readonly ('value' | 'upper' | 'lower')[];
2328
2345
  /**
2329
2346
  * Returns the natural value range for the given results.
2330
2347
  * Used to render a price axis on the right side of sub-panes and to support draggable Y-scale.
@@ -2492,6 +2509,12 @@ interface IDrawing {
2492
2509
  visible?: boolean;
2493
2510
  locked?: boolean;
2494
2511
  text?: string;
2512
+ /**
2513
+ * Trend Angle only: the line's angle in degrees from the horizontal — the
2514
+ * drawing's defining property, kept through zooms and carried across
2515
+ * platforms so the label reads the same everywhere. Other tools leave it unset.
2516
+ */
2517
+ angle?: number;
2495
2518
  /** Optional per-instance style override; falls back to theme defaults when absent. */
2496
2519
  style?: AnyDrawingStyle;
2497
2520
  render(ctx: CanvasRenderingContext2D, scale: ScaleManager, viewport: Viewport, priceRange: PriceRange, chartW: number, chartH: number, isSelected: boolean, pricePrecision?: number, theme?: ChartTheme, context?: DrawingRenderContext): void;
@@ -2511,6 +2534,14 @@ interface IDrawing {
2511
2534
  * a third time.
2512
2535
  */
2513
2536
  onPlaced?(): void;
2537
+ /**
2538
+ * Called after the user moved this drawing's points — while placing it,
2539
+ * dragging the whole drawing, or dragging a handle. Not called when the
2540
+ * engine re-anchors points to new data (reload, scroll-back, timeframe
2541
+ * change), so a tool that derives a property from where the user put the
2542
+ * points — Trend Angle's angle — can tell the two apart.
2543
+ */
2544
+ onPointsEdited?(): void;
2514
2545
  /** Returns the handle under (x, y), or null if none */
2515
2546
  getHandle(x: number, y: number, scale: ScaleManager, viewport: Viewport, priceRange: PriceRange, chartW: number, chartH: number): DrawingHandle | null;
2516
2547
  /**
@@ -2564,6 +2595,8 @@ interface SerializedDrawing {
2564
2595
  visible?: boolean;
2565
2596
  text?: string;
2566
2597
  locked?: boolean;
2598
+ /** Trend Angle: degrees from the horizontal. Present once the angle has been measured; see `IDrawing.angle`. */
2599
+ angle?: number;
2567
2600
  /** Optional per-instance style override; absent for drawings using theme defaults. */
2568
2601
  style?: AnyDrawingStyle;
2569
2602
  }
@@ -2761,6 +2794,14 @@ type ChartEventMap = {
2761
2794
  end: Date;
2762
2795
  /** Candle price source the bars were requested with (see `DataLoaderParams.priceSource`). */
2763
2796
  priceSource: 'bid' | 'ask' | 'ltp';
2797
+ /** Bars on the chart after the load. */
2798
+ barCount: number;
2799
+ /**
2800
+ * Whether any loaded bar has volume. When false, volume studies
2801
+ * (Volume, VWAP, OBV, MFI, …) are not plotted; native menus can grey
2802
+ * them out — the catalog marks them `requiresVolume`.
2803
+ */
2804
+ hasVolume: boolean;
2764
2805
  };
2765
2806
  /** Emitted when the user clicks the × button on a trade, position, or bracket (SL/TP) level. */
2766
2807
  tradeLevelClose: {
@@ -3060,6 +3101,14 @@ type ChartEventMap = {
3060
3101
  shortName: string;
3061
3102
  params: IndicatorParams;
3062
3103
  };
3104
+ /**
3105
+ * Emitted when an indicator is refused because every sub-pane slot is in
3106
+ * use (`maxSubPanes`, default 3). The chart also shows a short notice.
3107
+ */
3108
+ indicatorLimitReached: {
3109
+ shortName: string;
3110
+ maxSubPanes: number;
3111
+ };
3063
3112
  /** Emitted after an indicator instance is removed (pill ×, settings dialog, or `removeIndicator`). */
3064
3113
  indicatorRemoved: {
3065
3114
  instanceId: string;
@@ -3601,6 +3650,15 @@ declare function mapSeries(a: Series, fn: (x: number, i: number) => number | nul
3601
3650
  /** Cumulative running sum, null-propagating from the first defined value. */
3602
3651
  declare function cumulative(values: Series): Series;
3603
3652
 
3653
+ /**
3654
+ * Writes a one-line notice in the middle of a pane that has nothing to draw.
3655
+ *
3656
+ * An empty pane with only a label looks like a bug; saying why it is empty
3657
+ * (no compare symbol, no volume from the feed) tells the user what to do.
3658
+ */
3659
+ declare function drawPaneHint(ctx: CanvasRenderingContext2D, text: string, chartHeight: number, color?: string): void;
3660
+ /** True when no result carries a value in `field` — the study drew nothing. */
3661
+ declare function allEmpty(results: readonly IndicatorResult[], field?: 'value'): boolean;
3604
3662
  /** One plotted line: where to read it from a result, and how to draw it. */
3605
3663
  interface LineSpec {
3606
3664
  /** Which field of `IndicatorResult` carries this line. */
@@ -3667,6 +3725,13 @@ declare abstract class HistogramIndicatorBase extends LineIndicatorBase {
3667
3725
  protected baseline(): number;
3668
3726
  /** Which field drives the bars. */
3669
3727
  protected barField(): 'value' | 'histogram';
3728
+ /**
3729
+ * The bars must count toward the range. Subclasses that draw only bars
3730
+ * declare no lines, so the line-only range collapsed to the baseline guide
3731
+ * and fell back to a fixed −1…1 axis, flattening the Accelerator and
3732
+ * clipping Net Volume.
3733
+ */
3734
+ getValueRange(results: IndicatorResult[]): PriceRange;
3670
3735
  render(ctx: CanvasRenderingContext2D, results: IndicatorResult[], scale: ScaleManager, viewport: Viewport, chartHeight: number, rangeOverride?: PriceRange): void;
3671
3736
  }
3672
3737
  /** Packs aligned series into the `IndicatorResult[]` shape the engine renders. */
@@ -3797,6 +3862,13 @@ interface IndicatorDef {
3797
3862
  /** Only one instance makes sense (e.g. a single volume pane). */
3798
3863
  singleInstance?: boolean;
3799
3864
  }
3865
+ /**
3866
+ * Indicator short names that need bar volume. The indicator menus disable
3867
+ * them when the loaded bars carry none, since they would draw nothing.
3868
+ */
3869
+ declare const VOLUME_STUDIES: ReadonlySet<string>;
3870
+ /** Tooltip on a volume study the menu has disabled. */
3871
+ declare const NO_VOLUME_TITLE = "Not available: this symbol's chart data has no volume";
3800
3872
  /** A period field. Shared so every indicator agrees on sane bounds. */
3801
3873
  declare const periodField: (def: number, key?: string, label?: string, max?: number) => ParamFieldDef;
3802
3874
  /** A colour field. */
@@ -3823,6 +3895,14 @@ declare function extraIndicatorPresets(): {
3823
3895
  shortName: string;
3824
3896
  factory: () => IIndicator;
3825
3897
  }[];
3898
+ /**
3899
+ * Maps the `name` an indicator instance reports (e.g. `'Hamming MA'`) to its
3900
+ * registry short name (`'HammingMA'`), for the indicators where the two differ.
3901
+ * The engine keys active indicators, menu ticks, saved state and bridge events
3902
+ * by the short name; layouts saved before that used the instance name, so
3903
+ * restoring them goes through this map too. Built once, from schema defaults.
3904
+ */
3905
+ declare function extraInstanceNameMap(): ReadonlyMap<string, string>;
3826
3906
  /** Short names that may only have one instance on a chart. */
3827
3907
  declare function extraSingleInstance(): string[];
3828
3908
 
@@ -3887,4 +3967,4 @@ declare class MACD implements IIndicator {
3887
3967
  render(ctx: CanvasRenderingContext2D, results: IndicatorResult[], scale: ScaleManager, viewport: Viewport, paneHeight: number, rangeOverride?: PriceRange): void;
3888
3968
  }
3889
3969
 
3890
- export { type ChartMiscLabels as $, type AccountSpec as A, type BarColorSource as B, type ChartTheme as C, type Duration as D, type PositionLevel as E, type AnyLevel as F, type DrawingPoint as G, type DrawingHandle as H, type IIndicator as I, type DrawingRenderContext as J, type Tick as K, type LayoutSyncState as L, type StreamStatus as M, type ActiveIndicatorState as N, type OHLCVBar as O, type PriceScaleMode as P, BollingerBands as Q, type ResolvedInstrument as R, type SeriesType as S, type Timeframe as T, type BottomBarColors as U, type Viewport as V, type BottomBarLabels as W, type BottomBarUiConfig as X, type BoxSizeMode as Y, type CanvasColorSettings as Z, type ChartLabels as _, type ChartConfig as a, type TransformedBarMeta as a$, type ChartThemeUi as a0, type CrosshairUiConfig as a1, DARK_THEME as a2, DEFAULT_BOTTOM_BAR_CONFIG as a3, DEFAULT_CROSSHAIR_CONFIG as a4, DEFAULT_DRAWING_TOOLBAR_CONFIG as a5, DEFAULT_INDICATOR_OVERLAY_CONFIG as a6, DEFAULT_LABELS as a7, DEFAULT_LAYOUT_SYNC as a8, DEFAULT_PRICE_AXIS_CONFIG as a9, PRESET_COUNTS as aA, PRESET_LABEL as aB, PRICE_TRANSFORM_SERIES as aC, type Padding as aD, type PendingOrderLevel as aE, type PnlPillConfig as aF, type PnlPillLabels as aG, type PointFigureOptions as aH, type PositionRenderStyle as aI, type PriceAxisUiConfig as aJ, RSI as aK, type RenkoOptions as aL, SMA as aM, type SavedLayoutPane as aN, type Series as aO, type Source as aP, type Theme as aQ, type ThemeOverrides as aR, type TimeAxisUiConfig as aS, type TopBarColors as aT, type TopBarUiConfig as aU, type TradeButtonUiConfig as aV, type TradeDisplayFilter as aW, type TradeLabels as aX, type TradeLevel as aY, type TradeLevelColors as aZ, type TradePanelColors as a_, DEFAULT_TIME_AXIS_CONFIG as aa, DEFAULT_TOP_BAR_CONFIG as ab, DEFAULT_TRADE_BUTTON_CONFIG as ac, DEFAULT_UI_CONFIG as ad, type DataLoaderParams as ae, type DeepPartial$1 as af, type DeepPartialChartTheme as ag, type DialogLabels as ah, type DrawingToolbarColors as ai, type DrawingToolbarLabels as aj, type DrawingToolbarUiConfig as ak, EMA as al, EXTRA_INDICATORS as am, type IndicatorComputeContext as an, type IndicatorDef as ao, type IndicatorOverlayColors as ap, type IndicatorOverlayUiConfig as aq, type IndicatorStateEntry as ar, type KagiOptions as as, LAYOUT_PRESETS as at, LIGHT_THEME as au, type LayoutPreset as av, type LineBreakOptions as aw, MACD as ax, type OrderSubmit as ay, PRESETS_BY_COUNT as az, type IndicatorParams as b, stdev as b$, type TransformedSeries as b0, type UiConfig as b1, alma as b2, atr as b3, atrValue as b4, captureIndicatorTemplate as b5, captureLayout as b6, captureSettingsTemplate as b7, change as b8, cloneSettings as b9, lsma as bA, makeLayoutId as bB, makeSettingsTemplateId as bC, makeTemplateId as bD, mcginley as bE, methodField as bF, numField as bG, periodField as bH, registerCustomPreset as bI, removeLayout as bJ, removeSettingsTemplate as bK, removeTemplate as bL, resolveBoxSize as bM, resolveCssVarsInTheme as bN, resolveInstrument as bO, resolveLabels as bP, resolveUiConfig as bQ, rma as bR, rocPct as bS, sanitizeLayouts as bT, sanitizeSettingsTemplates as bU, sanitizeTemplates as bV, sma as bW, sourceField as bX, sourceSeries as bY, sourceValue as bZ, standardError as b_, colorField as ba, correlation as bb, cumulative as bc, deepMergeTheme as bd, dema as be, ema as bf, extraIndicatorOptions as bg, extraIndicatorPresets as bh, extraIndicatorSchemas as bi, extraSingleInstance as bj, findLayout as bk, findSettingsTemplate as bl, findTemplate as bm, formatDuration as bn, formatVolume as bo, getAllPresets as bp, getCustomPresets as bq, getPreset as br, hammingMa as bs, highest as bt, hma as bu, inferPipSize as bv, isPriceTransformSeries as bw, linregAt as bx, linregSlope as by, lowest as bz, type IndicatorTemplate as c, tema as c0, toKagi as c1, toLineBreak as c2, toMoney as c3, toPips as c4, toPointFigure as c5, toRenko as c6, trueRange as c7, unregisterCustomPreset as c8, upsertLayout as c9, upsertSettingsTemplate as ca, upsertTemplate as cb, vwma as cc, wma as cd, type PriceSource as ce, HistogramIndicatorBase as cf, type LineSpec as cg, type GuideLevel as ch, LineIndicatorBase as ci, type MaMethod as cj, BandIndicatorBase as ck, AdaptiveMA as cl, MaChannel as cm, MovingAverage as cn, MultiMA as co, applyMa as cp, combine as cq, mapSeries as cr, toResults as cs, type ChartEventMap as d, type CursorMode as e, type ChartState as f, type InstrumentSpec as g, type StatusLineSettings as h, type ScalesSettings as i, type CanvasOptions as j, type DrawingToolType as k, type SerializedDrawing as l, type IDrawing as m, type AnyDrawingStyle as n, type IWebSocketAdapter as o, type TradeLevelType as p, type SavedLayout as q, type ChartSettingsSnapshot as r, type ChartSettingsTemplate as s, type TopBarLabels as t, type OhlcLabels as u, type CrosshairPosition as v, type PriceRange as w, ScaleManager as x, type SidePanelLabels as y, type IndicatorResult as z };
3970
+ export { type ChartMiscLabels as $, type AccountSpec as A, type BarColorSource as B, type ChartTheme as C, type Duration as D, type PositionLevel as E, type AnyLevel as F, type DrawingPoint as G, type DrawingHandle as H, type IIndicator as I, type DrawingRenderContext as J, type Tick as K, type LayoutSyncState as L, type StreamStatus as M, type ActiveIndicatorState as N, type OHLCVBar as O, type PriceScaleMode as P, BollingerBands as Q, type ResolvedInstrument as R, type SeriesType as S, type Timeframe as T, type BottomBarColors as U, type Viewport as V, type BottomBarLabels as W, type BottomBarUiConfig as X, type BoxSizeMode as Y, type CanvasColorSettings as Z, type ChartLabels as _, type ChartConfig as a, type TradePanelColors as a$, type ChartThemeUi as a0, type CrosshairUiConfig as a1, DARK_THEME as a2, DEFAULT_BOTTOM_BAR_CONFIG as a3, DEFAULT_CROSSHAIR_CONFIG as a4, DEFAULT_DRAWING_TOOLBAR_CONFIG as a5, DEFAULT_INDICATOR_OVERLAY_CONFIG as a6, DEFAULT_LABELS as a7, DEFAULT_LAYOUT_SYNC as a8, DEFAULT_PRICE_AXIS_CONFIG as a9, PRESETS_BY_COUNT as aA, PRESET_COUNTS as aB, PRESET_LABEL as aC, PRICE_TRANSFORM_SERIES as aD, type Padding as aE, type PendingOrderLevel as aF, type PnlPillConfig as aG, type PnlPillLabels as aH, type PointFigureOptions as aI, type PositionRenderStyle as aJ, type PriceAxisUiConfig as aK, RSI as aL, type RenkoOptions as aM, SMA as aN, type SavedLayoutPane as aO, type Series as aP, type Source as aQ, type Theme as aR, type ThemeOverrides as aS, type TimeAxisUiConfig as aT, type TopBarColors as aU, type TopBarUiConfig as aV, type TradeButtonUiConfig as aW, type TradeDisplayFilter as aX, type TradeLabels as aY, type TradeLevel as aZ, type TradeLevelColors as a_, DEFAULT_TIME_AXIS_CONFIG as aa, DEFAULT_TOP_BAR_CONFIG as ab, DEFAULT_TRADE_BUTTON_CONFIG as ac, DEFAULT_UI_CONFIG as ad, type DataLoaderParams as ae, type DeepPartial$1 as af, type DeepPartialChartTheme as ag, type DialogLabels as ah, type DrawingToolbarColors as ai, type DrawingToolbarLabels as aj, type DrawingToolbarUiConfig as ak, EMA as al, EXTRA_INDICATORS as am, type IndicatorComputeContext as an, type IndicatorDef as ao, type IndicatorOverlayColors as ap, type IndicatorOverlayUiConfig as aq, type IndicatorStateEntry as ar, type KagiOptions as as, LAYOUT_PRESETS as at, LIGHT_THEME as au, type LayoutPreset as av, type LineBreakOptions as aw, MACD as ax, NO_VOLUME_TITLE as ay, type OrderSubmit as az, type IndicatorParams as b, sourceSeries as b$, type TransformedBarMeta as b0, type TransformedSeries as b1, type UiConfig as b2, VOLUME_STUDIES as b3, alma as b4, atr as b5, atrValue as b6, captureIndicatorTemplate as b7, captureLayout as b8, captureSettingsTemplate as b9, linregAt as bA, linregSlope as bB, lowest as bC, lsma as bD, makeLayoutId as bE, makeSettingsTemplateId as bF, makeTemplateId as bG, mcginley as bH, methodField as bI, numField as bJ, periodField as bK, registerCustomPreset as bL, removeLayout as bM, removeSettingsTemplate as bN, removeTemplate as bO, resolveBoxSize as bP, resolveCssVarsInTheme as bQ, resolveInstrument as bR, resolveLabels as bS, resolveUiConfig as bT, rma as bU, rocPct as bV, sanitizeLayouts as bW, sanitizeSettingsTemplates as bX, sanitizeTemplates as bY, sma as bZ, sourceField as b_, change as ba, cloneSettings as bb, colorField as bc, correlation as bd, cumulative as be, deepMergeTheme as bf, dema as bg, ema as bh, extraIndicatorOptions as bi, extraIndicatorPresets as bj, extraIndicatorSchemas as bk, extraInstanceNameMap as bl, extraSingleInstance as bm, findLayout as bn, findSettingsTemplate as bo, findTemplate as bp, formatDuration as bq, formatVolume as br, getAllPresets as bs, getCustomPresets as bt, getPreset as bu, hammingMa as bv, highest as bw, hma as bx, inferPipSize as by, isPriceTransformSeries as bz, type IndicatorTemplate as c, sourceValue as c0, standardError as c1, stdev as c2, tema as c3, toKagi as c4, toLineBreak as c5, toMoney as c6, toPips as c7, toPointFigure as c8, toRenko as c9, trueRange as ca, unregisterCustomPreset as cb, upsertLayout as cc, upsertSettingsTemplate as cd, upsertTemplate as ce, vwma as cf, wma as cg, type PriceSource as ch, HistogramIndicatorBase as ci, type LineSpec as cj, type GuideLevel as ck, LineIndicatorBase as cl, type MaMethod as cm, BandIndicatorBase as cn, AdaptiveMA as co, MaChannel as cp, MovingAverage as cq, MultiMA as cr, allEmpty as cs, applyMa as ct, combine as cu, drawPaneHint as cv, mapSeries as cw, toResults as cx, type ChartEventMap as d, type CursorMode as e, type ChartState as f, type InstrumentSpec as g, type StatusLineSettings as h, type ScalesSettings as i, type CanvasOptions as j, type DrawingToolType as k, type SerializedDrawing as l, type IDrawing as m, type AnyDrawingStyle as n, type IWebSocketAdapter as o, type TradeLevelType as p, type SavedLayout as q, type ChartSettingsSnapshot as r, type ChartSettingsTemplate as s, type TopBarLabels as t, type OhlcLabels as u, type CrosshairPosition as v, type PriceRange as w, ScaleManager as x, type SidePanelLabels as y, type IndicatorResult as z };