← Назад

Level1Change в API 4.2.1

Не совсем понятно в API 4.2.1: Level1Change заменит SecurityChange?

Комментарии (10)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

vk37
vk37 Автор

Работаю над закачкой маркет данных (свой аналог Гидры). Плаза коннектор. Попробовал перевести закачку SecurityChanges на Level1Change. Получаю данные так: ```csharp readonly HashSet<Level1Fields> _level1Fields = new HashSet<Level1Fields>(new[] { Level1Fields.AsksCount, Level1Fields.AsksVolume, Level1Fields.BidsCount, Level1Fields.BidsVolume, Level1Fields.HistoricalVolatility, Level1Fields.ImpliedVolatility, Level1Fields.MarginBuy, Level1Fields.MarginSell, Level1Fields.StepPrice, Level1Fields.PriceStep, Level1Fields.OpenInterest, });

    private void OnSecuritiesChanged(IEnumerable<Security> securities)
    {
        foreach (var security in securities)
        {
            var changeMessage = security.GetNewChanges(_level1Fields);
            _saveManager.Level1ChangeMessages.Enqueue(changeMessage);
        }
    }

Сохраняю данные так: csharp var level1ChangeMessagesBySecurity = from c in level1ChangeMessagesFromQueue group c by c.SecurityId into g select g;

            foreach (var level1ChangeMessageBySecurity in level1ChangeMessagesBySecurity)
            {
                var level1ChangeStorage = _storageRegistry.GetLevel1ChangeStorage(new Security() { Id = level1ChangeMessageBySecurity.Key.Native.ToString()}, _defaultDrive);
                try
                {
                    level1ChangeStorage.Save(level1ChangeMessageBySecurity);
                }
                catch (Exception e)
                {
                    Log.Error("Ошибка при сохранении изменений инструментов", e);
                }
            }

При сохранении получаю ошибку: plain {"Unable to cast object of type 'Grouping[StockSharp.Messages.SecurityId,StockSharp.Messages.Level1ChangeMessage]' to type 'System.Collections.Generic.IEnumerable`1[StockSharp.Algo.Storages.SecurityChange]'."}

Mikhail Sukhov
Mikhail Sukhov

vk37: Работаю над закачкой маркет данных (свой аналог Гидры). Плаза коннектор. Попробовал перевести закачку SecurityChanges на Level1Change.

Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.

vk37
vk37 Автор

Михаил Сухов: Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.Тогда получается как-то так:```csharp var messagesBySecurity = from c in messagesFromQueue group c by c.SecurityId into g select g;

            foreach (var messageBySecurity in messagesBySecurity)
            {
                var security = new Security() {Id = messageBySecurity.Key.Native.ToString()};
                var securityChangeStorage = _storageRegistry.GetSecurityChangeStorage(security, _defaultDrive);

                try
                {
                    var securityChanges = new List<SecurityChange>();

                    foreach (var message in messageBySecurity)
                        foreach (var change in message.Changes)
                            securityChanges.Add(new SecurityChange(security, message.LocalTimeStamp, change.Type, change.Value));

                    securityChangeStorage.Save(securityChanges);
                }
                catch (Exception e)
                {
                    Log.Error("Ошибка при сохранении изменений инструментов", e);
                }
            }
Или есть способ проще?
vk37
vk37 Автор

Михаил Сухов: Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.SC.Time брать из L1Msg.LocalTimeStamp?

vk37
vk37 Автор

vk37:

Михаил Сухов: Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.SC.Time брать из L1Msg.LocalTimeStamp?Ответ: http://stocksharp.com/posts/m/28536/

vk37
vk37 Автор

Кстати при вызове security.GetNewChanges приходит огромное количество Level1ChangeMessage с отсутствующими изменениями.

Mikhail Sukhov
Mikhail Sukhov

vk37: Кстати при вызове security.GetNewChanges приходит огромное количество Level1ChangeMessage с отсутствующими изменениями.

Не совсем понял фразы. Огромное количество отсутствующих изменений? Это как? :-)

vk37
vk37 Автор

Михаил Сухов: Не совсем понял фразы. Огромное количество отсутствующих изменений? Это как? :-)```csharp !changeMessage.Changes.Any()


Mikhail Sukhov
Mikhail Sukhov

vk37:

Михаил Сухов: Не совсем понял фразы. Огромное количество отсутствующих изменений? Это как? :-)```csharp !changeMessage.Changes.Any()


Я выбираю "Помощь зала"
vk37
vk37 Автор

Михаил Сухов: Я выбираю "Помощь зала" )) Ну в общем, этот код возвращает большое количество Level1ChangeMessage у которого в коллекции Changes отсутствуют элементы.```csharp readonly HashSet<Level1Fields> _level1Fields = new HashSet<Level1Fields>(new[] { Level1Fields.AsksCount, Level1Fields.AsksVolume, Level1Fields.BidsCount, Level1Fields.BidsVolume, Level1Fields.HistoricalVolatility, Level1Fields.ImpliedVolatility, Level1Fields.MarginBuy, Level1Fields.MarginSell, Level1Fields.StepPrice, Level1Fields.PriceStep, Level1Fields.OpenInterest, });

    private void OnSecuritiesChanged(IEnumerable<Security> securities)
    {
        foreach (var security in securities)
        {
            var changeMessage = security.GetNewChanges(_level1Fields);

            if (!changeMessage.Changes.Any())
                continue;
        }
    }