Table of Contents

На рыночных данных

Тестирование на рыночных данных представляет собой торговлю с реальным подключением к бирже ("живые" котировки), но без реального выставления заявок на биржу. Все регистрируемые заявки перехватываются, и их исполнение эмулируется на основе рыночных стаканов. Такое тестирование может быть полезно, например, если разрабатывается торговый тренажер, или необходимо проверить торговый алгоритм на краткосрочном отрезке времени с реальными котировками.

Для эмуляции торговли на реальных данных необходимо использовать RealTimeEmulationTrader<TAdapter>, который выполняет роль "обертки" коннектора конкретной торговой системы (Binance, Tinkoff и т.п.).

Создание эмуляционного коннектора

Для создания эмуляционного коннектора нужно сначала создать обычный коннектор для получения рыночных данных, а затем на его основе создать эмуляционный:

// Создаем обычный коннектор для получения рыночных данных
private readonly Connector _realConnector = new();

// Создаем эмуляционный коннектор
_emuConnector = new RealTimeEmulationTrader<IMessageAdapter>(_realConnector.Adapter, _realConnector, _emuPf, false);

// Настраиваем параметры эмуляции
var settings = _emuConnector.EmulationAdapter.Emulator.Settings;
settings.TimeZone = TimeHelper.Est;
settings.ConvertTime = true;

Для эмуляции торговли необходимо использовать специальный портфель:

private readonly Portfolio _emuPf = Portfolio.CreateSimulator();

Подписка на события

Как и обычный коннектор, эмуляционный коннектор генерирует события при получении рыночных данных и выполнении транзакций:

// Подписываемся на события коннектора
_emuConnector.Connected += () =>
{
    // update gui labels
    this.GuiAsync(() => { ChangeConnectStatus(true); });
};

_emuConnector.Disconnected += () =>
{
    // update gui labels
    this.GuiAsync(() => { ChangeConnectStatus(false); });
};

_emuConnector.ConnectionError += error => this.GuiAsync(() =>
{
    // update gui labels
    ChangeConnectStatus(false);
    MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959);
});

_emuConnector.OrderBookReceived += OnDepth;
_emuConnector.PositionReceived += (sub, p) => PortfolioGrid.Positions.TryAdd(p);
_emuConnector.OwnTradeReceived += (s, t) => TradeGrid.Trades.TryAdd(t);
_emuConnector.OrderReceived += (s, o) =>
{
    if (!_fistTimeOrders.Add(o))
        return;

    _bufferOrders.Add(o);
    OrderGrid.Orders.Add(o);
};

// Подписываемся на ошибки регистрации заявок
_emuConnector.OrderRegisterFailReceived += (s, f) => OrderGrid.AddRegistrationFail(f);

_emuConnector.CandleReceived += (s, candle) =>
{
    if (s == _candlesSubscription)
        _buffer.Add(candle);
};

Подписка на маркет-данные

Для работы с рыночными данными необходимо подписаться на соответствующие типы данных:

// Подписываемся на стаканы, тики и Level1 для эмуляционного коннектора
_emuConnector.Subscribe(new(DataType.MarketDepth, security));
_emuConnector.Subscribe(new(DataType.Ticks, security));
_emuConnector.Subscribe(new(DataType.Level1, security));

// Подписываемся на стаканы для реального коннектора (нужны для эмуляции)
_realConnector.Subscribe(new(DataType.MarketDepth, security));

// Подписываемся на свечи
_candlesSubscription = new(CandleDataTypeEdit.DataType, security)
{
    From = DateTimeOffset.UtcNow - TimeSpan.FromDays(10),
};
_emuConnector.Subscribe(_candlesSubscription);

Регистрация и управление заявками

Заявки регистрируются через эмуляционный коннектор аналогично обычному коннектору:

// Регистрация заявки
_emuConnector.RegisterOrder(order);

// Отмена заявки
_emuConnector.CancelOrder(order);

// Замена заявки
_emuConnector.ReRegisterOrder(order, newPrice, order.Balance);

Настройка параметров эмуляции

Для настройки параметров эмуляции можно использовать свойство MarketEmulatorSettings:

var settings = _emuConnector.EmulationAdapter.Emulator.Settings;

// Установка временной зоны
settings.TimeZone = TimeHelper.Est;

// Конвертация времени
settings.ConvertTime = true;

// Удовлетворять заявки при касании цены
settings.MatchOnTouch = false;

// Эмуляция задержки исполнения заявок
settings.Latency = TimeSpan.FromMilliseconds(100);

Пример интерфейса

Пример SampleRealTimeEmulation демонстрирует возможность одновременного отображения данных как от реального коннектора, так и от эмуляционного:

sample realtime emulation

Интерфейс приложения содержит следующие элементы:

  • Графики для отображения свечей и заявок
  • Таблицы заявок и собственных сделок
  • Стаканы реального рынка и эмуляционного стакана
  • Элементы управления для создания и отмены заявок

Преимущества и ограничения

Тестирование на рыночных данных имеет следующие преимущества:

  • Использование реальных рыночных данных без финансовых рисков
  • Проверка алгоритмов в условиях, максимально приближенных к реальной торговле
  • Возможность сравнения результатов с реальным рынком в реальном времени

Ограничения:

  • Скорость тестирования ограничена скоростью поступления реальных данных
  • Невозможность тестирования на исторических периодах
  • Зависимость от качества и полноты получаемых маркет-данных