Отчеты стратегий
Обзор
StockSharp предоставляет систему генерации отчетов по результатам работы стратегий. Система построена на двух ключевых компонентах:
IReportSource-- интерфейс, описывающий источник данных для отчета (параметры стратегии, заявки, сделки, позиции, статистика).IReportGenerator-- интерфейс генератора отчетов, поддерживающий различные форматы (CSV, JSON, XML, Excel).
Класс Strategy реализует интерфейс IReportSource, поэтому стратегию можно напрямую передать в генератор отчетов.
Интерфейс IReportSource
Интерфейс IReportSource предоставляет все данные, необходимые для формирования отчета:
| Свойство | Тип | Описание |
|---|---|---|
Name |
string |
Название стратегии |
TotalWorkingTime |
TimeSpan |
Общее время работы |
Commission |
decimal? |
Суммарная комиссия |
Position |
decimal |
Текущая позиция |
PnL |
decimal |
Суммарная прибыль/убыток |
Slippage |
decimal? |
Суммарное проскальзывание |
Latency |
TimeSpan? |
Суммарная задержка |
Parameters |
IEnumerable<(string, object)> |
Параметры стратегии |
StatisticParameters |
IEnumerable<(string, object)> |
Статистические параметры |
Orders |
IEnumerable<ReportOrder> |
Заявки |
OwnTrades |
IEnumerable<ReportTrade> |
Собственные сделки |
Positions |
IEnumerable<ReportPosition> |
Раунд-трипы позиций |
Перед чтением данных вызывается метод Prepare(), который синхронизирует внутреннее состояние источника.
Класс ReportSource
ReportSource -- самостоятельная реализация IReportSource, не привязанная к классу Strategy. Позволяет вручную формировать источник данных для отчета:
var source = new ReportSource();
source.Name = "Моя стратегия";
source.PnL = 15000m;
source.TotalWorkingTime = TimeSpan.FromHours(8);
source.AddParameter("Таймфрейм", "5 минут");
source.AddStatisticParameter("Sharpe Ratio", 1.85);
source.AddOrder(new ReportOrder(
Id: 123,
TransactionId: 456,
SecurityId: securityId,
Side: Sides.Buy,
Time: DateTime.UtcNow,
Price: 100m,
State: OrderStates.Done,
Balance: 0,
Volume: 10,
Type: OrderTypes.Limit
));
Агрегация данных
При большом количестве заявок и сделок ReportSource автоматически агрегирует данные для уменьшения объема отчета:
// Порог автоматической агрегации (по умолчанию 10000)
source.MaxOrdersBeforeAggregation = 5000;
source.MaxTradesBeforeAggregation = 5000;
// Интервал группировки (по умолчанию 1 час)
source.AggregationInterval = TimeSpan.FromMinutes(30);
// Ручная агрегация
source.AggregateOrders(TimeSpan.FromHours(1));
source.AggregateTrades(TimeSpan.FromHours(1));
При агрегации заявки и сделки группируются по временному интервалу, инструменту и направлению. Объемы суммируются, цены рассчитываются как средневзвешенные.
PositionLifecycleTracker
PositionLifecycleTracker отслеживает жизненный цикл позиций и формирует раунд-трипы (round-trips) -- записи об открытии и закрытии позиции.
Раунд-трип фиксируется, когда:
- Позиция полностью закрывается (значение становится равным 0)
- Происходит разворот позиции (смена знака)
В классе Strategy трекер автоматически интегрирован: замкнутые раунд-трипы добавляются в ReportSource через событие RoundTripClosed.
var tracker = new PositionLifecycleTracker();
// Событие при закрытии раунд-трипа
tracker.RoundTripClosed += roundTrip =>
{
Console.WriteLine($"Позиция закрыта: {roundTrip.SecurityId}, " +
$"Открытие: {roundTrip.OpenTime} по {roundTrip.OpenPrice}, " +
$"Закрытие: {roundTrip.CloseTime} по {roundTrip.ClosePrice}, " +
$"Макс. объем: {roundTrip.MaxPosition}");
};
// Обработка обновления позиции
tracker.ProcessPosition(position);
// Доступ к истории раунд-трипов
IReadOnlyList<ReportPosition> history = tracker.History;
Генераторы отчетов
Доступны следующие генераторы:
| Генератор | Формат | Описание |
|---|---|---|
CsvReportGenerator |
CSV | Текстовый формат с разделителями |
JsonReportGenerator |
JSON | Структурированный JSON |
XmlReportGenerator |
XML | Формат XML |
ExcelReportGenerator |
Excel | Формат Excel (требует IExcelWorkerProvider) |
Все генераторы наследуются от BaseReportGenerator и поддерживают настройку включаемых секций:
var generator = new CsvReportGenerator();
// Настройка секций отчета
generator.IncludeOrders = true;
generator.IncludeTrades = true;
generator.IncludePositions = true;
generator.Encoding = Encoding.UTF8;
Генерация отчета из стратегии
Так как Strategy реализует IReportSource, отчет можно сгенерировать напрямую:
// Стратегия сама является источником данных
var generator = new JsonReportGenerator();
using var stream = File.Create("report.json");
await generator.Generate(strategy, stream, CancellationToken.None);
Для отдельного источника данных:
var source = new ReportSource();
source.Name = strategy.Name;
source.PnL = strategy.PnL;
source.TotalWorkingTime = strategy.TotalWorkingTime;
// Добавить позиции из трекера
source.AddPositions(tracker.History);
var generator = new CsvReportGenerator();
using var stream = File.Create("report.csv");
await generator.Generate(source, stream, CancellationToken.None);
Пример: стратегия с генерацией отчета при остановке
public class ReportingStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public ReportingStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle)
{
if (!IsFormedAndOnlineAndAllowTrading())
return;
// Торговая логика...
}
protected override void OnStopped()
{
// Генерация отчета при остановке стратегии
var generator = new CsvReportGenerator();
using var stream = File.Create($"report_{Name}_{DateTime.Now:yyyyMMdd_HHmmss}.csv");
generator.Generate(this, stream, CancellationToken.None).AsTask().Wait();
base.OnStopped();
}
}
В этом примере стратегия автоматически создает CSV-отчет при остановке. Отчет включает параметры стратегии, статистику, заявки, сделки и раунд-трипы позиций.