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


Ошибка в методе Trader.CandleSeriesProcessing
Atom
12/19/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 MB (358)



Thanks:


Support

Avatar
Date: 12/19/2018
Reply


Добрый день

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

Code
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 опциональное, и заполняется в редких случаях.

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


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

Mike144

Avatar
Date: 12/19/2018
Reply


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

Support

Avatar
Date: 12/20/2018
Reply


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

Mike144

Avatar
Date: 12/20/2018
Reply


А 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 сохраняет инструменты)
Объясните, пожалуйста, разницу.
Thanks:

Support

Avatar
Date: 12/20/2018
Reply


Mike144 Go to
А 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 сохраняет инструменты)
Объясните, пожалуйста, разницу.


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

Thanks:

Support

Avatar
Date: 12/24/2018
Reply


Добрый день

Хранилище StorageRegistry.GetSecurityStorage является устаревшим.
Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy