Chart - тоска, печаль...
Atom
20.10.2013
Bond


Одна тоска, печаль при работе с графиками... [cursing]
Те чарты, что в msdn имеют на много больше свойств и методов, и разнятся с теми, что в доках S#
Например, в проекте GetCandles можно проверить, что при отрисовке исторических свечек на нормальном периоде времени все окно зависает нафиг пока не обработает все свечи и только потом покажет готовый график. К каким свойствам и методам обращаться, чтобы он брал свечку, выводил ее на график и только потом делал это с другой свечкой? Ладно бы график, все окно зависает.

ChartArea() - высота областей не настраивается. Где бы ты ее не задавал - в итоге стандартные 100 выводит и хоть ты тресни. Сказали, что передали разработчикам, те видимо забили.

EquityCurveChart()- легенда на пол графика, доступа к ее настройкам никаких. В процессе построения свои значения не показывает и даже после построения график чиcтый... пока не подвигаешь мышкой окно [biggrin] . Доступ к методам и свойствам минимальный.

Дока на графики вообще на половину не переведена.

И так по мелочи: Chart.CrossHairAxisLabels - здорово, можно выводить. Вот только куча не нужных цифр после запятой, как округлять? Наверное, опять к разработчикам...

Бонус: candles.Count выводит в два раза больше свечек, чем положено.

Если берете стандартные функции из C#, то зачем их урезать?

Очень вероятно, что я как начинающий, что-то проглядел, не внимательно читал документы, да, и, вообще, нажимал кнопки, какие попали на глаза без разбору. Буду рад, если профессионалы укажут на мои недостатки!

Заранее спасибо.

Теги:


Спасибо:


Mikhail Sukhov

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


Bond

Если берете стандартные функции из C#, то зачем их урезать?


Вообще то наш чарт построен на СкиЧарте. Это не стандартный компонент, и стоит почти что 50к рубликов. Распространять по лиц. соглашению мы не имеем право лицензию СкиЧарт, как и сам компонент. И поэтому он обернут (=урезан) в наши методы, и распространяется дэ факто и дэ юрэ наша обертка, тоесть производное решение. Именно в таком виде график получает бесплатное распространение. Если хотите фул тротэл, то велкам на сайт производителя, и сможете заюзать компонент со всеми его фичами. Только придется уплатить 50к.

Что касается замирания всех окон, то почти уверен, что это вовсе не из-за графика, а за частого маршалинга данных в ГУИ поток.
Спасибо:

Bond

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


Михаил Сухов
Bond

Если берете стандартные функции из C#, то зачем их урезать?


Вообще то наш чарт построен на СкиЧарте. Это не стандартный компонент, и стоит почти что 50к рубликов. Распространять по лиц. соглашению мы не имеем право лицензию СкиЧарт, как и сам компонент. И поэтому он обернут (=урезан) в наши методы, и распространяется дэ факто и дэ юрэ наша обертка, тоесть производное решение. Именно в таком виде график получает бесплатное распространение. Если хотите фул тротэл, то велкам на сайт производителя, и сможете заюзать компонент со всеми его фичами. Только придется уплатить 50к.

Что касается замирания всех окон, то почти уверен, что это вовсе не из-за графика, а за частого маршалинга данных в ГУИ поток.


Очень хорошо, что платформа использует качественные профессиональные компоненты. Но я и не планирую с этими графиками строить траектории движения космических кораблей. Просто хочу, чтобы график отрисовывался во время получения данных и было понятно, что он делает. Стандартные функции C# это позволяют, а профессиональные значит нет)

Я могу выложить код. И, надеюсь, мне подскажут как решить проблему с "маршалингом" или чем бы то ни было[biggrin]
Спасибо:

Bond

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


Код:

Передаю свечи в метод Draw:
Код

 candlesCountAll = candles.Count;

			    foreach (var candle in candles)
                {
                    candlesCount = candlesCount + 2;
                    Draw(candle, _chartCandleElement);
                }



Сам метод:
Код

