S# + сторонии controls
Atom Ответить
19.02.2013


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

Теги:


Спасибо:




10 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 19.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

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


Вообщем остановился на варианте с хранением свечей в txt, более менее удобно, а главное быстро. И поковыряв SciChart, откажусь пожалуй от Telerik. Во всяком случае для свечных графиков точно ThumpUp. Но вопросы актуальны! 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

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