Registro 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 negociación.

Niveles de registro

StockSharp admite los siguientes niveles de registro (enumerados en orden de importancia creciente):

  1. Verbose - el nivel de registro más detallado para trazas
  2. Debug - mensajes para depuración
  3. Info - mensajes informativos habituales
  4. Warning - advertencias sobre posibles problemas
  5. Error - mensajes de error

Métodos de registro en Strategy

La estrategia proporciona los siguientes métodos para escribir mensajes en el registro:

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 registro

La clase Strategy contiene una propiedad LogLevel que determina qué mensajes se escribirán en el registro:

// Establecer el nivel de registro para la estrategia
strategy.LogLevel = LogLevels.Info;

Con el nivel de registro 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 registro 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

Registro del inicio y la parada de la estrategia

protected override void OnStarted2(DateTime time)
{
	base.OnStarted2(time);

	LogInfo("Estrategia {0} iniciada en {1}. Instrumento: {2}, Cartera: {3}",
		Name, time, Security?.Code, Portfolio?.Name);

	// ...
}

protected override void OnStopped()
{
	LogInfo("Estrategia {0} detenida. Posición: {1}, P&L: {2}",
		Name, Position, PnL);

	base.OnStopped();
}

Registro de operaciones

protected override void OnNewMyTrade(MyTrade trade)
{
	LogInfo("{0} {1} {2} al precio {3}. Volumen: {4}",
		trade.Order.Direction == Sides.Buy ? "Comprado" : "Vendido",
		trade.Order.Security.Code,
		trade.Order.Type,
		trade.Trade.Price,
		trade.Trade.Volume);

	base.OnNewMyTrade(trade);
}

Registro de errores al registrar ó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 receptores de registro

Para recibir mensajes de una estrategia, conecte receptores 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 registro
logManager.Sources.Add(strategy);

Visualización de registros

Los mensajes escritos en el registro de la estrategia se pueden ver:

  1. En el programa Designer, en el panel "Registros"
  2. En archivos de registro, si FileLogListener está configurado
  3. En la interfaz de usuario mediante LogControl, si se usa GuiLogListener

Ver también

Registro Componente LogControl