策略日志记录
在 StockSharp 中,Strategy 类继承自 BaseLogReceiver,这允许您使用内置工具记录交易策略运行期间发生的所有操作和事件。
日志级别
StockSharp 支持以下日志级别(按重要性递增顺序列出):
- 详细 - 用于追踪的最详细的日志记录级别
- 调试 - 用于调试的消息
- 信息 - 常规信息消息
- 警告 - 关于潜在问题的警告
- 错误 - 错误消息
策略中的日志记录方法
该策略提供了以下将消息写入日志的方法:
详细日志
LogVerbose 方法旨在记录用于跟踪的详细消息:
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
LogVerbose("策略已启动,参数: 长期SMA={0}, 短期SMA={1}", LongSmaLength, ShortSmaLength);
// ...
}
LogDebug
LogDebug 方法用于调试消息:
private void ProcessCandle(ICandleMessage candle)
{
LogDebug("正在处理K线: {0}, 开盘={1}, 收盘={2}, 最高={3}, 最低={4}, 成交量={5}",
candle.OpenTime, candle.OpenPrice, candle.ClosePrice, candle.HighPrice, candle.LowPrice, candle.TotalVolume);
// ...
}
LogInfo
LogInfo 方法用于常规信息消息:
private void CalculateSignal(decimal shortSma, decimal longSma)
{
bool isShortGreaterThanLong = shortSma > longSma;
LogInfo("信号: {0}, 短期SMA={1}, 长期SMA={2}",
isShortGreaterThanLong ? "Buy" : "Sell", shortSma, longSma);
// ...
}
LogWarning
LogWarning 方法用于记录警告:
public void RegisterOrder(Order order)
{
if (order.Volume <= 0)
{
LogWarning("尝试注册无效数量的订单: {0}", order.Volume);
return;
}
// ...
}
LogError
LogError 方法用于记录错误消息:
try
{
// 一些操作
}
catch (Exception ex)
{
LogError("执行操作时出错: {0}", ex.Message);
Stop();
}
还有一个重载 LogError,它可以直接接受一个异常:
try
{
// 一些操作
}
catch (Exception ex)
{
LogError(ex);
Stop();
}
配置日志级别
Strategy 类包含一个 LogLevel 属性,该属性决定哪些消息将被写入日志:
// 设置策略日志级别
strategy.LogLevel = LogLevels.Info;
使用所选的日志记录级别,只有该级别及更高级别的消息会被记录。例如,如果设置为 LogLevels.Info,则 Verbose 和 Debug 消息将被忽略。
日志级别参数
为了在策略构造函数中方便地配置日志级别,你可以添加一个参数:
public class SmaStrategy : Strategy
{
private readonly StrategyParam<LogLevels> _logLevel;
public SmaStrategy()
{
_logLevel = Param(nameof(LogLevel), LogLevels.Info)
.SetDisplay("日志级别", "日志消息详细级别", "日志设置");
}
public override LogLevels LogLevel
{
get => _logLevel.Value;
set => _logLevel.Value = value;
}
// ...
}
在实际策略中的使用示例
日志策略启动和停止
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();
}
记录交易
protected override void OnOwnTradeReceived(MyTrade trade)
{
LogInfo("{0} {1} {2} 价格 {3}。数量: {4}",
trade.Order.Direction == Sides.Buy ? "Bought" : "Sold",
trade.Order.Security.Code,
trade.Order.Type,
trade.Trade.Price,
trade.Trade.Volume);
base.OnOwnTradeReceived(trade);
}
记录订单注册错误
protected override void OnOrderRegisterFailed(OrderFail fail, bool calcRisk)
{
LogError("订单注册错误 {0}: {1}",
fail.Order.TransactionId, fail.Error.Message);
base.OnOrderRegisterFailed(fail, calcRisk);
}
连接日志监听器
要接收策略发出的消息,需要通过 LogManager 连接监听器:
// 创建日志管理器
var logManager = new LogManager();
// 添加控制台日志监听器
logManager.Listeners.Add(new ConsoleLogListener());
// 将策略添加到日志源
logManager.Sources.Add(strategy);
查看日志
写入策略日志的消息可以查看:
- 在“日志”面板的Designer程序中
- 在日志文件中,如果配置了 FileLogListener
- 在用户界面通过 LogControl,如果使用 GuiLogListener