Table of Contents

Логирование в стратегии

В StockSharp класс Strategy унаследован от BaseLogReceiver, что позволяет встроенными средствами вести логирование всех действий и событий, происходящих в процессе работы торговой стратегии.

Уровни логирования

В StockSharp поддерживаются следующие уровни логирования (перечислены в порядке увеличения важности):

  1. Verbose (подробный) - самый детальный уровень логирования для трассировки
  2. Debug (отладка) - сообщения для отладки
  3. Info (информация) - обычные информационные сообщения
  4. Warning (предупреждение) - предупреждения о потенциальных проблемах
  5. Error (ошибка) - сообщения об ошибках

Методы логирования в стратегии

Стратегия предоставляет следующие методы для записи сообщений в лог:

LogVerbose

Метод LogVerbose предназначен для записи подробных сообщений при трассировке:

protected override void OnStarted(DateTimeOffset time)
{
    base.OnStarted(time);
    
    LogVerbose("Стратегия запущена с параметрами: Long SMA={0}, Short SMA={1}", LongSmaLength, ShortSmaLength);
    
    // ...
}

LogDebug

Метод LogDebug используется для отладочных сообщений:

private void ProcessCandle(ICandleMessage candle)
{
    LogDebug("Обработка свечи: {0}, Open={1}, Close={2}, High={3}, Low={4}, Volume={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}, Short SMA={1}, Long SMA={2}", 
        isShortGreaterThanLong ? "Покупка" : "Продажа", 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 будут игнорироваться.

Параметр LogLevel

Для удобной настройки уровня логирования в конструкторе стратегии можно добавить параметр:

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 OnStarted(DateTimeOffset time)
{
    base.OnStarted(time);
    
    LogInfo("Стратегия {0} запущена в {1}. Инструмент: {2}, Портфель: {3}", 
        Name, time, Security?.Code, Portfolio?.Name);
    
    // ...
}

protected override void OnStopped()
{
    LogInfo("Стратегия {0} остановлена. Позиция: {1}, P&L: {2}", 
        Name, Position, PnL);
    
    base.OnStopped();
}

Логирование сделок

protected override void OnNewMyTrade(MyTrade trade)
{
    LogInfo("{0} {1} {2} по цене {3}. Объем: {4}", 
        trade.Order.Direction == Sides.Buy ? "Куплено" : "Продано",
        trade.Order.Security.Code,
        trade.Order.Type,
        trade.Trade.Price,
        trade.Trade.Volume);
    
    base.OnNewMyTrade(trade);
}

Логирование ошибок при работе с заявками

protected override void OnOrderRegisterFailed(OrderFail fail, bool calcRisk)
{
    LogError("Ошибка регистрации заявки {0}: {1}", 
        fail.Order.TransactionId, fail.Error.Message);
    
    base.OnOrderRegisterFailed(fail, calcRisk);
}

Просмотр логов

Сообщения, записанные в лог стратегии, можно просматривать:

  1. В программе Designer на панели "Логи"
  2. В файлах лога, если настроен FileLogListener
  3. В пользовательском интерфейсе через LogControl, если используется GuiLogListener

См. также

Логирование Компонент LogControl