Для изменения размера нажмите или перетащите
На истории с Финам

Для тестирования на истории в классе HistoryEmulationConnector, наряду с использованием хранилища данных IStorageRegistry, предусмотрен альтернативный механизм работы с источниками данных. Этот механизм позволяет "напрямую" загружать данные с серверов поставщиков исторической информации, в частности с сервера Финам или же работать с собственными источниками данных.

Рассмотрим работу этого механизма на примере получения данных с сервиса Финам. Для работы с Финам в S# существует специальный класс FinamHistorySource, который позволяет получать свечи, тики и информацию об инструментах.

Тестирование с данными, загруженными с Финама

  1. Сначала нужно получить информацию об инструментах с сервиса Финам. Для этого необходимо создать хранилище для инструментов (FinamSecurityStorage) - класс, реализующий интерфейс ISecurityStorage. Код такого класса есть в примере Samples/Testing/SampleHistoryTesting.

    1. Создаем инструмент.

      var security = new Security
      {
          Id = secid,
          Code = secCode,
          Board = board
      };
    2. Создаем экземпляры классов хранилища инструментов и загрузчика данных с Финама. Обратите внимание, что в данном примере мы передаем в констуктор FinamSecurityStorage один инструмент. Если необходимо работать с несколькими инструментами, то Вы можете модифицировать код конструктора и передать массив инструментов.

      var finamSecurityStorage = new FinamSecurityStorage(security);
      var finamHistorySource = new FinamHistorySource();
    3. Далее необходимо обновить хранилище инструментов. Для этого используется метод FinamHistorySourceRefresh(ISecurityStorage, Security, ActionSecurity, FuncBoolean) Фактически этот метод записывает в свойство SecurityExtensionInfo коды инструмента и площадки, используемые в Финам, которые будут использованы при загрузке данных по инструменту. Обратите внимание, что первый аргумент метода имеет тип ISecurityStorage - этот интерфейс был реализован в FinamSecurityStorage. Также нужно иметь ввиду, что второй аргумент (Security) при обновлении инструментов хранилища выполняет функцию шаблона.

      finamHistorySource.Refresh(finamSecurityStorage, security, s => {}, () => false);
  2. Теперь нужно зарегистрировать в HistoryEmulationConnector новый источник данных. Это делается при помощи метода HistoryEmulationConnectorRegisterHistorySource(Security, MarketDataTypes, Object, FuncDateTimeOffset, IEnumerableMessage). Первый аргумент метода - это инструмент. Далее указывается тип данных источника. В нашем случае - это обычные свечи CandleTimeFrame. Третий аргумент - параметр, связанный с типом рыночных данных. Для обычных свечей - это таймфрейм свечи.

    В последнем аргументе нужно указать функцию, которая возвращает рыночные данные. Причем функция должна возвращать значение типа IEnumerable<Message> и принимать параметр типа DateTimeOffset. В нашем случае используется метод, который запрашивает свечи с Финама - FinamHistorySourceGetCandles(Security, TimeSpan, DateTime, DateTime)

    Данные будут загружены после старта коннектора, причем в качестве начальной и конечной дат загрузки будут использованы значения свойств StartDate и StopDate из HistoryMessageAdapter.

    connector.RegisterHistorySource(security, MarketDataTypes.CandleTimeFrame, TimeSpan.FromMinutes(1), d =>
              _finamHistorySource.GetCandles(security, TimeSpan.FromMinutes(1), d.Date, d.Date));