Informes de estrategia
Descripción general
StockSharp proporciona un sistema de generación de informes para resultados de trading de estrategias. El sistema se basa en dos componentes clave:
IReportSource-- una interfaz que describe la fuente de datos para el informe (parámetros de estrategia, órdenes, operaciones, posiciones, estadísticas).IReportGenerator-- una interfaz de generador de informes que admite varios formatos (CSV, JSON, XML, Excel).
La clase Strategy implementa la interfaz IReportSource, por lo que una estrategia se puede pasar directamente al generador de informes.
Interfaz IReportSource
La interfaz IReportSource proporciona todos los datos necesarios para generar un informe:
| Propiedad | Tipo | Descripción |
|---|---|---|
Name |
string |
Nombre de la estrategia |
TotalWorkingTime |
TimeSpan |
Tiempo total de trabajo |
Commission |
decimal? |
Comisión total |
Position |
decimal |
Posición actual |
PnL |
decimal |
Beneficio/pérdida total |
Slippage |
decimal? |
Slippage total |
Latency |
TimeSpan? |
Latencia total |
Parameters |
IEnumerable<(string, object)> |
Parámetros de estrategia |
StatisticParameters |
IEnumerable<(string, object)> |
Parámetros estadísticos |
Orders |
IEnumerable<ReportOrder> |
Órdenes |
OwnTrades |
IEnumerable<ReportTrade> |
Operaciones propias |
Positions |
IEnumerable<ReportPosition> |
Round-trips de posición |
Antes de leer los datos, se llama al método Prepare() para sincronizar el estado interno de la fuente.
Clase ReportSource
ReportSource es una implementación independiente de IReportSource, no vinculada a la clase Strategy. Permite construir manualmente la fuente de datos para un informe:
var source = new ReportSource();
source.Name = "Mi estrategia";
source.PnL = 15000m;
source.TotalWorkingTime = TimeSpan.FromHours(8);
source.AddParameter("Timeframe", "5 minutes");
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
));
Agregación de datos
Con una gran cantidad de órdenes y operaciones, ReportSource agrega automáticamente datos para reducir el tamaño del informe:
// Umbral de agregación automática (el valor predeterminado es 10000)
source.MaxOrdersBeforeAggregation = 5000;
source.MaxTradesBeforeAggregation = 5000;
// Intervalo de agrupación (el valor predeterminado es 1 hora)
source.AggregationInterval = TimeSpan.FromMinutes(30);
// Agregación manual
source.AggregateOrders(TimeSpan.FromHours(1));
source.AggregateTrades(TimeSpan.FromHours(1));
Durante la agregación, las órdenes y operaciones se agrupan por intervalo de tiempo, instrumento y dirección. Los volúmenes se suman y los precios se calculan como promedios ponderados.
PositionLifecycleTracker
PositionLifecycleTracker sigue el ciclo de vida de posiciones y genera round-trips: registros de apertura y cierre de posición.
Un round-trip se registra cuando:
- Una posición se cierra por completo (el valor se vuelve cero)
- Se produce una reversión de posición (cambio de signo)
En la clase Strategy, el tracker se integra automáticamente: los round-trips completados se agregan a ReportSource mediante el evento RoundTripClosed.
var tracker = new PositionLifecycleTracker();
// Evento al cerrar round-trip
tracker.RoundTripClosed += roundTrip =>
{
Console.WriteLine($"Posición cerrada: {roundTrip.SecurityId}, " +
$"Apertura: {roundTrip.OpenTime} a {roundTrip.OpenPrice}, " +
$"Cierre: {roundTrip.CloseTime} a {roundTrip.ClosePrice}, " +
$"Volumen máximo: {roundTrip.MaxPosition}");
};
// Procesar actualización de posición
tracker.ProcessPosition(position);
// Acceder al historial de round-trips
IReadOnlyList<ReportPosition> history = tracker.History;
Generadores de informes
Están disponibles los siguientes generadores:
| Generador | Formato | Descripción |
|---|---|---|
CsvReportGenerator |
CSV | Formato de texto con delimitadores |
JsonReportGenerator |
JSON | JSON estructurado |
XmlReportGenerator |
XML | Formato XML |
ExcelReportGenerator |
Excel | Formato Excel (requiere IExcelWorkerProvider) |
Todos los generadores heredan de BaseReportGenerator y admiten la configuración de secciones incluidas:
var generator = new CsvReportGenerator();
// Configurar secciones del informe
generator.IncludeOrders = true;
generator.IncludeTrades = true;
generator.IncludePositions = true;
generator.Encoding = Encoding.UTF8;
Generar un informe desde una estrategia
Como Strategy implementa IReportSource, se puede generar un informe directamente:
// La propia estrategia es la fuente de datos
var generator = new JsonReportGenerator();
using var stream = File.Create("report.json");
await generator.Generate(strategy, stream, CancellationToken.None);
Para una fuente de datos separada:
var source = new ReportSource();
source.Name = strategy.Name;
source.PnL = strategy.PnL;
source.TotalWorkingTime = strategy.TotalWorkingTime;
// Agregar posiciones desde el tracker
source.AddPositions(tracker.History);
var generator = new CsvReportGenerator();
using var stream = File.Create("report.csv");
await generator.Generate(source, stream, CancellationToken.None);
Ejemplo: estrategia con generación de informe al detenerse
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;
// Lógica de trading...
}
protected override void OnStopped()
{
// Generar informe cuando se detiene la estrategia
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();
}
}
En este ejemplo, la estrategia crea automáticamente un informe CSV cuando se detiene. El informe incluye parámetros de estrategia, estadísticas, órdenes, operaciones y round-trips de posición.