Как настроить шкалу оси XtraChart of Devexpress - PullRequest
0 голосов
/ 08 октября 2019

Я сейчас занимаюсь разработкой программы для работы с графиками и сейчас решаю некоторые проблемы. Есть финансовые данные из API. и привязать к управлению графиком. Для Axisx нет никаких правил. это означает, что может содержать mininute, second или может содержать только день. И я хочу смотреть все данные графика в одном масштабе всегда. Но сейчас не тот же масштаб и другое шоу. посмотрите на прикрепленное изображение. мои коды отображаются как erro1, error2 image, так что я хочу помочь мне правильно решить диаграмму, как ok1, ok2 image. Для инициализации используйте функцию InitChartControl () и установите стиль диаграммы с помощью функции Setmeasure. я использовал

xAxisScaleOptions.WorkdaysOnly = true;

Но это пока не исправлено .. помогите мне сейчас. С уважением.


void InitChartControl()  
        {
            PriceSeries.SetFinancialDataMembers("DateTimeStamp", "Low", "High", "Open", "Close");  
            DateTimeScaleOptions xAxisScaleOptions = AxisX.DateTimeScaleOptions;  
            xAxisScaleOptions.WorkdaysOnly = true;  
            xAxisScaleOptions.ScaleMode = ScaleMode.Manual;  
            xAxisScaleOptions.AggregateFunction = AggregateFunction.Average;
            WorkTimeRule weekdayRule = new WorkTimeRule();  
            xAxisScaleOptions.WorkTimeRules.Add(weekdayRule);  
            // Specify one or more work intervals of this rule.  
            weekdayRule.WorkIntervals.Add(new TimeInterval(00, 00, 00, 24, 00, 00));  
            // Add weekdays on which this rule should be applied.  
            weekdayRule.Weekdays = Weekday.Monday | Weekday.Tuesday | Weekday.Wednesday  
                    | Weekday.Thursday | Weekday.Friday;  

            //WorkTimeRule dateRule = new WorkTimeRule();  
            //xAxisScaleOptions.WorkTimeRules.Add(dateRule);  
            //dateRule.WorkIntervals.Add(new TimeInterval(0, 00, 00, 24, 00, 00));  
            //// Besides Weekdays, you can specify the Date  
            //// on which this rule should be applied.  
            //dateRule.Date = new DateTime(2019, 1, 1);  
            // workdayOptions.Holidays.Add(new KnownDate("Christmas Eve", new DateTime(2019, 12, 24)));  

            CandleStickSeriesView myView = (CandleStickSeriesView)PriceSeries.View;  
            myView.AxisX.MinorCount = 5;  

            // PutScrollBarToLastPane();  
        }
public void SetMeasureUnit(MeasureUnitWithMultiplier measureUnitWithMultiplier)  
        {  
            DateTimeMeasureUnit unit = DateTimeMeasureUnit.Minute;  
            switch (measureUnitWithMultiplier.MeasureUnit)  
            {  
                case ChartType.Day:  
                    unit = DateTimeMeasureUnit.Day;  
                    break;  
                case ChartType.Min:  
                    unit = DateTimeMeasureUnit.Minute;  
                    break;  
                case ChartType.Tick:  
                    unit = DateTimeMeasureUnit.Second;  
                    break;  
                case ChartType.Month:  
                    unit = DateTimeMeasureUnit.Month;  
                    break;  
                case ChartType.Week:  
                    unit = DateTimeMeasureUnit.Week;  
                    break;  
                case ChartType.Year:  
                    unit = DateTimeMeasureUnit.Year;  
                    break;  
            }  
            DateTimeScaleOptions xAxisScaleOptions = AxisX.DateTimeScaleOptions;  
            WorkdaysOptions workdayOptions = xAxisScaleOptions.WorkdaysOptions;  
            CandleStickSeriesView myView = (CandleStickSeriesView)PriceSeries.View;  

            if (measureUnitWithMultiplier.MeasureUnit == ChartType.Tick || measureUnitWithMultiplier.MeasureUnit == ChartType.Min)  
            {  
                xAxisScaleOptions.ScaleMode = ScaleMode.Automatic;  
                xAxisScaleOptions.AutomaticMeasureUnitsCalculator = new CustomDateTimeMeasureUnitsCalculator(measureUnitWithMultiplier.Multiplier);  

                myView.AxisX.MinorCount = 5;  
                myView.AxisX.GridLines.Color = Color.FromArgb(255, 0, 0);  
                myView.LevelLineLength = 0.3;  
                myView.LineThickness = 2;  
            }  
            else  
            {  
                AxisX.Logarithmic = false;  

                xAxisScaleOptions.ScaleMode = ScaleMode.Manual;  
                xAxisScaleOptions.MeasureUnit = unit;  
                xAxisScaleOptions.MeasureUnitMultiplier = measureUnitWithMultiplier.Multiplier;  

                myView.AxisX.MinorCount = 5;  
                myView.AxisX.GridLines.Color = Color.FromArgb(255, 255, 255);  
                myView.LevelLineLength = 0.3;  
                myView.LineThickness = 2;  
            }  

            ViewType viewType = ViewType.CandleStick;  
            PriceSeries.ChangeView(viewType);  
        }  
class CustomDateTimeMeasureUnitsCalculator : IDateTimeMeasureUnitsCalculator  
    {  
        const int daysInWeek = 7;  
        const int daysInMonth = 30;  
        const int daysInQuarter = 4 * daysInMonth;  
        const int daysInYear = 365;  

        const int minCount = 5;  

        int limit;  

        public CustomDateTimeMeasureUnitsCalculator(int val)  
        {  
            limit = val;  
        }  

        public DateTimeMeasureUnit CalculateMeasureUnit(  
                IEnumerable<Series> series,  
                double axisLength,  
                int pixelsPerUnit,  
                double visualMin,  
                double visualMax,  
                double wholeMin,  
                double wholeMax)  
        {  
            return DateTimeMeasureUnit.Second;  

            if (limit < 100)  
            {  

                if(limit > 1)  
                    return DateTimeMeasureUnit.Hour;  
                else  
                    return DateTimeMeasureUnit.Minute;  
            }  


            // Calculate visual range in msecs.  
            double visualRange = visualMax - visualMin;  
            TimeSpan ts = TimeSpan.FromMilliseconds(visualRange);  
            if (ts.TotalDays >= 1.0d)  
            {  
                if (ts.TotalDays <= minCount * daysInWeek)  
                    return DateTimeMeasureUnit.Day;  
                if (ts.TotalDays <= minCount * daysInMonth)  
                    return DateTimeMeasureUnit.Week;  
                if (ts.TotalDays <= minCount * daysInQuarter)  
                    return DateTimeMeasureUnit.Month;  
                if (ts.TotalDays <= minCount * daysInYear)  
                    return DateTimeMeasureUnit.Quarter;  
                else  
                    return DateTimeMeasureUnit.Year;  
            }  
            else if (ts.TotalHours >= 20.0d)  
                return DateTimeMeasureUnit.Hour;  
            else if (ts.TotalMinutes >= 20.0d)  
                return DateTimeMeasureUnit.Minute;  
            else if (ts.TotalSeconds >= 20.0d)  
                return DateTimeMeasureUnit.Second;  
            else  
                return DateTimeMeasureUnit.Millisecond;  
        }  
    }


enter image description here введите описание изображения здесь erro1.png

enter image description here

error2. png

enter image description here ok1.png enter image description here

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