@forgecharts/sdk 1.1.28 → 1.1.30
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/dist/index.js +8100 -48
- package/dist/index.js.map +1 -1
- package/dist/internal.js +8851 -31
- package/dist/internal.js.map +1 -1
- package/dist/react/index.js +11558 -27
- package/dist/react/index.js.map +1 -1
- package/dist/react/internal.js +12147 -43
- package/dist/react/internal.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/backwardCompatibility.test.js +0 -159
- package/dist/__tests__/backwardCompatibility.test.js.map +0 -1
- package/dist/__tests__/candleInvariant.test.js +0 -415
- package/dist/__tests__/candleInvariant.test.js.map +0 -1
- package/dist/__tests__/public-api-surface.js +0 -38
- package/dist/__tests__/public-api-surface.js.map +0 -1
- package/dist/__tests__/timeframeBoundary.test.js +0 -452
- package/dist/__tests__/timeframeBoundary.test.js.map +0 -1
- package/dist/api/DrawingManager.js +0 -190
- package/dist/api/DrawingManager.js.map +0 -1
- package/dist/api/EventBus.js +0 -44
- package/dist/api/EventBus.js.map +0 -1
- package/dist/api/IndicatorDAG.js +0 -316
- package/dist/api/IndicatorDAG.js.map +0 -1
- package/dist/api/IndicatorRegistry.js +0 -39
- package/dist/api/IndicatorRegistry.js.map +0 -1
- package/dist/api/LayoutManager.js +0 -51
- package/dist/api/LayoutManager.js.map +0 -1
- package/dist/api/PaneManager.js +0 -119
- package/dist/api/PaneManager.js.map +0 -1
- package/dist/api/ReferenceAPI.js +0 -153
- package/dist/api/ReferenceAPI.js.map +0 -1
- package/dist/api/TChart.js +0 -765
- package/dist/api/TChart.js.map +0 -1
- package/dist/api/createChart.js +0 -42
- package/dist/api/createChart.js.map +0 -1
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js +0 -22
- package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +0 -1
- package/dist/api/drawing tools/lines menu/crossLine.js +0 -16
- package/dist/api/drawing tools/lines menu/crossLine.js.map +0 -1
- package/dist/api/drawing tools/lines menu/disjointChannel.js +0 -59
- package/dist/api/drawing tools/lines menu/disjointChannel.js.map +0 -1
- package/dist/api/drawing tools/lines menu/extendedLine.js +0 -17
- package/dist/api/drawing tools/lines menu/extendedLine.js.map +0 -1
- package/dist/api/drawing tools/lines menu/flatTopBottom.js +0 -41
- package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +0 -1
- package/dist/api/drawing tools/lines menu/horizontal.js +0 -19
- package/dist/api/drawing tools/lines menu/horizontal.js.map +0 -1
- package/dist/api/drawing tools/lines menu/horizontalRay.js +0 -20
- package/dist/api/drawing tools/lines menu/horizontalRay.js.map +0 -1
- package/dist/api/drawing tools/lines menu/infoLine.js +0 -107
- package/dist/api/drawing tools/lines menu/infoLine.js.map +0 -1
- package/dist/api/drawing tools/lines menu/insidePitchfork.js +0 -31
- package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +0 -15
- package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/parallelChannel.js +0 -43
- package/dist/api/drawing tools/lines menu/parallelChannel.js.map +0 -1
- package/dist/api/drawing tools/lines menu/pitchfork.js +0 -12
- package/dist/api/drawing tools/lines menu/pitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/ray.js +0 -23
- package/dist/api/drawing tools/lines menu/ray.js.map +0 -1
- package/dist/api/drawing tools/lines menu/regressionTrend.js +0 -127
- package/dist/api/drawing tools/lines menu/regressionTrend.js.map +0 -1
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js +0 -15
- package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +0 -1
- package/dist/api/drawing tools/lines menu/trendAngle.js +0 -51
- package/dist/api/drawing tools/lines menu/trendAngle.js.map +0 -1
- package/dist/api/drawing tools/lines menu/trendline.js +0 -11
- package/dist/api/drawing tools/lines menu/trendline.js.map +0 -1
- package/dist/api/drawing tools/lines menu/vertical.js +0 -11
- package/dist/api/drawing tools/lines menu/vertical.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/crosshair.js +0 -16
- package/dist/api/drawing tools/pointers menu/crosshair.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/cursor.js +0 -15
- package/dist/api/drawing tools/pointers menu/cursor.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/demonstration.js +0 -30
- package/dist/api/drawing tools/pointers menu/demonstration.js.map +0 -1
- package/dist/api/drawing tools/pointers menu/dot.js +0 -23
- package/dist/api/drawing tools/pointers menu/dot.js.map +0 -1
- package/dist/api/drawing tools/shapes menu/rectangle.js +0 -19
- package/dist/api/drawing tools/shapes menu/rectangle.js.map +0 -1
- package/dist/api/drawing tools/shapes menu/text.js +0 -25
- package/dist/api/drawing tools/shapes menu/text.js.map +0 -1
- package/dist/api/drawingUtils.js +0 -83
- package/dist/api/drawingUtils.js.map +0 -1
- package/dist/core/CanvasLayer.js +0 -56
- package/dist/core/CanvasLayer.js.map +0 -1
- package/dist/core/Chart.js +0 -839
- package/dist/core/Chart.js.map +0 -1
- package/dist/core/CoordTransform.js +0 -224
- package/dist/core/CoordTransform.js.map +0 -1
- package/dist/core/Crosshair.js +0 -186
- package/dist/core/Crosshair.js.map +0 -1
- package/dist/core/IndicatorEngine.js +0 -181
- package/dist/core/IndicatorEngine.js.map +0 -1
- package/dist/core/InteractionManager.js +0 -698
- package/dist/core/InteractionManager.js.map +0 -1
- package/dist/core/PriceScale.js +0 -113
- package/dist/core/PriceScale.js.map +0 -1
- package/dist/core/Series.js +0 -114
- package/dist/core/Series.js.map +0 -1
- package/dist/core/TimeScale.js +0 -150
- package/dist/core/TimeScale.js.map +0 -1
- package/dist/datafeed/DatafeedConnector.js +0 -268
- package/dist/datafeed/DatafeedConnector.js.map +0 -1
- package/dist/engine/CandleEngine.js +0 -318
- package/dist/engine/CandleEngine.js.map +0 -1
- package/dist/engine/__tests__/CandleEngine.test.js +0 -300
- package/dist/engine/__tests__/CandleEngine.test.js.map +0 -1
- package/dist/engine/candleInvariants.js +0 -134
- package/dist/engine/candleInvariants.js.map +0 -1
- package/dist/engine/mergeUtils.js +0 -64
- package/dist/engine/mergeUtils.js.map +0 -1
- package/dist/engine/timeframeUtils.js +0 -100
- package/dist/engine/timeframeUtils.js.map +0 -1
- package/dist/licensing/ChartRuntimeResolver.js +0 -310
- package/dist/licensing/ChartRuntimeResolver.js.map +0 -1
- package/dist/licensing/LicenseManager.js +0 -114
- package/dist/licensing/LicenseManager.js.map +0 -1
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +0 -177
- package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +0 -1
- package/dist/licensing/__tests__/LicenseManager.test.js +0 -153
- package/dist/licensing/__tests__/LicenseManager.test.js.map +0 -1
- package/dist/licensing/licenseTypes.js +0 -2
- package/dist/licensing/licenseTypes.js.map +0 -1
- package/dist/pine/PineCompiler.js +0 -44
- package/dist/pine/PineCompiler.js.map +0 -1
- package/dist/pine/diagnostics.js +0 -11
- package/dist/pine/diagnostics.js.map +0 -1
- package/dist/pine/index.js +0 -5
- package/dist/pine/index.js.map +0 -1
- package/dist/pine/pine-ast.js +0 -19
- package/dist/pine/pine-ast.js.map +0 -1
- package/dist/pine/pine-lexer.js +0 -249
- package/dist/pine/pine-lexer.js.map +0 -1
- package/dist/pine/pine-parser.js +0 -416
- package/dist/pine/pine-parser.js.map +0 -1
- package/dist/pine/pine-transpiler.js +0 -260
- package/dist/pine/pine-transpiler.js.map +0 -1
- package/dist/pixi/LayerName.js +0 -35
- package/dist/pixi/LayerName.js.map +0 -1
- package/dist/pixi/PixiCandlestickRenderer.js +0 -107
- package/dist/pixi/PixiCandlestickRenderer.js.map +0 -1
- package/dist/pixi/PixiChart.js +0 -367
- package/dist/pixi/PixiChart.js.map +0 -1
- package/dist/pixi/PixiCrosshairRenderer.js +0 -110
- package/dist/pixi/PixiCrosshairRenderer.js.map +0 -1
- package/dist/pixi/PixiDrawingRenderer.js +0 -111
- package/dist/pixi/PixiDrawingRenderer.js.map +0 -1
- package/dist/pixi/PixiGridRenderer.js +0 -114
- package/dist/pixi/PixiGridRenderer.js.map +0 -1
- package/dist/pixi/PixiLayerManager.js +0 -92
- package/dist/pixi/PixiLayerManager.js.map +0 -1
- package/dist/react/canvas/ChartCanvas.js +0 -604
- package/dist/react/canvas/ChartCanvas.js.map +0 -1
- package/dist/react/canvas/ChartContextMenu.js +0 -5
- package/dist/react/canvas/ChartContextMenu.js.map +0 -1
- package/dist/react/canvas/ChartSettingsDialog.js +0 -28
- package/dist/react/canvas/ChartSettingsDialog.js.map +0 -1
- package/dist/react/canvas/IndicatorLabel.js +0 -196
- package/dist/react/canvas/IndicatorLabel.js.map +0 -1
- package/dist/react/canvas/IndicatorPane.js +0 -395
- package/dist/react/canvas/IndicatorPane.js.map +0 -1
- package/dist/react/canvas/PointerOverlay.js +0 -61
- package/dist/react/canvas/PointerOverlay.js.map +0 -1
- package/dist/react/canvas/toolbars/LeftToolbar.js +0 -407
- package/dist/react/canvas/toolbars/LeftToolbar.js.map +0 -1
- package/dist/react/hooks/useChartCapabilities.js +0 -66
- package/dist/react/hooks/useChartCapabilities.js.map +0 -1
- package/dist/react/shell/ManagedAppShell.js +0 -440
- package/dist/react/shell/ManagedAppShell.js.map +0 -1
- package/dist/react/trading/TradingBridge.js +0 -73
- package/dist/react/trading/TradingBridge.js.map +0 -1
- package/dist/react/workspace/ChartWorkspace.js +0 -42
- package/dist/react/workspace/ChartWorkspace.js.map +0 -1
- package/dist/react/workspace/FloatingPanel.js +0 -82
- package/dist/react/workspace/FloatingPanel.js.map +0 -1
- package/dist/react/workspace/IndicatorsDialog.js +0 -121
- package/dist/react/workspace/IndicatorsDialog.js.map +0 -1
- package/dist/react/workspace/LayoutMenu.js +0 -113
- package/dist/react/workspace/LayoutMenu.js.map +0 -1
- package/dist/react/workspace/SymbolSearchDialog.js +0 -245
- package/dist/react/workspace/SymbolSearchDialog.js.map +0 -1
- package/dist/react/workspace/TabBar.js +0 -29
- package/dist/react/workspace/TabBar.js.map +0 -1
- package/dist/react/workspace/toolbars/BottomToolbar.js +0 -236
- package/dist/react/workspace/toolbars/BottomToolbar.js.map +0 -1
- package/dist/react/workspace/toolbars/RightToolbar.js +0 -18
- package/dist/react/workspace/toolbars/RightToolbar.js.map +0 -1
- package/dist/react/workspace/toolbars/TopToolbar.js +0 -82
- package/dist/react/workspace/toolbars/TopToolbar.js.map +0 -1
- package/dist/renderers/CandlestickRenderer.js +0 -98
- package/dist/renderers/CandlestickRenderer.js.map +0 -1
- package/dist/renderers/HistogramRenderer.js +0 -50
- package/dist/renderers/HistogramRenderer.js.map +0 -1
- package/dist/renderers/LineRenderer.js +0 -64
- package/dist/renderers/LineRenderer.js.map +0 -1
- package/dist/theme/colors.js +0 -19
- package/dist/theme/colors.js.map +0 -1
- package/dist/tools/barDivergenceCheck.js +0 -200
- package/dist/tools/barDivergenceCheck.js.map +0 -1
- package/dist/trading/TradingOverlayStore.js +0 -139
- package/dist/trading/TradingOverlayStore.js.map +0 -1
- package/dist/trading/UnmanagedIngestion.js +0 -114
- package/dist/trading/UnmanagedIngestion.js.map +0 -1
- package/dist/trading/__tests__/ManagedTradingController.test.js +0 -271
- package/dist/trading/__tests__/ManagedTradingController.test.js.map +0 -1
- package/dist/trading/__tests__/TradingOverlayStore.test.js +0 -267
- package/dist/trading/__tests__/TradingOverlayStore.test.js.map +0 -1
- package/dist/trading/__tests__/UnmanagedIngestion.test.js +0 -170
- package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +0 -1
- package/dist/trading/managed/ManagedTradingController.js +0 -247
- package/dist/trading/managed/ManagedTradingController.js.map +0 -1
- package/dist/trading/managed/managedCapabilities.js +0 -79
- package/dist/trading/managed/managedCapabilities.js.map +0 -1
- package/dist/trading/managed/managedTypes.js +0 -13
- package/dist/trading/managed/managedTypes.js.map +0 -1
- package/dist/trading/tradingTypes.js +0 -8
- package/dist/trading/tradingTypes.js.map +0 -1
- package/dist/tscript/TScriptIndicator.js +0 -47
- package/dist/tscript/TScriptIndicator.js.map +0 -1
- package/dist/tscript/ast.js +0 -22
- package/dist/tscript/ast.js.map +0 -1
- package/dist/tscript/lexer.js +0 -187
- package/dist/tscript/lexer.js.map +0 -1
- package/dist/tscript/parser.js +0 -318
- package/dist/tscript/parser.js.map +0 -1
- package/dist/tscript/runtime.js +0 -475
- package/dist/tscript/runtime.js.map +0 -1
- package/dist/tscript/series.js +0 -79
- package/dist/tscript/series.js.map +0 -1
- package/dist/types/IChart.js +0 -2
- package/dist/types/IChart.js.map +0 -1
- package/dist/types/IRenderer.js +0 -2
- package/dist/types/IRenderer.js.map +0 -1
- package/dist/types/ISeries.js +0 -2
- package/dist/types/ISeries.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CandlestickRenderer.js","sourceRoot":"","sources":["../../src/renderers/CandlestickRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { mapRange } from '@forgecharts/utils';
|
|
2
|
-
/**
|
|
3
|
-
* HistogramRenderer — draws volume or indicator values as vertical bars.
|
|
4
|
-
*/
|
|
5
|
-
export class HistogramRenderer {
|
|
6
|
-
_colors;
|
|
7
|
-
constructor(colors) {
|
|
8
|
-
this._colors = colors;
|
|
9
|
-
}
|
|
10
|
-
draw(ctx, bars, viewport, rect, options) {
|
|
11
|
-
if (options.type !== 'histogram')
|
|
12
|
-
return;
|
|
13
|
-
const color = options.color ?? '#8b949e';
|
|
14
|
-
const plotW = rect.width - 70;
|
|
15
|
-
const plotH = rect.height - 30;
|
|
16
|
-
// Derive pitch from candle interval × pixels-per-second (same fix as CandlestickRenderer)
|
|
17
|
-
let candleInterval = 0;
|
|
18
|
-
if (bars.length >= 2) {
|
|
19
|
-
const deltas = [];
|
|
20
|
-
for (let i = 1; i < Math.min(bars.length, 20); i++) {
|
|
21
|
-
const d = bars[i].time - bars[i - 1].time;
|
|
22
|
-
if (d > 0)
|
|
23
|
-
deltas.push(d);
|
|
24
|
-
}
|
|
25
|
-
if (deltas.length > 0) {
|
|
26
|
-
deltas.sort((a, b) => a - b);
|
|
27
|
-
candleInterval = deltas[Math.floor(deltas.length / 2)];
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
const visibleSpan = viewport.timeRange.to - viewport.timeRange.from;
|
|
31
|
-
const pixelsPerSecond = visibleSpan > 0 ? plotW / visibleSpan : 1;
|
|
32
|
-
const barPitch = candleInterval > 0
|
|
33
|
-
? candleInterval * pixelsPerSecond
|
|
34
|
-
: plotW / Math.max(1, bars.length);
|
|
35
|
-
const barWidth = Math.max(1, Math.floor(barPitch) - 1);
|
|
36
|
-
const halfBar = barWidth / 2;
|
|
37
|
-
const baseline = plotH; // draws from bottom up
|
|
38
|
-
for (const bar of bars) {
|
|
39
|
-
const x = mapRange(bar.time, viewport.timeRange.from, viewport.timeRange.to, 0, plotW);
|
|
40
|
-
if (x < -barWidth || x > plotW + barWidth)
|
|
41
|
-
continue;
|
|
42
|
-
const y = mapRange(bar.volume, viewport.priceRange.max, viewport.priceRange.min, 0, plotH);
|
|
43
|
-
const barH = Math.max(1, baseline - y);
|
|
44
|
-
ctx.fillStyle = bar.close >= bar.open ? '#26a641' : '#f85149';
|
|
45
|
-
ctx.fillRect(x - halfBar, y, barWidth, barH);
|
|
46
|
-
}
|
|
47
|
-
void color; // unused when per-bar coloring is active
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=HistogramRenderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HistogramRenderer.js","sourceRoot":"","sources":["../../src/renderers/HistogramRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { mapRange } from '@forgecharts/utils';
|
|
2
|
-
import { hexToRgba } from '@forgecharts/utils';
|
|
3
|
-
/**
|
|
4
|
-
* LineRenderer — draws close prices as a line or area series.
|
|
5
|
-
*/
|
|
6
|
-
export class LineRenderer {
|
|
7
|
-
_colors;
|
|
8
|
-
constructor(colors) {
|
|
9
|
-
this._colors = colors;
|
|
10
|
-
}
|
|
11
|
-
draw(ctx, bars, viewport, rect, options) {
|
|
12
|
-
if (options.type !== 'line' && options.type !== 'area')
|
|
13
|
-
return;
|
|
14
|
-
if (bars.length < 2)
|
|
15
|
-
return;
|
|
16
|
-
const color = options.color ?? '#58a6ff';
|
|
17
|
-
const lineWidth = options.lineWidth ?? 2;
|
|
18
|
-
const isArea = options.type === 'area';
|
|
19
|
-
const plotW = rect.width - 70;
|
|
20
|
-
const plotH = rect.height - 30;
|
|
21
|
-
const points = bars.map((bar) => ({
|
|
22
|
-
x: mapRange(bar.time, viewport.timeRange.from, viewport.timeRange.to, 0, plotW),
|
|
23
|
-
y: mapRange(bar.close, viewport.priceRange.max, viewport.priceRange.min, 0, plotH),
|
|
24
|
-
}));
|
|
25
|
-
// Line path
|
|
26
|
-
ctx.beginPath();
|
|
27
|
-
ctx.strokeStyle = color;
|
|
28
|
-
ctx.lineWidth = lineWidth;
|
|
29
|
-
this._applyLineStyle(ctx, options.lineStyle ?? 'solid');
|
|
30
|
-
const first = points[0];
|
|
31
|
-
ctx.moveTo(first.x, first.y);
|
|
32
|
-
for (let i = 1; i < points.length; i++) {
|
|
33
|
-
ctx.lineTo(points[i].x, points[i].y);
|
|
34
|
-
}
|
|
35
|
-
ctx.stroke();
|
|
36
|
-
ctx.setLineDash([]);
|
|
37
|
-
// Area fill
|
|
38
|
-
if (isArea) {
|
|
39
|
-
ctx.beginPath();
|
|
40
|
-
ctx.moveTo(first.x, plotH);
|
|
41
|
-
ctx.lineTo(first.x, first.y);
|
|
42
|
-
for (let i = 1; i < points.length; i++) {
|
|
43
|
-
ctx.lineTo(points[i].x, points[i].y);
|
|
44
|
-
}
|
|
45
|
-
const last = points[points.length - 1];
|
|
46
|
-
ctx.lineTo(last.x, plotH);
|
|
47
|
-
ctx.closePath();
|
|
48
|
-
const gradient = ctx.createLinearGradient(0, 0, 0, plotH);
|
|
49
|
-
gradient.addColorStop(0, hexToRgba(color, 0.3));
|
|
50
|
-
gradient.addColorStop(1, hexToRgba(color, 0.0));
|
|
51
|
-
ctx.fillStyle = gradient;
|
|
52
|
-
ctx.fill();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
_applyLineStyle(ctx, style) {
|
|
56
|
-
if (style === 'dashed')
|
|
57
|
-
ctx.setLineDash([6, 3]);
|
|
58
|
-
else if (style === 'dotted')
|
|
59
|
-
ctx.setLineDash([2, 3]);
|
|
60
|
-
else
|
|
61
|
-
ctx.setLineDash([]);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=LineRenderer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LineRenderer.js","sourceRoot":"","sources":["../../src/renderers/LineRenderer.ts"],"names":[],"mappings":"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"}
|
package/dist/theme/colors.js
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export const DARK_COLORS = {
|
|
2
|
-
background: '#000000',
|
|
3
|
-
backgroundSecondary: '#0a0a0a',
|
|
4
|
-
text: '#ffffff',
|
|
5
|
-
textMuted: '#888888',
|
|
6
|
-
grid: '#2a2a2a',
|
|
7
|
-
border: '#333333',
|
|
8
|
-
crosshair: '#ffffff',
|
|
9
|
-
};
|
|
10
|
-
export const LIGHT_COLORS = {
|
|
11
|
-
background: '#ffffff',
|
|
12
|
-
backgroundSecondary: '#f5f5f5',
|
|
13
|
-
text: '#000000',
|
|
14
|
-
textMuted: '#666666',
|
|
15
|
-
grid: '#e8e8e8',
|
|
16
|
-
border: '#cccccc',
|
|
17
|
-
crosshair: '#000000',
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=colors.js.map
|
package/dist/theme/colors.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/theme/colors.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,UAAU,EAAE,SAAS;IACrB,mBAAmB,EAAE,SAAS;IAC9B,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC,UAAU,EAAE,SAAS;IACrB,mBAAmB,EAAE,SAAS;IAC9B,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;CACrB,CAAC"}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* First-Divergence Bar Comparison Tool
|
|
3
|
-
*
|
|
4
|
-
* Compares OHLCV bars from multiple data sources (provider REST, database,
|
|
5
|
-
* aggregated from 1m, SDK engine) and reports the **first** mismatch found.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
*
|
|
9
|
-
* import { compareSources, checkAllSources, formatReport } from '@forgecharts/sdk/tools/barDivergenceCheck';
|
|
10
|
-
*
|
|
11
|
-
* const report = compareSources(
|
|
12
|
-
* { source: 'provider', bars: providerBars },
|
|
13
|
-
* { source: 'database', bars: databaseBars },
|
|
14
|
-
* '1h',
|
|
15
|
-
* 'BINANCE:BTCUSDT',
|
|
16
|
-
* from,
|
|
17
|
-
* to,
|
|
18
|
-
* );
|
|
19
|
-
*
|
|
20
|
-
* if (report.diverged) console.log(formatReport(report));
|
|
21
|
-
*
|
|
22
|
-
* All bar arrays are expected to contain Unix **second** timestamps in the
|
|
23
|
-
* `time` field (matching the CandleBar.time convention). Use `from`/`to`
|
|
24
|
-
* as Unix seconds to scope the comparison window.
|
|
25
|
-
*/
|
|
26
|
-
import { getBucketStart } from '@forgecharts/shared';
|
|
27
|
-
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
28
|
-
/** Index bars by their Unix-second open time for O(1) lookup. */
|
|
29
|
-
function indexByTime(bars) {
|
|
30
|
-
const map = new Map();
|
|
31
|
-
for (const bar of bars) {
|
|
32
|
-
// Last-write-wins if the source has duplicate timestamps
|
|
33
|
-
map.set(bar.time, bar);
|
|
34
|
-
}
|
|
35
|
-
return map;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Compare two numeric values with a floating-point epsilon tolerance.
|
|
39
|
-
* Returns true when they differ by more than the tolerance.
|
|
40
|
-
*/
|
|
41
|
-
function differ(a, b, eps = 1e-9) {
|
|
42
|
-
return Math.abs(a - b) > eps;
|
|
43
|
-
}
|
|
44
|
-
// ─── Core comparison ──────────────────────────────────────────────────────────
|
|
45
|
-
/**
|
|
46
|
-
* Compare all timestamps from both sources inside [from, to] and return the
|
|
47
|
-
* first mismatch found, scanning oldest-first.
|
|
48
|
-
*
|
|
49
|
-
* Mismatch criteria (any one triggers a report):
|
|
50
|
-
* 1. Bar present in one source but absent in the other.
|
|
51
|
-
* 2. OHLCV field values differ by more than floating-point epsilon.
|
|
52
|
-
* 3. Canonical `getBucketStart` for the bar's time differs between sources
|
|
53
|
-
* (indicates one source has a misaligned timestamp).
|
|
54
|
-
*
|
|
55
|
-
* @param a Source A bars.
|
|
56
|
-
* @param b Source B bars.
|
|
57
|
-
* @param timeframe Canonical timeframe label (e.g. `'1h'`, `'1w'`).
|
|
58
|
-
* @param symbol Symbol string — stored in the report for identification.
|
|
59
|
-
* @param from Window start, Unix seconds (inclusive).
|
|
60
|
-
* @param to Window end, Unix seconds (inclusive).
|
|
61
|
-
*/
|
|
62
|
-
export function compareSources(a, b, timeframe, symbol, from, to) {
|
|
63
|
-
const aIndex = indexByTime(a.bars);
|
|
64
|
-
const bIndex = indexByTime(b.bars);
|
|
65
|
-
// All timestamps seen in either source, filtered to the requested window
|
|
66
|
-
const allTimes = new Set([...aIndex.keys(), ...bIndex.keys()]);
|
|
67
|
-
const sortedTimes = Array.from(allTimes)
|
|
68
|
-
.filter(t => t >= from && t <= to)
|
|
69
|
-
.sort((x, y) => x - y);
|
|
70
|
-
let totalMismatches = 0;
|
|
71
|
-
let firstMismatch = null;
|
|
72
|
-
const countA = a.bars.filter(bar => bar.time >= from && bar.time <= to).length;
|
|
73
|
-
const countB = b.bars.filter(bar => bar.time >= from && bar.time <= to).length;
|
|
74
|
-
for (const time of sortedTimes) {
|
|
75
|
-
const barA = aIndex.get(time);
|
|
76
|
-
const barB = bIndex.get(time);
|
|
77
|
-
// ── Missing bar ────────────────────────────────────────────────────────
|
|
78
|
-
if (!barA || !barB) {
|
|
79
|
-
totalMismatches++;
|
|
80
|
-
if (!firstMismatch) {
|
|
81
|
-
const notes = [];
|
|
82
|
-
if (!barA)
|
|
83
|
-
notes.push(`${a.source} is missing bar at time=${time}`);
|
|
84
|
-
if (!barB)
|
|
85
|
-
notes.push(`${b.source} is missing bar at time=${time}`);
|
|
86
|
-
firstMismatch = {
|
|
87
|
-
time,
|
|
88
|
-
bucketStartMs: getBucketStart(time * 1000, timeframe),
|
|
89
|
-
sourceA: a.source,
|
|
90
|
-
sourceB: b.source,
|
|
91
|
-
differences: [],
|
|
92
|
-
bucketMismatch: false,
|
|
93
|
-
notes,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
// ── OHLCV field comparison ─────────────────────────────────────────────
|
|
99
|
-
const diffs = [];
|
|
100
|
-
const OHLCV_FIELDS = [
|
|
101
|
-
'open', 'high', 'low', 'close', 'volume',
|
|
102
|
-
];
|
|
103
|
-
for (const field of OHLCV_FIELDS) {
|
|
104
|
-
const vA = barA[field] ?? 0;
|
|
105
|
-
const vB = barB[field] ?? 0;
|
|
106
|
-
if (differ(vA, vB)) {
|
|
107
|
-
diffs.push({ field, valueA: vA, valueB: vB, delta: vA - vB });
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// ── Bucket alignment comparison ────────────────────────────────────────
|
|
111
|
-
const bucketA = getBucketStart(barA.time * 1000, timeframe);
|
|
112
|
-
const bucketB = getBucketStart(barB.time * 1000, timeframe);
|
|
113
|
-
const bucketMismatch = bucketA !== bucketB;
|
|
114
|
-
const notes = [];
|
|
115
|
-
if (bucketMismatch) {
|
|
116
|
-
notes.push(`bucket start mismatch: ${a.source}=${bucketA}ms vs ${b.source}=${bucketB}ms ` +
|
|
117
|
-
`(delta=${bucketA - bucketB} ms)`);
|
|
118
|
-
}
|
|
119
|
-
for (const diff of diffs) {
|
|
120
|
-
notes.push(`${diff.field}: ${a.source}=${diff.valueA} vs ${b.source}=${diff.valueB} ` +
|
|
121
|
-
`(delta=${diff.delta.toPrecision(6)})`);
|
|
122
|
-
}
|
|
123
|
-
if (diffs.length > 0 || bucketMismatch) {
|
|
124
|
-
totalMismatches++;
|
|
125
|
-
if (!firstMismatch) {
|
|
126
|
-
firstMismatch = {
|
|
127
|
-
time,
|
|
128
|
-
bucketStartMs: bucketA,
|
|
129
|
-
sourceA: a.source,
|
|
130
|
-
sourceB: b.source,
|
|
131
|
-
differences: diffs,
|
|
132
|
-
bucketMismatch,
|
|
133
|
-
notes,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return {
|
|
139
|
-
symbol,
|
|
140
|
-
timeframe,
|
|
141
|
-
from,
|
|
142
|
-
to,
|
|
143
|
-
diverged: totalMismatches > 0,
|
|
144
|
-
firstMismatch,
|
|
145
|
-
totalMismatches,
|
|
146
|
-
sourceACount: countA,
|
|
147
|
-
sourceBCount: countB,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Run all pairwise comparisons across every combination of the provided sources.
|
|
152
|
-
*
|
|
153
|
-
* For N sources this produces N*(N-1)/2 reports. Use `formatReport` to render
|
|
154
|
-
* each one for console output.
|
|
155
|
-
*/
|
|
156
|
-
export function checkAllSources(sources, symbol, timeframe, from, to) {
|
|
157
|
-
const reports = [];
|
|
158
|
-
for (let i = 0; i < sources.length; i++) {
|
|
159
|
-
for (let j = i + 1; j < sources.length; j++) {
|
|
160
|
-
reports.push(compareSources(sources[i], sources[j], timeframe, symbol, from, to));
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return reports;
|
|
164
|
-
}
|
|
165
|
-
// ─── Formatter ───────────────────────────────────────────────────────────────
|
|
166
|
-
/**
|
|
167
|
-
* Render a `DivergenceReport` as a multi-line human-readable string suitable
|
|
168
|
-
* for console output or log files.
|
|
169
|
-
*
|
|
170
|
-
* @example
|
|
171
|
-
* const report = compareSources(a, b, '1h', 'BINANCE:BTCUSDT', from, to);
|
|
172
|
-
* console.log(formatReport(report));
|
|
173
|
-
*/
|
|
174
|
-
export function formatReport(report) {
|
|
175
|
-
const lines = [];
|
|
176
|
-
const status = report.diverged
|
|
177
|
-
? `DIVERGED (${report.totalMismatches} mismatch${report.totalMismatches === 1 ? '' : 'es'})`
|
|
178
|
-
: 'IDENTICAL';
|
|
179
|
-
lines.push('─'.repeat(72));
|
|
180
|
-
lines.push(`Bar Divergence Report — ${status}`);
|
|
181
|
-
lines.push(` Symbol : ${report.symbol}`);
|
|
182
|
-
lines.push(` Timeframe : ${report.timeframe}`);
|
|
183
|
-
lines.push(` Window : ${report.from} → ${report.to} (Unix seconds)`);
|
|
184
|
-
lines.push(` Bars : sourceA=${report.sourceACount} sourceB=${report.sourceBCount}`);
|
|
185
|
-
if (report.firstMismatch) {
|
|
186
|
-
const m = report.firstMismatch;
|
|
187
|
-
lines.push('');
|
|
188
|
-
lines.push(` First mismatch at time=${m.time} (bucketStart=${m.bucketStartMs} ms)`);
|
|
189
|
-
lines.push(` Sources : ${m.sourceA} vs ${m.sourceB}`);
|
|
190
|
-
if (m.bucketMismatch) {
|
|
191
|
-
lines.push(` ✗ Bucket alignment differs`);
|
|
192
|
-
}
|
|
193
|
-
for (const note of m.notes) {
|
|
194
|
-
lines.push(` · ${note}`);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
lines.push('─'.repeat(72));
|
|
198
|
-
return lines.join('\n');
|
|
199
|
-
}
|
|
200
|
-
//# sourceMappingURL=barDivergenceCheck.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"barDivergenceCheck.js","sourceRoot":"","sources":["../../src/tools/barDivergenceCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TradingOverlayStore
|
|
3
|
-
*
|
|
4
|
-
* Shared, mode-agnostic store for trade overlay state.
|
|
5
|
-
* Used by both unmanaged mode (externally supplied data) and managed mode
|
|
6
|
-
* (internally generated data from the managed trading service).
|
|
7
|
-
*
|
|
8
|
-
* Supports:
|
|
9
|
-
* - Full replace (setOrders / setPositions)
|
|
10
|
-
* - Incremental (upsertOrder / upsertPosition / pushExecution)
|
|
11
|
-
* - Remove by id (removeOrder / removePosition)
|
|
12
|
-
*
|
|
13
|
-
* Subscribers are notified via callbacks registered with onChange().
|
|
14
|
-
* The store is intentionally free of React/DOM dependencies so it can be
|
|
15
|
-
* consumed from any rendering layer (canvas, React, etc.).
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```ts
|
|
19
|
-
* const store = new TradingOverlayStore();
|
|
20
|
-
*
|
|
21
|
-
* // Subscribe to changes (e.g. trigger a canvas repaint)
|
|
22
|
-
* store.onChange(() => chart.markDirty());
|
|
23
|
-
*
|
|
24
|
-
* // Feed data
|
|
25
|
-
* store.setOrders([...]);
|
|
26
|
-
* store.upsertOrder({ id: 'o1', role: 'entry', side: 'buy', ... });
|
|
27
|
-
* store.removeOrder('o1');
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export class TradingOverlayStore {
|
|
31
|
-
_orders = new Map();
|
|
32
|
-
_positions = new Map();
|
|
33
|
-
_fills = [];
|
|
34
|
-
_listeners = [];
|
|
35
|
-
// ── Change subscription ──────────────────────────────────────────────────────
|
|
36
|
-
/**
|
|
37
|
-
* Register a callback that fires whenever any state changes.
|
|
38
|
-
* Returns an unsubscribe function.
|
|
39
|
-
*/
|
|
40
|
-
onChange(listener) {
|
|
41
|
-
this._listeners.push(listener);
|
|
42
|
-
return () => {
|
|
43
|
-
this._listeners = this._listeners.filter(l => l !== listener);
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
_notify() {
|
|
47
|
-
for (const l of this._listeners)
|
|
48
|
-
l();
|
|
49
|
-
}
|
|
50
|
-
// ── Orders ───────────────────────────────────────────────────────────────────
|
|
51
|
-
/** Replace the entire order set. */
|
|
52
|
-
setOrders(orders) {
|
|
53
|
-
this._orders.clear();
|
|
54
|
-
for (const o of orders)
|
|
55
|
-
this._orders.set(o.id, o);
|
|
56
|
-
this._notify();
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Insert or replace a single order.
|
|
60
|
-
* Matching is done by `order.id`.
|
|
61
|
-
*/
|
|
62
|
-
upsertOrder(order) {
|
|
63
|
-
this._orders.set(order.id, order);
|
|
64
|
-
this._notify();
|
|
65
|
-
}
|
|
66
|
-
/** Remove an order by id. Silent no-op if not found. */
|
|
67
|
-
removeOrder(orderId) {
|
|
68
|
-
if (this._orders.delete(orderId))
|
|
69
|
-
this._notify();
|
|
70
|
-
}
|
|
71
|
-
/** Returns a snapshot of all orders as an array (insertion order). */
|
|
72
|
-
getOrders() {
|
|
73
|
-
return Array.from(this._orders.values());
|
|
74
|
-
}
|
|
75
|
-
/** Returns orders that share the given `groupId`. */
|
|
76
|
-
getOrdersByGroup(groupId) {
|
|
77
|
-
return this.getOrders().filter(o => o.groupId === groupId);
|
|
78
|
-
}
|
|
79
|
-
// ── Positions ────────────────────────────────────────────────────────────────
|
|
80
|
-
/** Replace the entire position set. */
|
|
81
|
-
setPositions(positions) {
|
|
82
|
-
this._positions.clear();
|
|
83
|
-
for (const p of positions)
|
|
84
|
-
this._positions.set(p.id, p);
|
|
85
|
-
this._notify();
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Insert or replace a single position.
|
|
89
|
-
* Matching is done by `position.id`.
|
|
90
|
-
*/
|
|
91
|
-
upsertPosition(position) {
|
|
92
|
-
this._positions.set(position.id, position);
|
|
93
|
-
this._notify();
|
|
94
|
-
}
|
|
95
|
-
/** Remove a position by id. Silent no-op if not found. */
|
|
96
|
-
removePosition(positionId) {
|
|
97
|
-
if (this._positions.delete(positionId))
|
|
98
|
-
this._notify();
|
|
99
|
-
}
|
|
100
|
-
/** Returns a snapshot of all positions as an array (insertion order). */
|
|
101
|
-
getPositions() {
|
|
102
|
-
return Array.from(this._positions.values());
|
|
103
|
-
}
|
|
104
|
-
// ── Fills ────────────────────────────────────────────────────────────────────
|
|
105
|
-
/**
|
|
106
|
-
* Append an execution fill to the fill log.
|
|
107
|
-
* Fills are append-only — they are never updated or removed.
|
|
108
|
-
*/
|
|
109
|
-
pushExecution(fill) {
|
|
110
|
-
this._fills.push(fill);
|
|
111
|
-
this._notify();
|
|
112
|
-
}
|
|
113
|
-
/** Returns all fills in insertion (chronological) order. */
|
|
114
|
-
getFills() {
|
|
115
|
-
return this._fills;
|
|
116
|
-
}
|
|
117
|
-
/** Returns fills associated with a specific order id. */
|
|
118
|
-
getFillsByOrder(orderId) {
|
|
119
|
-
return this._fills.filter(f => f.orderId === orderId);
|
|
120
|
-
}
|
|
121
|
-
// ── Bulk clear ───────────────────────────────────────────────────────────────
|
|
122
|
-
/** Wipes all overlay state (orders, positions, fills). */
|
|
123
|
-
clear() {
|
|
124
|
-
this._orders.clear();
|
|
125
|
-
this._positions.clear();
|
|
126
|
-
this._fills = [];
|
|
127
|
-
this._notify();
|
|
128
|
-
}
|
|
129
|
-
// ── Snapshot ─────────────────────────────────────────────────────────────────
|
|
130
|
-
/** Returns the full overlay state as a plain object — useful for debug / serialisation. */
|
|
131
|
-
snapshot() {
|
|
132
|
-
return {
|
|
133
|
-
orders: this.getOrders(),
|
|
134
|
-
positions: this.getPositions(),
|
|
135
|
-
fills: this.getFills(),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=TradingOverlayStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TradingOverlayStore.js","sourceRoot":"","sources":["../../src/trading/TradingOverlayStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UnmanagedIngestion
|
|
3
|
-
*
|
|
4
|
-
* External candle data ingestion for unmanaged mode.
|
|
5
|
-
*
|
|
6
|
-
* In unmanaged mode the client owns their data pipeline. They pass
|
|
7
|
-
* normalised candle data to us; this layer validates the license gate,
|
|
8
|
-
* delegates to the existing CandleEngine for bucket management, and
|
|
9
|
-
* notifies callers via callbacks mirroring the CandleEngine contract.
|
|
10
|
-
*
|
|
11
|
-
* Critical constraint: the default RapidAPI-backed datafeed is completely
|
|
12
|
-
* untouched. UnmanagedIngestion is an additive, opt-in path.
|
|
13
|
-
*
|
|
14
|
-
* Candle rules (matches CandleEngine behaviour):
|
|
15
|
-
* same timeMs → update current candle
|
|
16
|
-
* newer timeMs → append / new bucket
|
|
17
|
-
* older timeMs → silently ignored (logged in debug mode)
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```ts
|
|
21
|
-
* const ingestion = new UnmanagedIngestion('1m', {
|
|
22
|
-
* onBarUpdated: (bar) => series.update(bar),
|
|
23
|
-
* onResync: (bars) => series.setData(bars),
|
|
24
|
-
* });
|
|
25
|
-
*
|
|
26
|
-
* // Feed a full history snapshot first
|
|
27
|
-
* ingestion.setHistory(historicalBars);
|
|
28
|
-
*
|
|
29
|
-
* // Then stream live ticks
|
|
30
|
-
* ingestion.pushCandle(latestBar);
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
import { CandleEngine } from '../engine/CandleEngine';
|
|
34
|
-
import { isUnmanagedMode } from '../licensing/ChartRuntimeResolver';
|
|
35
|
-
export class UnmanagedIngestion {
|
|
36
|
-
_engine;
|
|
37
|
-
_opts;
|
|
38
|
-
_timeframe;
|
|
39
|
-
constructor(timeframe, opts = {}) {
|
|
40
|
-
this._opts = opts;
|
|
41
|
-
this._timeframe = timeframe;
|
|
42
|
-
this._engine = new CandleEngine({
|
|
43
|
-
...(opts.debug !== undefined ? { debug: opts.debug } : {}),
|
|
44
|
-
...(opts.onBarUpdated !== undefined ? { onBarUpdated: opts.onBarUpdated } : {}),
|
|
45
|
-
...(opts.onBarClosed !== undefined ? { onBarClosed: opts.onBarClosed } : {}),
|
|
46
|
-
...(opts.onGapDetected !== undefined ? { onGapDetected: opts.onGapDetected } : {}),
|
|
47
|
-
...(opts.onResync !== undefined ? { onResync: opts.onResync } : {}),
|
|
48
|
-
});
|
|
49
|
-
// Prime the engine so it knows its timeframe before any data arrives
|
|
50
|
-
this._engine.initialize([], timeframe);
|
|
51
|
-
}
|
|
52
|
-
// ── Guard ────────────────────────────────────────────────────────────────────
|
|
53
|
-
_assertUnmanaged() {
|
|
54
|
-
if (!isUnmanagedMode()) {
|
|
55
|
-
throw new Error('[ForgeCharts] External data ingestion is only available in unmanaged mode. ' +
|
|
56
|
-
'The active license is in managed mode.');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
// ── History ──────────────────────────────────────────────────────────────────
|
|
60
|
-
/**
|
|
61
|
-
* Load a full historical bar snapshot.
|
|
62
|
-
* Replaces the engine's bar array and triggers `onResync` so the chart
|
|
63
|
-
* series is fully redrawn.
|
|
64
|
-
*
|
|
65
|
-
* Call this once at startup (or on symbol/interval change) before
|
|
66
|
-
* streaming live candles via `pushCandle`.
|
|
67
|
-
*
|
|
68
|
-
* @throws If the active license is not in unmanaged mode.
|
|
69
|
-
*/
|
|
70
|
-
setHistory(bars) {
|
|
71
|
-
this._assertUnmanaged();
|
|
72
|
-
// Sort ascending — initialize expects oldest → newest
|
|
73
|
-
const sorted = [...bars].sort((a, b) => a.time - b.time);
|
|
74
|
-
this._engine.initialize(sorted, this._timeframe);
|
|
75
|
-
// CandleEngine.initialize() does not fire onResync — invoke it explicitly
|
|
76
|
-
this._opts.onResync?.(this._engine.getBars());
|
|
77
|
-
}
|
|
78
|
-
// ── Live push ────────────────────────────────────────────────────────────────
|
|
79
|
-
/**
|
|
80
|
-
* Push a single live candle tick.
|
|
81
|
-
*
|
|
82
|
-
* Behaviour follows CandleEngine rules:
|
|
83
|
-
* - same bucket → updates existing bar (OHLCV merging)
|
|
84
|
-
* - new bucket → appends a new bar (previous bar is finalised)
|
|
85
|
-
* - older bucket → silently ignored; debug-logged when `debug: true`
|
|
86
|
-
*
|
|
87
|
-
* @throws If the active license is not in unmanaged mode.
|
|
88
|
-
*/
|
|
89
|
-
pushCandle(bar) {
|
|
90
|
-
this._assertUnmanaged();
|
|
91
|
-
return this._engine.applyLiveUpdate(bar);
|
|
92
|
-
}
|
|
93
|
-
// ── Accessors ────────────────────────────────────────────────────────────────
|
|
94
|
-
/** Returns the current bar array (chronological, ascending). */
|
|
95
|
-
getBars() {
|
|
96
|
-
return this._engine.getBars();
|
|
97
|
-
}
|
|
98
|
-
/** Returns the latest candle, or null if no data has been loaded. */
|
|
99
|
-
getLatestBar() {
|
|
100
|
-
const bars = this._engine.getBars();
|
|
101
|
-
return bars.length > 0 ? bars[bars.length - 1] : null;
|
|
102
|
-
}
|
|
103
|
-
/** Changes the active timeframe and clears all bar data. */
|
|
104
|
-
setTimeframe(timeframe) {
|
|
105
|
-
this._timeframe = timeframe;
|
|
106
|
-
// Re-initialise with empty history — caller must follow up with setHistory()
|
|
107
|
-
this._engine.initialize([], timeframe);
|
|
108
|
-
}
|
|
109
|
-
/** Clears all bars (e.g. on symbol change before calling setHistory again). */
|
|
110
|
-
reset() {
|
|
111
|
-
this._engine.reset();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=UnmanagedIngestion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UnmanagedIngestion.js","sourceRoot":"","sources":["../../src/trading/UnmanagedIngestion.ts"],"names":[],"mappings":"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"}
|