@stocksharp/trading-controls 1.3.0 → 1.4.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.
Files changed (62) hide show
  1. package/README.md +113 -5
  2. package/dist/esm/chart-engine.js +15 -0
  3. package/dist/esm/chart-engine.js.map +1 -0
  4. package/dist/esm/control-types.js +4 -0
  5. package/dist/esm/control-types.js.map +1 -1
  6. package/dist/esm/equity-widget.js +261 -0
  7. package/dist/esm/equity-widget.js.map +1 -0
  8. package/dist/esm/heatmap-grid.js +271 -0
  9. package/dist/esm/heatmap-grid.js.map +1 -0
  10. package/dist/esm/index.js +19 -0
  11. package/dist/esm/index.js.map +1 -1
  12. package/dist/esm/optimization-heatmap-widget.js +303 -0
  13. package/dist/esm/optimization-heatmap-widget.js.map +1 -0
  14. package/dist/esm/option-smile-widget.js +252 -0
  15. package/dist/esm/option-smile-widget.js.map +1 -0
  16. package/dist/esm/pnl-curve.js +5 -1
  17. package/dist/esm/pnl-curve.js.map +1 -1
  18. package/dist/esm/surface-grid.js +282 -0
  19. package/dist/esm/surface-grid.js.map +1 -0
  20. package/dist/esm/surface-widget.js +379 -0
  21. package/dist/esm/surface-widget.js.map +1 -0
  22. package/dist/sstradingcontrols.js +1595 -168
  23. package/dist/sstradingcontrols.js.map +4 -4
  24. package/dist/types/chart-engine.d.ts +3 -0
  25. package/dist/types/chart-engine.d.ts.map +1 -0
  26. package/dist/types/control-types.d.ts +4 -0
  27. package/dist/types/control-types.d.ts.map +1 -1
  28. package/dist/types/equity-widget.d.ts +34 -0
  29. package/dist/types/equity-widget.d.ts.map +1 -0
  30. package/dist/types/heatmap-grid.d.ts +88 -0
  31. package/dist/types/heatmap-grid.d.ts.map +1 -0
  32. package/dist/types/index.d.ts +15 -0
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/types/optimization-heatmap-widget.d.ts +45 -0
  35. package/dist/types/optimization-heatmap-widget.d.ts.map +1 -0
  36. package/dist/types/option-smile-widget.d.ts +39 -0
  37. package/dist/types/option-smile-widget.d.ts.map +1 -0
  38. package/dist/types/pnl-curve.d.ts +3 -0
  39. package/dist/types/pnl-curve.d.ts.map +1 -1
  40. package/dist/types/surface-grid.d.ts +64 -0
  41. package/dist/types/surface-grid.d.ts.map +1 -0
  42. package/dist/types/surface-widget.d.ts +64 -0
  43. package/dist/types/surface-widget.d.ts.map +1 -0
  44. package/package.json +28 -2
  45. package/screenshots/equity.png +0 -0
  46. package/screenshots/optimization-surface.png +0 -0
  47. package/screenshots/optimization.png +0 -0
  48. package/screenshots/option-smile.png +0 -0
  49. package/screenshots/panels.jpg +0 -0
  50. package/src/chart-engine.global.ts +64 -0
  51. package/src/chart-engine.ts +29 -0
  52. package/src/control-types.ts +4 -0
  53. package/src/equity-widget.ts +289 -0
  54. package/src/heatmap-grid.ts +405 -0
  55. package/src/index.ts +46 -0
  56. package/src/optimization-heatmap-widget.ts +347 -0
  57. package/src/option-smile-widget.ts +281 -0
  58. package/src/pnl-curve.ts +13 -1
  59. package/src/surface-grid.ts +410 -0
  60. package/src/surface-widget.ts +457 -0
  61. package/styles/trading-controls.css +281 -0
  62. package/translation-keys.json +14 -1
@@ -0,0 +1,3 @@
1
+ export { AreaSeries, CrosshairMode, LineSeries, createChart, } from '@stocksharp/chart';
2
+ export type { AreaData, CrosshairEvent, IChartApi, ISeriesApi, LineData, SeriesOptions, Time, } from '@stocksharp/chart';
3
+ //# sourceMappingURL=chart-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-engine.d.ts","sourceRoot":"","sources":["../../src/chart-engine.ts"],"names":[],"mappings":"AAaA,OAAO,EACH,UAAU,EACV,aAAa,EACb,UAAU,EACV,WAAW,GACd,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACR,QAAQ,EACR,cAAc,EACd,SAAS,EACT,UAAU,EACV,QAAQ,EACR,aAAa,EACb,IAAI,GACP,MAAM,mBAAmB,CAAC"}
@@ -10,6 +10,10 @@ export declare const ControlTypes: {
10
10
  readonly LogMonitor: "logMonitor";
11
11
  readonly Strategies: "strategies";
12
12
  readonly OptionDesk: "optionDesk";
13
+ readonly OptionSmile: "optionSmile";
14
+ readonly Equity: "equity";
15
+ readonly OptimizationHeatmap: "optimizationHeatmap";
16
+ readonly OptimizationSurface: "optimizationSurface";
13
17
  };
14
18
  export type ControlType = typeof ControlTypes[keyof typeof ControlTypes];
15
19
  //# sourceMappingURL=control-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-types.d.ts","sourceRoot":"","sources":["../../src/control-types.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,YAAY;;;;;;;;;;;;CAYf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"control-types.d.ts","sourceRoot":"","sources":["../../src/control-types.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;CAgBf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { TradingHost } from './trading-host.js';
2
+ import { type PnlPoint } from './pnl-curve.js';
3
+ import { type AreaData, type CrosshairEvent, type IChartApi, type ISeriesApi } from './chart-engine.js';
4
+ export interface EquityDeps {
5
+ host: TradingHost;
6
+ }
7
+ export declare class EquityWidget {
8
+ static TYPE: "equity";
9
+ rootEl: HTMLElement;
10
+ _host: TradingHost;
11
+ _closeBtn: HTMLElement | null;
12
+ _resetBtn: HTMLElement | null;
13
+ _lastEl: HTMLElement | null;
14
+ _hoverEl: HTMLElement | null;
15
+ _emptyEl: HTMLElement | null;
16
+ _chartEl: HTMLElement | null;
17
+ _chart: IChartApi | null;
18
+ _series: ISeriesApi<AreaData> | null;
19
+ _points: PnlPoint[];
20
+ _resizeObserver: ResizeObserver | null;
21
+ static create(hostEl: HTMLElement, state: Record<string, unknown>, deps: EquityDeps): EquityWidget;
22
+ static _buildRoot(host: TradingHost): HTMLElement;
23
+ constructor(rootEl: HTMLElement, _state: Record<string, unknown>, deps: EquityDeps);
24
+ dispose(): void;
25
+ update(points: PnlPoint[]): void;
26
+ resetZoom(): void;
27
+ chart(): IChartApi | null;
28
+ _ensureChart(): boolean;
29
+ _render(): void;
30
+ _fit(): void;
31
+ _renderLast(value: number | null): void;
32
+ _renderHover(param: CrosshairEvent): void;
33
+ }
34
+ //# sourceMappingURL=equity-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"equity-widget.d.ts","sourceRoot":"","sources":["../../src/equity-widget.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAEH,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EACtE,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,WAAW,CAAC;CACrB;AA2BD,qBAAa,YAAY;IACrB,MAAM,CAAC,IAAI,WAAuB;IAElC,MAAM,EAAE,WAAW,CAAC;IAEpB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,eAAe,EAAE,cAAc,GAAG,IAAI,CAAC;IAEvC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY;IAQlG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW;gBAqBrC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU;IA8BlF,OAAO,IAAI,IAAI;IAcf,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI;IAMhC,SAAS,IAAI,IAAI;IAMjB,KAAK,IAAI,SAAS,GAAG,IAAI;IAMzB,YAAY,IAAI,OAAO;IAwCvB,OAAO,IAAI,IAAI;IAwBf,IAAI,IAAI,IAAI;IAUZ,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAavC,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;CAqB5C"}
@@ -0,0 +1,88 @@
1
+ export declare const HeatDirections: {
2
+ readonly Higher: "higher";
3
+ readonly Lower: "lower";
4
+ };
5
+ export type HeatDirection = typeof HeatDirections[keyof typeof HeatDirections];
6
+ export interface HeatCell {
7
+ x: string;
8
+ y: string;
9
+ value: number;
10
+ }
11
+ export interface HeatBucket {
12
+ x: string;
13
+ y: string;
14
+ value: number;
15
+ count: number;
16
+ }
17
+ export interface HeatRect {
18
+ x: number;
19
+ y: number;
20
+ width: number;
21
+ height: number;
22
+ }
23
+ export interface HeatScale {
24
+ anchor: number;
25
+ reach: number;
26
+ min: number;
27
+ max: number;
28
+ }
29
+ export interface HeatCellShape {
30
+ bucket: HeatBucket;
31
+ rect: HeatRect;
32
+ tint: number;
33
+ best: boolean;
34
+ }
35
+ export interface HeatGapShape {
36
+ x: string;
37
+ y: string;
38
+ rect: HeatRect;
39
+ }
40
+ export interface HeatLabel {
41
+ text: string;
42
+ x: number;
43
+ y: number;
44
+ }
45
+ export interface HeatMark {
46
+ value: number;
47
+ x: number;
48
+ y: number;
49
+ }
50
+ export interface HeatLegendStep {
51
+ rect: HeatRect;
52
+ tint: number;
53
+ }
54
+ export interface HeatLegend {
55
+ steps: HeatLegendStep[];
56
+ low: HeatMark;
57
+ anchor: HeatMark;
58
+ high: HeatMark;
59
+ }
60
+ export interface HeatLayoutInput {
61
+ width: number;
62
+ height: number;
63
+ cells: readonly HeatCell[];
64
+ betterWhen: HeatDirection;
65
+ xLabel: string;
66
+ yLabel: string;
67
+ }
68
+ export interface HeatLayout {
69
+ plot: HeatRect;
70
+ columns: string[];
71
+ rows: string[];
72
+ cells: HeatCellShape[];
73
+ gaps: HeatGapShape[];
74
+ xTicks: HeatLabel[];
75
+ yTicks: HeatLabel[];
76
+ xTitle: HeatLabel;
77
+ yTitle: HeatLabel;
78
+ legend: HeatLegend;
79
+ scale: HeatScale;
80
+ }
81
+ export declare function foldCells(cells: readonly HeatCell[]): HeatBucket[];
82
+ export declare function axisValues(values: readonly string[]): string[];
83
+ export declare function heatScale(buckets: readonly HeatBucket[]): HeatScale;
84
+ export declare function tintOf(value: number, scale: HeatScale, betterWhen: HeatDirection): number;
85
+ export declare function valueAt(tint: number, scale: HeatScale, betterWhen: HeatDirection): number;
86
+ export declare function layoutHeatmap(input: HeatLayoutInput): HeatLayout | null;
87
+ export declare function hitHeatmap(layout: HeatLayout, x: number, y: number): HeatCellShape | null;
88
+ //# sourceMappingURL=heatmap-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heatmap-grid.d.ts","sourceRoot":"","sources":["../../src/heatmap-grid.ts"],"names":[],"mappings":"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"}
@@ -21,8 +21,23 @@ export type { OrderBookDeps, OrderBookView } from './orderbook-widget.js';
21
21
  export type { BookLevel, OrderBookFrame, QuoteLevel } from './trading-data.js';
