Для изменения размера нажмите или перетащите
На рыночных данных

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

Для эмуляции торговли на реальных данных необходимо использовать RealTimeEmulationTraderTUnderlyingMarketDataAdapter, который выполняет роль "обертки" коннектора конкретной торговой системы (Quik, SmartCOM и т.п.). Ниже приводится описание примера работы с эмулятором с использованием подключения к SmartCOM. Сам пример находится в папке Samples/Testing/SampleRealTimeEmulation.

Работа с эмулятором торговли на реальных данных

  1. Создаем шлюз RealTimeEmulationTraderTUnderlyingMarketDataAdapter и передаем в его конструктор адаптер сообщений SmartComMessageAdapter. Для создания идентификаторов "виртуальных" транзакций используем генератор идентификаторов MillisecondIncrementalIdGenerator.

    C#
    _connector = new RealTimeEmulationTrader<SmartComMessageAdapter>(new SmartComMessageAdapter(new MillisecondIncrementalIdGenerator())
    {
        Login = Login.Text,
        Password = Password.Password.To<SecureString>(),
        Address = Address.SelectedAddress
    });
  2. Созданный шлюз используется как обычный коннектор. В нашем случае подписываемся на события, создаем CandleManager, передаем информацию в графические компоненты и устанавливаем соединение.

    C#
    SecurityEditor.SecurityProvider = new FilterableSecurityProvider(_connector);
    
    _candleManager = new CandleManager(_connector);
    
    _logManager.Sources.Add(_connector);
    
    _connector.Connected += () =>
    {
        // set flag (connection is established)
        _isConnected = true;
    
        // update gui labels
        this.GuiAsync(() =>
            {
                ChangeConnectStatus(true);
                ConnectBtn.IsEnabled = false;
            });
    };
    
    // subscribe on connection error event
    _connector.ConnectionError += error => this.GuiAsync(() =>
    {
        // update gui labels
        ChangeConnectStatus(false);
    
        MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2959);
    });
    
    _connector.NewMarketDepths += OnDepths;
    _connector.MarketDepthsChanged += OnDepths;
    
    _connector.NewPortfolios += PortfolioGrid.Portfolios.AddRange;
    _connector.NewPositions += PortfolioGrid.Positions.AddRange;
    
    _connector.NewOrders += Orders.Orders.AddRange;
    _connector.NewMyTrades += Trades.Trades.AddRange;
    
    // subscribe on error of order registration event
    _connector.OrdersRegisterFailed += OrdersFailed;
    
    _candleManager.Processing += (s, candle) =>
        {
            if (candle.State == CandleStates.Finished)
                _buffer.Add(candle);
        };
    
    // subscribe on error event
    _connector.Error += error =>
        this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2955));
    
        // subscribe on error of market data subscription event
        _connector.MarketDataSubscriptionFailed += (security, type, error) =>
            this.GuiAsync(() => MessageBox.Show(this, error.ToString(), LocalizedStrings.Str2956Params.Put(type, security)));
                }
    
    _connector.Connect();
  3. На следующем рисунке показан результат работы примера.

    sample realtaime emulation