@tradecanvas/chart 0.8.1 → 0.9.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.
- package/README.md +223 -48
- package/dist/Chart.d.ts +11 -0
- package/dist/Chart.d.ts.map +1 -1
- package/dist/{Chart-Cn_TSMO7.js → DragDropImporter-6QOjnfSj.js} +361 -85
- package/dist/DragDropImporter-6QOjnfSj.js.map +1 -0
- package/dist/DragDropImporter-CQ3EarQn.cjs +2 -0
- package/dist/DragDropImporter-CQ3EarQn.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -26
- package/dist/index.js.map +1 -1
- package/dist/io/DragDropImporter.d.ts +34 -0
- package/dist/io/DragDropImporter.d.ts.map +1 -0
- package/dist/io/index.d.ts +5 -0
- package/dist/io/index.d.ts.map +1 -0
- package/dist/io/parseOHLCV.d.ts +21 -0
- package/dist/io/parseOHLCV.d.ts.map +1 -0
- package/dist/widget/ChartWidget.d.ts +46 -1
- package/dist/widget/ChartWidget.d.ts.map +1 -1
- package/dist/widget/WidgetHotkeySheet.d.ts +20 -0
- package/dist/widget/WidgetHotkeySheet.d.ts.map +1 -0
- package/dist/widget/WidgetReplayBar.d.ts +41 -0
- package/dist/widget/WidgetReplayBar.d.ts.map +1 -0
- package/dist/widget/WidgetSettings.d.ts.map +1 -1
- package/dist/widget/WidgetSymbolSearch.d.ts +32 -0
- package/dist/widget/WidgetSymbolSearch.d.ts.map +1 -0
- package/dist/widget/WidgetToolbar.d.ts.map +1 -1
- package/dist/widget/WidgetWatchlist.d.ts +39 -0
- package/dist/widget/WidgetWatchlist.d.ts.map +1 -0
- package/dist/widget/index.cjs +1455 -877
- package/dist/widget/index.cjs.map +1 -1
- package/dist/widget/index.js +695 -92
- package/dist/widget/index.js.map +1 -1
- package/dist/widget/types.d.ts +19 -0
- package/dist/widget/types.d.ts.map +1 -1
- package/dist/widget/widgetConfig.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/Chart-Br_N-BCL.cjs +0 -2
- package/dist/Chart-Br_N-BCL.cjs.map +0 -1
- package/dist/Chart-Cn_TSMO7.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,12 +8,22 @@ High-performance canvas trading chart with built-in indicators, drawing tools, a
|
|
|
8
8
|
|
|
9
9
|
Most chart libraries make you choose: pretty charts with no trading features, or trading features with an ugly API. TradeCanvas gives you both.
|
|
10
10
|
|
|
11
|
-
- **33
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
11
|
+
- **33 built-in indicators** — SMA, EMA, Hull MA, RSI, MACD, Bollinger, Ichimoku, Pivot Points, Anchored VWAP, ZigZag, Linear Regression Channel, Awesome / Chaikin Oscillator, and more. No separate calculation library needed.
|
|
12
|
+
- **24 drawing tools** — Trendlines, Fibonacci (retracement, extension, time zones), horizontal/vertical lines, channels, Elliott waves, Gann fans / boxes, Pitchfork, Volume Profile range. With undo/redo and full serialization.
|
|
13
|
+
- **17 chart types** — Candlestick, line, area, bar, hollow candle, baseline, Heikin-Ashi, Renko, Kagi, Line Break, Point & Figure, Range Bars, Volume Candles, **Equivolume**, HLC Area, Step Line, Line+Markers.
|
|
14
|
+
- **TradingView-grade interaction** *(new in 0.9)* — drag the price/time axes to scale, double-click to auto-fit, `Shift+drag` to measure (bars × price Δ × %), `Alt+click` to pin a comparison tooltip, axis-following price/time pill labels under the cursor, bar-hover highlight.
|
|
15
|
+
- **Trading overlay** — Render open positions with entry line, P&L zone, and SL/TP markers. Orders as dashed lines. Drag SL/TP to modify. Cleanly opt-out via `features.trading: false` for non-trading projects.
|
|
14
16
|
- **Real-time streaming** — Built-in Binance adapter. Plug in your own data source with the adapter interface.
|
|
17
|
+
- **Strategy backtester** — `@tradecanvas/analytics` ships a bar-by-bar `Backtester` with virtual fills, commission/slippage models, portfolio tracking, and risk metrics (Sharpe, Sortino, Calmar, max drawdown). **Now with 4 ready-to-use reference strategies + Monte Carlo path-dependence analysis.**
|
|
18
|
+
- **Replay mode** — `ReplayController` drives historical bars forward at controlled speed with start / pause / step / seek / setSpeed. *(new in 0.9)* The widget now ships a floating bottom scrubber UI (play/pause/step/seek + 0.5×–100× speed) on top of it.
|
|
19
|
+
- **Volume Profile** *(new in 0.9)* — optional horizontal histogram of traded volume bucketed by price over the visible range, with point-of-control highlighting.
|
|
20
|
+
- **Watchlist sidebar** *(new in 0.9)* — opt-in vertical panel listing symbols with last price, % change, mini sparkline. Click a row to switch chart.
|
|
21
|
+
- **CSV / JSON drag-and-drop** *(new in 0.9)* — drop a file onto the chart, it parses and loads instantly. Detects header layouts, ISO/unix-s/unix-ms timestamps, and array-vs-object JSON shapes.
|
|
22
|
+
- **Saved layouts** *(new in 0.9)* — opt-in per-symbol persistence of chart type + indicator stack + drawings + alerts to localStorage. Switch symbol, switch back, your setup is intact.
|
|
23
|
+
- **Multi-chart grid** — `ChartGrid` for synchronized 2×2 / 2×3 layouts with linked crosshairs and shared time axis.
|
|
24
|
+
- **Signal markers & trade zones** — render bot/algorithm output (directional arrows, entry→exit rectangles) as a first-class chart layer.
|
|
25
|
+
- **Hotkey sheet** *(new in 0.9)* — press `?` in the widget to open a categorized keyboard-shortcut reference.
|
|
15
26
|
- **Save/load chart state** — Persist drawings, indicators, theme, and chart type to JSON. Restore with one call.
|
|
16
|
-
- **Replay mode** — Step through historical data bar-by-bar for backtesting visualization.
|
|
17
27
|
- **Zero dependencies** — The entire library is self-contained. No `d3`, no `chart.js`, no `fancy-canvas`.
|
|
18
28
|
|
|
19
29
|
## Install
|
|
@@ -28,50 +38,45 @@ yarn add @tradecanvas/chart
|
|
|
28
38
|
|
|
29
39
|
## Quick Start
|
|
30
40
|
|
|
31
|
-
|
|
32
|
-
import { Chart, BinanceAdapter } from '@tradecanvas/chart'
|
|
41
|
+
The fastest path is `ChartWidget` — drop-in component with a full TradingView-like UI (toolbar, drawing sidebar, settings dialog, status bar). Zero framework dependency.
|
|
33
42
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
autoScale: true,
|
|
38
|
-
features: {
|
|
39
|
-
drawings: true,
|
|
40
|
-
indicators: true,
|
|
41
|
-
trading: true,
|
|
42
|
-
volume: true,
|
|
43
|
-
},
|
|
44
|
-
})
|
|
43
|
+
```typescript
|
|
44
|
+
import { ChartWidget } from '@tradecanvas/chart/widget'
|
|
45
|
+
import { BinanceAdapter } from '@tradecanvas/chart'
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
const adapter = new BinanceAdapter()
|
|
48
|
-
chart.connect({
|
|
49
|
-
adapter,
|
|
47
|
+
const widget = new ChartWidget(document.getElementById('chart')!, {
|
|
50
48
|
symbol: 'BTCUSDT',
|
|
51
49
|
timeframe: '5m',
|
|
52
|
-
|
|
50
|
+
theme: 'dark',
|
|
51
|
+
adapter: new BinanceAdapter(),
|
|
52
|
+
trading: true,
|
|
53
53
|
})
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
That's it.
|
|
56
|
+
That's it. Live data, all 33 indicators, all 24 drawing tools, command palette (`Ctrl+K`), symbol search (`Ctrl+P`), hotkey sheet (`?`), shift-drag measure, alt-click tooltip pin, and drag-drop CSV/JSON loading.
|
|
57
57
|
|
|
58
|
-
##
|
|
58
|
+
## Headless Chart
|
|
59
59
|
|
|
60
|
-
For
|
|
60
|
+
For projects that want to own the surrounding UI (custom toolbar, framework-specific controls), use the lower-level `Chart` class directly:
|
|
61
61
|
|
|
62
62
|
```typescript
|
|
63
|
-
import {
|
|
64
|
-
import { BinanceAdapter } from '@tradecanvas/chart'
|
|
63
|
+
import { Chart, BinanceAdapter } from '@tradecanvas/chart'
|
|
65
64
|
|
|
66
|
-
const
|
|
67
|
-
symbol: 'BTCUSDT',
|
|
68
|
-
timeframe: '5m',
|
|
69
|
-
adapter: new BinanceAdapter(),
|
|
65
|
+
const chart = new Chart(document.getElementById('chart')!, {
|
|
70
66
|
theme: 'dark',
|
|
67
|
+
autoScale: true,
|
|
68
|
+
features: {
|
|
69
|
+
drawings: true,
|
|
70
|
+
indicators: true,
|
|
71
|
+
trading: true, // set false to disable orders/positions entirely
|
|
72
|
+
tradingContextMenu: true, // set false to keep overlay but drop right-click menu
|
|
73
|
+
volume: true,
|
|
74
|
+
},
|
|
71
75
|
})
|
|
72
|
-
```
|
|
73
76
|
|
|
74
|
-
|
|
77
|
+
const adapter = new BinanceAdapter()
|
|
78
|
+
chart.connect({ adapter, symbol: 'BTCUSDT', timeframe: '5m', historyLimit: 300 })
|
|
79
|
+
```
|
|
75
80
|
|
|
76
81
|
### Widget Options
|
|
77
82
|
|
|
@@ -86,9 +91,12 @@ That's it. Full toolbar, drawing sidebar, settings modal, and status bar — all
|
|
|
86
91
|
| `settings` | `boolean` | `true` | Show settings button |
|
|
87
92
|
| `trading` | `boolean` | `true` | Enable trading overlay |
|
|
88
93
|
| `statusBar` | `boolean` | `true` | Show bottom status bar |
|
|
89
|
-
| `symbols` | `string[]` | BTC/ETH/SOL/BNB |
|
|
94
|
+
| `symbols` | `string[]` | BTC/ETH/SOL/BNB | Searchable symbol catalog |
|
|
90
95
|
| `timeframes` | `TimeFrame[]` | 1m to 1d | Available timeframes |
|
|
91
96
|
| `chartTypes` | `ChartType[]` | 11 types | Available chart types |
|
|
97
|
+
| `watchlist` | `boolean` | `false` | Right-side watchlist sidebar |
|
|
98
|
+
| `dragDropImport` | `boolean` | `true` | Drop CSV / JSON files onto the chart to load data |
|
|
99
|
+
| `persistLayouts` | `boolean \| { keyPrefix, debounceMs }` | `false` | Save per-symbol indicators / drawings / chart type to localStorage |
|
|
92
100
|
| `onSymbolChange` | `(symbol) => void` | — | Symbol change callback |
|
|
93
101
|
| `onTimeframeChange` | `(tf) => void` | — | Timeframe change callback |
|
|
94
102
|
| `onReady` | `(chart) => void` | — | Fired when chart is ready |
|
|
@@ -123,12 +131,15 @@ That's it. Full toolbar, drawing sidebar, settings modal, and status bar — all
|
|
|
123
131
|
| Line Break | Three-line break charts |
|
|
124
132
|
| Range Bars | Fixed price-range bars — each bar's high − low equals a configured range |
|
|
125
133
|
| Volume Candles | Candlesticks with width proportional to volume |
|
|
134
|
+
| Equivolume | Full-range boxes with width proportional to volume share (Richard Arms style) |
|
|
126
135
|
| HLC Area | High-low-close area band with close line |
|
|
127
136
|
| Step Line | Staircase/step pattern from close prices |
|
|
128
137
|
| Line with Markers | Close line with circular markers at each data point |
|
|
129
138
|
|
|
130
139
|
### Multi-Chart Grid
|
|
131
140
|
|
|
141
|
+
Display multiple synchronized charts side-by-side with linked crosshairs and time axis:
|
|
142
|
+
|
|
132
143
|
```typescript
|
|
133
144
|
import { ChartGrid, BinanceAdapter } from '@tradecanvas/chart'
|
|
134
145
|
|
|
@@ -142,11 +153,11 @@ const adapter = new BinanceAdapter()
|
|
|
142
153
|
grid.connectAll(adapter, ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT'], '5m')
|
|
143
154
|
```
|
|
144
155
|
|
|
145
|
-
|
|
156
|
+
Supported layouts: `'1x1'`, `'1x2'`, `'2x1'`, `'2x2'`, `'1x3'`, `'3x1'`, `'2x3'`, `'3x2'`.
|
|
146
157
|
|
|
147
158
|
### Command Palette
|
|
148
159
|
|
|
149
|
-
Press `Ctrl+K`
|
|
160
|
+
Press `Ctrl+K` (or `Cmd+K`) inside ChartWidget to open a searchable command palette. Quickly find and toggle indicators, change chart types, activate drawing tools, switch timeframes, or trigger actions (screenshot, theme toggle, settings).
|
|
150
161
|
|
|
151
162
|
### Finance Charts
|
|
152
163
|
|
|
@@ -210,7 +221,7 @@ All indicator parameters are validated at runtime — invalid values (NaN, Infin
|
|
|
210
221
|
|
|
211
222
|
### Drawing Tools
|
|
212
223
|
|
|
213
|
-
Trendline, Horizontal Line, Vertical Line, Ray, Extended Line, Parallel Channel, Fibonacci Retracement, Fibonacci Extension, Rectangle, Ellipse, Triangle, Arrow, Pitchfork, Gann Fan, Gann Box, Elliott Wave, Regression Channel, Date Range, Price Range, Measure, Anchored VWAP, Volume Profile Range, Text Annotation
|
|
224
|
+
Trendline, Horizontal Line, Vertical Line, Ray, Extended Line, Parallel Channel, Fibonacci Retracement, Fibonacci Extension, **Fibonacci Time Zones**, Rectangle, Ellipse, Triangle, Arrow, Pitchfork, Gann Fan, Gann Box, Elliott Wave, Regression Channel, Date Range, Price Range, Measure, Anchored VWAP, Volume Profile Range, Text Annotation
|
|
214
225
|
|
|
215
226
|
All drawing tools support:
|
|
216
227
|
- Click-to-place with magnet snapping to OHLC values
|
|
@@ -262,6 +273,53 @@ chart.on('positionModify', (e) => console.log('SL/TP moved:', e.payload))
|
|
|
262
273
|
chart.on('orderModify', (e) => console.log('Order moved:', e.payload))
|
|
263
274
|
```
|
|
264
275
|
|
|
276
|
+
### Signal Markers
|
|
277
|
+
|
|
278
|
+
Visualize buy/sell signals from bots, indicators, or manual analysis.
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
chart.addSignalMarker({
|
|
282
|
+
time: 1715692800000,
|
|
283
|
+
price: 62500,
|
|
284
|
+
direction: 'long',
|
|
285
|
+
confidence: 0.85,
|
|
286
|
+
source: 'ema-crossover',
|
|
287
|
+
label: 'EMA Cross',
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
// Color-code by source
|
|
291
|
+
chart.setSignalMarkerStyle({
|
|
292
|
+
sourceColors: {
|
|
293
|
+
'ema-crossover': '#2196F3',
|
|
294
|
+
'rsi-divergence': '#FF9800',
|
|
295
|
+
'whale-flow': '#9C27B0',
|
|
296
|
+
},
|
|
297
|
+
})
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Trade Zones
|
|
301
|
+
|
|
302
|
+
Render entry→exit rectangles with P&L coloring for executed trades.
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
const zoneId = chart.addTradeZone({
|
|
306
|
+
entryTime: 1715692800000,
|
|
307
|
+
entryPrice: 62500,
|
|
308
|
+
exitTime: 1715700000000,
|
|
309
|
+
exitPrice: 63200,
|
|
310
|
+
direction: 'long',
|
|
311
|
+
pnl: 140,
|
|
312
|
+
pnlPercent: 1.12,
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
// Update a live trade when it closes
|
|
316
|
+
chart.updateTradeZone(zoneId, {
|
|
317
|
+
exitTime: Date.now(),
|
|
318
|
+
exitPrice: 63500,
|
|
319
|
+
pnl: 200,
|
|
320
|
+
})
|
|
321
|
+
```
|
|
322
|
+
|
|
265
323
|
### Real-Time Streaming
|
|
266
324
|
|
|
267
325
|
```typescript
|
|
@@ -360,28 +418,141 @@ chart.on('positionModify', (e) => { /* ... */ })
|
|
|
360
418
|
|
|
361
419
|
### Replay Mode
|
|
362
420
|
|
|
421
|
+
`ReplayController` plays a historical `DataSeries` forward at controlled speed. Decoupled from `Chart` — wire it into any sink (chart for UI playback, or a strategy fn for headless backtests).
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
import { ReplayController } from '@tradecanvas/chart'
|
|
425
|
+
|
|
426
|
+
const replay = new ReplayController({
|
|
427
|
+
data: historicalBars,
|
|
428
|
+
speed: 10, // bars per second
|
|
429
|
+
startIndex: 0,
|
|
430
|
+
})
|
|
431
|
+
|
|
432
|
+
// Seed the chart with the prefix before replay starts
|
|
433
|
+
chart.setData(replay.getPrefix())
|
|
434
|
+
|
|
435
|
+
// Each emitted bar drives the chart forward
|
|
436
|
+
replay.on('bar', ({ bar }) => chart.appendBar(bar))
|
|
437
|
+
replay.on('finished', () => console.log('done'))
|
|
438
|
+
|
|
439
|
+
replay.start()
|
|
440
|
+
// replay.pause(); replay.resume(); replay.step(5); replay.seek(200); replay.setSpeed(20)
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### Chart Interaction (TradingView-style)
|
|
444
|
+
|
|
445
|
+
Every gesture you'd expect from a desktop trading chart is built in:
|
|
446
|
+
|
|
447
|
+
| Gesture | Result |
|
|
448
|
+
|---|---|
|
|
449
|
+
| Drag price axis up/down | Compress / expand vertical scale (freezes auto-scale) |
|
|
450
|
+
| Drag time axis left/right | Zoom time axis |
|
|
451
|
+
| Double-click price axis | Re-enable auto-scale |
|
|
452
|
+
| Double-click time axis | Fit all data to viewport |
|
|
453
|
+
| Wheel | Zoom around cursor |
|
|
454
|
+
| `Shift` + drag | Measure ruler (bars × time × price Δ × %) |
|
|
455
|
+
| `Alt` + click | Pin OHLC tooltip; live crosshair shows Δ to pinned bar |
|
|
456
|
+
| Hover | Price + time pill labels follow on both axes |
|
|
457
|
+
| `Esc` | Unpin tooltip / cancel drawing |
|
|
458
|
+
| `?` | Show keyboard-shortcut sheet *(widget)* |
|
|
459
|
+
| `Ctrl/⌘ + K` | Command palette *(widget)* |
|
|
460
|
+
| `Ctrl/⌘ + P` | Symbol search *(widget)* |
|
|
461
|
+
| `Ctrl/⌘ + Z` / `Shift + Z` | Undo / redo drawings |
|
|
462
|
+
|
|
463
|
+
### Data import — drag-and-drop or programmatic
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
import { parseOHLCV } from '@tradecanvas/chart'
|
|
467
|
+
|
|
468
|
+
const { data, rowCount, skipped } = parseOHLCV(csvText)
|
|
469
|
+
chart.setData(data)
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
Drop a CSV or JSON file onto the widget and it loads instantly. Auto-detects
|
|
473
|
+
delimiter (`,` / `;` / tab / `|`), header vs. headerless, ISO 8601 timestamps,
|
|
474
|
+
and array-of-arrays vs. array-of-objects JSON.
|
|
475
|
+
|
|
476
|
+
### Backtesting (`@tradecanvas/analytics`)
|
|
477
|
+
|
|
478
|
+
Bar-by-bar strategy backtester with virtual fills, commission/slippage models, and a full risk-metrics report.
|
|
479
|
+
|
|
363
480
|
```typescript
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
481
|
+
import { Backtester, PercentCommission, PercentSlippage } from '@tradecanvas/analytics'
|
|
482
|
+
|
|
483
|
+
const bt = new Backtester({
|
|
484
|
+
initialCash: 10_000,
|
|
485
|
+
commission: new PercentCommission(0.0005),
|
|
486
|
+
slippage: new PercentSlippage(0.0003),
|
|
487
|
+
})
|
|
488
|
+
|
|
489
|
+
const result = bt.run(historicalBars, (ctx) => {
|
|
490
|
+
// Strategy fn runs at close of each bar; orders fill on the NEXT bar.
|
|
491
|
+
if (!ctx.position && smaFast > smaSlow) {
|
|
492
|
+
ctx.placeOrder({ side: 'long', type: 'market', quantity: 1 })
|
|
493
|
+
} else if (ctx.position && smaFast < smaSlow) {
|
|
494
|
+
ctx.close()
|
|
495
|
+
}
|
|
496
|
+
})
|
|
497
|
+
|
|
498
|
+
console.log(result.metrics.sharpe) // 1.42
|
|
499
|
+
console.log(result.metrics.maxDrawdownPct) // 0.087
|
|
500
|
+
console.log(result.equityCurve) // → feed into the chart via EquityCurveRenderer
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
Returns: `fills`, closed `trades`, `equityCurve`, `metrics` (Sharpe, Sortino, Calmar, CAGR, max drawdown, win rate, profit factor, expectancy). See the [live backtest demo](https://bonguynvan.github.io/tradecanvas/docs/analytics/).
|
|
504
|
+
|
|
505
|
+
#### Strategy library (new in 0.9)
|
|
506
|
+
|
|
507
|
+
Four drop-in reference strategies — each returns a `StrategyFn` ready to feed
|
|
508
|
+
`Backtester.run()`:
|
|
509
|
+
|
|
510
|
+
```typescript
|
|
511
|
+
import {
|
|
512
|
+
Backtester,
|
|
513
|
+
smaCrossStrategy,
|
|
514
|
+
rsiReversionStrategy,
|
|
515
|
+
donchianBreakoutStrategy,
|
|
516
|
+
bollingerReversionStrategy,
|
|
517
|
+
} from '@tradecanvas/analytics'
|
|
518
|
+
|
|
519
|
+
const bt = new Backtester({ initialCash: 10_000 })
|
|
520
|
+
bt.run(bars, smaCrossStrategy({ fastPeriod: 10, slowPeriod: 30 }))
|
|
521
|
+
bt.run(bars, donchianBreakoutStrategy({ entryPeriod: 20, exitPeriod: 10 }))
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
#### Monte Carlo path-dependence (new in 0.9)
|
|
525
|
+
|
|
526
|
+
Shuffle realised trade order N times to expose whether a strategy depends on
|
|
527
|
+
lucky sequencing. Tight P5/P95 band = robust edge; wide band = path-dependent.
|
|
528
|
+
|
|
529
|
+
```typescript
|
|
530
|
+
import { runMonteCarlo } from '@tradecanvas/analytics'
|
|
531
|
+
|
|
532
|
+
const result = bt.run(bars, smaCrossStrategy())
|
|
533
|
+
const mc = runMonteCarlo(10_000, result.trades, { simulations: 1000, seed: 42 })
|
|
534
|
+
|
|
535
|
+
mc.equityBands // [{ step, p5, p25, p50, p75, p95 }, …]
|
|
536
|
+
mc.finalEquityPercentiles // { p5, p25, p50, p75, p95 }
|
|
537
|
+
mc.probabilityProfitable // 0..1
|
|
538
|
+
mc.worstMaxDrawdownPct
|
|
369
539
|
```
|
|
370
540
|
|
|
371
541
|
## Comparison
|
|
372
542
|
|
|
373
543
|
| Feature | @tradecanvas/chart | lightweight-charts | chart.js | Highcharts Stock |
|
|
374
544
|
|---|---|---|---|---|
|
|
375
|
-
| Chart types |
|
|
545
|
+
| Chart types | 17 + 6 finance | 4 | 8 (non-financial) | 10+ |
|
|
376
546
|
| Finance charts | Sparkline, Depth, Equity, Heatmap, Waterfall, Gauge | None | None | Some |
|
|
377
|
-
| Built-in indicators | 33
|
|
378
|
-
| Drawing tools |
|
|
547
|
+
| Built-in indicators | 33 | 0 | 0 | ~30 |
|
|
548
|
+
| Drawing tools | 24 | 0 | 0 | Some |
|
|
379
549
|
| Trading overlay | Full (pos + orders + drag) | None | None | None |
|
|
380
550
|
| Real-time streaming | Built-in (Binance) | Manual | Manual | Built-in |
|
|
381
551
|
| Save/load state | Yes | No | No | Yes |
|
|
382
|
-
| Replay mode | Yes | No | No | No |
|
|
383
|
-
|
|
|
384
|
-
|
|
|
552
|
+
| Replay mode | Yes (`ReplayController`) | No | No | No |
|
|
553
|
+
| Backtester | Yes (`@tradecanvas/analytics`) | No | No | No |
|
|
554
|
+
| Multi-chart grid | Yes (`ChartGrid`) | No | No | Yes |
|
|
555
|
+
| Bundle (gzip) | ~56 KB core | ~45 KB | ~70 KB | ~200 KB |
|
|
385
556
|
| Dependencies | 0 | 1 | 0 | 0 |
|
|
386
557
|
| Widget (complete UI) | Yes (`ChartWidget`) | No | No | No |
|
|
387
558
|
| License | MIT | Apache 2.0 | MIT | Commercial |
|
|
@@ -425,6 +596,10 @@ chart.setNumberLocale('de-DE') // 65.234,00
|
|
|
425
596
|
| `setDrawingTool(tool)` | Activate a drawing tool |
|
|
426
597
|
| `setPositions(positions)` | Render trading positions |
|
|
427
598
|
| `setOrders(orders)` | Render pending orders |
|
|
599
|
+
| `setVolumeProfileVisible(v)` | Toggle the horizontal volume-profile overlay |
|
|
600
|
+
| `setVolumeProfileConfig({ buckets, widthRatio, opacity, highlightPoC })` | Tune the volume profile |
|
|
601
|
+
| `setAutoScale(v)` / `setLogScale(v)` | Lock or change price-scale mode |
|
|
602
|
+
| `fitContent()` / `scrollToEnd()` | Fit all data / jump to live edge |
|
|
428
603
|
| `saveState(key?)` | Serialize chart state |
|
|
429
604
|
| `loadState(json)` | Restore chart state |
|
|
430
605
|
| `screenshot()` | Download chart as image |
|
package/dist/Chart.d.ts
CHANGED
|
@@ -28,14 +28,17 @@ export declare class Chart {
|
|
|
28
28
|
private compareRenderer;
|
|
29
29
|
private countdownInterval;
|
|
30
30
|
private volumeRenderer;
|
|
31
|
+
private volumeProfile;
|
|
31
32
|
private alertManager;
|
|
32
33
|
private signalMarkerManager;
|
|
33
34
|
private tradeZoneManager;
|
|
35
|
+
private measureOverlay;
|
|
34
36
|
private replayManager;
|
|
35
37
|
private undoRedoManager;
|
|
36
38
|
private autoSaveScheduler;
|
|
37
39
|
private animator;
|
|
38
40
|
private crosshairTooltip;
|
|
41
|
+
private pinnedTooltip;
|
|
39
42
|
private interactionManager;
|
|
40
43
|
private crosshairHandler;
|
|
41
44
|
private chartRenderer;
|
|
@@ -201,6 +204,14 @@ export declare class Chart {
|
|
|
201
204
|
setGridVisible(visible: boolean): void;
|
|
202
205
|
isGridVisible(): boolean;
|
|
203
206
|
setVolumeVisible(visible: boolean): void;
|
|
207
|
+
setVolumeProfileVisible(visible: boolean): void;
|
|
208
|
+
isVolumeProfileVisible(): boolean;
|
|
209
|
+
setVolumeProfileConfig(config: {
|
|
210
|
+
buckets?: number;
|
|
211
|
+
widthRatio?: number;
|
|
212
|
+
opacity?: number;
|
|
213
|
+
highlightPoC?: boolean;
|
|
214
|
+
}): void;
|
|
204
215
|
setTooltipVisible(visible: boolean): void;
|
|
205
216
|
setLegend(config: Partial<import('@tradecanvas/core').LegendConfig>): void;
|
|
206
217
|
setSymbolName(symbol: string): void;
|
package/dist/Chart.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../src/Chart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAU,EACV,KAAK,EACL,SAAS,EACT,cAAc,EACd,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,cAAc,EACf,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../src/Chart.ts"],"names":[],"mappings":"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"}
|