← 返回

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

Проблема:

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

"System.NotImplementedException: Метод или операция не реализована. в Ecng.Serialization.InMemoryStorage.GetBy[TEntity](SerializationItemCollection by) в Ecng.Serialization.RelationManyList1.OnGet(SerializationItemCollection by) в Ecng.Serialization.RelationManyList1.Read(SerializationItem by) в Ecng.Serialization.RelationManyList1.ReadById(Object id) в StockSharp.Algo.Storages.StorageHelper.ReadBySecurityId(IStorageEntityList1 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, Nullable1 from, Nullable1 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(KeyValuePair2 item) в Ecng.Collections.BaseInMemoryChannel1.<Open>b__16_1()"


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

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

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

本主题对您有帮助吗?

分享主题

评论 (6)

登录创建账户, 登录或注册以发表评论

Support
Support

Добрый день

  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);
  1. У вас отсуствует файл с мета-информацией по инструментам. Приложен к данному сообщению. Его необходимо записать в директорию, где присутсвует файл instruments.csv

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

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

После исправлений ваша программа начала показывать счетчик.

Mike144
Mike144
Mike144 作者

Спасибо! Дайте, пожалуйста, еще пару пояснений по пунктам:

  1. Да, добавил путь, Init() и хранилище подключилось, свечи пошли. Не совсем понимаю, для чего нужны CsvEntityRegistry и SnapshotRegistry. Ну, и, если приоткроете какие были предпосылки для такого перехода, буду очень признателен.
  2. Все работало без этого файла (и работает, после применения пункта 1). Тут тоже не понимаю, зачем он нужен, что делает и точно ли он нужен?
  3. Бывает, их путаю😂
Support
Support
  1. Как ранее вам написал, вы использовали хранилище SQLite. Оно требует дополнительных настроек. Хранилище на базе CSV не требует настроек.
  2. Видимо у вас откуда то ещё грузится информация об инструментах.
Mike144
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
Support

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
Support

Добрый день

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