22
22
  export type { CanvasPalette } from './trading-host.js';
23
23
  export { compressPnl, drawPnlCurve, pnlCurve } from './pnl-curve.js';
24
+ export { EquityWidget } from './equity-widget.js';
25
+ export type { EquityDeps } from './equity-widget.js';
26
+ export { AreaSeries, CrosshairMode, LineSeries, createChart } from './chart-engine.js';
27
+ export type { IChartApi, ISeriesApi } from './chart-engine.js';
28
+ export { OptimizationHeatmapWidget } from './optimization-heatmap-widget.js';
29
+ export type { OptimizationHeatmapDeps } from './optimization-heatmap-widget.js';
30
+ export { HeatDirections, heatScale, hitHeatmap, layoutHeatmap, tintOf, valueAt } from './heatmap-grid.js';
31
+ export { SurfaceWidget } from './surface-widget.js';
32
+ export type { SurfaceData, SurfaceDeps } from './surface-widget.js';
33
+ export { DEFAULT_VIEW, MAX_PITCH, MIN_PITCH, clampView, dragView, project, surfaceLayout, zoomView, } from './surface-grid.js';
34
+ export type { SurfaceAxis, SurfaceBox, SurfaceInput, SurfaceLayout, SurfaceQuad, SurfaceView } from './surface-grid.js';
35
+ export type { HeatBucket, HeatCell, HeatCellShape, HeatDirection, HeatGapShape, HeatLabel, HeatLayout, HeatLayoutInput, HeatLegend, HeatLegendStep, HeatMark, HeatRect, HeatScale, } from './heatmap-grid.js';
24
36
  export type { PnlBox, PnlCurve, PnlCurveContext, PnlCurveStyle, PnlPoint } from './pnl-curve.js';
25
37
  export { OptionDeskWidget, greekPlaces, greekScales, scaleChain, sideGreeks } from './option-desk-widget.js';
38
+ export { OptionSmileWidget } from './option-smile-widget.js';
39
+ export type { OptionSmileDeps } from './option-smile-widget.js';
40
+ export { sideVolatility, sortedChain, toSmileSeries } from './option-smile-widget.js';
26
41
  export type { OptionChainContext, OptionDeskDeps, OptionSide, OptionStrike } from './option-desk-widget.js';
