@tradecanvas/core 0.9.0 → 1.0.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 (157) hide show
  1. package/dist/axis/PriceAxis.d.ts.map +1 -1
  2. package/dist/axis/TimeAxis.d.ts +3 -0
  3. package/dist/axis/TimeAxis.d.ts.map +1 -1
  4. package/dist/charts/AreaRenderer.d.ts.map +1 -1
  5. package/dist/charts/DepthHeatmapBuffer.d.ts +25 -0
  6. package/dist/charts/DepthHeatmapBuffer.d.ts.map +1 -0
  7. package/dist/charts/DepthHeatmapRenderer.d.ts +24 -0
  8. package/dist/charts/DepthHeatmapRenderer.d.ts.map +1 -0
  9. package/dist/charts/LineRenderer.d.ts.map +1 -1
  10. package/dist/charts/MarketProfileRenderer.d.ts +53 -0
  11. package/dist/charts/MarketProfileRenderer.d.ts.map +1 -0
  12. package/dist/charts/PeriodLevelsRenderer.d.ts +17 -0
  13. package/dist/charts/PeriodLevelsRenderer.d.ts.map +1 -0
  14. package/dist/charts/PivotMarkersRenderer.d.ts +21 -0
  15. package/dist/charts/PivotMarkersRenderer.d.ts.map +1 -0
  16. package/dist/charts/downsample.d.ts +15 -0
  17. package/dist/charts/downsample.d.ts.map +1 -0
  18. package/dist/charts/index.d.ts +14 -0
  19. package/dist/charts/index.d.ts.map +1 -1
  20. package/dist/charts/lttb.bench.d.ts +2 -0
  21. package/dist/charts/lttb.bench.d.ts.map +1 -0
  22. package/dist/charts/marketProfile.d.ts +69 -0
  23. package/dist/charts/marketProfile.d.ts.map +1 -0
  24. package/dist/charts/periodLevels.d.ts +15 -0
  25. package/dist/charts/periodLevels.d.ts.map +1 -0
  26. package/dist/charts/pivots.d.ts +26 -0
  27. package/dist/charts/pivots.d.ts.map +1 -0
  28. package/dist/drawings/DrawingManager.d.ts +21 -0
  29. package/dist/drawings/DrawingManager.d.ts.map +1 -1
  30. package/dist/drawings/autoFib.d.ts +10 -0
  31. package/dist/drawings/autoFib.d.ts.map +1 -0
  32. package/dist/drawings/index.d.ts +1 -0
  33. package/dist/drawings/index.d.ts.map +1 -1
  34. package/dist/engine/RenderEngine.d.ts +7 -0
  35. package/dist/engine/RenderEngine.d.ts.map +1 -1
  36. package/dist/features/AlertManager.d.ts +26 -4
  37. package/dist/features/AlertManager.d.ts.map +1 -1
  38. package/dist/index.cjs +8 -8
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.js +4333 -727
  41. package/dist/index.js.map +1 -1
  42. package/dist/indicators/IndicatorEngine.d.ts +4 -0
  43. package/dist/indicators/IndicatorEngine.d.ts.map +1 -1
  44. package/dist/indicators/index.d.ts +33 -0
  45. package/dist/indicators/index.d.ts.map +1 -1
  46. package/dist/indicators/overlay/Alligator.d.ts +28 -0
  47. package/dist/indicators/overlay/Alligator.d.ts.map +1 -0
  48. package/dist/indicators/overlay/ChandelierExit.d.ts +23 -0
  49. package/dist/indicators/overlay/ChandelierExit.d.ts.map +1 -0
  50. package/dist/indicators/overlay/MTFMovingAverage.d.ts +23 -0
  51. package/dist/indicators/overlay/MTFMovingAverage.d.ts.map +1 -0
  52. package/dist/indicators/overlay/SessionVWAP.d.ts +26 -0
  53. package/dist/indicators/overlay/SessionVWAP.d.ts.map +1 -0
  54. package/dist/indicators/panel/AcceleratorOscillator.d.ts +24 -0
  55. package/dist/indicators/panel/AcceleratorOscillator.d.ts.map +1 -0
  56. package/dist/indicators/panel/BalanceOfPower.d.ts +20 -0
  57. package/dist/indicators/panel/BalanceOfPower.d.ts.map +1 -0
  58. package/dist/indicators/panel/ChaikinVolatility.d.ts +23 -0
  59. package/dist/indicators/panel/ChaikinVolatility.d.ts.map +1 -0
  60. package/dist/indicators/panel/ChandeMomentum.d.ts +22 -0
  61. package/dist/indicators/panel/ChandeMomentum.d.ts.map +1 -0
  62. package/dist/indicators/panel/ChoppinessIndex.d.ts +22 -0
  63. package/dist/indicators/panel/ChoppinessIndex.d.ts.map +1 -0
  64. package/dist/indicators/panel/ConnorsRSI.d.ts +25 -0
  65. package/dist/indicators/panel/ConnorsRSI.d.ts.map +1 -0
  66. package/dist/indicators/panel/Coppock.d.ts +24 -0
  67. package/dist/indicators/panel/Coppock.d.ts.map +1 -0
  68. package/dist/indicators/panel/DetrendedPriceOscillator.d.ts +21 -0
  69. package/dist/indicators/panel/DetrendedPriceOscillator.d.ts.map +1 -0
  70. package/dist/indicators/panel/DisparityIndex.d.ts +22 -0
  71. package/dist/indicators/panel/DisparityIndex.d.ts.map +1 -0
  72. package/dist/indicators/panel/EaseOfMovement.d.ts +25 -0
  73. package/dist/indicators/panel/EaseOfMovement.d.ts.map +1 -0
  74. package/dist/indicators/panel/ElderRay.d.ts +22 -0
  75. package/dist/indicators/panel/ElderRay.d.ts.map +1 -0
  76. package/dist/indicators/panel/FisherTransform.d.ts +21 -0
  77. package/dist/indicators/panel/FisherTransform.d.ts.map +1 -0
  78. package/dist/indicators/panel/ForceIndex.d.ts +21 -0
  79. package/dist/indicators/panel/ForceIndex.d.ts.map +1 -0
  80. package/dist/indicators/panel/KST.d.ts +29 -0
  81. package/dist/indicators/panel/KST.d.ts.map +1 -0
  82. package/dist/indicators/panel/Klinger.d.ts +26 -0
  83. package/dist/indicators/panel/Klinger.d.ts.map +1 -0
  84. package/dist/indicators/panel/MassIndex.d.ts +21 -0
  85. package/dist/indicators/panel/MassIndex.d.ts.map +1 -0
  86. package/dist/indicators/panel/PercentagePriceOscillator.d.ts +24 -0
  87. package/dist/indicators/panel/PercentagePriceOscillator.d.ts.map +1 -0
  88. package/dist/indicators/panel/PrettyGoodOscillator.d.ts +23 -0
  89. package/dist/indicators/panel/PrettyGoodOscillator.d.ts.map +1 -0
  90. package/dist/indicators/panel/PriceVolumeTrend.d.ts +20 -0
  91. package/dist/indicators/panel/PriceVolumeTrend.d.ts.map +1 -0
  92. package/dist/indicators/panel/Qstick.d.ts +23 -0
  93. package/dist/indicators/panel/Qstick.d.ts.map +1 -0
  94. package/dist/indicators/panel/RelativeMomentumIndex.d.ts +22 -0
  95. package/dist/indicators/panel/RelativeMomentumIndex.d.ts.map +1 -0
  96. package/dist/indicators/panel/RelativeVigor.d.ts +21 -0
  97. package/dist/indicators/panel/RelativeVigor.d.ts.map +1 -0
  98. package/dist/indicators/panel/SchaffTrendCycle.d.ts +23 -0
  99. package/dist/indicators/panel/SchaffTrendCycle.d.ts.map +1 -0
  100. package/dist/indicators/panel/StochasticRSI.d.ts +23 -0
  101. package/dist/indicators/panel/StochasticRSI.d.ts.map +1 -0
  102. package/dist/indicators/panel/TRIX.d.ts +22 -0
  103. package/dist/indicators/panel/TRIX.d.ts.map +1 -0
  104. package/dist/indicators/panel/UltimateOscillator.d.ts +25 -0
  105. package/dist/indicators/panel/UltimateOscillator.d.ts.map +1 -0
  106. package/dist/indicators/panel/VolumeDelta.d.ts +22 -0
  107. package/dist/indicators/panel/VolumeDelta.d.ts.map +1 -0
  108. package/dist/indicators/panel/Vortex.d.ts +21 -0
  109. package/dist/indicators/panel/Vortex.d.ts.map +1 -0
  110. package/dist/indicators/panel/WilliamsAD.d.ts +21 -0
  111. package/dist/indicators/panel/WilliamsAD.d.ts.map +1 -0
  112. package/dist/indicators/registry.d.ts.map +1 -1
  113. package/dist/interaction/AlertDragHandler.d.ts +21 -0
  114. package/dist/interaction/AlertDragHandler.d.ts.map +1 -0
  115. package/dist/interaction/CrosshairHandler.d.ts +3 -0
  116. package/dist/interaction/CrosshairHandler.d.ts.map +1 -1
  117. package/dist/interaction/InteractionManager.d.ts +22 -0
  118. package/dist/interaction/InteractionManager.d.ts.map +1 -1
  119. package/dist/interaction/PaneResizeHandler.d.ts +36 -0
  120. package/dist/interaction/PaneResizeHandler.d.ts.map +1 -0
  121. package/dist/interaction/index.d.ts +2 -0
  122. package/dist/interaction/index.d.ts.map +1 -1
  123. package/dist/realtime/adapters/BybitAdapter.d.ts +29 -0
  124. package/dist/realtime/adapters/BybitAdapter.d.ts.map +1 -0
  125. package/dist/realtime/adapters/CoinbaseAdapter.d.ts +25 -0
  126. package/dist/realtime/adapters/CoinbaseAdapter.d.ts.map +1 -0
  127. package/dist/realtime/adapters/KrakenAdapter.d.ts +26 -0
  128. package/dist/realtime/adapters/KrakenAdapter.d.ts.map +1 -0
  129. package/dist/realtime/adapters/PollingAdapter.d.ts +50 -0
  130. package/dist/realtime/adapters/PollingAdapter.d.ts.map +1 -0
  131. package/dist/realtime/adapters/WebSocketAdapter.d.ts +79 -0
  132. package/dist/realtime/adapters/WebSocketAdapter.d.ts.map +1 -0
  133. package/dist/realtime/adapters/index.d.ts +10 -0
  134. package/dist/realtime/adapters/index.d.ts.map +1 -1
  135. package/dist/realtime/adapters/parseUtils.d.ts +5 -0
  136. package/dist/realtime/adapters/parseUtils.d.ts.map +1 -0
  137. package/dist/trading/BracketTool.d.ts +46 -0
  138. package/dist/trading/BracketTool.d.ts.map +1 -0
  139. package/dist/trading/OrderDraftTool.d.ts +37 -0
  140. package/dist/trading/OrderDraftTool.d.ts.map +1 -0
  141. package/dist/trading/PaperExecutionAdapter.d.ts +45 -0
  142. package/dist/trading/PaperExecutionAdapter.d.ts.map +1 -0
  143. package/dist/trading/TradingManager.d.ts +15 -1
  144. package/dist/trading/TradingManager.d.ts.map +1 -1
  145. package/dist/trading/index.d.ts +6 -0
  146. package/dist/trading/index.d.ts.map +1 -1
  147. package/dist/ui/SessionBreaks.d.ts +0 -5
  148. package/dist/ui/SessionBreaks.d.ts.map +1 -1
  149. package/dist/ui/SessionShading.d.ts +19 -0
  150. package/dist/ui/SessionShading.d.ts.map +1 -0
  151. package/dist/ui/index.d.ts +3 -0
  152. package/dist/ui/index.d.ts.map +1 -1
  153. package/dist/ui/sessionHours.d.ts +17 -0
  154. package/dist/ui/sessionHours.d.ts.map +1 -0
  155. package/dist/viewport/Viewport.d.ts +6 -1
  156. package/dist/viewport/Viewport.d.ts.map +1 -1
  157. package/package.json +2 -2
