S# + сторонии controls
Atom
20.02.2013
vint


Доброго времени суток! Разбираюсь с этой замечательной штукой StockSharp и возник вопрос - а есть ли возможность, как-то приспособить S# для работы с другими контролами? Например с Telerik? Давненько полюбил этот телерик за красоту и удобство, и хотел бы использовать его и в связке с S#. В частности, сейчас стою перед вопросом как 'скормить' графику, данные из CandleSeries (или они в CandleManager?) ? Буду очень признателен, если кто-что подскажет [smile]


Теги:


Спасибо:


Mikhail Sukhov

Фотография
Дата: 20.02.2013
Ответить


Мы же как-то используем сторонние контролы в своих роботах.[wink]

Спасибо:

vint

Фотография
Дата: 20.02.2013
Ответить


Это вселяет уверенность :) А поподробнее можно? [rolleyes] Просто не хотелось бы в очередной раз изобретать велосипед...

Спасибо:

ra81

Фотография
Дата: 20.02.2013
Ответить


vint: Это вселяет уверенность :) А поподробнее можно? [rolleyes] Просто не хотелось бы в очередной раз изобретать велосипед...

Свечи должны быть в CandleContainer. Исходники S# берете и вперед для начала. Если поймете что не разобраться, обращайтесь народ подскажет.

Спасибо: vint

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

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)

И будет запущено получение свечек. Не забыть, по каким инструментам и за какой ТФ гидрой скачаны свечки. Если например создается CandleSeries1 мин. по RIH3, то значит должны быть закачаны свечки по этому инструменту и данного ТФ.

Спасибо: vint

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 из тиков лишь умеет собирать. Гидра тоже это не делает и тоже лишь умеет собирать из тиков.

Разве нет готового механизма? Самому надо конвертер писать?

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy