@stocksharp/trading-controls 1.2.0 → 1.3.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 (59) hide show
  1. package/README.md +95 -16
  2. package/dist/esm/black-scholes.js +147 -0
  3. package/dist/esm/black-scholes.js.map +1 -0
  4. package/dist/esm/control-types.js +4 -0
  5. package/dist/esm/control-types.js.map +1 -1
  6. package/dist/esm/index.js +18 -0
  7. package/dist/esm/index.js.map +1 -1
  8. package/dist/esm/log-monitor-widget.js +265 -0
  9. package/dist/esm/log-monitor-widget.js.map +1 -0
  10. package/dist/esm/log-tree.js +96 -0
  11. package/dist/esm/log-tree.js.map +1 -0
  12. package/dist/esm/option-desk-widget.js +322 -0
  13. package/dist/esm/option-desk-widget.js.map +1 -0
  14. package/dist/esm/pnl-curve.js +129 -0
  15. package/dist/esm/pnl-curve.js.map +1 -0
  16. package/dist/esm/statistics-widget.js +194 -0
  17. package/dist/esm/statistics-widget.js.map +1 -0
  18. package/dist/esm/strategies-widget.js +348 -0
  19. package/dist/esm/strategies-widget.js.map +1 -0
  20. package/dist/sstradingcontrols.js +1307 -47
  21. package/dist/sstradingcontrols.js.map +4 -4
  22. package/dist/types/black-scholes.d.ts +28 -0
  23. package/dist/types/black-scholes.d.ts.map +1 -0
  24. package/dist/types/control-types.d.ts +4 -0
  25. package/dist/types/control-types.d.ts.map +1 -1
  26. package/dist/types/index.d.ts +16 -1
  27. package/dist/types/index.d.ts.map +1 -1
  28. package/dist/types/log-monitor-widget.d.ts +42 -0
  29. package/dist/types/log-monitor-widget.d.ts.map +1 -0
  30. package/dist/types/log-tree.d.ts +34 -0
  31. package/dist/types/log-tree.d.ts.map +1 -0
  32. package/dist/types/option-desk-widget.d.ts +68 -0
  33. package/dist/types/option-desk-widget.d.ts.map +1 -0
  34. package/dist/types/pnl-curve.d.ts +43 -0
  35. package/dist/types/pnl-curve.d.ts.map +1 -0
  36. package/dist/types/statistics-widget.d.ts +29 -0
  37. package/dist/types/statistics-widget.d.ts.map +1 -0
  38. package/dist/types/strategies-widget.d.ts +63 -0
  39. package/dist/types/strategies-widget.d.ts.map +1 -0
  40. package/dist/types/trading-data.d.ts +9 -0
  41. package/dist/types/trading-data.d.ts.map +1 -1
  42. package/package.json +27 -2
  43. package/screenshots/log-monitor.png +0 -0
  44. package/screenshots/option-desk.png +0 -0
  45. package/screenshots/panels.jpg +0 -0
  46. package/screenshots/statistics.png +0 -0
  47. package/screenshots/strategies.png +0 -0
  48. package/src/black-scholes.ts +199 -0
  49. package/src/control-types.ts +4 -0
  50. package/src/index.ts +41 -0
  51. package/src/log-monitor-widget.ts +312 -0
  52. package/src/log-tree.ts +131 -0
  53. package/src/option-desk-widget.ts +422 -0
  54. package/src/pnl-curve.ts +204 -0
  55. package/src/statistics-widget.ts +226 -0
  56. package/src/strategies-widget.ts +435 -0
  57. package/src/trading-data.ts +22 -0
  58. package/styles/trading-controls.css +356 -0
  59. package/translation-keys.json +70 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-monitor-widget.js","sourceRoot":"","sources":["../../src/log-monitor-widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ // The log monitor's shape, as pure functions: how sources nest, and which messages a view of
