Logging em Estratégias

Em StockSharp, a classe Strategy herda de BaseLogReceiver, o que permite usar ferramentas integradas para registar todas as ações e eventos que ocorrem durante a operação de uma estratégia de negociação.

Níveis de Logging

StockSharp suporta os seguintes níveis de logging (listados por ordem crescente de importância):

  1. Verbose - o nível de logging mais detalhado para rastreamento
  2. Debug - mensagens para depuração
  3. Info - mensagens informativas regulares
  4. Warning - avisos sobre problemas potenciais
  5. Error - mensagens de erro

Métodos de Logging na Estratégia

A estratégia fornece os seguintes métodos para escrever mensagens no log:

LogVerbose

O método LogVerbose destina-se a registar mensagens detalhadas para rastreamento:

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

	LogVerbose("Estratégia iniciada com parâmetros: SMA longa={0}, SMA curta={1}", LongSmaLength, ShortSmaLength);

	// ...
}

LogDebug

O método LogDebug é usado para mensagens de depuração:

private void ProcessCandle(ICandleMessage candle)
{
	LogDebug("Processando candle: {0}, Abertura={1}, Fechamento={2}, Máxima={3}, Mínima={4}, Volume={5}",
		candle.OpenTime, candle.OpenPrice, candle.ClosePrice, candle.HighPrice, candle.LowPrice, candle.TotalVolume);

	// ...
}

LogInfo

O método LogInfo é usado para mensagens informativas regulares:

private void CalculateSignal(decimal shortSma, decimal longSma)
{
	bool isShortGreaterThanLong = shortSma > longSma;

	LogInfo("Sinal: {0}, SMA curta={1}, SMA longa={2}",
		isShortGreaterThanLong ? "Buy" : "Sell", shortSma, longSma);

	// ...
}

LogWarning

O método LogWarning é usado para registar avisos:

public void RegisterOrder(Order order)
{
	if (order.Volume <= 0)
	{
		LogWarning("Tentativa de registrar uma ordem com volume inválido: {0}", order.Volume);
		return;
	}

	// ...
}

LogError

O método LogError é usado para registar mensagens de erro:

try
{
	// Algumas ações
}
catch (Exception ex)
{
	LogError("Erro ao executar a operação: {0}", ex.Message);
	Stop();
}

Existe também uma sobrecarga LogError que aceita diretamente uma exceção:

try
{
	// Algumas ações
}
catch (Exception ex)
{
	LogError(ex);
	Stop();
}

Configurar o Nível de Logging

A classe Strategy contém uma propriedade LogLevel que determina que mensagens serão escritas no log:

// Definir o nível de log da estratégia
strategy.LogLevel = LogLevels.Info;

Com o nível de logging selecionado, apenas as mensagens desse nível e de níveis superiores serão registadas. Por exemplo, se LogLevels.Info estiver definido, as mensagens Verbose e Debug serão ignoradas.

Parâmetro LogLevel

Para configurar convenientemente o nível de logging no construtor da estratégia, pode adicionar um parâmetro:

public class SmaStrategy : Strategy
{
	private readonly StrategyParam<LogLevels> _logLevel;

	public SmaStrategy()
	{
		_logLevel = Param(nameof(LogLevel), LogLevels.Info)
					.SetDisplay("Nível de log", "Nível de detalhe das mensagens de log", "Configurações de log");
	}

	public override LogLevels LogLevel
	{
		get => _logLevel.Value;
		set => _logLevel.Value = value;
	}

	// ...
}

Exemplos de Utilização numa Estratégia Real

Registar o Início e a Paragem da Estratégia

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();
}

Registar Negócios

protected override void OnNewMyTrade(MyTrade trade)
{
	LogInfo("{0} {1} {2} ao preço {3}. Volume: {4}",
		trade.Order.Direction == Sides.Buy ? "Bought" : "Sold",
		trade.Order.Security.Code,
		trade.Order.Type,
		trade.Trade.Price,
		trade.Trade.Volume);

	base.OnNewMyTrade(trade);
}

Registar Erros de Registo de Ordens

protected override void OnOrderRegisterFailed(OrderFail fail, bool calcRisk)
{
	LogError("Erro de registro da ordem {0}: {1}",
		fail.Order.TransactionId, fail.Error.Message);

	base.OnOrderRegisterFailed(fail, calcRisk);
}

Ligar Listeners de Log

Para receber mensagens de uma estratégia, ligue listeners através de LogManager:

var logManager = new LogManager();

// Gravar em arquivo
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 e-mail
var emailListener = new EmailLogListener("from@stocksharp.com", "to@stocksharp.com");
emailListener.Filters.Add(msg => msg.Level == LogLevels.Error);
logManager.Listeners.Add(emailListener);

// Adicionar a estratégia como fonte de log
logManager.Sources.Add(strategy);

Visualizar Logs

As mensagens escritas no log da estratégia podem ser visualizadas:

  1. No programa Designer, no painel "Logs"
  2. Em ficheiros de log, se FileLogListener estiver configurado
  3. Na interface de utilizador através de LogControl, se GuiLogListener for usado

Ver Também

Registo de logs Componente LogControl