27
42
  export { OptionTypes, d1, d2, greeks, impliedVolatility, normalCdf, normalPdf, premium } from './black-scholes.js';
28
43
  export type { Greeks, OptionInputs, OptionType } from './black-scholes.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { TradingHost } from './trading-host.js';
2
+ import type { HeatCell, HeatCellShape, HeatDirection, HeatLayout, HeatRect } from './heatmap-grid.js';
3
+ export interface HeatmapData {
4
+ xLabel: string;
5
+ yLabel: string;
6
+ metricLabel: string;
7
+ betterWhen: HeatDirection;
8
+ cells: HeatCell[];
9
+ }
10
+ export interface OptimizationHeatmapDeps {
11
+ host: TradingHost;
12
+ }
13
+ export declare class OptimizationHeatmapWidget {
14
+ static TYPE: "optimizationHeatmap";
15
+ rootEl: HTMLElement;
16
+ canvasEl: HTMLCanvasElement | null;
17
+ _host: TradingHost;
18
+ _metricEl: HTMLElement | null;
19
+ _emptyEl: HTMLElement | null;
20
+ _tooltipEl: HTMLElement | null;
21
+ _closeBtn: HTMLElement | null;
22
+ _ctx: CanvasRenderingContext2D | null;
23
+ _data: HeatmapData | null;
24
+ _layout: HeatLayout | null;
25
+ _size: {
26
+ width: number;
27
+ height: number;
28
+ } | null;
29
+ _resizeObserver: ResizeObserver | null;
30
+ static create(hostEl: HTMLElement, state: Record<string, unknown>, deps: OptimizationHeatmapDeps): OptimizationHeatmapWidget;
31
+ static _buildRoot(host: TradingHost): HTMLElement;
32
+ constructor(rootEl: HTMLElement, _state: Record<string, unknown>, deps: OptimizationHeatmapDeps);
33
+ dispose(): void;
34
+ update(data: HeatmapData): void;
35
+ _sizeCanvas(): void;
36
+ _render(): void;
37
+ _paintTint(ctx: CanvasRenderingContext2D, rect: HeatRect, tint: number, ground: string, up: string, down: string): void;
38
+ static _outline(ctx: CanvasRenderingContext2D, rect: HeatRect, inset: number): void;
39
+ _setEmpty(empty: boolean): void;
40
+ _bindHover(): void;
41
+ _showTooltip(shape: HeatCellShape, x: number, y: number): void;
42
+ _tooltipLine(label: string, value: string): HTMLElement;
43
+ _hideTooltip(): void;
44
+ }
45
+ //# sourceMappingURL=optimization-heatmap-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimization-heatmap-widget.d.ts","sourceRoot":"","sources":["../../src/optimization-heatmap-widget.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKtG,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IAGpB,UAAU,EAAE,aAAa,CAAC;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACrB;AAID,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,WAAW,CAAC;CACrB;AAmBD,qBAAa,yBAAyB;IAClC,MAAM,CAAC,IAAI,wBAAoC;IAE/C,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAEnC,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAG1B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChD,eAAe,EAAE,cAAc,GAAG,IAAI,CAAC;IAEvC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB,GAAG,yBAAyB;IAa5H,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW;gBAgBrC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,uBAAuB;IA2B/F,OAAO,IAAI,IAAI;IAQf,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAU/B,WAAW,IAAI,IAAI;IAiBnB,OAAO,IAAI,IAAI;IAoFf,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWvH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAcnF,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAM/B,UAAU,IAAI,IAAI;IAkBlB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAkC9D,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW;IAOvD,YAAY,IAAI,IAAI;CAGvB"}
@@ -0,0 +1,39 @@
1
+ import { TradingHost } from './trading-host.js';
2
+ import type { OptionChainContext, OptionSide, OptionStrike } from './option-desk-widget.js';
3
+ import { type CrosshairEvent, type IChartApi, type ISeriesApi, type LineData } from './chart-engine.js';
4
+ export interface OptionSmileDeps {
5
+ host: TradingHost;
6
+ }
7
+ export declare function sideVolatility(side: OptionSide | undefined): number | null;
8
+ export declare function sortedChain(strikes: readonly OptionStrike[]): OptionStrike[];
9
+ export declare function toSmileSeries(chain: readonly OptionStrike[], put: boolean): LineData[];
10
+ export declare class OptionSmileWidget {
11
+ static TYPE: "optionSmile";
12
+ rootEl: HTMLElement;
13
+ _host: TradingHost;
14
+ _closeBtn: HTMLElement | null;
15
+ _resetBtn: HTMLElement | null;
16
+ _emptyEl: HTMLElement | null;
17
+ _chartEl: HTMLElement | null;
18
+ _spotEl: HTMLElement | null;
19
+ _hoverEl: HTMLElement | null;
20
+ _chart: IChartApi | null;
21
+ _call: ISeriesApi<LineData> | null;
22
+ _put: ISeriesApi<LineData> | null;
23
+ _strikes: OptionStrike[];
24
+ _context: OptionChainContext;
25
+ _resizeObserver: ResizeObserver | null;
26
+ static create(hostEl: HTMLElement, state: Record<string, unknown>, deps: OptionSmileDeps): OptionSmileWidget;
27
+ static _buildRoot(host: TradingHost): HTMLElement;
28
+ constructor(rootEl: HTMLElement, _state: Record<string, unknown>, deps: OptionSmileDeps);
29
+ dispose(): void;
30
+ update(strikes: OptionStrike[], context?: OptionChainContext): void;
31
+ resetZoom(): void;
32
+ chart(): IChartApi | null;
33
+ _ensureChart(): boolean;
34
+ _render(): void;
35
+ _fit(): void;
36
+ _renderSpot(): void;
37
+ _renderHover(param: CrosshairEvent): void;
38
+ }
39
+ //# sourceMappingURL=option-smile-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-smile-widget.d.ts","sourceRoot":"","sources":["../../src/option-smile-widget.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAEH,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EACtE,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,WAAW,CAAC;CACrB;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAW1E;AAGD,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAI5E;AAOD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,QAAQ,EAAE,CAUtF;AAED,qBAAa,iBAAiB;IAC1B,MAAM,CAAC,IAAI,gBAA4B;IAEvC,MAAM,EAAE,WAAW,CAAC;IAEpB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,eAAe,EAAE,cAAc,GAAG,IAAI,CAAC;IAEvC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,GAAG,iBAAiB;IAQ5G,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW;gBAgCrC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe;IA6BvF,OAAO,IAAI,IAAI;IAef,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI;IAOvE,SAAS,IAAI,IAAI;IAKjB,KAAK,IAAI,SAAS,GAAG,IAAI;IAIzB,YAAY,IAAI,OAAO;IA+BvB,OAAO,IAAI,IAAI;IAef,IAAI,IAAI,IAAI;IAYZ,WAAW,IAAI,IAAI;IAcnB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;CAiB5C"}
@@ -14,6 +14,9 @@ export interface PnlCurve {
14
14
  zeroY: number;
15
15
  min: number;
16
16
  max: number;
17
+ from: number;
18
+ to: number;
19
+ last: number;
17
20
  positive: boolean;
18
21
  }
