Logging en estrategias
En StockSharp, la clase Strategy hereda de BaseLogReceiver, lo que permite usar herramientas integradas para registrar todas las acciones y eventos que ocurren durante el funcionamiento de una estrategia de trading.
Niveles de logging
StockSharp admite los siguientes niveles de logging (enumerados en orden de importancia creciente):
- Verbose - el nivel de logging más detallado para trazas
- Debug - mensajes para depuración
- Info - mensajes informativos habituales
- Warning - advertencias sobre posibles problemas
- Error - mensajes de error
Métodos de logging en Strategy
La estrategia proporciona los siguientes métodos para escribir mensajes en el log:
LogVerbose
El método LogVerbose está diseñado para registrar mensajes detallados de traza:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
LogVerbose("Estrategia iniciada con parámetros: SMA larga={0}, SMA corta={1}", LongSmaLength, ShortSmaLength);
// ...
}
LogDebug
El método LogDebug se usa para mensajes de depuración:
private void ProcessCandle(ICandleMessage candle)
{
LogDebug("Procesando vela: {0}, Apertura={1}, Cierre={2}, Máximo={3}, Mínimo={4}, Volumen={5}",
candle.OpenTime, candle.OpenPrice, candle.ClosePrice, candle.HighPrice, candle.LowPrice, candle.TotalVolume);
// ...
}
LogInfo
El método LogInfo se usa para mensajes informativos habituales:
private void CalculateSignal(decimal shortSma, decimal longSma)
{
bool isShortGreaterThanLong = shortSma > longSma;
LogInfo("Señal: {0}, SMA corta={1}, SMA larga={2}",
isShortGreaterThanLong ? "Buy" : "Sell", shortSma, longSma);
// ...
}
LogWarning
El método LogWarning se usa para registrar advertencias:
public void RegisterOrder(Order order)
{
if (order.Volume <= 0)
{
LogWarning("Intento de registrar una orden con volumen no válido: {0}", order.Volume);
return;
}
// ...
}
LogError
El método LogError se usa para registrar mensajes de error:
try
{
// Algunas acciones
}
catch (Exception ex)
{
LogError("Error al realizar la operación: {0}", ex.Message);
Stop();
}
También existe una sobrecarga LogError que acepta directamente una excepción:
try
{
// Algunas acciones
}
catch (Exception ex)
{
LogError(ex);
Stop();
}
Configuración del nivel de logging
La clase Strategy contiene una propiedad LogLevel que determina qué mensajes se escribirán en el log:
// Establecer el nivel de logging para la estrategia
strategy.LogLevel = LogLevels.Info;
Con el nivel de logging seleccionado, solo se registrarán los mensajes de ese nivel y de niveles superiores. Por ejemplo, si se establece LogLevels.Info, los mensajes Verbose y Debug se ignorarán.
Parámetro LogLevel
Para configurar cómodamente el nivel de logging en el constructor de la estrategia, puede agregar un parámetro:
public class SmaStrategy : Strategy
{
private readonly StrategyParam<LogLevels> _logLevel;
public SmaStrategy()
{
_logLevel = Param(nameof(LogLevel), LogLevels.Info)
.SetDisplay("Nivel de registro", "Nivel de detalle de los mensajes de registro", "Configuración de registro");
}
public override LogLevels LogLevel
{
get => _logLevel.Value;
set => _logLevel.Value = value;
}
// ...
}
Ejemplos de uso en una estrategia real
Logging del inicio y parada de la estrategia
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
LogInfo("Strategy {0} started at {1}. Instrument: {2}, Portfolio: {3}",
Name, time, Security?.Code, Portfolio?.Name);
// ...
}
protected override void OnStopped()
{
LogInfo("Strategy {0} stopped. Position: {1}, P&L: {2}",
Name, Position, PnL);
base.OnStopped();
}
Logging de operaciones
protected override void OnNewMyTrade(MyTrade trade)
{
LogInfo("{0} {1} {2} al precio {3}. Volumen: {4}",
trade.Order.Direction == Sides.Buy ? "Bought" : "Sold",
trade.Order.Security.Code,
trade.Order.Type,
trade.Trade.Price,
trade.Trade.Volume);
base.OnNewMyTrade(trade);
}
Logging de errores de registro de órdenes
protected override void OnOrderRegisterFailed(OrderFail fail, bool calcRisk)
{
LogError("Error de registro de orden {0}: {1}",
fail.Order.TransactionId, fail.Error.Message);
base.OnOrderRegisterFailed(fail, calcRisk);
}
Conexión de listeners de log
Para recibir mensajes de una estrategia, conecte listeners mediante LogManager:
var logManager = new LogManager();
// Escribir en archivo
var fileListener = new FileLogListener("{0}_{1:00}_{2:00}.txt".Put(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day));
logManager.Listeners.Add(fileListener);
// Enviar email
var emailListener = new EmailLogListener("from@stocksharp.com", "to@stocksharp.com");
emailListener.Filters.Add(msg => msg.Level == LogLevels.Error);
logManager.Listeners.Add(emailListener);
// Agregar la estrategia como fuente de log
logManager.Sources.Add(strategy);
Visualización de logs
Los mensajes escritos en el log de la estrategia se pueden ver:
- En el programa Designer, en el panel "Logs"
- En archivos de log, si FileLogListener está configurado
- En la interfaz de usuario mediante LogControl, si se usa GuiLogListener