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):
- Verbose - o nível de logging mais detalhado para rastreamento
- Debug - mensagens para depuração
- Info - mensagens informativas regulares
- Warning - avisos sobre problemas potenciais
- 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:
- No programa Designer, no painel "Logs"
- Em ficheiros de log, se FileLogListener estiver configurado
- Na interface de utilizador através de LogControl, se GuiLogListener for usado