@@ -0,0 +1,29 @@
1
+ import { OHLCBar, TimeFrame } from '@tradecanvas/commons';
2
+ import { WebSocketAdapter, WsParseResult } from './WebSocketAdapter.js';
3
+ type BybitCategory = 'spot' | 'linear' | 'inverse';
4
+ /** Map a TimeFrame to a Bybit kline interval token, defaulting to `1`. */
5
+ export declare function bybitInterval(timeframe: TimeFrame): string;
6
+ export interface BybitAdapterOptions {
7
+ /** REST base, default `https://api.bybit.com`. */
8
+ restBase?: string;
9
+ /** WS base, default `wss://stream.bybit.com/v5/public/spot`. */
10
+ wsBase?: string;
11
+ /** Product category, default `spot`. */
12
+ category?: BybitCategory;
13
+ }
14
+ /**
15
+ * Bybit v5 adapter (no API key). WebSocket `kline` stream for live bars, REST
16
+ * `/v5/market/kline` for history. Symbols use the `BTCUSDT` format.
17
+ */
18
+ export declare class BybitAdapter extends WebSocketAdapter {
19
+ constructor(options?: BybitAdapterOptions);
20
+ }
21
+ /** Parse a Bybit v5 kline push frame into the latest bar. */
22
+ export declare function parseBybitWsMessage(raw: unknown): WsParseResult | null;
23
+ export declare function fetchBybitKlines(restBase: string, category: BybitCategory, symbol: string, timeframe: TimeFrame, limit: number): Promise<OHLCBar[]>;
24
+ /** Parse Bybit's `result.list` (descending) into ascending bars. */
25
+ export declare function parseBybitRestKlines(json: unknown): OHLCBar[];
26
+ /** Bybit kline tuple: `[startTime(ms), open, high, low, close, volume, turnover]`. */
27
+ export declare function parseBybitRestRow(row: unknown): OHLCBar | null;
28
+ export {};
29
+ //# sourceMappingURL=BybitAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BybitAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/BybitAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG7E,KAAK,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAQnD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;gBACpC,OAAO,GAAE,mBAAwB;CAa9C;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAuBtE;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAW7D;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAe9D"}
@@ -0,0 +1,25 @@
1
+ import { OHLCBar, TimeFrame } from '@tradecanvas/commons';
2
+ import { PollingAdapter } from './PollingAdapter.js';
3
+ /** Map a TimeFrame to a Coinbase granularity (seconds), defaulting to 1h. */
4
+ export declare function coinbaseGranularity(timeframe: TimeFrame): number;
5
+ export interface CoinbaseAdapterOptions {
6
+ /** REST base, default `https://api.exchange.coinbase.com`. */
7
+ restBase?: string;
8
+ /** Poll interval in ms (default 5000). */
9
+ intervalMs?: number;
10
+ }
11
+ /**
12
+ * Coinbase Exchange adapter (no API key). Uses REST candle polling — the
13
+ * Exchange candles endpoint covers every supported granularity, which the WS
14
+ * candles channel does not. Product ids use the `BTC-USD` format. History is
15
+ * capped at ~300 candles per Coinbase's limit.
16
+ */
17
+ export declare class CoinbaseAdapter extends PollingAdapter {
18
+ constructor(options?: CoinbaseAdapterOptions);
19
+ }
20
+ export declare function fetchCoinbaseCandles(restBase: string, symbol: string, timeframe: TimeFrame): Promise<OHLCBar[]>;
21
+ /** Parse Coinbase's candle response (newest-first) into ascending bars. */
22
+ export declare function parseCoinbaseCandles(data: unknown): OHLCBar[];
23
+ /** Coinbase candle tuple: `[time(s), low, high, open, close, volume]`. */
24
+ export declare function parseCoinbaseCandle(row: unknown): OHLCBar | null;
25
+ //# sourceMappingURL=CoinbaseAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoinbaseAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/CoinbaseAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAarD,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAEhE;AAED,MAAM,WAAW,sBAAsB;IACrC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,OAAO,GAAE,sBAA2B;CASjD;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC,CAOpB;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAS7D;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAehE"}
@@ -0,0 +1,26 @@
1
+ import { OHLCBar, TimeFrame } from '@tradecanvas/commons';
2
+ import { WebSocketAdapter, WsParseResult } from './WebSocketAdapter.js';
3
+ /** Map a TimeFrame to a Kraken interval (minutes), defaulting to 1. */
4
+ export declare function krakenInterval(timeframe: TimeFrame): number;
5
+ export interface KrakenAdapterOptions {
6
+ /** REST base, default `https://api.kraken.com`. */
7
+ restBase?: string;
8
+ /** WS base (v2), default `wss://ws.kraken.com/v2`. */
9
+ wsBase?: string;
10
+ }
11
+ /**
12
+ * Kraken adapter (no API key). WebSocket v2 `ohlc` channel for live bars, REST
13
+ * `/0/public/OHLC` for history. WS symbols use the `BTC/USD` format; the REST
14
+ * `pair` is derived by stripping the slash (`BTCUSD`).
15
+ */
16
+ export declare class KrakenAdapter extends WebSocketAdapter {
17
+ constructor(options?: KrakenAdapterOptions);
18
+ }
19
+ /** Parse a Kraken v2 `ohlc` frame into the latest bar (OHLC are floats). */
20
+ export declare function parseKrakenWsMessage(raw: unknown): WsParseResult | null;
21
+ export declare function fetchKrakenOhlc(restBase: string, symbol: string, timeframe: TimeFrame): Promise<OHLCBar[]>;
22
+ /** Parse Kraken's OHLC response (result keyed by canonical pair) into bars. */
23
+ export declare function parseKrakenOhlc(json: unknown): OHLCBar[];
24
+ /** Kraken OHLC tuple: `[time(s), open, high, low, close, vwap, volume, count]`. */
25
+ export declare function parseKrakenOhlcRow(row: unknown): OHLCBar | null;
26
+ //# sourceMappingURL=KrakenAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KrakenAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/KrakenAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAS7E,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE3D;AAED,MAAM,WAAW,oBAAoB;IACnC,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,gBAAgB;gBACrC,OAAO,GAAE,oBAAyB;CAkB/C;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAuBvE;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,CAkBxD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAe/D"}
@@ -0,0 +1,50 @@
1
+ import { DataAdapter, DataAdapterConfig, DataAdapterEventType, DataAdapterListener, ConnectionState, OHLCBar, TimeFrame } from '@tradecanvas/commons';
2
+ export interface PollingAdapterOptions {
3
+ /** Adapter name, e.g. `'coinbase'`. */
4
+ name: string;
5
+ /** Fetch recent bars (ascending by time). Drives both history and polling. */
6
+ fetchBars: (symbol: string, timeframe: TimeFrame, limit: number) => Promise<OHLCBar[]>;
7
+ /** Poll interval in ms (default 5000). */
8
+ intervalMs?: number;
9
+ /** Bars to request each poll — ≥2 so a rollover's closing bar is included (default 2). */
10
+ pollLimit?: number;
11
+ /** History limit when `fetchHistory` is called without one (default 500). */
12
+ defaultHistoryLimit?: number;
13
+ /** Inject a timer (testing). Defaults to global `setInterval`/`clearInterval`. */
14
+ setInterval?: (fn: () => void, ms: number) => unknown;
15
+ clearInterval?: (handle: unknown) => void;
16
+ }
17
+ /**
18
+ * REST polling `DataAdapter` base — for feeds without a WebSocket (most stock /
19
+ * FX APIs). Polls `fetchBars` on an interval, emits the latest bar as forming,
20
+ * and emits the prior bar as `closed` when the bucket rolls over.
21
+ *
22
+ * Generic use:
23
+ * ```ts
24
+ * new PollingAdapter({ name, fetchBars, intervalMs: 3000 })
25
+ * ```
26
+ * Built-in subclass: `CoinbaseAdapter`.
27
+ */
28
+ export declare class PollingAdapter implements DataAdapter {
29
+ readonly name: string;
30
+ private state;
31
+ private listeners;
32
+ private config;
33
+ private timer;
34
+ private lastBarTime;
35
+ private readonly opts;
36
+ constructor(opts: PollingAdapterOptions);
37
+ connect(config: DataAdapterConfig): void;
38
+ disconnect(): void;
39
+ getConnectionState(): ConnectionState;
40
+ fetchHistory(symbol: string, timeframe: TimeFrame, limit?: number): Promise<OHLCBar[]>;
41
+ on<T = unknown>(event: DataAdapterEventType, listener: DataAdapterListener<T>): void;
42
+ off<T = unknown>(event: DataAdapterEventType, listener: DataAdapterListener<T>): void;
43
+ dispose(): void;
44
+ /** Run one poll cycle. Public so callers (and tests) can pull on demand. */
45
+ poll(): Promise<void>;
46
+ private startPolling;
47
+ private stopPolling;
48
+ private emitEvent;
49
+ }
50
+ //# sourceMappingURL=PollingAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PollingAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/PollingAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,OAAO,EACP,SAAS,EACV,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAA6D;IAC9E,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;gBAEjC,IAAI,EAAE,qBAAqB;IAKvC,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAQxC,UAAU,IAAI,IAAI;IAMlB,kBAAkB,IAAI,eAAe;IAIrC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAItF,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IASpF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIrF,OAAO,IAAI,IAAI;IAKf,4EAA4E;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,SAAS;CAOlB"}
@@ -0,0 +1,79 @@
1
+ import { DataAdapter, DataAdapterConfig, DataAdapterEventType, DataAdapterListener, ConnectionState, OHLCBar, RawTick, TimeFrame } from '@tradecanvas/commons';
2
+ /** Minimal structural subset of the browser WebSocket this base depends on. */
3
+ export interface WebSocketLike {
4
+ onopen: ((ev: unknown) => void) | null;
5
+ onmessage: ((ev: {
6
+ data: unknown;
7
+ }) => void) | null;
8
+ onerror: ((ev: unknown) => void) | null;
9
+ onclose: ((ev: unknown) => void) | null;
10
+ send(data: string): void;
11
+ close(): void;
12
+ }
13
+ export type WebSocketFactory = (url: string) => WebSocketLike;
14
+ /** What `parseMessage` extracts from a raw WS frame. */
15
+ export interface WsParseResult {
16
+ /** A bar update (forming or finalized). */
17
+ bar?: OHLCBar;
18
+ /** Whether `bar` is finalized (default false). */
19
+ closed?: boolean;
20
+ /** An explicit trade tick. When omitted but `bar` is present, a tick is
21
+ * synthesized from the bar close (matches BinanceAdapter). */
22
+ tick?: RawTick;
23
+ }
24
+ export interface WebSocketAdapterOptions {
25
+ /** Adapter name, e.g. `'bybit'`. */
26
+ name: string;
27
+ /** Build the WS URL for a connection. */
28
+ wsUrl: (config: DataAdapterConfig) => string;
29
+ /** Fetch historical bars (REST), ascending by time. */
30
+ fetchHistory: (symbol: string, timeframe: TimeFrame, limit: number) => Promise<OHLCBar[]>;
31
+ /** Decode a raw frame into a bar/tick; return null/undefined to ignore. */
32
+ parseMessage: (raw: unknown, config: DataAdapterConfig) => WsParseResult | null | undefined;
33
+ /** Message(s) to send on open to subscribe (sent as JSON unless a string). */
34
+ subscribeMessage?: (config: DataAdapterConfig) => unknown;
35
+ /** Message(s) to send before close to unsubscribe. */
36
+ unsubscribeMessage?: (config: DataAdapterConfig) => unknown;
37
+ /** Decode raw frame data before `parseMessage` (default: `JSON.parse` of a string). */
38
+ decode?: (data: unknown) => unknown;
39
+ /** Inject a WebSocket implementation (default: global `WebSocket`). */
40
+ socketFactory?: WebSocketFactory;
41
+ /** History limit when `fetchHistory` is called without one (default 500). */
42
+ defaultHistoryLimit?: number;
43
+ }
44
+ /**
45
+ * Configurable WebSocket `DataAdapter` base. Factors out connection lifecycle,
46
+ * subscribe/unsubscribe, event emission, decoding, and history fetch so a
47
+ * concrete adapter is just URLs plus a parse function. Reconnection is
48
+ * orchestrated by `StreamManager` (the adapter only reports `connectionChange`),
49
+ * matching `BinanceAdapter`.
50
+ *
51
+ * Generic use:
52
+ * ```ts
53
+ * new WebSocketAdapter({ name, wsUrl, fetchHistory, parseMessage })
54
+ * ```
55
+ * Built-in subclasses: `BybitAdapter`, `KrakenAdapter`.
56
+ */
57
+ export declare class WebSocketAdapter implements DataAdapter {
58
+ readonly name: string;
59
+ protected ws: WebSocketLike | null;
60
+ protected state: ConnectionState;
61
+ protected config: DataAdapterConfig | null;
62
+ private listeners;
63
+ private readonly opts;
64
+ constructor(opts: WebSocketAdapterOptions);
65
+ connect(config: DataAdapterConfig): void;
66
+ disconnect(): void;
67
+ getConnectionState(): ConnectionState;
68
+ fetchHistory(symbol: string, timeframe: TimeFrame, limit?: number): Promise<OHLCBar[]>;
69
+ on<T = unknown>(event: DataAdapterEventType, listener: DataAdapterListener<T>): void;
70
+ off<T = unknown>(event: DataAdapterEventType, listener: DataAdapterListener<T>): void;
71
+ dispose(): void;
72
+ private openSocket;
73
+ private sendMessage;
74
+ private decode;
75
+ private createSocket;
76
+ protected setState(state: ConnectionState): void;
77
+ protected emitEvent(type: DataAdapterEventType, data: unknown): void;
78
+ }
79
+ //# sourceMappingURL=WebSocketAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/WebSocketAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,14 @@
1
1
  export { BinanceAdapter } from './BinanceAdapter.js';
