Positionsverwaltung
StockSharp stellt ein flexibles Positionsverwaltungssystem bereit, mit dem Sie den aktuellen Positionszustand verfolgen, Positionen auf Basis von Orders oder Trades berechnen und eine Lebenszyklus-Historie (Eröffnung, Schließung, Umkehrungen) führen können.
PositionManager
Die Klasse PositionManager implementiert das Interface IPositionManager und dient als primäre Komponente zur Berechnung aktueller Positionen auf Basis eingehender Nachrichten.
Manager erstellen
Der Konstruktor akzeptiert zwei Parameter:
var state = new PositionManagerState();
var manager = new PositionManager(byOrders: false, state);
byOrders = true- die Position wird auf Basis von Änderungen des Order-Saldos berechnet. Geeignet, wenn das Handelssystem Orderzustandsaktualisierungen, aber keine einzelnen Trades empfängt.byOrders = false- die Position wird auf Basis von Trade-Volumina berechnet (empfohlener Modus). Bietet eine genauere Abrechnung ausgeführter Operationen.
Nachrichten verarbeiten
Die Methode ProcessMessage akzeptiert eine eingehende Nachricht (Message) und gibt eine PositionChangeMessage zurück, wenn sich die Position ändert, oder null, wenn sich die Position nicht geändert hat:
var posChange = manager.ProcessMessage(executionMsg);
if (posChange != null)
{
Console.WriteLine($"Position: {posChange.CurrentValue}");
}
IPositionManagerState
Das Interface IPositionManagerState beschreibt den internen Zustand des Positionsmanagers. Die Implementierung PositionManagerState speichert Informationen zu aktuellen Orders und Positionen.
Hauptmethoden
| Methode | Beschreibung |
|---|---|
AddOrGetOrder |
Registriert eine neue Order oder gibt eine bestehende anhand von transactionId zurück |
TryGetOrder |
Ruft Orderparameter ab (Instrument, Portfolio, Richtung, Saldo) |
UpdateOrderBalance |
Aktualisiert den aktuellen Order-Saldo nach Teilausführung |
RemoveOrder |
Entfernt eine abgeschlossene Order aus dem Tracking |
UpdatePosition |
Aktualisiert die Position nach Instrument und Portfolio und gibt den neuen Wert zurück |
Clear |
Setzt den gesamten Managerzustand zurück |
Beispiel für die Arbeit mit State
var state = new PositionManagerState();
// Order registrieren
state.AddOrGetOrder(
transactionId: 12345,
securityId: secId,
portfolioName: "MyPortfolio",
side: Sides.Buy,
volume: 100,
balance: 100
);
// Nach Teilausführung aktualisieren
state.UpdateOrderBalance(12345, newBalance: 60);
// Position direkt aktualisieren
var newPosition = state.UpdatePosition(secId, "MyPortfolio", diff: 40);
Console.WriteLine($"Aktuelle Position: {newPosition}");
// Leeren
state.Clear();
PositionLifecycleTracker
Die Klasse PositionLifecycleTracker verfolgt den vollständigen Lebenszyklus von Positionen - von der Eröffnung bis zur Schließung (Round-Trip). Dies ist nützlich für die Analyse einzelner Trades, die Gewinnberechnung pro Position und die Erstellung von Berichten.
Hauptmerkmale
- History: Die Eigenschaft
History(IReadOnlyList<ReportPosition>) enthält alle abgeschlossenen Round-Trip-Positionen. - Ereignis
RoundTripClosed: Wird ausgelöst, wenn eine Position geschlossen wird (Wert erreicht null) oder umgekehrt wird (Positionsvorzeichen ändert sich). - Methode
ProcessPosition: Akzeptiert ein Objekt Position und aktualisiert den internen Zustand.
Erkannte Zustände
| Zustand | Beschreibung |
|---|---|
| Opening | Position wechselt von null zu einem Wert ungleich null |
| Closing | Positionswert erreicht null |
| Reversal | Positionsvorzeichen ändert sich (z. B. von Long zu Short) |
Verwendungsbeispiel
var tracker = new PositionLifecycleTracker();
tracker.RoundTripClosed += report =>
{
Console.WriteLine($"Round-Trip abgeschlossen:");
Console.WriteLine($" Eröffnet: {report.OpenTime}");
Console.WriteLine($" Geschlossen: {report.CloseTime}");
};
// Positionenaktualisierungen verarbeiten
tracker.ProcessPosition(position);
// Historie anzeigen
foreach (var report in tracker.History)
{
Console.WriteLine($" {report.OpenTime} -> {report.CloseTime}");
}
PositionMessageAdapter
Die Klasse PositionMessageAdapter ist ein Wrapper um einen Nachrichtenadapter, der Positionen automatisch aus dem Nachrichtenstrom berechnet. Sie wird innerhalb der internen Connector-Infrastruktur verwendet.
Funktionsweise
var innerAdapter = connector.Adapter;
var posManager = new PositionManager(byOrders: false, new PositionManagerState());
var posAdapter = new PositionMessageAdapter(innerAdapter, posManager);
Der Adapter fängt Orderausführungs- und Trade-Nachrichten ab, ruft PositionManager.ProcessMessage auf und erzeugt entsprechende PositionChangeMessage-Instanzen für Upstream-Handler.
Positionen in Strategien
In der Klasse Strategy wird über die Eigenschaft Position auf die aktuelle Position zugegriffen:
// Aktuelle Position für das primäre Instrument
decimal currentPosition = Position;
// Position schließen
if (Position > 0)
SellMarket(Math.Abs(Position));
else if (Position < 0)
BuyMarket(Math.Abs(Position));
// Oder über eine integrierte Methode
ClosePosition();
Weitere Details zu Handelsoperationen in Strategien finden Sie im Abschnitt Handelsoperationen.