Ошибка в методе Trader.CandleSeriesProcessing
Atom Ответить
19.12.2018


Проблема:

Переход от CandleManager к Connector для работы со свечами.
После подписки на новые свечи Trader.CandleSeriesProcessing += Connector_CandleSeriesProcessing ничего не происходит.
После подключения логирования выловилась ошибка:

"System.NotImplementedException: Метод или операция не реализована.
в Ecng.Serialization.InMemoryStorage.GetBy[TEntity](SerializationItemCollection by)
в Ecng.Serialization.RelationManyList`1.OnGet(SerializationItemCollection by)
в Ecng.Serialization.RelationManyList`1.Read(SerializationItem by)
в Ecng.Serialization.RelationManyList`1.ReadById(Object id)
в StockSharp.Algo.Storages.StorageHelper.ReadBySecurityId(IStorageEntityList`1 securities, SecurityId securityId)
в StockSharp.Algo.Storages.StorageMessageAdapter.GetSecurity(SecurityId securityId)
в StockSharp.Algo.Storages.StorageMessageAdapter.GetTimeFrameCandleMessageStorage(SecurityId securityId, TimeSpan timeFrame, Boolean allowBuildFromSmallerTimeFrame)
в StockSharp.Algo.Storages.StorageMessageAdapter.LoadMessages(MarketDataMessage msg, Nullable`1 from, Nullable`1 to, Int64 transactionId)
в StockSharp.Algo.Storages.StorageMessageAdapter.ProcessMarketDataRequest(MarketDataMessage msg)
в StockSharp.Algo.Storages.StorageMessageAdapter.SendInMessage(Message message)
в StockSharp.Messages.MessageAdapterWrapper.SendInMessage(Message message)
в StockSharp.Algo.FilteredMarketDepthAdapter.SendInMessage(Message message)
в StockSharp.Algo.Connector.InMessageChannelOnNewOutMessage(Message message)
в StockSharp.Messages.InMemoryMessageChannel.OnNewOut(KeyValuePair`2 item)
в Ecng.Collections.BaseInMemoryChannel`1.<Open>b__16_1()"
_____________________________________________________

Пробовалось:

Передать в CandleManager экземпляр коннектора, чтобы получать свечи по-старому. Результат тот же.
Создать реальный коннектор QuikTrader, с подключением. Безрезультатно.

API 4.14.15, с форматом свечей и инструментов проблем нет(перечисляются, считаются и тп).
Мини-пример в приложении.
Problem.zip 56,7MB (2)



Спасибо:




6 Ответов
Support

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


Добрый день

1) Инициализация хранилища теперь выглядит таким образом (в вашем случае использовалось хранилище, основанное на SQLite):

Код
storage = new StorageRegistry();
var path = System.IO.Path.GetFullPath(@"C:\Users\KalDarckli\Desktop\Hystory");
((LocalMarketDataDrive)storage.DefaultDrive).Path = path;

     var er = new CsvEntityRegistry(path);
     er.Init();

var security = er.Securities.LookupByCode("RIZ8").First();

var candles = storage.GetCandleStorage(typeof(TimeFrameCandle), security, TimeSpan.FromTicks(1));
From_d.Value = candles.Dates.First();
To_d.Value = candles.Dates.Last();

candleSeries = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromTicks(1));

     SnapshotRegistry sr = new SnapshotRegistry(path);
     sr.Init();

connector.InitializeStorage(er, storage, sr);
connector.CandleSeriesProcessing += Connector_CandleSeriesProcessing;
connector.SubscribeCandles(candleSeries, (DateTime)From_d.Value, (DateTime)To_d.Value);


2) У вас отсуствует файл с мета-информацией по инструментам. Приложен к данному сообщению. Его необходимо записать в директорию, где присутсвует файл instruments.csv

3) У вас неправильно написано обработчик свечей. Поле CloseVolume опциональное, и заполняется в редких случаях.

Код
private void Connector_CandleSeriesProcessing(CandleSeries arg1, Candle candle)
{
sum += candle.TotalVolume;
}


После исправлений ваша программа начала показывать счетчик.
security.csv 59B (2)
Спасибо: Mike144

Mike144

Фотография
Курсы
Дата: 19.12.2018
Ответить


Спасибо! Дайте, пожалуйста, еще пару пояснений по пунктам:
1) Да, добавил путь, Init() и хранилище подключилось, свечи пошли. Не совсем понимаю, для чего нужны CsvEntityRegistry и SnapshotRegistry. Ну, и, если приоткроете какие были предпосылки для такого перехода, буду очень признателен.
2) Все работало без этого файла (и работает, после применения пункта 1). Тут тоже не понимаю, зачем он нужен, что делает и точно ли он нужен?
3) Бывает, их путаюLaugh
Автор топика
Спасибо:

Support

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


1) Как ранее вам написал, вы использовали хранилище SQLite. Оно требует дополнительных настроек. Хранилище на базе CSV не требует настроек.
2) Видимо у вас откуда то ещё грузится информация об инструментах.
Спасибо:

Mike144

Фотография
Курсы
Дата: 20.12.2018
Ответить


А Connector не примет хранилище на базе CSV, как раньше принимал CandleManager?

По второму, да у меня файл с инструментами instruments.csv (он есть в мини-примере в папке Hystory).
Но там формат другой: RIZ8@FORTS;Future;0;10;;1;RIZ8;;RTS@FORTS;;RUB;; (получается вызовом метода _storage.GetSecurityStorage().Save(security, true))
А в файле, который вы прислали формат: RIZ8@FORTS;RIZ8;RIZ8;;;FORTS;;10;;;0;;;;;;;;;;;;;;;;;;;;; (вроде, в таком формате Hydra сохраняет инструменты)
Объясните, пожалуйста, разницу.
Автор топика
Спасибо:

Support

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


Mike144 Перейти
А Connector не примет хранилище на базе CSV, как раньше принимал CandleManager?

По второму, да у меня файл с инструментами instruments.csv (он есть в мини-примере в папке Hystory).
Но там формат другой: RIZ8@FORTS;Future;0;10;;1;RIZ8;;RTS@FORTS;;RUB;; (получается вызовом метода _storage.GetSecurityStorage().Save(security, true))
А в файле, который вы прислали формат: RIZ8@FORTS;RIZ8;RIZ8;;;FORTS;;10;;;0;;;;;;;;;;;;;;;;;;;;; (вроде, в таком формате Hydra сохраняет инструменты)
Объясните, пожалуйста, разницу.


Ваш вопрос был передан разработчикам. Предварительный ответ - данное хранилище инструментов устаревшее.

Спасибо:

Support

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


Добрый день

Хранилище StorageRegistry.GetSecurityStorage является устаревшим.
Спасибо:


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

loading
clippy