Создание CandleManager при неодновременном запуске двух стратегий в одном приложении


Создание CandleManager при неодновременном запуске двух стратегий в одном приложении
Atom
1/4/2017


Имеется приложение, которое позволяет запускать несколько стратегий одновременно.
Поясните, пожалуйста, каков подход Стокшарпа, экземпляр CandleManager должен создаваться свой отдельный на каждую стратегию, или один общий?
При создании отдельного CandleManager на каждую стратегию, каким образом решается проблема, что второй созданный CandleManager не получает тиковые данные с начала текущей торговой сессии по тому же инструменту, по которому первый CandleManager их успешно получил и построил на их основании свечки?
При создании одного общего CandleManager на все стратегии, каким образом должна решаться проблема, что вторая запускаемая стратегия не получит уже сформированные к моменту ее запуска свечки?



Thanks:


< 1 2 3  >
RomSunZ

Avatar
Date: 1/13/2017
Reply


Ага, только в таком подходе можно получить пропуск свечек в промежутке между обработкой результатов candleManager.GetCandles и подписью на событие CandleManager.Processing. Придется городить огород с проверками и т.п.
Thanks:

Support

Avatar
Date: 1/13/2017
Reply


нельзя...
Thanks:

RomSunZ

Avatar
Date: 1/13/2017
Reply


Что значит нельзя?
Вариант 1:
Вы вызываете candleManager.GetCandles<T>(CandleSeries). Получаете коллекцию. Обрабатываете ее - это занимает некоторое время, подписываетесь на событие Processing, начинаете получать сообщения. Но со времени получения и обработки коллекции уже могли произойти изменения в коллекции в candleManager (потоки-то разные), и какие-то из изменений могли пройти мимо нас.

Вариант 2:
Подписываемся на Processing и начинаем получать сообщения. Вызываем candleManager.GetCandles<T>(CandleSeries). Получаем коллекцию. Обрабатываете ее, но во время ее обработки может придти сообщение от Processing - проблемы с синхронизацией обработки.

Есть еще какие-либо варианты?
Thanks:

Evgeny

Avatar
Date: 1/14/2017
Reply


Потратил кучу времени и выяснил вот что: вторая стратегия, запущенная позднее старта первой стратегии (или второй чарт) все-таки получают данные с начала торговой сессии при следующих условиях:
1. CandleManager должен быть обязательно один и тот же.
2. CandleSeries должны быть обязательно разные (даже если стратегии или чарты используют абсолютно идентичные свечи с тем же инструментом и таймфреймом).
3. С момента запуска второй стратегии по этому инструменту должен придти хотя бы один тик. Если до конца сессии новых сделок так и не будет, то вторая стратегия так и не получит данные с начала сессии. Если же новые сделки будут получены, то вторая стратегия сначала получит все сформированные свечи с начала сессии, а потом начнёт получать реальные данные.

Третий пункт как раз меня и gem81 судя по всему и сбил с толку. Так как если запускать стандартный пример с графиками ChartWindow после окончания торговой сессии (то есть новых сделок уже точно не поступит), то второй чарт по одному инструменту не строится. Но если его запускать во время торговой сессии и по инструменту продолжают поступать сделки, то все строится нормально.

То есть по идее, если третье условие считать допустимым, то можно не прибегать к использованию метода GetCandles.
В идеале, конечно, хотелось бы получить подтверждение от поддержки, что описанное действительно работает (и главное - должно работать) именно так, а я не набрёл на очередной частный случай.
Thanks:

RomSunZ

Avatar
Date: 1/14/2017
Reply


1. Не обязательно.
2. Должны.
3. Я же Вам написал ранее. Используйте candlemanager.Start(startTime, endTime) и получите Ваши свечи не зависимо от других запущенных стратегий.
Thanks:

Evgeny

Avatar
Date: 1/14/2017
Reply


RomSunZ, вы сами пробовали на последней версии API запустить пример SampleQuikCandles с двумя чартами по одному инструменту предварительно сделав те доработки, про которые вы говорите?
1. Если создавать два экземпляра CandleManager для одного коннектора, то при старте серии свечек по второму появляется ошибка System.InvalidOperationException: Subscribed. Появляется она из-за того, что в RealTimeCandleBuilderSource.Start производится подписка на получение тиков по инструменту. Попытка это вторая, т.к. при старте первого менеджера свечек подписка на тики уже ранее была произведена.
Соответственно после появления этой ошибки ничего уже не строится.
3. Это не работает. В том же примере заменяю строку запуске серии на candleManager.Start(series, System.DateTime.Today.AddDays(-1), System.DateTime.MaxValue); и от этого ничего не меняется. На втором чарте по тому же инструменту свечи появятся только если после запуска этого второго чарта придет хотя бы один тик. А он после окончания сессии никогда не придет.
Thanks:

RomSunZ

Avatar
Date: 1/18/2017
Reply


В таком случае пишите свой обработчик загрузки истории, иначе никак.
Thanks:

RomSunZ

Avatar
Date: 1/20/2017
Reply


А Вы смотрели поведение candlemanager например в S#.Disigner? Если там все работает, то значит решение есть, его просто надо увидеть :)
Thanks:

Support

Avatar
Date: 1/26/2017
Reply


Для вашей задачи оптимальным будет следующее решение..
Во второй стратегии Вы просто подписываетесь на событие CandleManager.Processing..., кроме того создаете флаг для первой свечи в этой стратегии... При получении первой свечи запрашиваете все свечи CandleManager.GetCandles, выполняет нужные операции, сбрасываете флаг....
При создании дополнительных CandleManager или дополнительных CandleSeries накладные расходы программы будут больше....
Thanks:

RomSunZ

Avatar
Date: 1/27/2017
Reply


Тут вопрос в другом. Событие появления обработки свечек сработает только после получения новой сделки по инструменту и Ваше решение бесполезно. А человеку надо получить свечки сразу после запуска второй стратегии, т.к. сделки придут неизвестно через какой промежуток времени (например после окончания торговой сессии это будет только на следующий рабочий день). Тогда уж наверное при запуске стратегии сначала делать запрос GetCandles и после их обработки подписываться на обработку. Правда как я уже писал придется проверять появились ли изменения в свечках с момента их получения до момента подписки на событие обработки.
Thanks:
< 1 2 3  >

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

loading
clippy