Доброго времени суток! Разбираюсь с этой замечательной штукой StockSharp и возник вопрос - а есть ли возможность, как-то приспособить S# для работы с другими контролами? Например с Telerik? Давненько полюбил этот телерик за красоту и удобство, и хотел бы использовать его и в связке с S#. В частности, сейчас стою перед вопросом как 'скормить' графику, данные из CandleSeries (или они в CandleManager?) ? Буду очень признателен, если кто-что подскажет 🙂
Comentários (10)
Entrar ou Criar conta, Faça login ou cadastre-se para deixar um comentário
Мы же как-то используем сторонние контролы в своих роботах.😉
Это вселяет уверенность :) А поподробнее можно? 🙄 Просто не хотелось бы в очередной раз изобретать велосипед...
Свечи должны быть в CandleContainer. Исходники S# берете и вперед для начала. Если поймете что не разобраться, обращайтесь народ подскажет.
ra81, спасибо за наводку! Привязку данных к графику сделал, на истории работает. Теперь проблема с реал-таймом. Связку история+реал-тайм, я делал по документации, и со стандартным Chart все работает отлично. С telerik'ом же проблемы. Суть такая - для live-обновления графика teletik, данные для него, должны быть в виде коллекции ObservableCollection.Обновляется коллекция - обновляется график. Это сделанно (сначала GetCandles(series), потом заполнение ими ObservableCollection). Но никак не пойму, как теперь обновлять данные в этой коллекции. Понимаю что делать это нужно по событию _candleManager.Processing. Но ведь при событии (т.е. при тике) каждый раз приходит новая свечка и добавлять ее сразу в коллекцию нельзя (да и не получается, приложение виснет). Что делать не пойму... Уже хочется плюнуть и использовать стандартный Chart.
Если в коллекцию надо добавлять только целые свечки. Когда срабатывает событие Processingи приходит свечка, ее можно отфильтровать по Сandle.State == CandleStates.Finished.
Если надо чтобы свечки на графике "шевелились". То когда пришла свечка, сравнивать ее время и время последней свечки в коллекции. Если время одинаковое, значит эта та же свечка - обновляем значения последней свечки в коллекции. Если время другое, значит добавляем новую свечку в коллекцию.
Спасибо, Moadip! Буду пробовать.
Да, разрешите еще пару вопросов не совсем по теме (ну чтоб не плодить новых) - у меня максимально возможная длина истории получается где-то около 20 дней, если импортировать больше, вылетает эксепшен OutOfMemory (ОЗУ 8 Гб). Само приложение, это оригинальный SampleCandle из примеров, только добавленна история. Историю качал гидрой, с финама. Да и само построение графика, занимает около 2-х минут. Я так понимаю, это происходит по тому, что данные хранятся в виде сделок, т.е. идет конвертация в нужный формат. Хотя время построения графика не особо критично, но вот невозможность загрузить историю больше чем за 20 дней, не приемлима. Как это победить? Попробовал скачать историю не в виде сделок, а в виде свечей, но как их подключить не понял. Искал в доках аналог TradeStorageCandleBuilderSource, но либо не нашел, либо не увидел... Как придуманное решение - сохранить свечи в txt, и уже обрабатывать оттуда. Но помоему это опять велосипед, ведь для чего-то же Вы придумали формат для хранения свечей? :) Как ими пользоваться? Заранее спасибо!)
Вообщем остановился на варианте с хранением свечей в txt, более менее удобно, а главное быстро. И поковыряв SciChart, откажусь пожалуй от Telerik. Во всяком случае для свечных графиков точно 👍. Но вопросы актуальны! 🙂
Тики(Из справки):
Cвечки:
Главное потом, когда будет создаваться CandleSeries
И будет запущено получение свечек. Не забыть, по каким инструментам и за какой ТФ гидрой скачаны свечки. Если например создается CandleSeries1 мин. по RIH3, то значит должны быть закачаны свечки по этому инструменту и данного ТФ.
Даже при построении часовок за 20 дней, памяти не хватает.
_candleManager = new CandleManager(_trader);
var storageRegistry = new StorageRegistry(); ((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = _historyPath; ((LocalMarketDataDrive)storageRegistry.DefaultDrive).UseAlphabeticPath = true; // используем алфавитное хранилище
_candleManager.Sources.OfType<StorageCandleSource>().Single().StorageRegistry = storageRegistry;
Я вот что-то ну никак не могу разобраться, как имеющиеся свечки сжать по таймфрейму. Например, скачанные минутки сжать в пятиминутки, часовики и т.д., чтобы быстрее длинную историю, например, часовых свечек собрать. Из тиков это нереально, а из свечек можно.
Как я понял, TimeFrameCandleBuilder из тиков лишь умеет собирать. Гидра тоже это не делает и тоже лишь умеет собирать из тиков.
Разве нет готового механизма? Самому надо конвертер писать?