Logging in Strategien
In StockSharp erbt die Klasse Strategy von BaseLogReceiver. Dadurch können integrierte Werkzeuge verwendet werden, um alle Aktionen und Ereignisse zu protokollieren, die während der Ausführung einer Handelsstrategie auftreten.
Logging-Stufen
StockSharp unterstützt die folgenden Logging-Stufen, aufgelistet in aufsteigender Wichtigkeit:
- Verbose - die detaillierteste Logging-Stufe für Tracing
- Debug - Meldungen für die Fehlersuche
- Info - normale Informationsmeldungen
- Warning - Warnungen vor potenziellen Problemen
- Error - Fehlermeldungen
Logging-Methoden in Strategy
Die Strategie stellt die folgenden Methoden zum Schreiben von Meldungen in das Log bereit:
LogVerbose
Die Methode LogVerbose dient zum Aufzeichnen detaillierter Meldungen für Tracing:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
LogVerbose("Strategie mit Parametern gestartet: lange SMA={0}, kurze SMA={1}", LongSmaLength, ShortSmaLength);
// ...
}
LogDebug
Die Methode LogDebug wird für Debug-Meldungen verwendet:
private void ProcessCandle(ICandleMessage candle)
{
LogDebug("Kerze wird verarbeitet: {0}, Open={1}, Close={2}, High={3}, Low={4}, Volumen={5}",
candle.OpenTime, candle.OpenPrice, candle.ClosePrice, candle.HighPrice, candle.LowPrice, candle.TotalVolume);
// ...
}
LogInfo
Die Methode LogInfo wird für normale Informationsmeldungen verwendet:
private void CalculateSignal(decimal shortSma, decimal longSma)
{
bool isShortGreaterThanLong = shortSma > longSma;
LogInfo("Signal: {0}, kurze SMA={1}, lange SMA={2}",
isShortGreaterThanLong ? "Kauf" : "Verkauf", shortSma, longSma);
// ...
}
LogWarning
Die Methode LogWarning wird zum Aufzeichnen von Warnungen verwendet:
public void RegisterOrder(Order order)
{
if (order.Volume <= 0)
{
LogWarning("Versuch, eine Order mit ungültigem Volumen zu registrieren: {0}", order.Volume);
return;
}
// ...
}
LogError
Die Methode LogError wird zum Aufzeichnen von Fehlermeldungen verwendet:
try
{
// Einige Aktionen
}
catch (Exception ex)
{
LogError("Fehler beim Ausführen der Operation: {0}", ex.Message);
Stop();
}
Es gibt außerdem eine Überladung LogError, die direkt eine Ausnahme akzeptiert:
try
{
// Einige Aktionen
}
catch (Exception ex)
{
LogError(ex);
Stop();
}
Konfigurieren der Logging-Stufe
Die Klasse Strategy enthält die Eigenschaft LogLevel, die bestimmt, welche Meldungen in das Log geschrieben werden:
// Logging-Stufe für die Strategie festlegen
strategy.LogLevel = LogLevels.Info;
Bei der ausgewählten Logging-Stufe werden nur Meldungen dieser Stufe und höherer Stufen aufgezeichnet. Wenn beispielsweise LogLevels.Info gesetzt ist, werden Verbose- und Debug-Meldungen ignoriert.
LogLevel-Parameter
Für eine bequeme Konfiguration der Logging-Stufe im Strategiekonstruktor können Sie einen Parameter hinzufügen:
public class SmaStrategy : Strategy
{
private readonly StrategyParam<LogLevels> _logLevel;
public SmaStrategy()
{
_logLevel = Param(nameof(LogLevel), LogLevels.Info)
.SetDisplay("Logging-Stufe", "Detailstufe der Logmeldung", "Logging-Einstellungen");
}
public override LogLevels LogLevel
{
get => _logLevel.Value;
set => _logLevel.Value = value;
}
// ...
}
Verwendungsbeispiele in einer realen Strategie
Start und Stopp der Strategie protokollieren
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
LogInfo("Strategie {0} gestartet um {1}. Instrument: {2}, Portfolio: {3}",
Name, time, Security?.Code, Portfolio?.Name);
// ...
}
protected override void OnStopped()
{
LogInfo("Strategie {0} gestoppt. Position: {1}, P&L: {2}",
Name, Position, PnL);
base.OnStopped();
}
Trades protokollieren
protected override void OnNewMyTrade(MyTrade trade)
{
LogInfo("{0} {1} {2} zum Preis {3}. Volumen: {4}",
trade.Order.Direction == Sides.Buy ? "Gekauft" : "Verkauft",
trade.Order.Security.Code,
trade.Order.Type,
trade.Trade.Price,
trade.Trade.Volume);
base.OnNewMyTrade(trade);
}
Fehler bei der Orderregistrierung protokollieren
protected override void OnOrderRegisterFailed(OrderFail fail, bool calcRisk)
{
LogError("Fehler bei der Orderregistrierung {0}: {1}",
fail.Order.TransactionId, fail.Error.Message);
base.OnOrderRegisterFailed(fail, calcRisk);
}
Log-Listener verbinden
Um Meldungen von einer Strategie zu empfangen, verbinden Sie Listener über LogManager:
var logManager = new LogManager();
// In Datei schreiben
var fileListener = new FileLogListener("{0}_{1:00}_{2:00}.txt".Put(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
logManager.Listeners.Add(fileListener);
// E-Mail senden
var emailListener = new EmailLogListener("from@stocksharp.com", "to@stocksharp.com");
emailListener.Filters.Add(msg => msg.Level == LogLevels.Error);
logManager.Listeners.Add(emailListener);
// Strategie als Log-Quelle hinzufügen
logManager.Sources.Add(strategy);
Logs anzeigen
Meldungen, die in das Strategielog geschrieben wurden, können angezeigt werden:
- Im Programm Designer im Bereich "Logs"
- In Logdateien, wenn FileLogListener konfiguriert ist
- In der Benutzeroberfläche über LogControl, wenn GuiLogListener verwendet wird