Mikhail Sukhov
|
Дата: 20.02.2013
Мы же как-то используем сторонние контролы в своих роботах.[wink]
|
|
Спасибо:
|
|
|
|
|
vint
|
Дата: 20.02.2013
Это вселяет уверенность :) А поподробнее можно? [rolleyes] Просто не хотелось бы в очередной раз изобретать велосипед...
|
|
Спасибо:
|
|
|
|
|
ra81
|
Дата: 20.02.2013
vint Это вселяет уверенность :) А поподробнее можно? [rolleyes] Просто не хотелось бы в очередной раз изобретать велосипед... Свечи должны быть в CandleContainer. Исходники S# берете и вперед для начала. Если поймете что не разобраться, обращайтесь народ подскажет.
|
|
|
|
|
vint
|
Дата: 25.02.2013
ra81, спасибо за наводку! Привязку данных к графику сделал, на истории работает. Теперь проблема с реал-таймом. Связку история+реал-тайм, я делал по документации, и со стандартным Chart все работает отлично. С telerik'ом же проблемы. Суть такая - для live-обновления графика teletik, данные для него, должны быть в виде коллекции ObservableCollection.Обновляется коллекция - обновляется график. Это сделанно (сначала GetCandles(series), потом заполнение ими ObservableCollection). Но никак не пойму, как теперь обновлять данные в этой коллекции. Понимаю что делать это нужно по событию _candleManager.Processing. Но ведь при событии (т.е. при тике) каждый раз приходит новая свечка и добавлять ее сразу в коллекцию нельзя (да и не получается, приложение виснет). Что делать не пойму... Уже хочется плюнуть и использовать стандартный Chart.
|
|
Спасибо:
|
|
|
|
|
Moadip
|
Дата: 25.02.2013
|
|
|
|
Цитата:Но никак не пойму, как теперь обновлять данные в этой коллекции. Понимаю что делать это нужно по событию _candleManager.Processing. Но ведь при событии (т.е. при тике) каждый раз приходит новая свечка и добавлять ее сразу в коллекцию нельзя (да и не получается, приложение виснет). На событие Processing не каждый раз приходит новая свечка. Имеется ввиду новый объект типа Candle. Приходит тот же самый объект, но с измененными св-вами. Новый объект создается(приходит) когда текущая свечка заканчивается. Это чтобы знать. Если в коллекцию надо добавлять только целые свечки. Когда срабатывает событие Processing и приходит свечка, ее можно отфильтровать по Сandle.State == CandleStates.Finished. Если надо чтобы свечки на графике "шевелились". То когда пришла свечка, сравнивать ее время и время последней свечки в коллекции. Если время одинаковое, значит эта та же свечка - обновляем значения последней свечки в коллекции. Если время другое, значит добавляем новую свечку в коллекцию. Цитата:Уже хочется плюнуть и использовать стандартный Chart В S# есть SciChart. Попробуйте, шустрый контрол.
|
|
|
|
|
vint
|
Дата: 25.02.2013
|
|
|
|
Спасибо, Moadip! Буду пробовать.
Да, разрешите еще пару вопросов не совсем по теме (ну чтоб не плодить новых) - у меня максимально возможная длина истории получается где-то около 20 дней, если импортировать больше, вылетает эксепшен OutOfMemory (ОЗУ 8 Гб). Само приложение, это оригинальный SampleCandle из примеров, только добавленна история. Историю качал гидрой, с финама. Да и само построение графика, занимает около 2-х минут. Я так понимаю, это происходит по тому, что данные хранятся в виде сделок, т.е. идет конвертация в нужный формат. Хотя время построения графика не особо критично, но вот невозможность загрузить историю больше чем за 20 дней, не приемлима. Как это победить? Попробовал скачать историю не в виде сделок, а в виде свечей, но как их подключить не понял. Искал в доках аналог TradeStorageCandleBuilderSource, но либо не нашел, либо не увидел... Как придуманное решение - сохранить свечи в txt, и уже обрабатывать оттуда. Но помоему это опять велосипед, ведь для чего-то же Вы придумали формат для хранения свечей? :) Как ими пользоваться? Заранее спасибо!)
|
|
Спасибо:
|
|
|
|
|
vint
|
Дата: 26.02.2013
Вообщем остановился на варианте с хранением свечей в txt, более менее удобно, а главное быстро. И поковыряв SciChart, откажусь пожалуй от Telerik. Во всяком случае для свечных графиков точно [thumbup]. Но вопросы актуальны! [smile]
|
|
Спасибо:
|
|
|
|
|
Moadip
|
Дата: 27.02.2013
|
|
|
|
Цитата:у меня максимально возможная длина истории получается где-то около 20 дней, если импортировать больше, вылетает эксепшен OutOfMemory (ОЗУ 8 Гб). Странно. Попробовал подгрузил тики по ри за 3 месяца, из них были сделаны 1мин. В пике, когда подгружались тики и формировались свечки, прога отъедала ~400 мб. Когда все подргузилось и сформировалось - ~ 250мб. Цитата:Да и само построение графика, занимает около 2-х минут. Я так понимаю, это происходит по тому, что данные хранятся в виде сделок, т.е. идет конвертация в нужный формат. Хотя время построения графика не особо критично Для того чтобы отрисовался график, необходимо чтобы подргузились тики из них сформировались свечки, на это требуется какое то время. Цитата:Как придуманное решение - сохранить свечи в txt, и уже обрабатывать оттуда. Но помоему это опять велосипед, ведь для чего-то же Вы придумали формат для хранения свечей? :) Как ими пользоваться? Да, действительно велосипед.[smile] Подгрузить скачанные гидрой свечки, не сложнее чем тики. Тики(Из справки): Код
_candleManager = new CandleManager(_trader);
// Добавление в источник свечек TimeFrameCandleBuilder источник данных в виде файлов гидры
var storageRegistry = new StorageRegistry();
((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = _historyPath;
var cbs = new TradeStorageCandleBuilderSource { StorageRegistry = storageRegistry };
_candleManager.Sources.OfType<TimeFrameCandleBuilder>().Single().Sources.Add(cbs);
Cвечки: Код
_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;
Главное потом, когда будет создаваться CandleSeriesКод
readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(1);
...
_series = new CandleSeries(typeof(TimeFrameCandle), _instr1, _timeFrame)
И будет запущено получение свечек. Не забыть, по каким инструментам и за какой ТФ гидрой скачаны свечки. Если например создается CandleSeries 1 мин. по RIH3, то значит должны быть закачаны свечки по этому инструменту и данного ТФ.
|
|
|
|
|
vint
|
Дата: 27.02.2013
|
|
|
|
Moadip Странно. Попробовал подгрузил тики по ри за 3 месяца, из них были сделаны 1мин. В пике, когда подгружались тики и формировались свечки, прога отъедала ~400 мб. Когда все подргузилось и сформировалось - ~ 250мб.
Действительно странно... С учетом того что я собственно ничего не изобретал, взял готовый пример и просто добавил уже упомянутые строки. Код
// Добавление в источник свечек TimeFrameCandleBuilder источник данных в виде файлов гидры
var storageRegistry = new StorageRegistry();
((LocalMarketDataDrive)storageRegistry.DefaultDrive).Path = _historyPath;
var cbs = new TradeStorageCandleBuilderSource { StorageRegistry = storageRegistry };
_candleManager.Sources.OfType<TimeFrameCandleBuilder>().Single().Sources.Add(cbs);
Даже при построении часовок за 20 дней, памяти не хватает. Цитата:Cвечки: Код
_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;
Вот последнюю строчку я и искал :) Спасибо! Про таймфреймы я понял, что они должны совпадать.
|
|
Спасибо:
|
|
|
|
|
akoz
|
Дата: 23.03.2013
Цитата:Про таймфреймы я понял, что они должны совпадать. Я вот что-то ну никак не могу разобраться, как имеющиеся свечки сжать по таймфрейму. Например, скачанные минутки сжать в пятиминутки, часовики и т.д., чтобы быстрее длинную историю, например, часовых свечек собрать. Из тиков это нереально, а из свечек можно. Как я понял, TimeFrameCandleBuilder из тиков лишь умеет собирать. Гидра тоже это не делает и тоже лишь умеет собирать из тиков. Разве нет готового механизма? Самому надо конвертер писать?
|
|
Спасибо:
|
|
|
|