【问题标题】:MS chart candlestick How to set tail colorsMS 图表烛台 如何设置尾部颜色
【发布时间】:2017-09-20 08:05:33
【问题描述】:

我目前正在使用 Visual C# 中的 mschart 开发烛台图表。 我现在已经创建了两个图表,并创建了如下图表

问题 1. 查看顶部的烛台图。我想将每个杆的尾部颜色应用为红色或蓝色。

问题 2. 查看底部的条形图。我想将红色或蓝色应用于此图表。我想在烛台图表的顶部应用相同的颜色。我该怎么做?

[来源]

DataTable table_ChartData = new DataTable();
table_ChartData.Columns.Add("Id");
table_ChartData.Columns.Add("Open");
table_ChartData.Columns.Add("Close");
table_ChartData.Columns.Add("High");
table_ChartData.Columns.Add("Low");
table_ChartData.Columns.Add("Day");
dataGridView1.DataSource = table_ChartData;  

chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.LineWidth = 1;
chart1.ChartAreas["ChartArea1"].AxisY.MajorGrid.LineWidth = 1;
chart1.ChartAreas["ChartArea1"].AxisY.Maximum = max;
chart1.ChartAreas["ChartArea1"].AxisY.Minimum = min;

chart1.ChartAreas["ChartArea1"].AxisX.LabelAutoFitStyle = LabelAutoFitStyles.WordWrap;
chart1.ChartAreas["ChartArea1"].AxisX.IsLabelAutoFit = true;
chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled = true;


chart1.Series["Candle"].XValueMember = "Day";            
chart1.Series["Candle"].YValueMembers = "High,Low,Open,Close,Volume";
chart1.Series["Candle"].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Date;
chart1.Series["Candle"].CustomProperties = "PriceDownColor=Blue,PriceUpColor=Red";
chart1.Series["Candle"]["OpenCloseStyle"] = "Triangle";
chart1.Series["Candle"]["ShowOpenClose"] = "Both";
chart1.DataSource = table_ChartData;
chart1.DataBind();

////////////////////////////////////////////////////////////

chart2.ChartAreas["ChartArea1"].AxisX.MajorGrid.LineWidth = 1;
chart2.ChartAreas["ChartArea1"].AxisY.MajorGrid.LineWidth = 1;
chart2.ChartAreas["ChartArea1"].AxisY.Maximum = v_max + (v_max / 10);
chart2.ChartAreas["ChartArea1"].AxisY.Minimum = v_min / 2;

chart2.ChartAreas["ChartArea1"].AxisX.LabelAutoFitStyle = LabelAutoFitStyles.WordWrap;
chart2.ChartAreas["ChartArea1"].AxisX.IsLabelAutoFit = true;
chart2.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled = true;


chart2.Series["Bar"].XValueMember = "Day";
chart2.Series["Bar"].YValueMembers = "Volume";
chart2.Series["Bar"].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Date;
chart2.Series["Bar"].YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
chart2.DataSource = table_ChartData;
chart2.DataBind();

【问题讨论】:

  • Q1:请定义 'tailcolor' 烛台有 hi、lo、open 和 close 值 - Q2 您可以设置每个数据点的颜色。 for 在绑定后循环点。如果两个图表有对应的点,您可以测试顶部值并在底部设置颜色。什么条件?

标签: c# charts bar-chart mschart candlestick-chart


【解决方案1】:

简单的方法:

priceSerie.Points[index].Color = Color.Blue;
// priceSerie.Points[index].BorderColor = Color.Magenta;

【讨论】:

    【解决方案2】:

    Candlestick Chart 中有CustomProperties 可以根据趋势自动设置框的颜色:

    someSeries.SetCustomProperty("PriceUpColor", "Green");   
    someSeries.SetCustomProperty("PriceDownColor", "Red");
    

    很遗憾,无法设置连接高值和低值的线条的颜色。

    但是,除非您弄乱了其他自定义属性并且 x 值有意义,否则您可以轻松绘制这些线,并且通过分别绘制顶部和底部,您还可以使用不同的颜色。

    这是一个例子:

    private void chart6_PostPaint(object sender, ChartPaintEventArgs e)
    {
        ChartArea ca = chart6.ChartAreas[0];
        Series s = chart6.Series[0];
        Pen hiPen = Pens.Green;
        Pen loPen = Pens.Red;
    
        if (e.ChartElement == s)
        foreach (DataPoint dp in s.Points)
        {
            float x       = (float)ca.AxisX.ValueToPixelPosition(dp.XValue);
            float y_hi    = (float)ca.AxisY.ValueToPixelPosition(dp.YValues[0]);
            float y_low   = (float)ca.AxisY.ValueToPixelPosition(dp.YValues[1]);
            float y_open  = (float)ca.AxisY.ValueToPixelPosition(dp.YValues[2]);
            float y_close = (float)ca.AxisY.ValueToPixelPosition(dp.YValues[3]);
    
            e.ChartGraphics.Graphics.DrawLine(hiPen, x, y_low, x, Math.Min(y_close, y_open));
            e.ChartGraphics.Graphics.DrawLine(loPen, x, y_hi,  x, Math.Max(y_close, y_open));
        }
    }
    

    要为第二张图表的点设置颜色,您需要遍历这些点,因为在绑定中设置了颜色 cannot

    代码很简单:

    void SetColors(Series candles, Series columns)
    {
        for (int i = 0; i < candles.Points.Count; i++)
        {
            DataPoint dp = candles.Points[i];
            columns.Points[i].Color =
                dp.YValues[2] > dp.YValues[3] ? Color.Red :  Color.Green;
        }
    }
    

    绑定后调用!

    结果:

    请注意,为了避免看到原始线条透过我们将BorderWidth 设置为 0:

    someSeries.BorderWidth = 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多