Стратегии
StrategiesWidget показывает список запущенных стратегий: одна строка на стратегию с её состоянием, торговым режимом, позицией, счётчиками заявок и сделок, прибылью и кнопками управления. Идентификатор контрола — strategies (ControlTypes.Strategies), доступный также через статическое свойство StrategiesWidget.TYPE.

Создание и обновление
import {
StrategiesWidget,
StrategyStates,
type TradingHost,
} from '@stocksharp/trading-controls';
declare const host: TradingHost;
let strategies!: StrategiesWidget;
strategies = StrategiesWidget.create(
document.querySelector<HTMLElement>('#strategies')!,
{},
{
host,
tradingModes: ['Disabled', 'CancelOrders', 'ReducePosition', 'Full'],
start: id => console.log('start', id),
stop: id => console.log('stop', id),
closePosition: id => console.log('flatten', id),
openStrategy: id => console.log('open', id),
riskRules: id => console.log('risk', id),
setTradingMode: (id, mode) => console.log('mode', id, mode),
},
);
strategies.update([{
id: 'sma-1',
name: 'SMA crossover',
state: StrategyStates.Started,
online: true,
tradingMode: 'Full',
portfolio: 'Demo',
security: 'BTC@IMEX',
position: 0.25,
ordersCount: 12,
tradesCount: 8,
pnlChange: 105,
realized: 20,
unrealized: 85,
pnl: [
{ time: 1, value: 0 },
{ time: 2, value: 60 },
{ time: 3, value: 105 },
],
}]);
update принимает полный набор строк и заменяет им таблицу: стратегия, которой нет в переданном списке, считается удалённой, и её строка исчезает. Потокового обновления одной строки у контрола нет — новое состояние приходит целым списком.
Второй аргумент create — сохранённое состояние экземпляра. Контрол его не читает и сам ничего не сохраняет: ни ключей в host.preferences, ни вызовов host.persistState.
Объект StrategyStates экспортирует состояния Stopped, Starting, Started и Stopping.
Зависимости
Обязателен только хост. Полнота хоста проверяется при создании функцией assertHost, поэтому неполный TradingHost приводит к исключению с именем недостающего члена, а не к неработающей кнопке.
| Зависимость | Обязательность | Поведение по умолчанию |
|---|---|---|
host |
обязательная | — |
start(id) |
необязательная | Кнопка запуска не создаётся. |
stop(id) |
необязательная | Кнопка остановки не создаётся. |
closePosition(id) |
необязательная | В колонке позиции остаётся только число. |
openStrategy(id) |
необязательная | Кнопка перехода к стратегии не создаётся. |
riskRules(id) |
необязательная | Кнопка правил риска не создаётся. |
setTradingMode(id, mode) |
необязательная | Торговый режим показывается текстом. |
tradingModes |
необязательная | Пустой список, выпадающий список режимов не создаётся. |
Такой набор позволяет собрать панель только для чтения: если не передана ни одна функция действия, таблица отображает данные и не показывает ни одной кнопки.
Строки tradingModes проходят через host.t, то есть служат ключами перевода. Они принадлежат хосту, а не пакету, поэтому их отсутствие в translation-keys.json — норма, и переводит их хост.
Состояния и действия
Ячейка состояния состоит из точки и слова: точка читается при беглом просмотре списка, слово отличает Starting от Started. Если в строке заполнено поле error, текст ошибки попадает во всплывающую подсказку и точки, и слова, а остановленная из-за сбоя стратегия обозначается словом «Ошибка», а не «Остановлена».
Кнопки строки создаются только для переданных хостом функций и включены только там, где состояние это допускает:
- запуск — только у стратегии в состоянии
Stopped; - остановка — только у стратегии в состоянии
Started; - закрытие позиции — только у работающей стратегии с ненулевой позицией;
- правила риска и переход к стратегии — всегда.
Выпадающий список торгового режима активен только у остановленной стратегии: режим определяет, с чем стратегия будет запущена, и не служит рычагом во время торговли. Изменение режима вызывает setTradingMode; контрол сам не меняет значение в строке и ждёт следующего update.
Колонки и оформление
В таблице показываются состояние, действия, признак онлайна, торговый режим, имя, портфель, инструмент, позиция, количество заявок и сделок, изменение прибыли, график прибыли, реализованная и нереализованная прибыль, ошибка. Признак онлайна — общий: стратегия считается онлайн, только если она и сформирована, и подключена, и это решает поставщик данных.
Классы цвета для позиции, изменения прибыли и обеих величин прибыли возвращает host.presentation.pnlClass. Изменение прибыли дополнительно помечается стрелкой направления; при нулевом изменении стрелки нет.
Колонка графика рисует кривую накопленной прибыли по точкам pnl в поле 140 × 26 CSS-пикселей. Холст создаётся с учётом devicePixelRatio, поэтому линия остаётся резкой на экранах с высокой плотностью. Цвета берутся из host.presentation.canvasPalette(), а кривая окрашивается по итогу прогона: стратегия, дошедшая до пика и вернувшая всё обратно, показывается как убыточная. Без точек pnl ячейка остаётся пустой.
Сортировка по умолчанию — по имени по возрастанию: список читают сверху вниз в поисках конкретной стратегии, и перестановка строк вслед за прибылью такому чтению мешает. Панель также поддерживает выделение нескольких строк, контекстное меню, фильтры и экспорт в XLSX.
Что остаётся хосту
Контрол не запускает и не останавливает стратегии, не отправляет заявки и не закрывает позиции — он вызывает переданные функции и ждёт нового списка строк.
Значение pnlChange контрол принимает как есть: точку отсчёта выбирает поставщик данных. Так перезапущенная стратегия не продолжает считать изменение от момента до перезапуска.
Кнопка закрытия панели вызывает host.close(), экспорт выгружает файл strategies. Экземпляр регистрируется в хосте при создании и снимается с регистрации в dispose.
Публичные методы
StrategiesWidget.create(hostEl, state, deps)— построить панель и добавить её в контейнер.update(rows)— заменить весь список стратегий.dispose()— снять регистрацию, удалить таблицу и освободить ресурсы.