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):
- Verbose - o nível de registo 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 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:
- No programa Designer, no painel "Registos"
- Em ficheiros de registo, se FileLogListener estiver configurado
- Na interface de utilizador através de LogControl, se GuiLogListener for usado