Strategieberichte
Überblick
StockSharp stellt ein System zur Berichtserstellung für Handelsergebnisse von Strategien bereit. Das System basiert auf zwei Schlüsselkomponenten:
IReportSource-- eine Schnittstelle, die die Datenquelle für den Bericht beschreibt (Strategieparameter, Orders, Trades, Positionen, Statistiken).IReportGenerator-- eine Schnittstelle für Berichtsgeneratoren, die verschiedene Formate unterstützt (CSV, JSON, XML, Excel).
Die Klasse Strategy implementiert die Schnittstelle IReportSource, sodass eine Strategie direkt an den Berichtsgenerator übergeben werden kann.
IReportSource-Schnittstelle
Die Schnittstelle IReportSource stellt alle Daten bereit, die zum Erzeugen eines Berichts benötigt werden:
| Eigenschaft | Typ | Beschreibung |
|---|---|---|
Name |
string |
Strategiename |
TotalWorkingTime |
TimeSpan |
Gesamte Arbeitszeit |
Commission |
decimal? |
Gesamte Kommission |
Position |
decimal |
Aktuelle Position |
PnL |
decimal |
Gesamter Gewinn/Verlust |
Slippage |
decimal? |
Gesamte Slippage |
Latency |
TimeSpan? |
Gesamte Latenz |
Parameters |
IEnumerable<(string, object)> |
Strategieparameter |
StatisticParameters |
IEnumerable<(string, object)> |
Statistikparameter |
Orders |
IEnumerable<ReportOrder> |
Orders |
OwnTrades |
IEnumerable<ReportTrade> |
Eigene Trades |
Positions |
IEnumerable<ReportPosition> |
Positions-Round-Trips |
Vor dem Lesen der Daten wird die Methode Prepare() aufgerufen, um den internen Zustand der Quelle zu synchronisieren.
ReportSource-Klasse
ReportSource ist eine eigenständige Implementierung von IReportSource, die nicht an die Klasse Strategy gebunden ist. Sie erlaubt den manuellen Aufbau der Datenquelle für einen Bericht:
var source = new ReportSource();
source.Name = "Meine Strategie";
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
));
Datenaggregation
Bei einer großen Anzahl von Orders und Trades aggregiert ReportSource Daten automatisch, um die Berichtsgröße zu reduzieren:
// Automatischer Aggregationsschwellenwert (Standardwert ist 10000)
source.MaxOrdersBeforeAggregation = 5000;
source.MaxTradesBeforeAggregation = 5000;
// Gruppierungsintervall (Standardwert ist 1 Stunde)
source.AggregationInterval = TimeSpan.FromMinutes(30);
// Manuelle Aggregation
source.AggregateOrders(TimeSpan.FromHours(1));
source.AggregateTrades(TimeSpan.FromHours(1));
Während der Aggregation werden Orders und Trades nach Zeitintervall, Instrument und Richtung gruppiert. Volumina werden summiert, Preise als gewichtete Durchschnitte berechnet.
PositionLifecycleTracker
PositionLifecycleTracker verfolgt den Lebenszyklus von Positionen und erzeugt Round-Trips, also Datensätze über Positionsöffnung und -schließung.
Ein Round-Trip wird aufgezeichnet, wenn:
- Eine Position vollständig geschlossen wird, also der Wert null wird
- Eine Positionsumkehr stattfindet, also ein Vorzeichenwechsel
In der Klasse Strategy ist der Tracker automatisch integriert: abgeschlossene Round-Trips werden über das Ereignis RoundTripClosed zu ReportSource hinzugefügt.
var tracker = new PositionLifecycleTracker();
// Ereignis beim Schließen eines Round-Trips
tracker.RoundTripClosed += roundTrip =>
{
Console.WriteLine($"Position geschlossen: {roundTrip.SecurityId}, " +
$"Öffnung: {roundTrip.OpenTime} zu {roundTrip.OpenPrice}, " +
$"Schließung: {roundTrip.CloseTime} zu {roundTrip.ClosePrice}, " +
$"Max. Volumen: {roundTrip.MaxPosition}");
};
// Positionenaktualisierung verarbeiten
tracker.ProcessPosition(position);
// Zugriff auf die Round-Trip-Historie
IReadOnlyList<ReportPosition> history = tracker.History;
Berichtsgeneratoren
Die folgenden Generatoren sind verfügbar:
| Generator | Format | Beschreibung |
|---|---|---|
CsvReportGenerator |
CSV | Textformat mit Trennzeichen |
JsonReportGenerator |
JSON | Strukturiertes JSON |
XmlReportGenerator |
XML | XML-Format |
ExcelReportGenerator |
Excel | Excel-Format (erfordert IExcelWorkerProvider) |
Alle Generatoren erben von BaseReportGenerator und unterstützen die Konfiguration der enthaltenen Abschnitte:
var generator = new CsvReportGenerator();
// Berichtsabschnitte konfigurieren
generator.IncludeOrders = true;
generator.IncludeTrades = true;
generator.IncludePositions = true;
generator.Encoding = Encoding.UTF8;
Bericht aus einer Strategie erzeugen
Da Strategy IReportSource implementiert, kann ein Bericht direkt erzeugt werden:
// Die Strategie selbst ist die Datenquelle
var generator = new JsonReportGenerator();
using var stream = File.Create("report.json");
await generator.Generate(strategy, stream, CancellationToken.None);
Für eine separate Datenquelle:
var source = new ReportSource();
source.Name = strategy.Name;
source.PnL = strategy.PnL;
source.TotalWorkingTime = strategy.TotalWorkingTime;
// Positionen aus dem Tracker hinzufügen
source.AddPositions(tracker.History);
var generator = new CsvReportGenerator();
using var stream = File.Create("report.csv");
await generator.Generate(source, stream, CancellationToken.None);
Beispiel: Strategie mit Berichtserstellung beim Stoppen
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;
// Handelslogik...
}
protected override void OnStopped()
{
// Bericht erzeugen, wenn die Strategie stoppt
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();
}
}
In diesem Beispiel erstellt die Strategie beim Stoppen automatisch einen CSV-Bericht. Der Bericht enthält Strategieparameter, Statistiken, Orders, Trades und Positions-Round-Trips.