Скажите, пожалуйста, каким образом в текущей версии стокшарпа можно строить свечи сначала из хранимых тиков, а затем из поступающих онлайн? После обновления до текущей версии свечи онлайн строятся из тиков нормально, но не строятся из хранящихся на диске тиков. Нигде не нашел примера для текущей версии.
Kommentare (20)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Вот так попробуйте. 1. Инициализируем объект хранилища в коннекторе. var storage = new StorageRegistry() { DefaultDrive = new LocalMarketDataDrive() }; connector.InitializeStorage( new EntityRegistry(), storage ); 2. Дальше коннектор должен сам склеивать свечи...
Нет, не помогает. Я коннектор изначально создаю так: Connector connector = new Connector(entityRegistry, storageRegistry); Потом добавляю в него адаптеры сообщений для квика. Поэтому метод InitializeStorage запускается и без его прямого вызова. Хотя и если дополнительно вызвать, то все равно, свечи из сохраненных ранее тиков не строятся. Только из поступающих онлайн. Он даже файлы с тиками из хранилища не подгружает (в окне output нет соответствующего сообщения). Хотя при этом поступающие онлайн тики он в то же самое хранилище записывает успешно.
Может быть есть работающий пример?
Привет будет после обновления документации.
А как вы подписываетесь на свечи?
После соединения коннектора подписываюсь на свечи в стратегии так: CandleManager candleManager = new CandleManager(connector); CandleSeries candleSeries = new CandleSeries(typeof(TimeframeCandle, security, period); candleSeries.BuildCandlesMode = BuildCandlesModes.Build;// LoadAndBuild я тоже пробовал candleSeries.From = from; candleSeries.To = DateTimeOffset.MaxValue; candleManager.Start(candleSeries, from, DateTimeOffset.MaxValue); strategy.Start();
А в методе OnStarted() стратегии выполняю: candleManager.WhenCandlesFinished(candleSeries).Do(ProcessFinishedCandle).Apply(this);
Попробовал добавить склеивание исторических и онлайн свечей по Вашему совету в стандартный пример SampleQuikCandles. Ничего также не получилось. Если в качестве коннектора использовать QuikTrader и потом вызывать InitializeStorage, передавая в него EntityRegistry и StorageRegistry, то в момент попытки коннекта появляется вот такая ошибка: System.InvalidOperationException: Сообщение 'Connect,T(L)=2017/07/17 07:01:56.221,Error=Необходимо создать хотя бы одно подключение.' привело к ошибке обработки. ---> System.Collections.Generic.KeyNotFoundException: Данный ключ отсутствует в словаре.
Если же в качестве коннектора использовать Connector и передавать EntityRegistry и StorageRegistry в его конструктор, потом вручную добавлять квиковские адаптеры сообщений, то коннект проходит нормально, но свечи строятся только из поступающих онлайн тиков. Из хранилища никакой подгрузки данных не происходит.
Обновился до версии 4.3.26. Проблема со склеиванием свечей из хранимых тиков и онлайн тиков исчезла. То есть свечи стали строиться. Однако я заметил, что теперь, пока свечи строятся из хранимых тиков, возникает рассинхронизация в поступающих данных по правилу CandleManager.WhenCandlesFinished и по правилу Security.WhenNewTrade. То есть, например, срабатывает правило CandleManager.WhenCandlesFinished при закрытии свечи с 10 до 11 часов, а после этого еще продолжают срабатывать правила Security.WhenNewTrade с тиками с 10 до 11 часов. Причем такая расснихронизация по хранимым тикам может достигать нескольких дней. Срабатывает правило завершения свечи где-нибудь в середине дня 03.08.2017, а в это время еще продолжают срабатывать правила новых сделок за 02.08.2017. Раньше такого не было. По поступающим онлайн тикам и сейчас такого не наблюдается. Скажите, пожалуйста, такая рассинхронизация поступающих данных - это какая-то ошибка или теперь нельзя рассчитывать на то, что данные поступающих сделок и свечей синхронизированы?
Могли бы вы прислать пример для воспроизведения ошибки?
Да, могу. В аттаче доработанный исходный код для примера SampleQuikCandles. Соответственно этим файлом нужно заменить аналогичный в папке с этим примером. Для воспроизведения в строках 120 и 121 нужно заменить пути к папкам с хранилищем EntityRegistry и StorageRegistry на Ваши. Я тестировал на часовых данных SBER@TQBR. Воспроизвести можно так:
Коллеги, подскажите, пожалуйста, по описанной выше проблеме рассинхронизации поступающих данных тиков и свечей (при их построении из тиков) - вы считаете это ошибкой, которая будет исправлена? Или все-таки теперь необходимо самостоятельно в каждой стратегии заботиться о синхронизации этих данных?
Пока не было времени. Задача стоит в списке.
Добрый день,
Свечи строится в вашем случае из локальных данных и потока сделок. Инструмент же обновляется только из потока сделок. Синхронизации между двумя этими действиями нет. Это необхожимо делать в программе.
Скажите, пожалуйста:
Свечи в вашем случае сначала получаются готовые, затем обновляются тиковыми данными. Инструмент обновляется только тиковыми данными.
Это не так. У меня все свечи, в том числе исторические, строятся из тиков. В хранилище свечей вообще нет.
Ответьте, пожалуйста, на вторую часть предыдущего вопроса: на основе какого потока данных срабатывает правило Security.WhenNewTrade ? На основе обновления инструмента или на основе данных тиковых сделок?
И еще: под обновлением инструмента Вы понимаете подписку Connector.RegisterSecurity() ?
Свечи строятся в вашем случае из тиков хранилища + поступающих из Квик.
Инструмент обновляется только по таблице текущих параметров.
Причем тут обновление инструмента? Судя по коду правило Security.WhenNewTrade срабатывает при появлении новой тиковой сделки (то есть того же самого источника данных, что и при построении свечей), либо при включенном параметре CreateTradesFromOrdersLog (в моем случае он отключен).
То есть рассинхронизация происходит не между разными потоками данных, а в рамках одного и того же потока данных. Вы также не считаете это ошибкой?
Ваш измененный пример строит свечи из истории + реальных данных. В Security.WhenNewTrade только реальные. Поэтому это разные потоки данных.
Коллеги, ну как же так. Вы хотя бы посмотрите внимательно мое первоначальное сообщение об ошибке (не говоря уже о том, чтобы его воспроизвести самостоятельно по тому примеру, который я прислал). Я же сразу написал, что проблема возникает пока свечи строятся из хранимых тиков. То есть рассинхронизация построенных свечей из хранимых тиков с событием Security.WhenNewTrade, сгенерированным на основе тех же хранимых тиков. Когда все выходит в онлайн - все нормализуется и рассинхронизации не возникает.
Вы могли сразу мне ответить, что не считаете описанный мной случай ошибкой и все. Вместо этого Вы в третьем сообщении придумываете причину, почему не считаете это ошибкой, которая к моему примеру не имеет никакого отношения.
Да, именно это и было в нашем ответе. Рассинхронизация идет из-за истории. Она может быть получена и в реальном времени, и считана с диска. Например, в середине дня вы запускаете построение свечей с начала дня. Конечно же в самом начале свечи будут идти со временем на несколько часов меньше, чем тещие тики в Security.WhenNewTrade. Затем данные синхронизуются.
К сожалению, опять не сходится. Посмотрите сами на разницу в описанной мной проблеме и на Ваше объяснение. Вот мой пример из поста выше:
Заметьте, что все с точностью до наоборот. Запаздывают не свечи, как Вы пишите, а запаздывают сделки. Причем все это только при построении на основе данных тиков, которые только хранятся. Никакого отношения к текущему дню проблема не имеет. То есть если сегодня 17.11, то при загрузке данных, например, за 13.11 правила завершения свечей за 13.11 срабатывают гораздо быстрее, чем правила поступление новой сделки за то же самое 13.11.