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

Chart - тоска, печаль...
Atom
10/20/2013


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

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

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

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

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

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

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

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

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



Thanks:


Mikhail Sukhov

Avatar
Date: 10/20/2013
Reply


Bond Go to

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


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

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

Bond

Avatar
Date: 10/20/2013
Reply


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

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


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

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


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

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

Bond

Avatar
Date: 10/20/2013
Reply


Код:

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

 candlesCountAll = candles.Count;

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



Сам метод:
Code

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 }
                                                                                                                        }));
            }
            
        }


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

Mikhail Sukhov

Avatar
Date: 10/20/2013
Reply


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


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

Bond

Avatar
Date: 10/20/2013
Reply


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


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


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

Mikhail Sukhov

Avatar
Date: 10/21/2013
Reply


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


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

Bond

Avatar
Date: 10/21/2013
Reply


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


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


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

Mikhail Sukhov

Avatar
Date: 10/21/2013
Reply


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


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

Bond Go to

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


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

Bond

Avatar
Date: 10/21/2013
Reply


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy