Registo 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 registo

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

  1. Verbose - o nível de registo 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 registo na estratégia

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

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 vela: {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 registo

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

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

Com o nível de registo 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 registo 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 registo", "Nível de detalhe das mensagens de registo", "Configurações de registo");
	}

	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("Estratégia {0} iniciada em {1}. Instrumento: {2}, Portfólio: {3}",
		Name, time, Security?.Code, Portfolio?.Name);

	// ...
}

protected override void OnStopped()
{
	LogInfo("Estratégia {0} parada. Posição: {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 ? "Comprado" : "Vendido",
		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 ouvintes de registo

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

var logManager = new LogManager();

// Gravar num ficheiro
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 registo
logManager.Sources.Add(strategy);

Visualizar registos

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

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

Ver Também

Registo Componente LogControl