2
+ // them keeps.
3
+ //
4
+ // A log source announces its parent, not its children, and it can announce itself before its
5
+ // parent has said anything — so the tree is assembled from whatever has arrived rather than
6
+ // walked from a root that may not exist yet. Keeping that here is what makes it checkable: a
7
+ // cycle, an orphan and an unnamed source are all things a live feed produces, and none of them
8
+ // should be discovered as a hung page.
9
+ /// The levels a log message carries. The names are the wire's; the letter is what a narrow
10
+ /// column shows.
11
+ export const LogLevels = {
12
+ Error: 'error',
13
+ Warning: 'warning',
14
+ Info: 'info',
15
+ Debug: 'debug',
16
+ Verbose: 'verbose',
17
+ };
18
+ /// Assemble the sources into a forest, roots first, each node carrying its depth.
19
+ ///
20
+ /// A source whose parent is not among these is a root: it is the only honest place for it, and
21
+ /// dropping it would silently lose a whole strategy's log because its connector had not spoken
22
+ /// yet. A cycle is broken the same way, by rooting the first node of it — a wrong tree beats a
23
+ /// walk that never ends.
24
+ export function buildLogTree(sources) {
25
+ const byId = new Map();
26
+ for (const s of sources)
27
+ byId.set(s.id, { ...s, name: s.name && s.name.length > 0 ? s.name : '—', depth: 0, children: [] });
28
+ const roots = [];
29
+ for (const node of byId.values()) {
30
+ const parent = node.parentId != null ? byId.get(node.parentId) : undefined;
31
+ if (parent !== undefined && parent !== node && !descends(byId, parent, node.id))
32
+ parent.children.push(node);
33
+ else
34
+ roots.push(node);
35
+ }
36
+ const setDepth = (node, depth) => {
37
+ node.depth = depth;
38
+ for (const child of node.children)
39
+ setDepth(child, depth + 1);
40
+ };
41
+ for (const root of roots)
42
+ setDepth(root, 0);
43
+ return roots;
44
+ }
45
+ /// Whether `node` already sits under `id`, which is how a cycle is spotted before it is made.
46
+ function descends(byId, node, id) {
47
+ const seen = new Set();
48
+ let at = node;
49
+ while (at !== undefined && !seen.has(at.id)) {
50
+ if (at.id === id)
51
+ return true;
52
+ seen.add(at.id);
53
+ at = at.parentId != null ? byId.get(at.parentId) : undefined;
54
+ }
55
+ return false;
56
+ }
57
+ /// The ids a selected node covers: itself and everything under it, or null for no selection.
58
+ ///
59
+ /// Null rather than every id, because "everything" and "this node, which happens to be the
60
+ /// root" are different questions and only one of them narrows when a new source appears.
61
+ export function subtreeOf(sources, selectedId) {
62
+ if (selectedId === null)
63
+ return null;
64
+ const children = new Map();
65
+ for (const s of sources) {
66
+ if (s.parentId == null)
67
+ continue;
68
+ const siblings = children.get(s.parentId);
69
+ if (siblings === undefined)
70
+ children.set(s.parentId, [s.id]);
71
+ else
72
+ siblings.push(s.id);
73
+ }
74
+ const out = new Set();
75
+ const walk = (id) => {
76
+ if (out.has(id))
77
+ return;
78
+ out.add(id);
79
+ for (const child of children.get(id) ?? [])
80
+ walk(child);
81
+ };
82
+ walk(selectedId);
83
+ return out;
84
+ }
85
+ /// Whether this message belongs in that view. Every filter applies at once.
86
+ export function keepLog(message, view) {
87
+ if (!view.levels.has(message.level))
88
+ return false;
89
+ if (view.sources !== null && !view.sources.has(message.sourceId))
90
+ return false;
91
+ const text = view.text.trim();
92
+ if (text.length === 0)
93
+ return true;
94
+ return (message.message ?? '').toLowerCase().includes(text.toLowerCase());
95
+ }
96
+ //# sourceMappingURL=log-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tree.js","sourceRoot":"","sources":["../../src/log-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,322 @@
1
+ // Option desk — multi-instance.
2
+ //
3
+ // One expiry of a chain, strike by strike: the call's side on the left, the put's mirrored on
4
+ // the right, and the strike between them. Every figure a trader compares across the strip -
5
+ // volume, open interest, volatility - carries a bar as well as a number, because a chain is
6
+ // read by shape first and by value second.
7
+ //
8
+ // Two scales, and the difference matters. Volume and open interest are scaled per side, since
9
+ // calls and puts trade in different sizes and comparing a call's volume against the busiest put
10
+ // says nothing. Volatility is scaled across BOTH sides at once - a skew is exactly the
11
+ // comparison between them, and two independent scales would flatten it.
12
+ //
13
+ // Greeks arrive one of two ways. A host that computes them sends them and the desk shows what
14
+ // it was given; a host that sends volatility instead has them computed here, from the same
15
+ // Black-Scholes the desktop uses. Neither is a fallback for the other going wrong - they are
16
+ // two shapes of host, and which one a row came from is not the desk's business.
17
+ import { formatPrice, formatQty } from './formatters.js';
18
+ import { makeElement, makeIconButton, makePanelId, makePanelRoot } from './dom.js';
19
+ import { ControlTypes } from './control-types.js';
20
+ import { makeGridMenu } from './grid-menu.js';
21
+ import { assertHost } from './trading-host.js';
22
+ import { OptionTypes, greeks as computeGreeks } from './black-scholes.js';
23
+ import { DataGrid } from '@stocksharp/grids/data-grid';
24
+ export class OptionDeskWidget {
25
+ static create(hostEl, state, deps) {
26
+ const host = assertHost(deps?.host, 'OptionDeskWidget');
27
+ const root = OptionDeskWidget._buildRoot(host);
28
+ root.id = makePanelId(OptionDeskWidget.TYPE);
29
+ hostEl.appendChild(root);
30
+ return new OptionDeskWidget(root, state || {}, deps);
31
+ }
32
+ static _buildRoot(host) {
33
+ const title = host.t('OptionDesk');
34
+ return makePanelRoot('option-desk-panel', title, [
35
+ makeElement('div', 'panel-header', {}, [
36
+ makeElement('span', '', {}, [title]),
37
+ makeIconButton('bt-icon-btn bt-icon-cancel panel-close-btn', host.t('ClosePanel'), 'bi-x', { type: 'button' }),
38
+ ]),
39
+ makeElement('div', 'panel-body panel-body-with-rail', {}, [
40
+ makeElement('div', 'panel-body-content', {}, [
41
+ makeElement('table', 'terminal-table option-desk-table', { role: 'table', 'aria-label': host.t('OptionChain') }, [
42
+ makeElement('thead', '', {}, []),
43
+ makeElement('tbody', 'option-desk-body', {}, []),
44
+ ]),
45
+ ]),
46
+ makeElement('div', 'panel-rail', { role: 'toolbar', 'aria-label': host.t('OptionDeskActions') }, [
47
+ makeIconButton('bt-icon-btn panel-export-btn', host.t('ExportToExcel'), 'bi-file-earmark-spreadsheet', {}),
48
+ ]),
49
+ ]),
50
+ ]);
51
+ }
52
+ constructor(rootEl, _state, deps) {
53
+ this._host = assertHost(deps?.host, 'OptionDeskWidget');
54
+ this.rootEl = rootEl;
55
+ this.el = this.rootEl.querySelector('.option-desk-body');
56
+ this._closeBtn = this.rootEl.querySelector('.panel-close-btn');
57
+ this._exportBtn = this.rootEl.querySelector('.panel-export-btn');
58
+ this._rows = [];
59
+ this._context = {};
60
+ this._places = greekScales([], {});
61
+ this._closeBtn?.addEventListener('click', (e) => { e.preventDefault(); this._host.close(); });
62
+ this._exportBtn?.addEventListener('click', (e) => { e.preventDefault(); this._export(); });
63
+ const head = this.rootEl.querySelector('.option-desk-table thead');
64
+ this._grid = head && this.el
65
+ ? new DataGrid({
66
+ head: head,
67
+ body: this.el,
68
+ columns: this._columns(),
69
+ // By strike, ascending. A chain has exactly one order and it is not negotiable:
70
+ // the strip is read as a ladder, and re-sorting it by any column destroys that.
71
+ defaultSort: { col: 'strike', dir: 'asc' },
72
+ rowKey: (r) => String(r.strike),
73
+ emptyText: this._host.t('NoOptions'),
74
+ rowClass: (r) => this._rowClass(r),
75
+ contextMenu: makeGridMenu(this._host),
76
+ selection: 'multi',
77
+ })
78
+ : null;
79
+ // The greeks and the far volatilities are there when wanted and out of the way when not:
80
+ // a desk is read across, and thirty-six columns at once cannot be.
81
+ this._grid?.setState({
82
+ hidden: [
83
+ 'callRho', 'callTheta', 'callHv', 'callTheor',
84
+ 'putRho', 'putTheta', 'putHv', 'putTheor',
85
+ ],
86
+ });
87
+ this._host.register(this);
88
+ }
89
+ dispose() {
90
+ this._grid?.destroy();
91
+ this._host.unregister(this);
92
+ try {
93
+ this.rootEl.remove();
94
+ }
95
+ catch { /* already detached */ }
96
+ }
97
+ /// Show this chain, priced against this context.
98
+ ///
99
+ /// Both together, always: a chain and the underlying it is priced off are one observation,
100
+ /// and refreshing them separately shows greeks computed from a price that has moved.
101
+ update(strikes, context = {}) {
102
+ this._context = context ?? {};
103
+ this._rows = scaleChain(strikes ?? [], this._context);
104
+ this._places = greekScales(this._rows, this._context);
105
+ this._grid?.setRows(this._rows);
106
+ }
107
+ /// The rows as the desk holds them, scales and intrinsic values resolved.
108
+ rows() {
109
+ return this._rows;
110
+ }
111
+ _export() {
112
+ this._grid?.download('option-chain', this._host.t('OptionDesk'));
113
+ }
114
+ // Which side of the money this strike is on. A chain is read from the money outwards, and
115
+ // the line between the two halves is what a reader finds first.
116
+ _rowClass(row) {
117
+ const asset = this._context.assetPrice;
118
+ if (asset === null || asset === undefined)
119
+ return 'option-row';
120
+ return `option-row ${row.strike < asset ? 'option-itm-call' : 'option-itm-put'}`;
121
+ }
122
+ _columns() {
123
+ const label = (key) => this._host.t(key);
124
+ const side = (which) => {
125
+ const prefix = which;
126
+ const at = (r) => r[which];
127
+ const g = (r) => sideGreeks(r, which, this._context);
128
+ return [
129
+ { key: `${prefix}Rho`, header: label('Rho'), exportable: true, value: (r) => g(r)?.rho ?? null, render: (r) => decimals(g(r)?.rho, this._places.rho) },
130
+ { key: `${prefix}Theta`, header: label('Theta'), exportable: true, value: (r) => g(r)?.theta ?? null, render: (r) => decimals(g(r)?.theta, this._places.theta) },
131
+ { key: `${prefix}Vega`, header: label('Vega'), exportable: true, value: (r) => g(r)?.vega ?? null, render: (r) => decimals(g(r)?.vega, this._places.vega) },
132
+ { key: `${prefix}Gamma`, header: label('Gamma'), exportable: true, value: (r) => g(r)?.gamma ?? null, render: (r) => decimals(g(r)?.gamma, this._places.gamma) },
133
+ { key: `${prefix}Delta`, header: label('Delta'), exportable: true, value: (r) => g(r)?.delta ?? null, render: (r) => decimals(g(r)?.delta, this._places.delta) },
134
+ { key: `${prefix}Bid`, header: label('Bid'), exportable: true, cellClass: () => 'option-bid', value: (r) => at(r).bid ?? null, render: (r) => price(at(r).bid) },
135
+ { key: `${prefix}Ask`, header: label('Ask'), exportable: true, cellClass: () => 'option-ask', value: (r) => at(r).ask ?? null, render: (r) => price(at(r).ask) },
136
+ { key: `${prefix}Theor`, header: label('TheorPrice'), exportable: true, value: (r) => at(r).theoretical ?? null, render: (r) => price(at(r).theoretical) },
137
+ {
138
+ key: `${prefix}Volume`, header: label('Volume'), exportable: true,
139
+ value: (r) => at(r).volume ?? 0,
140
+ render: (r) => this._bar(at(r).volume, which === 'call' ? r.maxCallVolume : r.maxPutVolume, which, formatQty(at(r).volume ?? 0)),
141
+ exportValue: (r) => at(r).volume ?? 0,
142
+ },
143
+ {
144
+ key: `${prefix}Oi`, header: label('OI'), exportable: true,
145
+ value: (r) => at(r).openInterest ?? 0,
146
+ render: (r) => this._bar(at(r).openInterest, which === 'call' ? r.maxCallOpenInterest : r.maxPutOpenInterest, which, formatQty(at(r).openInterest ?? 0)),
147
+ exportValue: (r) => at(r).openInterest ?? 0,
148
+ },
149
+ { key: `${prefix}Symbol`, header: which === 'call' ? label('Call') : label('Put'), exportable: true, value: (r) => at(r).symbol ?? '' },
150
+ {
151
+ key: `${prefix}IvBid`, header: label('IVBid'), exportable: true,
152
+ value: (r) => at(r).ivBid ?? null,
153
+ render: (r) => this._bar(at(r).ivBid, r.maxVolatility, 'iv', percent(at(r).ivBid)),
154
+ exportValue: (r) => at(r).ivBid ?? '',
155
+ },
156
+ {
157
+ key: `${prefix}IvAsk`, header: label('IVAsk'), exportable: true,
158
+ value: (r) => at(r).ivAsk ?? null,
159
+ render: (r) => this._bar(at(r).ivAsk, r.maxVolatility, 'iv', percent(at(r).ivAsk)),
160
+ exportValue: (r) => at(r).ivAsk ?? '',
161
+ },
162
+ {
163
+ key: `${prefix}IvLast`, header: label('IVLast'), exportable: true,
164
+ value: (r) => at(r).ivLast ?? null,
165
+ render: (r) => this._bar(at(r).ivLast, r.maxVolatility, 'iv', percent(at(r).ivLast)),
166
+ exportValue: (r) => at(r).ivLast ?? '',
167
+ },
168
+ {
169
+ key: `${prefix}Hv`, header: label('HV'), exportable: true,
170
+ value: (r) => at(r).historicalVolatility ?? null,
171
+ render: (r) => this._bar(at(r).historicalVolatility, r.maxVolatility, 'iv', percent(at(r).historicalVolatility)),
172
+ exportValue: (r) => at(r).historicalVolatility ?? '',
173
+ },
174
+ ];
175
+ };
176
+ // Declared outward from the strike: volatilities and quotes against the middle, where
177
+ // the two sides are compared, and the greeks out at the edges. The put side is that
178
+ // same order reflected, which is what makes the chain a mirror rather than a repeat.
179
+ const puts = side('put').slice().reverse();
180
+ return [
181
+ ...side('call'),
182
+ {
183
+ key: 'strike',
184
+ header: label('Strike'),
185
+ exportable: true,
186
+ cellClass: () => 'option-strike',
187
+ value: (r) => r.strike,
188
+ render: (r) => price(r.strike),
189
+ },
190
+ {
191
+ key: 'intrinsic',
192
+ header: label('IntrinsicValue'),
193
+ exportable: true,
194
+ cellClass: () => 'option-intrinsic',
195
+ // Whichever side is in the money at this strike; the other is worth nothing to
196
+ // exercise, and showing both would be one number and one zero on every row.
197
+ value: (r) => Math.max(r.callIntrinsic, r.putIntrinsic),
198
+ render: (r) => price(Math.max(r.callIntrinsic, r.putIntrinsic)),
199
+ },
200
+ ...puts,
201
+ ];
202
+ }
203
+ // A figure with its share of the strip behind it. The bar is a width, not a drawing: it
204
+ // scales with the cell, it prints, and it needs no canvas per row.
205
+ _bar(value, max, kind, text) {
206
+ if (value === null || value === undefined || !isFinite(value) || value <= 0)
207
+ return text;
208
+ const cell = document.createElement('span');
209
+ cell.className = 'option-bar-cell';
210
+ const bar = document.createElement('span');
211
+ bar.className = `option-bar option-bar-${kind}`;
212
+ bar.style.width = `${Math.min(100, (value / (max || 1)) * 100).toFixed(1)}%`;
213
+ cell.appendChild(bar);
214
+ const label = document.createElement('span');
215
+ label.className = 'option-bar-text';
216
+ label.textContent = text;
217
+ cell.appendChild(label);
218
+ return cell;
219
+ }
220
+ }
221
+ OptionDeskWidget.TYPE = ControlTypes.OptionDesk;
222
+ /// Resolve the bar scales and the intrinsic values over a whole chain.
223
+ ///
224
+ /// One pass over every strike, not one per row: a bar means "this much of the busiest strike",
225
+ /// and a scale computed per row would make every row its own maximum.
226
+ export function scaleChain(strikes, context) {
227
+ const asset = context.assetPrice ?? null;
228
+ const maxOf = (pick, sides) => Math.max(0, ...strikes.flatMap(r => sides(r).map(s => pick(s) ?? 0)).filter(v => isFinite(v)));
229
+ const maxCallVolume = maxOf(s => s.volume, r => [r.call]);
230
+ const maxPutVolume = maxOf(s => s.volume, r => [r.put]);
231
+ const maxCallOpenInterest = maxOf(s => s.openInterest, r => [r.call]);
232
+ const maxPutOpenInterest = maxOf(s => s.openInterest, r => [r.put]);
233
+ // One scale across both sides: the comparison a skew IS, is the one between them.
234
+ const maxVolatility = Math.max(maxOf(s => s.ivBid, r => [r.call, r.put]), maxOf(s => s.ivAsk, r => [r.call, r.put]), maxOf(s => s.ivLast, r => [r.call, r.put]), maxOf(s => s.historicalVolatility, r => [r.call, r.put]));
235
+ return strikes.map(row => ({
236
+ ...row,
237
+ maxCallVolume,
238
+ maxPutVolume,
239
+ maxCallOpenInterest,
240
+ maxPutOpenInterest,
241
+ maxVolatility,
242
+ callIntrinsic: asset === null ? 0 : Math.max(0, asset - row.strike),
243
+ putIntrinsic: asset === null ? 0 : Math.max(0, row.strike - asset),
244
+ }));
245
+ }
246
+ /// The greeks for one side: the host's if it sent them, otherwise computed from its volatility.
247
+ ///
248
+ /// Null when neither is possible - no volatility, or nothing to price against. A blank is the
249
+ /// honest answer there; a zero would read as a measured delta of nothing.
250
+ export function sideGreeks(row, which, context) {
251
+ const side = row[which];
252
+ if (side.greeks !== undefined)
253
+ return side.greeks;
254
+ const deviation = side.ivLast ?? side.ivBid ?? side.ivAsk ?? side.historicalVolatility ?? null;
255
+ const assetPrice = context.assetPrice ?? null;
256
+ const timeToExpiry = context.timeToExpiry ?? null;
257
+ if (deviation === null || assetPrice === null || timeToExpiry === null)
258
+ return null;
259
+ return computeGreeks(which === 'call' ? OptionTypes.Call : OptionTypes.Put, {
260
+ assetPrice,
261
+ strike: row.strike,
262
+ timeToExpiry,
263
+ riskFree: context.riskFree ?? 0,
264
+ dividend: context.dividend ?? 0,
265
+ deviation,
266
+ });
267
+ }
268
+ /// Every greek this desk can show. Order is the order a chain is read in, outwards from delta.
269
+ const GREEK_KEYS = ['delta', 'gamma', 'vega', 'theta', 'rho'];
270
+ /// Three significant digits for the smallest figure in a column, within bounds a column can hold.
271
+ const GREEK_DIGITS = 4;
272
+ const GREEK_MIN_PLACES = 2;
273
+ const GREEK_MAX_PLACES = 8;
274
+ /// How many decimal places a column of greeks needs.
275
+ ///
276
+ /// One count cannot serve every greek: a delta is about one, while a gamma on an underlying at
277
+ /// 60000 is about 0.00003, and the four places that suit the first show every strike of the
278
+ /// second as 0.0000 - a column that is present, aligned, and says nothing. So the count comes
279
+ /// from the numbers, sized to the smallest of them.
280
+ ///
281
+ /// One count for the whole column, not per cell: a column of figures is read down its decimal
282
+ /// point, and a ragged one is read a cell at a time.
283
+ export function greekPlaces(values) {
284
+ const scale = Math.min(...values
285
+ .filter((v) => typeof v === 'number' && isFinite(v) && v !== 0)
286
+ .map(Math.abs));
287
+ // Nothing measurable: a zero column is a zero column at any width.
288
+ if (!isFinite(scale))
289
+ return GREEK_MIN_PLACES;
290
+ const places = GREEK_DIGITS - 1 - Math.floor(Math.log10(scale));
291
+ return Math.min(GREEK_MAX_PLACES, Math.max(GREEK_MIN_PLACES, places));
292
+ }
293
+ /// The places for each greek, measured across both sides of the chain at once.
294
+ ///
295
+ /// Across both sides deliberately: the desk mirrors, and a gamma written to eight places on the
296
+ /// left and five on the right stops being a mirror.
297
+ export function greekScales(rows, context) {
298
+ const all = rows
299
+ .flatMap(r => [sideGreeks(r, OptionTypes.Call, context), sideGreeks(r, OptionTypes.Put, context)])
300
+ .filter((g) => g !== null);
301
+ const places = {};
302
+ for (const key of GREEK_KEYS)
303
+ places[key] = greekPlaces(all.map(g => g[key]));
304
+ return places;
305
+ }
306
+ function decimals(value, places) {
307
+ if (value === null || value === undefined || !isFinite(value))
308
+ return '';
309
+ return value.toFixed(places);
310
+ }
311
+ function price(value) {
312
+ if (value === null || value === undefined || !isFinite(value))
313
+ return '';
314
+ return formatPrice(value);
315
+ }
316
+ /// A volatility, as the points a desk quotes it in rather than the fraction it is held as.
317
+ function percent(value) {
318
+ if (value === null || value === undefined || !isFinite(value))
319
+ return '';
320
+ return `${(value * 100).toFixed(2)}%`;
321
+ }
322
+ //# sourceMappingURL=option-desk-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-desk-widget.js","sourceRoot":"","sources":["../../src/option-desk-widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ // The geometry of a cumulative P&L curve, as pure functions over numbers.
2
+ //
3
+ // The same curve is read in three places and drawn at three sizes: a strategy row's sparkline,
4
+ // a statistics card, and a backtest's own chart. Only the last of those is a price chart - it
5
+ // shares the price axis and belongs to the chart engine. The other two are a curve in a box,
6
+ // and this is that curve: where each point lands, where the baseline sits, and which way the
7
+ // run ended. No canvas, so it can be checked against arithmetic rather than against pixels.
8
+ /// A run reduced to at most `count` samples, spanning the same stretch of time.
9
+ ///
10
+ /// A sparkline that keeps only the newest N samples marches sideways: each new sample pushes the
11
+ /// oldest off the left edge, so the shape slides and the run's beginning is lost. Compressing
12
+ /// instead keeps the whole run in the box and re-buckets it, so a new sample changes the curve's
13
+ /// shape rather than its position - which is what makes two readings of the same strategy
14
+ /// comparable.
15
+ ///
16
+ /// A bucket is summarised by its LAST sample, not by an average. This is a cumulative figure:
17
+ /// the last value in a bucket is where the run actually stood at that moment, while an average
18
+ /// would draw a rising run below the line it was on. Every point returned is therefore a real
19
+ /// sample, never a computed one, and the first and last are kept exactly - they are where the
20
+ /// run started and where it stands now.
21
+ export function compressPnl(points, count) {
22
+ if (points.length <= count || count < 2)
23
+ return points.slice();
24
+ const first = points[0];
25
+ const last = points[points.length - 1];
26
+ const span = last.time - first.time;
27
+ // Every sample at the same instant: there is no time to bucket by, so fall back to position.
28
+ if (!(span > 0)) {
29
+ const step = (points.length - 1) / (count - 1);
30
+ return Array.from({ length: count }, (_, i) => points[Math.round(i * step)]);
31
+ }
32
+ // One bucket per output point, the last sample in each standing for it. Buckets that caught
33
+ // nothing are skipped rather than repeated, so a quiet stretch reads as a long flat segment
34
+ // instead of as a row of identical points.
35
+ // `count - 1` buckets, not `count`: the first sample is seeded and the last is appended, so
36
+ // the buckets between them may contribute at most `count - 2` points. Sized any wider the
37
+ // result can overrun `count`, and trimming it afterwards would drop the run's start - the
38
+ // one point this function exists to keep.
39
+ const buckets = count - 1;
40
+ const out = [first];
41
+ let bucket = 0;
42
+ for (let i = 1; i < points.length; i++) {
43
+ const index = Math.min(buckets - 1, Math.floor(((points[i].time - first.time) / span) * buckets));
44
+ if (index > bucket) {
45
+ out.push(points[i - 1]);
46
+ bucket = index;
47
+ }
48
+ }
49
+ if (out[out.length - 1] !== last)
50
+ out.push(last);
51
+ return out;
52
+ }
53
+ /// Lay a run out in a box, or null when there is no curve to draw.
54
+ ///
55
+ /// Two rules that are not arbitrary. Zero is always in the range, so a run that only ever won
56
+ /// still shows the line it started from and the height of the curve means something. And the
57
+ /// horizontal axis is time, not sample index: a strategy that traded twice in the morning and
58
+ /// forty times after lunch should look like that, not like a curve with evenly spaced steps.
59
+ export function pnlCurve(points, box) {
60
+ const clean = points
61
+ .filter(p => p !== null && p !== undefined && Number.isFinite(p.time) && Number.isFinite(p.value))
62
+ .slice()
63
+ .sort((a, b) => a.time - b.time);
64
+ if (clean.length < 2)
65
+ return null;
66
+ // One sample per drawable pixel is as much as a box can show; past that the extra points are
67
+ // strokes on top of strokes. Compressing here rather than asking the caller to do it is what
68
+ // lets a host keep the whole run and still get a curve that does not slide.
69
+ const drawable = Math.max(2, Math.round(box.width - box.padX * 2));
70
+ const shown = compressPnl(clean, drawable);
71
+ const values = shown.map(p => p.value);
72
+ const min = Math.min(0, ...values);
73
+ const max = Math.max(0, ...values);
74
+ const left = box.padX;
75
+ const right = box.width - box.padX;
76
+ const top = box.padY;
77
+ const bottom = box.height - box.padY;
78
+ const firstTime = shown[0].time;
79
+ const lastTime = shown[shown.length - 1].time;
80
+ const timeSpan = lastTime - firstTime;
81
+ const valueSpan = max - min;
82
+ // A run with no spread in one axis collapses onto a line rather than dividing by nothing:
83
+ // every sample at the same instant stacks at the left edge, every sample at the same value
84
+ // rests on the top edge, which for a flat run is also its baseline.
85
+ const x = (time) => (timeSpan === 0 ? left : left + ((time - firstTime) / timeSpan) * (right - left));
86
+ const y = (value) => (valueSpan === 0 ? top : bottom - ((value - min) / valueSpan) * (bottom - top));
87
+ const curve = shown.map(p => [x(p.time), y(p.value)]);
88
+ const zeroY = y(0);
89
+ return {
90
+ points: curve,
91
+ // Closed along the baseline rather than along the foot of the box: a run entirely above
92
+ // water fills the gap between itself and zero, and nothing below it.
93
+ area: [...curve, [curve[curve.length - 1][0], zeroY], [curve[0][0], zeroY]],
94
+ zeroY,
95
+ min,
96
+ max,
97
+ positive: shown[shown.length - 1].value >= 0,
98
+ };
99
+ }
100
+ /// Paint a laid-out curve: the baseline, the filled area under it, then the line itself.
101
+ export function drawPnlCurve(ctx, curve, box, style) {
102
+ const colour = curve.positive ? style.up : style.down;
103
+ ctx.clearRect(0, 0, box.width, box.height);
104
+ ctx.setLineDash([2, 3]);
105
+ ctx.strokeStyle = style.baseline;
106
+ ctx.lineWidth = 1;
107
+ ctx.beginPath();
108
+ ctx.moveTo(box.padX, curve.zeroY);
109
+ ctx.lineTo(box.width - box.padX, curve.zeroY);
110
+ ctx.stroke();
111
+ ctx.setLineDash([]);
112
+ ctx.globalAlpha = style.fillOpacity;
113
+ ctx.fillStyle = colour;
114
+ ctx.beginPath();
115
+ ctx.moveTo(curve.area[0][0], curve.area[0][1]);
116
+ for (const [px, py] of curve.area.slice(1))
117
+ ctx.lineTo(px, py);
118
+ ctx.closePath();
119
+ ctx.fill();
120
+ ctx.globalAlpha = 1;
121
+ ctx.strokeStyle = colour;
122
+ ctx.lineWidth = style.lineWidth;
123
+ ctx.beginPath();
124
+ ctx.moveTo(curve.points[0][0], curve.points[0][1]);
125
+ for (const [px, py] of curve.points.slice(1))
126
+ ctx.lineTo(px, py);
127
+ ctx.stroke();
128
+ }
129
+ //# sourceMappingURL=pnl-curve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnl-curve.js","sourceRoot":"","sources":["../../src/pnl-curve.ts"],"names":[],"mappings":"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"}