public void Draw(Candle candle, IChartElement chartElement)
        {
            ProcessDraw.Maximum = candlesCountAll;
            this.GuiAsync(() => ProcessDraw.Value = candlesCount);
            
            if (candle.State == CandleStates.Finished || candle.State == CandleStates.Changed)
            {
                var final = candle.State == CandleStates.Finished;

                var valSMA = _SMA.Indicator.Process(new DecimalIndicatorValue(candle.ClosePrice) { IsFinal = final });
                var ValueSMA = new ChartIndicatorValue(_SMA.Indicator, valSMA);

                var valAO = _AO.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                var ValueAO = new ChartIndicatorValue(_AO.Indicator, valAO);

                var valRSI = _RSI.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                var ValueRSI = new ChartIndicatorValue(_RSI.Indicator, valRSI);

                var valATR = _ATR.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                var ValueATR = new ChartIndicatorValue(_ATR.Indicator, valATR);

                var valVolume = _Volume.Indicator.Process(new CandleIndicatorValue(candle) { IsFinal = true });
                var ValueVolume = new ChartIndicatorValue(_Volume.Indicator, valVolume);

                this.GuiAsync(() => candlesChart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
                                                                                                                        {
                                                                                                                            { chartElement, candle },
                                                                                                                            { _SMA, ValueSMA },
                                                                                                                            { _AO, ValueAO },
                                                                                                                            { _RSI, ValueRSI },
                                                                                                                            { _ATR, ValueATR },
                                                                                                                            { _Volume, ValueVolume }
                                                                                                                        }));
            }
            
        }


Все работает. Только отрисовывает после работы метода.
Спасибо:

Mikhail Sukhov

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


Bond
Только отрисовывает после работы метода.


Вот эта фраза не понятно. А когда должно отрисовывать? До работы?[laugh]
Спасибо:

Bond

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


Михаил Сухов
Bond
Только отрисовывает после работы метода.


Вот эта фраза не понятно. А когда должно отрисовывать? До работы?[laugh]


Отрисовывает по окончании foreach. А в процессе зависание. Кода добавлял вывод сообщения после окончания метода, то свечка отрисовывалась нормально. Как ему обозначить, что нужно показать график со свечей, а потом уже новую свечу выводить. Он либо не успевает, либо игнорирует. Хз.
Спасибо:

Mikhail Sukhov

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


Bond
Отрисовывает по окончании foreach. А в процессе зависание.


Потому что GUI маршалинг - это не мгновенная операция. Или передавайте свечки пачкой, или используйте очередь. Но сам метод не зависает, скорее всего. Зависает отрисовка. Потому что маршалинг асинхронный.
Спасибо: Bond

Bond

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


Михаил Сухов
Bond
Отрисовывает по окончании foreach. А в процессе зависание.


Потому что GUI маршалинг - это не мгновенная операция. Или передавайте свечки пачкой, или используйте очередь. Но сам метод не зависает, скорее всего. Зависает отрисовка. Потому что маршалинг асинхронный.


Мне тоже так кажется. Как можно это решить на практике? Или забить? Не хотелось бы...
А с остальными моментами из первого сообщения?
Спасибо:

Mikhail Sukhov

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


Bond
Мне тоже так кажется. Как можно это решить на практике? Или забить? Не хотелось бы...


Тема перфоманса ГУИ не такая уж и простая. Я бы сказал, ее многие конторы в трейдинге до сих пор не очень успешно решают. Тут нет однозначного решения как лучше. Надо экспериментировать. Может обновление пачкой свечек ускорит, а может еще что. На худой конец, просто забить, ведь в рилтайме свечки пачками не приходят. Если мы про тест на истории говорим, то опять же, результат можно смотреть в конце. Ведь отображение в реальном времени параметров тестирования может ухудшить перформанс тестирования.

Bond

А с остальными моментами из первого сообщения?


Я другие не особо понял о чем речь. Если про коммент насчет исправления ошибок, то все в процессе. Есть сейчас более актуальные задачи (к примеру, тестирование, о чем вы писали в плане утечки памяти). Как закончим, то вернемся к найденным недочетам с форума. Никто не забыт, ничто не забыто.
Спасибо: Bond

Bond

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


Есть решения. Попробую реализовать.
Спасибо:


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

loading
clippy