Создание собственных панелей для стратегий

У каждой стратегии в Shell есть две панели: панель настройки в области Эмуляция и панель наблюдения в области Реал-тайм. По умолчанию обе - общие: таблица параметров и, для эмуляции, вкладка с настройками истории. Собственная панель нужна, когда стратегии есть что показать сверх этого.

Заготовка

Панели лежат в Shell.Avalonia/Shell.Avalonia/Views/Strategies/. Собственная - это обычный UserControl Avalonia, внутри которого используется одна из двух общих панелей:

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:views="using:Shell.Views.Strategies"
             xmlns:strategies="using:Shell.ViewModels.Strategies"
             x:Class="Shell.Views.Strategies.MyTestingView"
             x:DataType="strategies:StrategyDraftViewModel">
  <views:TestingView Header="Моя стратегия, тестирование" />
</UserControl>

TestingView - панель настройки, MonitoringView - панель наблюдения. Свойство Header - это подпись, которой панель называет себя в своей строке заголовка.

Контекстом данных панели всегда является StrategyDraftViewModel - та самая модель, которую редактирует пользователь. Через неё доступны название стратегии, её параметры, настройки прогона и текущее состояние, поэтому собственные элементы привязываются к ней напрямую, без обращения к главному окну.

Привязка панели к стратегии

Какая панель показывается для какой стратегии, решает StrategyDraftViewLocator. Там перечислены пары «область + вид шаблона - панель»:

public Control Build(object data)
	=> data switch
	{
		StrategyDraftViewModel { WorkspaceKind: StrategyWorkspaceKind.Backtest, TemplateKind: StrategyTemplateKind.Sma } => new SmaTestingView(),
		StrategyDraftViewModel { WorkspaceKind: StrategyWorkspaceKind.Realtime, TemplateKind: StrategyTemplateKind.Sma } => new SmaMonitoringView(),
		...
		StrategyDraftViewModel { WorkspaceKind: StrategyWorkspaceKind.Backtest } => new TestingView(),
		StrategyDraftViewModel { WorkspaceKind: StrategyWorkspaceKind.Realtime } => new MonitoringView(),
		_ => null,
	};

Две последние строки - это и есть панели по умолчанию: стратегия, для которой ничего не добавлено, получает их.

Что показывать не нужно

График сделок, статистику, кривую доходности, заявки и собственные сделки рисовать в своей панели не нужно - это отдельные панели рядом, и они наполняются сами для любой стратегии.

См. также

Создание собственной стратегии