Как автоматически настроить масштаб по оси Y, как отобразить только 2 цифры на оси Y Double и более - PullRequest
1 голос
/ 06 августа 2011

В последние пару дней я пытаюсь использовать элемент управления MS-chart для составления графика StockData (интервал 1 мин, свеча), который у меня есть на моем сервере sql. я думал, что это будет легко ... но теперь я нахожусь в точке, где я скоро заплачу.

У меня так много проблем, если кто-нибудь сможет решить любую, он будет благословен навсегда:
// мой код внизу, возможно, я сделал несколько фатальных ошибок

  1. всякий раз, когда я меняюсь

    series.XValueType = ChartValueType.Time;
    

    полоса прокрутки больше не работает должным образом, я не могу больше ее перетаскивать, но могу укажите где-нибудь на полосу прокрутки, и это приведет меня туда, но я не могу плавно перетащить ее, как если бы это был простой индекс int.

  2. , где я прокручиваю различные часы (минуты за минутой), у меня серьезные проблемы
    с осью Y я установил максимум и минимум в начале, но это не очень эффективно
    когда вы прокрутите график.

  3. для каждой точки, которую я установил (в цикле заполнения)

    series.Points[index]["PriceUpColor"] = "Green";
    series.Points[index]["PriceDownColor"] = "Red";
    

    но все свечи оказались красными независимо.

  4. У меня есть кнопка, когда она нажата. Я хочу, чтобы график был заполнен, это не работать, это работает, только если я поместил свой код под form_load

  5. я установил ось lbl

    chartArea.AxisX.LabelStyle.Format = "hh:mm";
    

    это правильный код?

  6. когда у меня есть значения с плавающей запятой (пример: 26.52), но когда я помещаю эти значения в series.Points.AddXY, результат для символов будет 26.5273287623, что, конечно, не помогает, я пробовал много разных решений (приведение, удаление цифр и т. д.) но не смог найти решение

Наконец вот мой код, я помещаю диаграмму в форму и вызываю эту функцию, чтобы изменить настройку диаграммы и заполнить ее (я уже делаю неправильно?)

Я понимаю, что это довольно долго, что я могу сказать, спасибо за вашу помощь! (вся помощь приветствуется!)

private void MyChart(Chart chart1, DailyBarData dbb)

-> получение компонента графика и dailybardata, и теоретически должен заполнить график соответственно
-> Я также вставил некоторые случайные данные

    {

        int viewSize = 30;     
        chart1.Series.Clear();        
        var series = chart1.Series.Add("Price");
        series.ChartType = SeriesChartType.Candlestick;       
        series.YValueType = ChartValueType.Auto;
        series.XValueType = ChartValueType.Time;                            
        DateTime date = dbb.Bars[0].time.AddMinutes (1); //getting the first minute
        double viewdistanceDouble = date.AddMinutes(viewSize).ToOADate(); // getting the initital X loc - im guessing this is not good
        double startdateDouble = date.ToOADate();
        double maxy = 0; //minmax values for the chart
        double miny = 10000000;
        for (int index = 0; index < dbb.Count()-1; index++)
        {          


            BarData b = dbb.Bars[index];
            series.Points.AddXY(
               b.time,                // X value is a date
         b.TwoDigits (b.High),    // High Y value - is originally a float, here i mult by 100, cast to int then double then divide by 100
                                    //and gets the exact same result..... i realize this is unneeded but i cant solve it
               b.TwoDigits(b.Low),    // Low Y value
          b.TwoDigits(b.Open),    // Open Y value
         b.TwoDigits(b.Close));    // Close Y value


            if (b.Low < miny) miny = b.Low;
            if (b.High > maxy) maxy = b.High;



            // u can use this code instead, however those values are ints and not floats which is half of the problem
            // with this values i get less problems
            //series.Points.AddXY(
            //    date,                // X value is a date
            //    rnd.Next(40, 50),    // High Y value
            //    rnd.Next(10, 20),    // Low Y value
            //    rnd.Next(20, 40),    // Open Y value
            //    rnd.Next(20, 40));    // Close Y value
            //date = date.AddMinutes(1);


            series.Points[index]["PriceUpColor"] = "Green"; // this code have unclear effects as it always red
            series.Points[index]["PriceDownColor"] = "Red";
            series.Points[index].Color = Color.Black;
            series.Points[index].BorderColor = Color.Black;

        }

        var chartArea = chart1.ChartAreas[series.ChartArea];        
        chartArea.AxisX.LabelStyle.Format = "hh:mm";
        chartArea.AxisX.Interval = 5;
        chartArea.AxisX.IntervalType = DateTimeIntervalType.Minutes;
        chartArea.AxisX.ScaleView.Zoom(startdateDouble, viewdistanceDouble); //starting scale , rarly works    
        chartArea.AxisX.ScaleView.SmallScrollSize = viewSize;
        chartArea.AxisX.ScrollBar.IsPositionedInside = true;
        chartArea.AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;
        chartArea.AxisY.Maximum = maxy ; //by the values found on the loop, not good i want it to be automated when u scroll
        chartArea.AxisY.Minimum = miny;


    }

1 Ответ

3 голосов
/ 06 августа 2011
  1. Это известно, но я не знаю, можно ли это исправить тоже.
  2. Может быть, вы должны дать более подробную информацию?
  3. Может быть, вы должны показать, где вы объявляете PriceUpColorи PriceDown.
  4. "series.Points.AddXY (b.time" - это просто DateTime? Вы пытались использовать вместо него .ToOADate ()?.
  5. Я бы сказал, что это правильно.
  6. Возможно, это проблема прецизионности из-за приведения, поскольку MS Chart контролирует работу с двойными числами.

РЕДАКТИРОВАТЬ: Для 1 вы можете попробовать

chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollMinSizeType = DataVisualization.Charting.DateTimeIntervalType.Milliseconds;

Или какой-то другой тип.

...