Level1Change в API 4.2.1
Atom
21.11.2013


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

Теги:


Спасибо:


vk37

Фотография
Дата: 21.11.2013
Ответить


Работаю над закачкой маркет данных (свой аналог Гидры). Плаза коннектор. Попробовал перевести закачку SecurityChanges на Level1Change. Получаю данные так:
Код
        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);
            }
        }
Сохраняю данные так:
Код
                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);
                    }
                }
При сохранении получаю ошибку:
Код
{"Unable to cast object of type 'Grouping[StockSharp.Messages.SecurityId,StockSharp.Messages.Level1ChangeMessage]' to type 'System.Collections.Generic.IEnumerable`1[StockSharp.Algo.Storages.SecurityChange]'."}
Не понятно почему идет попытка привести StockSharp.Messages.Level1ChangeMessage к типу StockSharp.Algo.Storages.SecurityChange. Предполагаю это баг.
Спасибо:

Mikhail Sukhov

Фотография
Дата: 21.11.2013
Ответить


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


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

vk37

Фотография
Дата: 21.11.2013
Ответить


Михаил Сухов Перейти


Так не получиться. Под месседжи будет свой формат, отдельный. Будет основан на протоколе FAST. А SC - это комбинация L1 и L1Msg.
Тогда получается как-то так:
Код
                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

Фотография
Дата: 27.11.2013
Ответить


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

Спасибо:

vk37

Фотография
Дата: 27.11.2013
Ответить


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

Mikhail Sukhov

Фотография
Дата: 28.11.2013
Ответить


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


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

vk37

Фотография
Дата: 28.11.2013
Ответить


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


Спасибо:

Mikhail Sukhov

Фотография
Дата: 28.11.2013
Ответить


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




Я выбираю "Помощь зала"
Спасибо:

vk37

Фотография
Дата: 29.11.2013
Ответить


Михаил Сухов Перейти
Я выбираю "Помощь зала"
)) Ну в общем, этот код возвращает большое количество Level1ChangeMessage у которого в коллекции Changes отсутствуют элементы.
Код
        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;
            }
        }

Спасибо:

vk37

Фотография
Дата: 29.11.2013
Ответить


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

Ответ: http://stocksharp.com/posts/m/28536/

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy