Risikomanagement
Überblick
Jede Strategie in StockSharp verfügt über einen integrierten RiskManager, der die automatische Kontrolle von Handelsrisiken ermöglicht. Wenn eine Regel ausgelöst wird, kann der Manager Positionen schließen, aktive Orders stornieren oder den Handel der Strategie vollständig stoppen.
Der Risikomanager verarbeitet alle Handelsmeldungen, die durch die Strategie laufen. Wenn Regelbedingungen erfüllt sind, führt er die festgelegte Aktion automatisch aus, ohne dass zusätzlicher Code in der Strategielogik erforderlich ist.
Strategieeigenschaften
RiskManager
Das Objekt IRiskManager, das die Liste der Regeln verwaltet. Es wird automatisch erstellt, wenn die Strategie initialisiert wird:
// Zugriff auf den Risikomanager
IRiskManager manager = strategy.RiskManager;
RiskRules
Eine bequeme Eigenschaft zum Lesen und Setzen der Regelliste:
// Aktuelle Regeln lesen
IEnumerable<IRiskRule> rules = strategy.RiskRules;
// Neue Regeln setzen
strategy.RiskRules = new IRiskRule[]
{
new RiskPnLRule { PnL = -1000m, Action = RiskActions.StopTrading },
new RiskPositionSizeRule { Position = 100m, Action = RiskActions.ClosePositions },
};
Auslöseaktionen
Die Enumeration RiskActions definiert die möglichen Aktionen:
| Aktion | Beschreibung |
|---|---|
ClosePositions |
Alle offenen Positionen mit einer Market-Order schließen |
StopTrading |
Den Handel der Strategie blockieren |
CancelOrders |
Alle aktiven Orders stornieren |
Wenn eine Regel ausgelöst wird, protokolliert die Strategie eine Warnung mit dem Regelnamen, ihren Parametern und der ausgeführten Aktion.
Verfügbare Regeln
RiskPnLRule -- Gewinn-/Verlustkontrolle
Wird ausgelöst, wenn das angegebene P&L-Niveau erreicht ist. Ein positiver Wert kontrolliert Gewinn, ein negativer Wert kontrolliert Verlust:
// Handel bei einem Verlust über 5000 stoppen
new RiskPnLRule
{
PnL = -5000m,
Action = RiskActions.StopTrading
}
RiskPositionSizeRule -- Kontrolle der Positionsgröße
Wird ausgelöst, wenn die angegebene Positionsgröße erreicht ist:
// Aufträge stornieren, wenn Position >= 100
new RiskPositionSizeRule
{
Position = 100m,
Action = RiskActions.CancelOrders
}
RiskOrderFreqRule -- Kontrolle der Orderfrequenz
Wird ausgelöst, wenn die Anzahl der Orders innerhalb des angegebenen Intervalls das Limit überschreitet:
// Stoppen bei mehr als 50 Orders pro Minute
new RiskOrderFreqRule
{
Count = 50,
Interval = TimeSpan.FromMinutes(1),
Action = RiskActions.StopTrading
}
RiskOrderVolumeRule -- Kontrolle des Ordervolumens
Wird ausgelöst, wenn das Volumen einer einzelnen Order überschritten wird.
RiskOrderPriceRule -- Kontrolle des Orderpreises
Wird ausgelöst, wenn der Orderpreis die festgelegten Grenzen überschreitet.
RiskTradeVolumeRule -- Kontrolle des Trade-Volumens
Wird ausgelöst, wenn das Volumen eines einzelnen Trades überschritten wird.
RiskTradePriceRule -- Kontrolle des Trade-Preises
Wird ausgelöst, wenn der Trade-Preis die festgelegten Grenzen überschreitet.
RiskTradeFreqRule -- Kontrolle der Trade-Frequenz
Wird ausgelöst, wenn die Anzahl der Trades innerhalb des Intervalls überschritten wird.
RiskPositionTimeRule -- Kontrolle der Positionshaltedauer
Wird ausgelöst, wenn eine Position länger als die festgelegte Zeit gehalten wurde.
RiskCommissionRule -- Kommissionskontrolle
Wird ausgelöst, wenn die Gesamtkommission überschritten wird.
RiskSlippageRule -- Slippage-Kontrolle
Wird ausgelöst, wenn das Slippage-Niveau überschritten wird.
RiskErrorRule -- Fehlerkontrolle
Wird ausgelöst, wenn sich eine bestimmte Anzahl von Fehlern angesammelt hat.
RiskOrderErrorRule -- Kontrolle von Orderregistrierungsfehlern
Wird ausgelöst, wenn sich Orderregistrierungsfehler angesammelt haben.
Verwendungsbeispiel
public class RiskAwareStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public RiskAwareStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame());
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
// Risikomanagementregeln konfigurieren
RiskRules = new IRiskRule[]
{
// Positionen bei einem Verlust über 10000 schließen
new RiskPnLRule
{
PnL = -10000m,
Action = RiskActions.ClosePositions
},
// Handel stoppen, wenn die Position 500 Kontrakte überschreitet
new RiskPositionSizeRule
{
Position = 500m,
Action = RiskActions.StopTrading
},
// Aufträge stornieren, wenn die Frequenz 100 pro Minute überschreitet
new RiskOrderFreqRule
{
Count = 100,
Interval = TimeSpan.FromMinutes(1),
Action = RiskActions.CancelOrders
},
};
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle)
{
if (!IsFormedAndOnlineAndAllowTrading())
return;
// Handelslogik
if (candle.OpenPrice < candle.ClosePrice && Position <= 0)
BuyMarket(Volume + Math.Abs(Position));
else if (candle.OpenPrice > candle.ClosePrice && Position >= 0)
SellMarket(Volume + Math.Abs(Position));
}
}
In diesem Beispiel werden Risikomanagementregeln beim Start der Strategie gesetzt. Wenn ein Verlust von 10000 erreicht wird, werden Positionen automatisch geschlossen. Wenn die Positionsgröße 500 Kontrakte überschreitet, wird der Handel blockiert. Wenn Orders zu häufig platziert werden, werden aktive Orders storniert. Alle diese Prüfungen werden automatisch ausgeführt, ohne zusätzlichen Code in der Methode ProcessCandle.