Storage API.
Atom Ответить
29.08.2011


Тест записи сделок в файловое хранилище (на базе примера SmpleStorage со своим генератором экземпляров класса Trade и хранением на диске вместо записи в память) привел к следующим наблюдениям:

1.Конструктор "public FileStorage(string directory)" - не ясно, какая именно директория подразумевается. Какую бы я строку не задавал, пишет в текущую директорию (и читает с нее же). Может, я неправильно понимаю этот параметр? Выкрутился тем, что после создания экземпляра TradingStorage задаю нужное место хранения данных используя BasePath. Вполне возможно, что у параметра directory из конструктора FileStorage есть какой-то другой смысл, но разобраться в этом из документации я не смог.

2. Повторной запись всего набора данных после добавления свежих записей ведет к удвоению бывшей последней записи. На примере. Если я за сегодня записал 10 экземпляров класса Trade со значением Id от 1 до 10, то при добавлении следующих 10 трейдов к исходному списку и повторному его сохранению, имею следующий результат: при чтении получу 21 запись (вместо ожидаемых 20), где все записи будут уникальные, кроме одного исключения - трейд за номером 10 (бывший последний) будет записан два раза с одним и тем же Id. Похоже на баг, т.к. мой здравый смысл подсказывает, что при повторной записи всего набора или все записи должны удваиваться, или ни одна из них. Замечу, что такое поведение наблюдается при AppendOnlyNew = true (интерфейс IMarketDataStorage<T>), если же установить AppendOnlyNew = false все записи будут просто дублироваться, как и ожидается по смыслу.

3. Если для экземпляров каждой из записей класса Trade в списке не задавать значение Security, то сохранить список трейдов в TradeStorage невозможно, т.к. генерируется ошибка. Признаться, я посчитал, что если стоит атрибут [Ignore] в определении класса перед соответствующим полем, то можно не задавать лишнее - ведь все равно при вызове IMarketDataStorage<Trade> GetTradeStorage(Security security) мы задаем единое значение security для всего набора записываемых данных. Зачем лишние операции на каждую единицу хранения?! Но почему-то [Ignore] не работает. Или я в этом месте неправильно понимаю логику.

Теги:


Спасибо:




3 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.08.2011
Ответить


igsbr Перейти
Тест записи сделок в файловое хранилище (на базе примера SmpleStorage со своим генератором экземпляров класса Trade и хранением на диске вместо записи в память) привел к следующим наблюдениям:

1.Конструктор "public FileStorage(string directory)" - не ясно, какая именно директория подразумевается.


FileStorage пока в разработке.

igsbr Перейти

2. Повторной запись всего набора данных после добавления свежих записей ведет к удвоению бывшей последней записи. На примере. Если я за сегодня записал 10 экземпляров класса Trade со значением Id от 1 до 10, то при добавлении следующих 10 трейдов к исходному списку и повторному его сохранению, имею следующий результат: при чтении получу 21 запись (вместо ожидаемых 20), где все записи будут уникальные, кроме одного исключения - трейд за номером 10 (бывший последний) будет записан два раза с одним и тем же Id. Похоже на баг, т.к. мой здравый смысл подсказывает,


Правильно подсказывает. Спасибо за репорт, пофиксил.

igsbr Перейти

3. Если для экземпляров каждой из записей класса Trade в списке не задавать значение Security, то сохранить список трейдов в TradeStorage невозможно, т.к. генерируется ошибка. Признаться, я посчитал, что если стоит атрибут [Ignore] в определении класса перед соответствующим полем, то можно не задавать лишнее - ведь все равно при вызове IMarketDataStorage<Trade> GetTradeStorage(Security security) мы задаем единое значение security для всего набора записываемых данных. Зачем лишние операции на каждую единицу хранения?! Но почему-то [Ignore] не работает. Или я в этом месте неправильно понимаю логику.


Ignore - это для сериализации из Ecng.Serialization. Маркетные данные не сериализуются, а архивируются спец форматом. Наличие установленного значения в поле Trade.Security нужно лишь для проверки потока данных. Об лишних операциях я не понял. Если подразумевается их сохранение в файл, то, естественно, этого не происходит.
Спасибо:

igsbr

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


Mikhail Sukhov Перейти
[quote=igsbr;10677] Об лишних операциях я не понял. Если подразумевается их сохранение в файл, то, естественно, этого не происходит.
Попробую пояснить.

Когда мы вызываем GetTradeStorage(Security security), мы уже на этом этапе задаем общее значение security для всего набора записываемых (или читаемых) данных. Вдобавок к этому требовать задавать то же самое значение security для каждой (!!!) записи в наборе... ну мне как-то показалось такое излишним для целей архивации трейдов. Если же считать, что в одном наборе для разных трейдов могут быть разные security, то зачем тогда задавать некий общий security при вызове GetTradeStorage? В общем, лично для меня логика в этом моменте показалась несколько неясной.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.08.2011
Ответить


igsbr Перейти
Mikhail Sukhov Перейти
Об лишних операциях я не понял. Если подразумевается их сохранение в файл, то, естественно, этого не происходит.

Попробую пояснить.

Когда мы вызываем GetTradeStorage(Security security), мы уже на этом этапе задаем общее значение security для всего набора записываемых (или читаемых) данных. Вдобавок к этому требовать задавать то же самое значение security для каждой (!!!) записи в наборе... ну мне как-то показалось такое излишним для целей архивации трейдов.


Это называется проверкой входящих аргументов. Безотносительно функциональности ее необходимо выполнять.

igsbr Перейти

Если же считать, что в одном наборе для разных трейдов могут быть разные security, то зачем тогда задавать некий общий security при вызове GetTradeStorage? В общем, лично для меня логика в этом моменте показалась несколько неясной.


Вот как раз для таких случаев такая проверка и сделана. Вы, не понимая того как работает архиватор (TradeStorage), засовываете туда все сделки всех инcтрументов. Если бы архиватор не проверял инструменты, то в итоге в файлах получилась бы каша. Но так как он проверяет, вы получаете исключение. Посмотрите исходники Гидры (класс Worker). Там как раз показан юз кейс как нужно работать с Storage API.
Спасибо:


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

loading
clippy