Стратегии

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

Список стратегий с состоянием, позицией, PnL и кривой доходности

Создание и обновление

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() — снять регистрацию, удалить таблицу и освободить ресурсы.

Смотрите также