2
2
  export { MockAdapter } from './MockAdapter.js';
3
3
  export type { MockAdapterOptions } from './MockAdapter.js';
4
+ export { WebSocketAdapter } from './WebSocketAdapter.js';
5
+ export type { WebSocketAdapterOptions, WebSocketLike, WebSocketFactory, WsParseResult, } from './WebSocketAdapter.js';
6
+ export { PollingAdapter } from './PollingAdapter.js';
7
+ export type { PollingAdapterOptions } from './PollingAdapter.js';
8
+ export { CoinbaseAdapter } from './CoinbaseAdapter.js';
9
+ export type { CoinbaseAdapterOptions } from './CoinbaseAdapter.js';
10
+ export { BybitAdapter } from './BybitAdapter.js';
11
+ export type { BybitAdapterOptions } from './BybitAdapter.js';
12
+ export { KrakenAdapter } from './KrakenAdapter.js';
13
+ export type { KrakenAdapterOptions } from './KrakenAdapter.js';
4
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,uBAAuB,EACvB,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Shared numeric/shape coercion for adapter REST/WS payload parsing. */
2
+ /** Coerce a string-or-number field to a finite number, or null if invalid. */
3
+ export declare function toFiniteNumber(value: unknown): number | null;
4
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
5
+ //# sourceMappingURL=parseUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseUtils.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/parseUtils.ts"],"names":[],"mappings":"AAAA,yEAAyE;AAEzE,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAS5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,46 @@
1
+ import { OrderSide, Point, ViewportState, Theme } from '@tradecanvas/commons';
2
+ export type BracketHandle = 'entry' | 'sl' | 'tp';
3
+ export interface BracketDraft {
4
+ side: OrderSide;
5
+ entry: number;
6
+ stopLoss: number;
7
+ takeProfit: number;
8
+ }
9
+ export interface BracketDefaultsOptions {
10
+ /** Stop distance as a fraction of entry price. Default 0.01 (1%). */
11
+ riskFraction?: number;
12
+ /** Reward-to-risk ratio for the take-profit. Default 2. */
13
+ riskReward?: number;
14
+ }
15
+ /**
16
+ * Default SL/TP for a fresh bracket: stop `riskFraction` away from entry on the
17
+ * losing side, take-profit `riskReward`× the stop distance on the winning side.
18
+ * Pure — used by the tool and directly testable.
19
+ */
20
+ export declare function computeBracketDefaults(side: OrderSide, entry: number, opts?: BracketDefaultsOptions): BracketDraft;
21
+ /** Reward-to-risk ratio of a draft, or 0 when the stop distance is zero. */
22
+ export declare function bracketRiskReward(draft: BracketDraft): number;
23
+ /**
24
+ * In-progress bracket-order placement: an entry line plus draggable stop-loss
25
+ * and take-profit handles, rendered as shaded risk/reward zones. Geometry only
26
+ * — the `TradingManager` owns lifecycle and emits the place event on confirm.
27
+ */
28
+ export declare class BracketTool {
29
+ private draft;
30
+ private dragging;
31
+ private defaults;
32
+ constructor(defaults?: BracketDefaultsOptions);
33
+ start(side: OrderSide, entry: number): void;
34
+ cancel(): void;
35
+ isActive(): boolean;
36
+ getDraft(): BracketDraft | null;
37
+ /** Which handle (if any) is under the pointer. */
38
+ hitTest(pos: Point, viewport: ViewportState): BracketHandle | null;
39
+ beginDrag(pos: Point, viewport: ViewportState): boolean;
40
+ drag(pos: Point, viewport: ViewportState): boolean;
41
+ endDrag(): void;
42
+ isDragging(): boolean;
43
+ private priceOf;
44
+ render(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme, pricePrecision?: number): void;
45
+ }
46
+ //# sourceMappingURL=BracketTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BracketTool.d.ts","sourceRoot":"","sources":["../../src/trading/BracketTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAGnF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,sBAA2B,GAChC,YAAY,CASd;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAI7D;AAID;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,QAAQ,GAAE,sBAA2B;IAIjD,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3C,MAAM,IAAI,IAAI;IAKd,QAAQ,IAAI,OAAO;IAInB,QAAQ,IAAI,YAAY,GAAG,IAAI;IAI/B,kDAAkD;IAClD,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,aAAa,GAAG,IAAI;IAgBlE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAOvD,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAOlD,OAAO,IAAI,IAAI;IAIf,UAAU,IAAI,OAAO;IAIrB,OAAO,CAAC,OAAO;IAKf,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,SAAI,GAAG,IAAI;CA4CvG"}
@@ -0,0 +1,37 @@
1
+ import { OrderSide, OrderType, OrderPlaceIntent, Point, ViewportState, Theme } from '@tradecanvas/commons';
2
+ export interface OrderDraft {
3
+ side: OrderSide;
4
+ price: number;
5
+ quantity: number;
6
+ }
7
+ /**
8
+ * Infer an order type from the draft price relative to the market: a buy below
9
+ * (or sell above) the market is a resting limit; a buy above (or sell below) is
10
+ * a stop. With no market price known, defaults to limit. Pure and testable.
11
+ */
12
+ export declare function inferOrderType(side: OrderSide, price: number, marketPrice: number | null): OrderType;
13
+ /**
14
+ * In-progress single-order placement: one draggable price line whose order type
15
+ * (limit/stop) is derived from where it sits relative to the market. Geometry
16
+ * and state only — the `TradingManager` owns lifecycle and emits `orderPlace`
17
+ * on confirm. Mirrors `BracketTool`.
18
+ */
19
+ export declare class OrderDraftTool {
20
+ private draft;
21
+ private dragging;
22
+ start(side: OrderSide, price: number, quantity?: number): void;
23
+ cancel(): void;
24
+ isActive(): boolean;
25
+ isDragging(): boolean;
26
+ getDraft(): OrderDraft | null;
27
+ /** Update the draft price directly (used by drag; pure and testable). */
28
+ setPrice(price: number): boolean;
29
+ /** Build the place intent, inferring the type from the market price. */
30
+ toIntent(marketPrice: number | null): OrderPlaceIntent | null;
31
+ hitTest(pos: Point, viewport: ViewportState): boolean;
32
+ beginDrag(pos: Point, viewport: ViewportState): boolean;
33
+ drag(pos: Point, viewport: ViewportState): boolean;
34
+ endDrag(): void;
35
+ render(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme, marketPrice: number | null, pricePrecision?: number): void;
36
+ }
37
+ //# sourceMappingURL=OrderDraftTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderDraftTool.d.ts","sourceRoot":"","sources":["../../src/trading/OrderDraftTool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,aAAa,EACb,KAAK,EACN,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB,SAAS,CAIX;AAID;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAS;IAEzB,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,IAAI;IAKzD,MAAM,IAAI,IAAI;IAKd,QAAQ,IAAI,OAAO;IAInB,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,UAAU,GAAG,IAAI;IAI7B,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMhC,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI;IAU7D,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAKrD,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAMvD,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAKlD,OAAO,IAAI,IAAI;IAIf,MAAM,CACJ,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,cAAc,SAAI,GACjB,IAAI;CA2BR"}
@@ -0,0 +1,45 @@
1
+ import { ExecutionAdapter, ExecutionConfig, ExecutionEventType, ExecutionListener, ConnectionState, TradingOrder, TradingPosition, OrderPlaceIntent, OrderModifyIntent, OrderCancelIntent, PositionModifyIntent, PositionCloseIntent } from '@tradecanvas/commons';
2
+ export interface PaperExecutionOptions {
3
+ /** Mark price used to fill market orders before `setMarkPrice` is called. */
4
+ markPrice?: number;
5
+ }
6
+ /**
7
+ * Reference in-memory `ExecutionAdapter`: virtual fills, hedging-style
8
+ * positions (one position per filled order), and pending limit/stop orders
9
+ * triggered via `setMarkPrice()`. SL/TP auto-close when the mark crosses them.
10
+ *
11
+ * The safe sandbox for demos and tests, and the shape real broker adapters
12
+ * mirror. No network, no real money.
13
+ */
14
+ export declare class PaperExecutionAdapter implements ExecutionAdapter {
15
+ readonly name = "paper";
16
+ private state;
17
+ private listeners;
18
+ private orders;
19
+ private positions;
20
+ private markPrice;
21
+ private seq;
22
+ constructor(options?: PaperExecutionOptions);
23
+ connect(_config: ExecutionConfig): void;
24
+ disconnect(): void;
25
+ getConnectionState(): ConnectionState;
26
+ /** Feed the latest traded price; fills triggered limit/stop orders and SL/TP. */
27
+ setMarkPrice(price: number): void;
28
+ getOrders(): TradingOrder[];
29
+ getPositions(): TradingPosition[];
30
+ placeOrder(intent: OrderPlaceIntent): Promise<TradingOrder>;
31
+ modifyOrder(intent: OrderModifyIntent): Promise<void>;
32
+ cancelOrder(intent: OrderCancelIntent): Promise<void>;
33
+ modifyPosition(intent: PositionModifyIntent): Promise<void>;
34
+ closePosition(intent: PositionCloseIntent): Promise<void>;
35
+ on<T = unknown>(event: ExecutionEventType, listener: ExecutionListener<T>): void;
36
+ off<T = unknown>(event: ExecutionEventType, listener: ExecutionListener<T>): void;
37
+ dispose(): void;
38
+ private fill;
39
+ private checkPendingOrders;
40
+ private isTriggered;
41
+ private checkStops;
42
+ private nextId;
43
+ private emit;
44
+ }
45
+ //# sourceMappingURL=PaperExecutionAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaperExecutionAdapter.d.ts","sourceRoot":"","sources":["../../src/trading/PaperExecutionAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EAEjB,eAAe,EACf,YAAY,EACZ,eAAe,EAGf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAC5D,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAAyD;IAC1E,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAK;gBAEJ,OAAO,GAAE,qBAA0B;IAI/C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAOvC,UAAU,IAAI,IAAI;IAKlB,kBAAkB,IAAI,eAAe;IAIrC,iFAAiF;IACjF,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMjC,SAAS,IAAI,YAAY,EAAE;IAI3B,YAAY,IAAI,eAAe,EAAE;IAI3B,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAqB3D,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3D,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAShF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIjF,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,IAAI;IAsBZ,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,IAAI;CAOb"}
@@ -1,4 +1,4 @@
1
- import { TradingOrder, TradingPosition, DepthData, TradingConfig, ViewportState, Theme, Point } from '@tradecanvas/commons';
1
+ import { TradingOrder, TradingPosition, DepthData, TradingConfig, ViewportState, Theme, Point, OrderSide } from '@tradecanvas/commons';
2
2
  export declare class TradingManager {
3
3
  private orders;
4
4
  private positions;
@@ -10,6 +10,8 @@ export declare class TradingManager {
10
10
  private depthOverlay;
11
11
  private dragHandler;
12
12
  private contextMenu;
13
+ private bracket;
14
+ private orderDraft;
13
15
  private requestRender;
14
16
  private eventCallback;
15
17
  private container;
@@ -22,6 +24,18 @@ export declare class TradingManager {
22
24
  setDepthData(depth: DepthData | null): void;
23
25
  setCurrentPrice(price: number): void;
24
26
  setConfig(config: Partial<TradingConfig>): void;
27
+ /** Begin placing a bracket (entry + SL + TP) at `entry` for `side`. */
28
+ startBracket(side: OrderSide, entry: number): void;
29
+ cancelBracket(): void;
30
+ /** Emit `bracketPlace` with the current draft and clear it. No-op if inactive. */
31
+ confirmBracket(): boolean;
32
+ isBracketActive(): boolean;
33
+ /** Begin a draggable single-order draft at `price` for `side`. */
34
+ startOrderDraft(side: OrderSide, price: number): void;
35
+ cancelOrderDraft(): void;
36
+ /** Emit `orderPlace` with the drafted order (type inferred vs the market). */
37
+ confirmOrderDraft(): boolean;
38
+ isOrderDraftActive(): boolean;
25
39
  onPointerDown(pos: Point, viewport: ViewportState): boolean;
26
40
  onPointerMove(pos: Point, viewport: ViewportState): boolean;
27
41
  onPointerUp(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"TradingManager.d.ts","sourceRoot":"","sources":["../../src/trading/TradingManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,aAAa,EACb,KAAK,EACL,KAAK,EACN,MAAM,sBAAsB,CAAC;AAS9B,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAyD;IAC9E,OAAO,CAAC,SAAS,CAA4B;gBAEjC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAS3C,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAI1C,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAItC,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAMlE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI;IAKvC,YAAY,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,IAAI;IAKhD,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAK3C,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKpC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAO/C,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAK3D,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAO3D,WAAW,IAAI,OAAO;IAqBtB,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAS3D,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAmBlF;;;OAGG;IACH,gBAAgB,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAU5F,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"TradingManager.d.ts","sourceRoot":"","sources":["../../src/trading/TradingManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,aAAa,EACb,KAAK,EACL,KAAK,EACN,MAAM,sBAAsB,CAAC;AAU9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAAgB;IAE9B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAwB;IAE1C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAyD;IAC9E,OAAO,CAAC,SAAS,CAA4B;gBAEjC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAS3C,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;IAI1C,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAItC,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAMlE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI;IAKvC,YAAY,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,IAAI;IAKhD,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAK3C,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKpC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAO/C,uEAAuE;IACvE,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlD,aAAa,IAAI,IAAI;IAMrB,kFAAkF;IAClF,cAAc,IAAI,OAAO;IAezB,eAAe,IAAI,OAAO;IAM1B,kEAAkE;IAClE,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKrD,gBAAgB,IAAI,IAAI;IAMxB,8EAA8E;IAC9E,iBAAiB,IAAI,OAAO;IAS5B,kBAAkB,IAAI,OAAO;IAM7B,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAc3D,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAiB3D,WAAW,IAAI,OAAO;IA+BtB,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO;IAS3D,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IA6BlF;;;OAGG;IACH,gBAAgB,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAU5F,OAAO,IAAI,IAAI;CAGhB"}
@@ -5,4 +5,10 @@ export { PositionRenderer } from './PositionRenderer.js';
5
5
  export { DepthOverlay } from './DepthOverlay.js';
6
6
  export { TradingDragHandler } from './TradingDragHandler.js';
7
7
  export { TradingContextMenu } from './TradingContextMenu.js';
8
+ export { BracketTool, computeBracketDefaults, bracketRiskReward } from './BracketTool.js';
9
+ export type { BracketDraft, BracketHandle, BracketDefaultsOptions } from './BracketTool.js';
10
+ export { PaperExecutionAdapter } from './PaperExecutionAdapter.js';
11
+ export type { PaperExecutionOptions } from './PaperExecutionAdapter.js';
12
+ export { OrderDraftTool, inferOrderType } from './OrderDraftTool.js';
13
+ export type { OrderDraft } from './OrderDraftTool.js';
8
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trading/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trading/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -20,7 +20,6 @@ export interface SessionBreakConfig {
20
20
  */
21
21
  export declare class SessionBreaks {
22
22
  private config;
23
- private cachedBreaks;
24
23
  private cachedBreaksTyped;
25
24
  private lastDataLength;
26
25
  setConfig(config: Partial<SessionBreakConfig>): void;
@@ -33,10 +32,6 @@ export declare class SessionBreaks {
33
32
  */
34
33
  private computeBreaksTyped;
35
34
  private toMs;
36
- /** Legacy (kept for compatibility) — returns just the indices. */
37
- private computeBreaks;
38
- /** Get a day key from a timestamp (seconds or milliseconds) */
39
- private getDayKey;
40
35
  render(ctx: CanvasRenderingContext2D, viewport: ViewportState, theme: Theme, data: DataSeries): void;
41
36
  /** Invalidate cache when data changes */
42
37
  invalidateCache(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"SessionBreaks.d.ts","sourceRoot":"","sources":["../../src/ui/SessionBreaks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG7E,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,2FAA2F;IAC3F,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,iBAAiB,CAA8E;IACvG,OAAO,CAAC,cAAc,CAAK;IAE3B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAIpD,SAAS,IAAI,OAAO;IAIpB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,IAAI;IAIZ,kEAAkE;IAClE,OAAO,CAAC,aAAa;IAIrB,+DAA+D;IAC/D,OAAO,CAAC,SAAS;IAOjB,MAAM,CACJ,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GACf,IAAI;IAqEP,yCAAyC;IACzC,eAAe,IAAI,IAAI;CAKxB"}
1
+ {"version":3,"file":"SessionBreaks.d.ts","sourceRoot":"","sources":["../../src/ui/SessionBreaks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAG7E,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,2FAA2F;IAC3F,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,iBAAiB,CAA8E;IACvG,OAAO,CAAC,cAAc,CAAK;IAE3B,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAIpD,SAAS,IAAI,OAAO;IAIpB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA8B1B,OAAO,CAAC,IAAI;IAIZ,MAAM,CACJ,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GACf,IAAI;IAqEP,yCAAyC;IACzC,eAAe,IAAI,IAAI;CAIxB"}
@@ -0,0 +1,19 @@
1
+ import { DataSeries, ViewportState, Theme } from '@tradecanvas/commons';
2
+ import { SessionHoursConfig } from './sessionHours.js';
3
+ /** US equity regular trading hours (09:30–16:00 ET) as a sensible default. */
4
+ export declare const DEFAULT_SESSION_HOURS: SessionHoursConfig;
5
+ /**
6
+ * Dims bars outside the regular session (pre-/post-market or the overnight
7
+ * break) with a translucent overlay, so the regular session stands out. Drawn
8
+ * on the background layer behind candles.
9
+ */
10
+ export declare class SessionShading {
11
+ private visible;
12
+ private config;
13
+ setVisible(v: boolean): void;
14
+ isVisible(): boolean;
15
+ setConfig(config: Partial<SessionHoursConfig>): void;
16
+ getConfig(): SessionHoursConfig;
17
+ render(ctx: CanvasRenderingContext2D, data: DataSeries, viewport: ViewportState, theme: Theme): void;
18
+ }
19
+ //# sourceMappingURL=SessionShading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionShading.d.ts","sourceRoot":"","sources":["../../src/ui/SessionShading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,EAAE,kBAInC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAoD;IAElE,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAG5B,SAAS,IAAI,OAAO;IAGpB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAGpD,SAAS,IAAI,kBAAkB;IAI/B,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;CA+BrG"}
@@ -5,4 +5,7 @@ export { Watermark } from './Watermark.js';
5
5
  export { BarCountdown } from './BarCountdown.js';
6
6
  export { SessionBreaks } from './SessionBreaks.js';
7
7
  export type { SessionBreakConfig } from './SessionBreaks.js';
8
+ export { SessionShading, DEFAULT_SESSION_HOURS } from './SessionShading.js';
9
+ export { isRegularSession, minuteOfDay } from './sessionHours.js';
10
+ export type { SessionHoursConfig } from './sessionHours.js';
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface SessionHoursConfig {
2
+ /** Session start, minutes from midnight in the session's timezone (e.g. 570 = 09:30). */
3
+ startMinute: number;
4
+ /** Session end, minutes from midnight (e.g. 960 = 16:00). */
5
+ endMinute: number;
6
+ /** Timezone offset applied to UTC before deriving minute-of-day (e.g. -300 for EST). */
7
+ tzOffsetMinutes: number;
8
+ }
9
+ /** Minute-of-day (0–1439) for a timestamp in the configured timezone. */
10
+ export declare function minuteOfDay(timeMs: number, tzOffsetMinutes: number): number;
11
+ /**
12
+ * Whether a timestamp falls inside the regular session. Handles overnight
13
+ * sessions where `endMinute < startMinute` (e.g. a 17:00–16:00 futures session)
14
+ * by treating the window as wrapping past midnight.
15
+ */
16
+ export declare function isRegularSession(timeMs: number, config: SessionHoursConfig): boolean;
17
+ //# sourceMappingURL=sessionHours.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionHours.d.ts","sourceRoot":"","sources":["../../src/ui/sessionHours.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,eAAe,EAAE,MAAM,CAAC;CACzB;AAID,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAOpF"}
@@ -1,4 +1,4 @@
1
- import { ViewportState, Rect, DataSeries } from '@tradecanvas/commons';
1
+ import { ViewportState, Rect, DataSeries, PriceScaleMode } from '@tradecanvas/commons';
2
2
  export declare class Viewport {
3
3
  private state;
4
4
  private dataLength;
@@ -10,6 +10,11 @@ export declare class Viewport {
10
10
  getState(): ViewportState;
11
11
  setLogScale(enabled: boolean): void;
12
12
  isLogScale(): boolean;
13
+ /** Set the price-scale presentation. Keeps `logScale` mirrored for back-compat. */
14
+ setScaleMode(mode: PriceScaleMode): void;
15
+ getScaleMode(): PriceScaleMode;
16
+ /** Reference price for percentage / indexed-to-100 axis labels. */
17
+ setScaleBaseline(price: number | undefined): void;
13
18
  setRightMargin(bars: number): void;
14
19
  private computeChartRect;
15
20
  resize(width: number, height: number): void;
@@ -1 +1 @@
1
- {"version":3,"file":"Viewport.d.ts","sourceRoot":"","sources":["../../src/viewport/Viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAI5E,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;gBAG9B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,WAAW,SAAI,EACf,WAAW,SAAK,EAChB,eAAe,SAAI;IAgBrB,0DAA0D;IAC1D,QAAQ,IAAI,aAAa;IAYzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC,UAAU,IAAI,OAAO;IAIrB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,OAAO,CAAC,gBAAgB;IASxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAW9B,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAiBtD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IASrC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMnC,wEAAwE;IACxE,OAAO,IAAI,OAAO;IAUlB,WAAW,IAAI,IAAI;IAYnB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAoB1C,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,kBAAkB;CAQ3B"}
1
+ {"version":3,"file":"Viewport.d.ts","sourceRoot":"","sources":["../../src/viewport/Viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI5F,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;gBAG9B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,WAAW,SAAI,EACf,WAAW,SAAK,EAChB,eAAe,SAAI;IAgBrB,0DAA0D;IAC1D,QAAQ,IAAI,aAAa;IAczB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC,UAAU,IAAI,OAAO;IAIrB,mFAAmF;IACnF,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKxC,YAAY,IAAI,cAAc;IAI9B,mEAAmE;IACnE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIjD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,OAAO,CAAC,gBAAgB;IASxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3C,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAW9B,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI;IAiBtD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IASrC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMnC,wEAAwE;IACxE,OAAO,IAAI,OAAO;IAUlB,WAAW,IAAI,IAAI;IAYnB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAoB1C,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,kBAAkB;CAQ3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradecanvas/core",
3
- "version": "0.9.0",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "description": "Canvas rendering engine for @tradecanvas/chart",
6
6
  "license": "MIT",
@@ -34,7 +34,7 @@
34
34
  "README.md"
35
35
  ],
36
36
  "dependencies": {
37
- "@tradecanvas/commons": "0.9.0"
37
+ "@tradecanvas/commons": "1.0.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "vitest": "^2.1.8"