@stocksharp/trading-controls 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +204 -17
- package/dist/esm/black-scholes.js +147 -0
- package/dist/esm/black-scholes.js.map +1 -0
- package/dist/esm/chart-engine.js +15 -0
- package/dist/esm/chart-engine.js.map +1 -0
- package/dist/esm/control-types.js +8 -0
- package/dist/esm/control-types.js.map +1 -1
- package/dist/esm/equity-widget.js +261 -0
- package/dist/esm/equity-widget.js.map +1 -0
- package/dist/esm/heatmap-grid.js +271 -0
- package/dist/esm/heatmap-grid.js.map +1 -0
- package/dist/esm/index.js +37 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/log-monitor-widget.js +265 -0
- package/dist/esm/log-monitor-widget.js.map +1 -0
- package/dist/esm/log-tree.js +96 -0
- package/dist/esm/log-tree.js.map +1 -0
- package/dist/esm/optimization-heatmap-widget.js +303 -0
- package/dist/esm/optimization-heatmap-widget.js.map +1 -0
- package/dist/esm/option-desk-widget.js +322 -0
- package/dist/esm/option-desk-widget.js.map +1 -0
- package/dist/esm/option-smile-widget.js +252 -0
- package/dist/esm/option-smile-widget.js.map +1 -0
- package/dist/esm/pnl-curve.js +133 -0
- package/dist/esm/pnl-curve.js.map +1 -0
- package/dist/esm/statistics-widget.js +194 -0
- package/dist/esm/statistics-widget.js.map +1 -0
- package/dist/esm/strategies-widget.js +348 -0
- package/dist/esm/strategies-widget.js.map +1 -0
- package/dist/esm/surface-grid.js +282 -0
- package/dist/esm/surface-grid.js.map +1 -0
- package/dist/esm/surface-widget.js +379 -0
- package/dist/esm/surface-widget.js.map +1 -0
- package/dist/sstradingcontrols.js +2982 -295
- package/dist/sstradingcontrols.js.map +4 -4
- package/dist/types/black-scholes.d.ts +28 -0
- package/dist/types/black-scholes.d.ts.map +1 -0
- package/dist/types/chart-engine.d.ts +3 -0
- package/dist/types/chart-engine.d.ts.map +1 -0
- package/dist/types/control-types.d.ts +8 -0
- package/dist/types/control-types.d.ts.map +1 -1
- package/dist/types/equity-widget.d.ts +34 -0
- package/dist/types/equity-widget.d.ts.map +1 -0
- package/dist/types/heatmap-grid.d.ts +88 -0
- package/dist/types/heatmap-grid.d.ts.map +1 -0
- package/dist/types/index.d.ts +31 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/log-monitor-widget.d.ts +42 -0
- package/dist/types/log-monitor-widget.d.ts.map +1 -0
- package/dist/types/log-tree.d.ts +34 -0
- package/dist/types/log-tree.d.ts.map +1 -0
- package/dist/types/optimization-heatmap-widget.d.ts +45 -0
- package/dist/types/optimization-heatmap-widget.d.ts.map +1 -0
- package/dist/types/option-desk-widget.d.ts +68 -0
- package/dist/types/option-desk-widget.d.ts.map +1 -0
- package/dist/types/option-smile-widget.d.ts +39 -0
- package/dist/types/option-smile-widget.d.ts.map +1 -0
- package/dist/types/pnl-curve.d.ts +46 -0
- package/dist/types/pnl-curve.d.ts.map +1 -0
- package/dist/types/statistics-widget.d.ts +29 -0
- package/dist/types/statistics-widget.d.ts.map +1 -0
- package/dist/types/strategies-widget.d.ts +63 -0
- package/dist/types/strategies-widget.d.ts.map +1 -0
- package/dist/types/surface-grid.d.ts +64 -0
- package/dist/types/surface-grid.d.ts.map +1 -0
- package/dist/types/surface-widget.d.ts +64 -0
- package/dist/types/surface-widget.d.ts.map +1 -0
- package/dist/types/trading-data.d.ts +9 -0
- package/dist/types/trading-data.d.ts.map +1 -1
- package/package.json +54 -3
- package/screenshots/equity.png +0 -0
- package/screenshots/log-monitor.png +0 -0
- package/screenshots/optimization-surface.png +0 -0
- package/screenshots/optimization.png +0 -0
- package/screenshots/option-desk.png +0 -0
- package/screenshots/option-smile.png +0 -0
- package/screenshots/panels.jpg +0 -0
- package/screenshots/statistics.png +0 -0
- package/screenshots/strategies.png +0 -0
- package/src/black-scholes.ts +199 -0
- package/src/chart-engine.global.ts +64 -0
- package/src/chart-engine.ts +29 -0
- package/src/control-types.ts +8 -0
- package/src/equity-widget.ts +289 -0
- package/src/heatmap-grid.ts +405 -0
- package/src/index.ts +87 -0
- package/src/log-monitor-widget.ts +312 -0
- package/src/log-tree.ts +131 -0
- package/src/optimization-heatmap-widget.ts +347 -0
- package/src/option-desk-widget.ts +422 -0
- package/src/option-smile-widget.ts +281 -0
- package/src/pnl-curve.ts +216 -0
- package/src/statistics-widget.ts +226 -0
- package/src/strategies-widget.ts +435 -0
- package/src/surface-grid.ts +410 -0
- package/src/surface-widget.ts +457 -0
- package/src/trading-data.ts +22 -0
- package/styles/trading-controls.css +637 -0
- package/translation-keys.json +83 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statistics-widget.js","sourceRoot":"","sources":["../../src/statistics-widget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
// Strategies dashboard — multi-instance.
|
|
2
|
+
//
|
|
3
|
+
// A row per strategy: what state it is in, what it is trading, what it has done, and the
|
|
4
|
+
// controls to start it, stop it and flatten it. This is the panel a browser client exists for -
|
|
5
|
+
// the strategies run on a server and the page is how someone reaches them.
|
|
6
|
+
//
|
|
7
|
+
// Three deliberate departures from the desktop version, each because copying it would carry a
|
|
8
|
+
// defect across. Its Settings button is wired to a disabled command in both shipped hosts, so a
|
|
9
|
+
// viewer sees a permanently dead control - that button is not here, and the rest are declared
|
|
10
|
+
// through deps, so a host that cannot do a thing does not show a button for it. Its P&L
|
|
11
|
+
// sparkline is filled green unconditionally, which paints a losing run in the winning colour;
|
|
12
|
+
// here the curve is coloured by where the run ended. And its P&L change is measured from the
|
|
13
|
+
// first non-zero P&L and never re-anchored, so a restarted strategy keeps measuring from before
|
|
14
|
+
// the restart; here the consumer states the number it means.
|
|
15
|
+
import { formatPnl, formatQty } from './formatters.js';
|
|
16
|
+
import { makeElement, makeIconButton, makePanelId, makePanelRoot } from './dom.js';
|
|
17
|
+
import { ControlTypes } from './control-types.js';
|
|
18
|
+
import { makeGridMenu } from './grid-menu.js';
|
|
19
|
+
import { assertHost } from './trading-host.js';
|
|
20
|
+
import { drawPnlCurve, pnlCurve } from './pnl-curve.js';
|
|
21
|
+
import { DataGrid } from '@stocksharp/grids/data-grid';
|
|
22
|
+
/// The states a strategy moves through, as the wire spells them.
|
|
23
|
+
export const StrategyStates = {
|
|
24
|
+
Stopped: 'stopped',
|
|
25
|
+
Starting: 'starting',
|
|
26
|
+
Started: 'started',
|
|
27
|
+
Stopping: 'stopping',
|
|
28
|
+
};
|
|
29
|
+
const SPARK_WIDTH = 140;
|
|
30
|
+
const SPARK_HEIGHT = 26;
|
|
31
|
+
export class StrategiesWidget {
|
|
32
|
+
static create(hostEl, state, deps) {
|
|
33
|
+
const host = assertHost(deps?.host, 'StrategiesWidget');
|
|
34
|
+
const root = StrategiesWidget._buildRoot(host);
|
|
35
|
+
root.id = makePanelId(StrategiesWidget.TYPE);
|
|
36
|
+
hostEl.appendChild(root);
|
|
37
|
+
return new StrategiesWidget(root, state || {}, deps);
|
|
38
|
+
}
|
|
39
|
+
static _buildRoot(host) {
|
|
40
|
+
const title = host.t('Strategies');
|
|
41
|
+
return makePanelRoot('strategies-panel', title, [
|
|
42
|
+
makeElement('div', 'panel-header', {}, [
|
|
43
|
+
makeElement('span', '', {}, [title]),
|
|
44
|
+
makeIconButton('bt-icon-btn bt-icon-cancel panel-close-btn', host.t('ClosePanel'), 'bi-x', { type: 'button' }),
|
|
45
|
+
]),
|
|
46
|
+
makeElement('div', 'panel-body panel-body-with-rail', {}, [
|
|
47
|
+
makeElement('div', 'panel-body-content', {}, [
|
|
48
|
+
makeElement('table', 'terminal-table strategies-table', { role: 'table', 'aria-label': host.t('StrategiesList') }, [
|
|
49
|
+
makeElement('thead', '', {}, []),
|
|
50
|
+
makeElement('tbody', 'strategies-body', {}, []),
|
|
51
|
+
]),
|
|
52
|
+
]),
|
|
53
|
+
makeElement('div', 'panel-rail', { role: 'toolbar', 'aria-label': host.t('StrategiesActions') }, [
|
|
54
|
+
makeIconButton('bt-icon-btn panel-export-btn', host.t('ExportToExcel'), 'bi-file-earmark-spreadsheet', {}),
|
|
55
|
+
]),
|
|
56
|
+
]),
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
constructor(rootEl, _state, deps) {
|
|
60
|
+
this._host = assertHost(deps?.host, 'StrategiesWidget');
|
|
61
|
+
this._deps = deps;
|
|
62
|
+
this.rootEl = rootEl;
|
|
63
|
+
this.el = this.rootEl.querySelector('.strategies-body');
|
|
64
|
+
this._closeBtn = this.rootEl.querySelector('.panel-close-btn');
|
|
65
|
+
this._exportBtn = this.rootEl.querySelector('.panel-export-btn');
|
|
66
|
+
this._rows = [];
|
|
67
|
+
this._closeBtn?.addEventListener('click', (e) => { e.preventDefault(); this._host.close(); });
|
|
68
|
+
this._exportBtn?.addEventListener('click', (e) => { e.preventDefault(); this._export(); });
|
|
69
|
+
const head = this.rootEl.querySelector('.strategies-table thead');
|
|
70
|
+
this._grid = head && this.el
|
|
71
|
+
? new DataGrid({
|
|
72
|
+
head: head,
|
|
73
|
+
body: this.el,
|
|
74
|
+
columns: this._columns(),
|
|
75
|
+
// By name: a dashboard is a list someone reads down looking for one strategy,
|
|
76
|
+
// and a list that reorders itself as P&L moves cannot be read that way.
|
|
77
|
+
defaultSort: { col: 'name', dir: 'asc' },
|
|
78
|
+
rowKey: (s) => String(s.id),
|
|
79
|
+
emptyText: this._host.t('NoStrategies'),
|
|
80
|
+
rowClass: (s) => `strategy-row strategy-${s.state}${s.error ? ' strategy-failed' : ''}`,
|
|
81
|
+
contextMenu: makeGridMenu(this._host),
|
|
82
|
+
selection: 'multi',
|
|
83
|
+
})
|
|
84
|
+
: null;
|
|
85
|
+
this._host.register(this);
|
|
86
|
+
}
|
|
87
|
+
dispose() {
|
|
88
|
+
this._grid?.destroy();
|
|
89
|
+
this._host.unregister(this);
|
|
90
|
+
try {
|
|
91
|
+
this.rootEl.remove();
|
|
92
|
+
}
|
|
93
|
+
catch { /* already detached */ }
|
|
94
|
+
}
|
|
95
|
+
/// Show these strategies. The whole set: one that is gone from it has been removed, and
|
|
96
|
+
/// leaving its row behind would offer a Stop for something that no longer runs.
|
|
97
|
+
update(rows) {
|
|
98
|
+
this._rows = rows || [];
|
|
99
|
+
this._grid?.setRows(this._rows);
|
|
100
|
+
}
|
|
101
|
+
_export() {
|
|
102
|
+
this._grid?.download('strategies', this._host.t('Strategies'));
|
|
103
|
+
}
|
|
104
|
+
_columns() {
|
|
105
|
+
const label = (key) => this._host.t(key);
|
|
106
|
+
const presentation = this._host.presentation;
|
|
107
|
+
return [
|
|
108
|
+
{
|
|
109
|
+
key: 'state',
|
|
110
|
+
header: label('State'),
|
|
111
|
+
exportable: true,
|
|
112
|
+
value: (s) => s.state,
|
|
113
|
+
render: (s) => this._stateCell(s),
|
|
114
|
+
cellClass: (s) => `strategy-state strategy-state-${s.state}`,
|
|
115
|
+
exportValue: (s) => s.state,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
key: 'actions',
|
|
119
|
+
header: label('Actions'),
|
|
120
|
+
headerHidden: true,
|
|
121
|
+
exportable: false,
|
|
122
|
+
cellClass: () => 'strategy-actions',
|
|
123
|
+
render: (s) => this._actionCell(s),
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
key: 'online',
|
|
127
|
+
header: label('Online'),
|
|
128
|
+
exportable: true,
|
|
129
|
+
value: (s) => (s.online ? 1 : 0),
|
|
130
|
+
render: (s) => (s.online ? '●' : '○'),
|
|
131
|
+
cellClass: (s) => (s.online ? 'strategy-online is-on' : 'strategy-online'),
|
|
132
|
+
exportValue: (s) => (s.online ? label('Yes') : label('No')),
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
key: 'tradingMode',
|
|
136
|
+
header: label('Trading'),
|
|
137
|
+
exportable: true,
|
|
138
|
+
value: (s) => s.tradingMode ?? '',
|
|
139
|
+
render: (s) => this._tradingCell(s),
|
|
140
|
+
exportValue: (s) => s.tradingMode ?? '',
|
|
141
|
+
},
|
|
142
|
+
{ key: 'name', header: label('Name'), exportable: true, value: (s) => s.name },
|
|
143
|
+
{ key: 'portfolio', header: label('Portfolio'), exportable: true, value: (s) => s.portfolio ?? '' },
|
|
144
|
+
{ key: 'security', header: label('Sym'), exportable: true, value: (s) => s.security ?? '' },
|
|
145
|
+
{
|
|
146
|
+
key: 'position',
|
|
147
|
+
header: label('Position'),
|
|
148
|
+
exportable: true,
|
|
149
|
+
value: (s) => s.position ?? 0,
|
|
150
|
+
render: (s) => this._positionCell(s),
|
|
151
|
+
cellClass: (s) => `strategy-position ${presentation.pnlClass(s.position ?? 0)}`,
|
|
152
|
+
exportValue: (s) => s.position ?? 0,
|
|
153
|
+
},
|
|
154
|
+
{ key: 'orders', header: label('OrderCount'), exportable: true, value: (s) => s.ordersCount ?? 0 },
|
|
155
|
+
{ key: 'trades', header: label('NumOfTrades'), exportable: true, value: (s) => s.tradesCount ?? 0 },
|
|
156
|
+
{
|
|
157
|
+
key: 'pnlChange',
|
|
158
|
+
header: label('PnLChange'),
|
|
159
|
+
exportable: true,
|
|
160
|
+
value: (s) => s.pnlChange ?? 0,
|
|
161
|
+
render: (s) => `${direction(s.pnlChange ?? 0)} ${formatPnl(s.pnlChange ?? 0)}`,
|
|
162
|
+
cellClass: (s) => presentation.pnlClass(s.pnlChange ?? 0),
|
|
163
|
+
exportValue: (s) => s.pnlChange ?? 0,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
key: 'pnlChart',
|
|
167
|
+
header: label('PnLChart'),
|
|
168
|
+
exportable: false,
|
|
169
|
+
cellClass: () => 'strategy-spark',
|
|
170
|
+
render: (s) => this._sparkline(s),
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
key: 'realized',
|
|
174
|
+
header: label('RealizedProfit'),
|
|
175
|
+
exportable: true,
|
|
176
|
+
value: (s) => s.realized ?? 0,
|
|
177
|
+
render: (s) => formatPnl(s.realized ?? 0),
|
|
178
|
+
cellClass: (s) => presentation.pnlClass(s.realized ?? 0),
|
|
179
|
+
exportValue: (s) => s.realized ?? 0,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
key: 'unrealized',
|
|
183
|
+
header: label('UnrealizedProfit'),
|
|
184
|
+
exportable: true,
|
|
185
|
+
value: (s) => s.unrealized ?? 0,
|
|
186
|
+
render: (s) => formatPnl(s.unrealized ?? 0),
|
|
187
|
+
cellClass: (s) => presentation.pnlClass(s.unrealized ?? 0),
|
|
188
|
+
exportValue: (s) => s.unrealized ?? 0,
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
key: 'error',
|
|
192
|
+
header: label('Error'),
|
|
193
|
+
exportable: true,
|
|
194
|
+
cellClass: () => 'strategy-error',
|
|
195
|
+
value: (s) => s.error ?? '',
|
|
196
|
+
},
|
|
197
|
+
];
|
|
198
|
+
}
|
|
199
|
+
// A dot and the state's own word. The dot is what is read across a list of twenty; the word
|
|
200
|
+
// is what tells Starting from Started, which a colour alone cannot.
|
|
201
|
+
_stateCell(row) {
|
|
202
|
+
const cell = document.createDocumentFragment();
|
|
203
|
+
const failed = row.error !== undefined && row.error !== null && String(row.error).length > 0;
|
|
204
|
+
const dot = document.createElement('span');
|
|
205
|
+
dot.className = 'strategy-dot';
|
|
206
|
+
dot.textContent = '●';
|
|
207
|
+
// The reason sits on the dot as well as on the word: the dot is what a reader looks at
|
|
208
|
+
// first, and a tooltip only the word carries is one nobody finds.
|
|
209
|
+
if (failed)
|
|
210
|
+
dot.title = String(row.error);
|
|
211
|
+
cell.appendChild(dot);
|
|
212
|
+
const text = document.createElement('span');
|
|
213
|
+
text.className = 'strategy-state-text';
|
|
214
|
+
// A run that stopped because something went wrong says so, rather than reading exactly
|
|
215
|
+
// like one the user stopped and differing only by the colour of the dot. The colour is
|
|
216
|
+
// the same statement made a second time, for a board too narrow to show the error
|
|
217
|
+
// column; the word is what a reader gets first.
|
|
218
|
+
text.textContent = failed && row.state === StrategyStates.Stopped
|
|
219
|
+
? this._host.t('Error')
|
|
220
|
+
: stateText(this._host, row.state);
|
|
221
|
+
if (failed)
|
|
222
|
+
text.title = String(row.error);
|
|
223
|
+
cell.appendChild(text);
|
|
224
|
+
return cell;
|
|
225
|
+
}
|
|
226
|
+
// Only the buttons this host can actually carry out, and only where the state allows them.
|
|
227
|
+
// A strategy that is already running has nothing to start.
|
|
228
|
+
_actionCell(row) {
|
|
229
|
+
const cell = document.createDocumentFragment();
|
|
230
|
+
const deps = this._deps;
|
|
231
|
+
const add = (action, when, title, icon, cls) => {
|
|
232
|
+
if (action === undefined)
|
|
233
|
+
return;
|
|
234
|
+
const button = makeIconButton(`bt-icon-btn ${cls}`, title, icon, { type: 'button' });
|
|
235
|
+
if (!when)
|
|
236
|
+
button.disabled = true;
|
|
237
|
+
else
|
|
238
|
+
button.addEventListener('click', () => action.call(deps, row.id));
|
|
239
|
+
cell.appendChild(button);
|
|
240
|
+
};
|
|
241
|
+
add(deps.start, row.state === StrategyStates.Stopped, this._host.t('Start'), 'bi-play-fill', 'strategy-start-btn');
|
|
242
|
+
add(deps.stop, row.state === StrategyStates.Started, this._host.t('Stop'), 'bi-stop-fill', 'strategy-stop-btn');
|
|
243
|
+
add(deps.riskRules, true, this._host.t('RiskManagement'), 'bi-shield-exclamation', 'strategy-risk-btn');
|
|
244
|
+
add(deps.openStrategy, true, this._host.t('OpenStrategy'), 'bi-box-arrow-up-right', 'strategy-open-btn');
|
|
245
|
+
return cell;
|
|
246
|
+
}
|
|
247
|
+
// The position, and next to it the one gesture that acts on it. Flattening is only
|
|
248
|
+
// meaningful while the strategy runs and only when it holds something.
|
|
249
|
+
_positionCell(row) {
|
|
250
|
+
const position = row.position ?? 0;
|
|
251
|
+
const text = formatQty(position);
|
|
252
|
+
if (this._deps.closePosition === undefined)
|
|
253
|
+
return text;
|
|
254
|
+
const cell = document.createDocumentFragment();
|
|
255
|
+
// The figure sits in a box of a fixed least width, so the button beside it stays put
|
|
256
|
+
// when a minus sign appears or a digit is dropped. Without it the whole column shifts
|
|
257
|
+
// every time a position crosses zero.
|
|
258
|
+
const value = makeElement('span', 'strategy-position-value', {}, [text]);
|
|
259
|
+
cell.appendChild(value);
|
|
260
|
+
const button = makeIconButton('bt-icon-btn strategy-flatten-btn', this._host.t('ClosePosition'), 'bi-x-octagon', { type: 'button' });
|
|
261
|
+
if (row.state !== StrategyStates.Started || position === 0)
|
|
262
|
+
button.disabled = true;
|
|
263
|
+
else
|
|
264
|
+
button.addEventListener('click', () => this._deps.closePosition?.(row.id));
|
|
265
|
+
cell.appendChild(button);
|
|
266
|
+
return cell;
|
|
267
|
+
}
|
|
268
|
+
// The one editable cell, and only when the host can carry the change out.
|
|
269
|
+
_tradingCell(row) {
|
|
270
|
+
const modes = this._deps.tradingModes ?? [];
|
|
271
|
+
if (this._deps.setTradingMode === undefined || modes.length === 0)
|
|
272
|
+
return row.tradingMode ?? '';
|
|
273
|
+
const select = document.createElement('select');
|
|
274
|
+
select.className = 'form-control form-control-sm strategy-mode';
|
|
275
|
+
// Only on a stopped run, the way start is only on a stopped one and stop only on a
|
|
276
|
+
// started one: the mode is what the run will be started with, not a lever to pull while
|
|
277
|
+
// it is trading.
|
|
278
|
+
select.disabled = row.state !== StrategyStates.Stopped;
|
|
279
|
+
for (const mode of modes) {
|
|
280
|
+
const option = document.createElement('option');
|
|
281
|
+
option.value = mode;
|
|
282
|
+
option.textContent = this._host.t(mode);
|
|
283
|
+
if (mode === row.tradingMode)
|
|
284
|
+
option.selected = true;
|
|
285
|
+
select.appendChild(option);
|
|
286
|
+
}
|
|
287
|
+
if (!select.disabled)
|
|
288
|
+
select.addEventListener('change', () => this._deps.setTradingMode?.(row.id, select.value));
|
|
289
|
+
return select;
|
|
290
|
+
}
|
|
291
|
+
// The run's own curve, at the size a cell has. Coloured by where it ended, which is the
|
|
292
|
+
// whole reason a glance at the column tells one strategy from another.
|
|
293
|
+
_sparkline(row) {
|
|
294
|
+
const box = { width: SPARK_WIDTH, height: SPARK_HEIGHT, padX: 1, padY: 2 };
|
|
295
|
+
const curve = pnlCurve(row.pnl ?? [], box);
|
|
296
|
+
if (curve === null)
|
|
297
|
+
return '';
|
|
298
|
+
const canvas = document.createElement('canvas');
|
|
299
|
+
canvas.className = 'strategy-spark-canvas';
|
|
300
|
+
// Two sizes, and they are not the same one. The backing store is in device pixels, so
|
|
301
|
+
// a curve on a 2x screen is drawn at 2x; the CSS box stays the size the column has.
|
|
302
|
+
// Sized only in CSS pixels, as this was, every stroke lands on half the pixels it
|
|
303
|
+
// should and the whole sparkline reads as a smudge.
|
|
304
|
+
const ratio = typeof window === 'undefined' ? 1 : (window.devicePixelRatio || 1);
|
|
305
|
+
canvas.width = Math.round(box.width * ratio);
|
|
306
|
+
canvas.height = Math.round(box.height * ratio);
|
|
307
|
+
canvas.style.width = `${box.width}px`;
|
|
308
|
+
canvas.style.height = `${box.height}px`;
|
|
309
|
+
const ctx = canvas.getContext('2d');
|
|
310
|
+
if (ctx !== null) {
|
|
311
|
+
const palette = this._host.presentation.canvasPalette();
|
|
312
|
+
const scaled = { width: canvas.width, height: canvas.height, padX: box.padX * ratio, padY: box.padY * ratio };
|
|
313
|
+
drawPnlCurve(ctx, pnlCurve(row.pnl ?? [], scaled) ?? curve, scaled, {
|
|
314
|
+
up: palette.up,
|
|
315
|
+
down: palette.down,
|
|
316
|
+
baseline: palette.grid,
|
|
317
|
+
lineWidth: 1.5 * ratio,
|
|
318
|
+
fillOpacity: 0.35,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
return canvas;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
StrategiesWidget.TYPE = ControlTypes.Strategies;
|
|
325
|
+
/// What a state is called here.
|
|
326
|
+
///
|
|
327
|
+
/// Each key is a literal at the point it is asked for, rather than one value picked and then
|
|
328
|
+
/// translated: `translation-keys.json` is generated by scanning the sources for exactly that
|
|
329
|
+
/// shape, so a key assembled from a value never reaches the list, no host learns to translate
|
|
330
|
+
/// it, and it arrives at the user as itself.
|
|
331
|
+
function stateText(host, state) {
|
|
332
|
+
switch (state) {
|
|
333
|
+
case StrategyStates.Started: return host.t('Started');
|
|
334
|
+
case StrategyStates.Starting: return host.t('Starting');
|
|
335
|
+
case StrategyStates.Stopping: return host.t('Stopping');
|
|
336
|
+
default: return host.t('Stopped');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/// Which way a figure moved, as one character. Blank for no change: an arrow that always points
|
|
340
|
+
/// somewhere says a strategy is moving when it is not.
|
|
341
|
+
function direction(value) {
|
|
342
|
+
if (value > 0)
|
|
343
|
+
return '▲';
|
|
344
|
+
if (value < 0)
|
|
345
|
+
return '▼';
|
|
346
|
+
return '';
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=strategies-widget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies-widget.js","sourceRoot":"","sources":["../../src/strategies-widget.ts"],"names":[],"mappings":"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"}
|