19
22
  export declare function compressPnl(points: readonly PnlPoint[], count: number): PnlPoint[];
@@ -1 +1 @@
1
- {"version":3,"file":"pnl-curve.d.ts","sourceRoot":"","sources":["../../src/pnl-curve.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IAErB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAE3B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAEzB,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IAGZ,QAAQ,EAAE,OAAO,CAAC;CACrB;AAeD,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CAiClF;AAQD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CA+ClF;AAID,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,EAAE,MAAM,CAAC;CACvB;AAID,MAAM,WAAW,eAAe;IAC5B,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,SAAS,IAAI,IAAI,CAAC;IAClB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,IAAI,IAAI,CAAC;IAClB,MAAM,IAAI,IAAI,CAAC;IACf,IAAI,IAAI,IAAI,CAAC;IACb,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IAGpB,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;IACrD,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;CACrB;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CA6B3G"}
1
+ {"version":3,"file":"pnl-curve.d.ts","sourceRoot":"","sources":["../../src/pnl-curve.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IAErB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAE3B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAEzB,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IAIZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IAGX,IAAI,EAAE,MAAM,CAAC;IAGb,QAAQ,EAAE,OAAO,CAAC;CACrB;AAeD,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CAiClF;AAQD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAmDlF;AAID,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,EAAE,MAAM,CAAC;CACvB;AAID,MAAM,WAAW,eAAe;IAC5B,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,SAAS,IAAI,IAAI,CAAC;IAClB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,SAAS,IAAI,IAAI,CAAC;IAClB,MAAM,IAAI,IAAI,CAAC;IACf,IAAI,IAAI,IAAI,CAAC;IACb,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IAGpB,WAAW,EAAE,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;IACrD,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,aAAa,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;CACrB;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CA6B3G"}
@@ -0,0 +1,64 @@
1
+ import { type HeatBucket, type HeatCell, type HeatDirection, type HeatScale } from './heatmap-grid.js';
2
+ export interface SurfaceView {
3
+ yaw: number;
4
+ pitch: number;
5
+ zoom: number;
6
+ }
7
+ export interface SurfaceBox {
8
+ width: number;
9
+ height: number;
10
+ }
11
+ export interface SurfaceQuad {
12
+ points: [number, number][];
13
+ tint: number;
14
+ depth: number;
15
+ bucket: HeatBucket;
16
+ }
17
+ export interface SurfaceAxis {
18
+ from: [number, number];
19
+ to: [number, number];
20
+ axis: 'x' | 'y' | 'z';
21
+ ticks: SurfaceTick[];
22
+ }
23
+ export interface SurfaceTick {
24
+ at: [number, number];
25
+ label: string;
26
+ away: [number, number];
27
+ }
28
+ export interface SurfaceVertex {
29
+ at: [number, number];
30
+ x: string;
31
+ y: string;
32
+ value: number;
33
+ depth: number;
34
+ }
35
+ export interface SurfaceLayout {
36
+ quads: SurfaceQuad[];
37
+ axes: SurfaceAxis[];
38
+ vertices: SurfaceVertex[];
39
+ xValues: string[];
40
+ yValues: string[];
41
+ scale: HeatScale;
42
+ }
43
+ export interface SurfaceInput {
44
+ width: number;
45
+ height: number;
46
+ cells: readonly HeatCell[];
47
+ betterWhen: HeatDirection;
48
+ view: SurfaceView;
49
+ }
50
+ export declare const MIN_PITCH = 0.12;
51
+ export declare const MAX_PITCH = 1.45;
52
+ export declare const DEFAULT_VIEW: SurfaceView;
53
+ export declare function clampView(view: SurfaceView): SurfaceView;
54
+ export declare function dragView(view: SurfaceView, dx: number, dy: number): SurfaceView;
55
+ export declare function zoomView(view: SurfaceView, factor: number): SurfaceView;
56
+ export declare function project(nx: number, ny: number, nz: number, view: SurfaceView, box: SurfaceBox): {
57
+ x: number;
58
+ y: number;
59
+ depth: number;
60
+ };
61
+ export declare function surfaceLayout(input: SurfaceInput): SurfaceLayout | null;
62
+ export declare const SURFACE_HEIGHT_TICKS: readonly number[];
63
+ export declare function nearestVertex(vertices: readonly SurfaceVertex[], x: number, y: number, reach: number): SurfaceVertex | null;
64
+ //# sourceMappingURL=surface-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-grid.d.ts","sourceRoot":"","sources":["../../src/surface-grid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { TradingHost } from './trading-host.js';
2
+ import { type HeatCell, type HeatDirection } from './heatmap-grid.js';
3
+ import { type SurfaceLayout, type SurfaceVertex, type SurfaceView } from './surface-grid.js';
4
+ export interface SurfaceData {
5
+ xLabel: string;
6
+ yLabel: string;
7
+ metricLabel: string;
8
+ betterWhen: HeatDirection;
9
+ cells: HeatCell[];
10
+ }
11
+ export interface SurfaceDeps {
12
+ host: TradingHost;
13
+ }
14
+ export declare function wheelNotches(deltaY: number, deltaMode: number): number;
15
+ export declare class SurfaceWidget {
16
+ static TYPE: "optimizationSurface";
17
+ rootEl: HTMLElement;
18
+ canvasEl: HTMLCanvasElement | null;
19
+ _host: TradingHost;
20
+ _closeBtn: HTMLElement | null;
21
+ _resetBtn: HTMLElement | null;
22
+ _emptyEl: HTMLElement | null;
23
+ _ctx: CanvasRenderingContext2D | null;
24
+ _data: SurfaceData | null;
25
+ _view: SurfaceView;
26
+ _resizeObserver: ResizeObserver | null;
27
+ _pointers: Map<number, {
28
+ x: number;
29
+ y: number;
30
+ }>;
31
+ _pinch: number;
32
+ _layout: SurfaceLayout | null;
33
+ _hover: SurfaceVertex | null;
34
+ _hoverEl: HTMLElement | null;
35
+ static create(hostEl: HTMLElement, state: Record<string, unknown>, deps: SurfaceDeps): SurfaceWidget;
36
+ static _buildRoot(host: TradingHost): HTMLElement;
37
+ constructor(rootEl: HTMLElement, _state: Record<string, unknown>, deps: SurfaceDeps);
38
+ dispose(): void;
39
+ update(data: SurfaceData): void;
40
+ view(): SurfaceView;
41
+ resetView(): void;
42
+ _bindGestures(): void;
43
+ _setHover(x: number | null, y: number | null): void;
44
+ _renderHover(): void;
45
+ _pointerSpread(): number;
46
+ _render(): void;
47
+ _drawAxes(ctx: CanvasRenderingContext2D, layout: SurfaceLayout, palette: {
48
+ grid: string;
49
+ font: string;
50
+ }): void;
51
+ _tickLabel(axis: 'x' | 'y' | 'z', label: string, layout: SurfaceLayout): string;
52
+ _axisCaption(axis: 'x' | 'y' | 'z'): string;
53
+ _drawHover(ctx: CanvasRenderingContext2D, palette: {
54
+ up: string;
55
+ grid: string;
56
+ }): void;
57
+ _drawFloor(ctx: CanvasRenderingContext2D, layout: SurfaceLayout, colour: string): void;
58
+ _drawFaces(ctx: CanvasRenderingContext2D, layout: SurfaceLayout, palette: {
59
+ up: string;
60
+ down: string;
61
+ grid: string;
62
+ }): void;
63
+ }
64
+ //# sourceMappingURL=surface-widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-widget.d.ts","sourceRoot":"","sources":["../../src/surface-widget.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stocksharp/trading-controls",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Browser trading controls for StockSharp: order blotters, positions, trade history, watchlist and trade feed, each built against one host port and rendering its own DOM.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
@@ -101,6 +101,22 @@
101
101
  "types": "./dist/types/option-desk-widget.d.ts",
102
102
  "import": "./dist/esm/option-desk-widget.js"
103
103
  },
104
+ "./option-smile-widget": {
105
+ "types": "./dist/types/option-smile-widget.d.ts",
106
+ "import": "./dist/esm/option-smile-widget.js"
107
+ },
108
+ "./equity-widget": {
109
+ "types": "./dist/types/equity-widget.d.ts",
110
+ "import": "./dist/esm/equity-widget.js"
111
+ },
112
+ "./optimization-heatmap-widget": {
113
+ "types": "./dist/types/optimization-heatmap-widget.d.ts",
114
+ "import": "./dist/esm/optimization-heatmap-widget.js"
115
+ },
116
+ "./surface-widget": {
117
+ "types": "./dist/types/surface-widget.d.ts",
118
+ "import": "./dist/esm/surface-widget.js"
119
+ },
104
120
  "./trading-data": {
105
121
  "types": "./dist/types/trading-data.d.ts",
106
122
  "import": "./dist/esm/trading-data.js"
@@ -121,6 +137,13 @@
121
137
  "./source/strategies-widget": "./src/strategies-widget.ts",
122
138
  "./source/log-monitor-widget": "./src/log-monitor-widget.ts",
123
139
  "./source/option-desk-widget": "./src/option-desk-widget.ts",
140
+ "./source/option-smile-widget": "./src/option-smile-widget.ts",
141
+ "./source/chart-engine": "./src/chart-engine.ts",
142
+ "./source/equity-widget": "./src/equity-widget.ts",
143
+ "./source/optimization-heatmap-widget": "./src/optimization-heatmap-widget.ts",
144
+ "./source/heatmap-grid": "./src/heatmap-grid.ts",
145
+ "./source/surface-widget": "./src/surface-widget.ts",
146
+ "./source/surface-grid": "./src/surface-grid.ts",
124
147
  "./source/trading-data": "./src/trading-data.ts",
125
148
  "./styles.css": "./styles/trading-controls.css",
126
149
  "./theme.css": "./styles/theme.css",
@@ -164,10 +187,13 @@
164
187
  "@stocksharp/grids": "^1.2.1"
165
188
  },
166
189
  "devDependencies": {
167
- "@stocksharp/chart": "^0.2.3",
190
+ "@stocksharp/chart": "^2.4.0",
168
191
  "@types/node": "^24.0.0",
169
192
  "dockview-core": "^6.6.1",
170
193
  "esbuild": "^0.25.0",
171
194
  "typescript": "^5.8.0"
195
+ },
196
+ "peerDependencies": {
197
+ "@stocksharp/chart": "^2.1.0"
172
198
  }
173
199
  }
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,64 @@
1
+ // The chart engine, off the global its own bundle publishes.
2
+ //
3
+ // Only the IIFE build uses this file: `build.mjs` points `./chart-engine.js` here, so the browser
4
+ // bundle carries no copy of @stocksharp/chart. A page that loads `sschart.js` and
5
+ // `sstradingcontrols.js` would otherwise hold two of them - a megabyte twice, and two registries
6
+ // of series definitions that do not recognise each other's, so a series added through one engine
7
+ // is invisible to the other.
8
+ //
9
+ // Everything an npm consumer sees goes through `chart-engine.ts` and imports the package
10
+ // properly; this exists because a script tag has no module resolution to do that with.
11
+ import type {
12
+ TimedSeriesData,
13
+ AreaData as EngineAreaData,
14
+ CrosshairEvent as EngineCrosshairEvent,
15
+ IChartApi as EngineChartApi,
16
+ ISeriesApi as EngineSeriesApi,
17
+ LineData as EngineLineData,
18
+ SeriesOptions as EngineSeriesOptions,
19
+ Time as EngineTime,
20
+ } from '@stocksharp/chart';
21
+
22
+ export type AreaData = EngineAreaData;
23
+ export type CrosshairEvent = EngineCrosshairEvent;
24
+ export type IChartApi = EngineChartApi;
25
+ export type ISeriesApi<T extends TimedSeriesData> = EngineSeriesApi<T>;
26
+ export type LineData = EngineLineData;
27
+ export type SeriesOptions = EngineSeriesOptions;
28
+ export type Time = EngineTime;
29
+
30
+ /// The global `@stocksharp/chart`'s own bundle assigns itself to.
31
+ interface ChartGlobal {
32
+ createChart: typeof import('@stocksharp/chart').createChart;
33
+ AreaSeries: typeof import('@stocksharp/chart').AreaSeries;
34
+ LineSeries: typeof import('@stocksharp/chart').LineSeries;
35
+ CrosshairMode: typeof import('@stocksharp/chart').CrosshairMode;
36
+ }
37
+
38
+ function engine(): ChartGlobal {
39
+ const found = (globalThis as { SSChart?: ChartGlobal }).SSChart;
40
+ if (found === undefined || found === null) {
41
+ // Named plainly, because the fix is one script tag and a message that only says
42
+ // "createChart is not a function" sends a reader into this package instead.
43
+ throw new Error(
44
+ 'The chart panels need @stocksharp/chart. Load its bundle (sschart.js) before '
45
+ + 'sstradingcontrols.js, or import this package from npm rather than as a script.');
46
+ }
47
+ return found;
48
+ }
49
+
50
+ // Read through on every call rather than captured at load: a script tag order that puts this
51
+ // bundle first would otherwise fail permanently instead of only until the engine arrives.
52
+ export const createChart: ChartGlobal['createChart'] = (container, options) => engine().createChart(container, options);
53
+
54
+ export const AreaSeries = new Proxy({} as ChartGlobal['AreaSeries'], {
55
+ get: (_target, key) => (engine().AreaSeries as unknown as Record<string | symbol, unknown>)[key],
56
+ });
57
+
58
+ export const LineSeries = new Proxy({} as ChartGlobal['LineSeries'], {
59
+ get: (_target, key) => (engine().LineSeries as unknown as Record<string | symbol, unknown>)[key],
60
+ });
61
+
62
+ export const CrosshairMode = new Proxy({} as ChartGlobal['CrosshairMode'], {
63
+ get: (_target, key) => (engine().CrosshairMode as unknown as Record<string | symbol, unknown>)[key],
64
+ });
@@ -0,0 +1,29 @@
1
+ // The chart engine, in one place.
2
+ //
3
+ // Two panels here are charts rather than drawings - an equity curve over time and a smile over
4
+ // strike - and @stocksharp/chart already does what a chart does: a crosshair that names the
5
+ // point under the pointer, a wheel that zooms about it, a drag that pans, tick labels that pick
6
+ // their own step. Re-implementing that was two engines and a poorer result, so it is a peer
7
+ // dependency now and the panels are built on it.
8
+ //
9
+ // Every import of it goes through this module, for one reason: the IIFE bundle must NOT inline
10
+ // the engine. A page that loads `sschart.js` and `sstradingcontrols.js` would otherwise hold two
11
+ // copies of it - a megabyte twice over, and two registries of series definitions that do not
12
+ // recognise each other's. `build.mjs` points this specifier at `chart-engine.global.ts` for that
13
+ // build, which reads the engine off the global the chart's own bundle publishes.
14
+ export {
15
+ AreaSeries,
16
+ CrosshairMode,
17
+ LineSeries,
18
+ createChart,
19
+ } from '@stocksharp/chart';
20
+
21
+ export type {
22
+ AreaData,
23
+ CrosshairEvent,
24
+ IChartApi,
25
+ ISeriesApi,
26
+ LineData,
27
+ SeriesOptions,
28
+ Time,
29
+ } from '@stocksharp/chart';