微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 MS 图表 X 轴更改为日期时间

如何解决如何将 MS 图表 X 轴更改为日期时间

我有一个图表显示最新的 1000 根蜡烛图(Binance API 限制)。我使用以下方法获取图表数据:

BinanceClient client = new BinanceClient();
        var candles = client.Spot.Market.GetKlines(symbol: "BTCUSDT",interval: (Binance.Net.Enums.KlineInterval)inter,startTime: start,endTime: end,limit: 1000).Data.ToList();

这是数据源。

然后我使用以下方法构建图表:

for (int i = 0; i < candles.Count; i++)
        {
            // adding date and high
            chart1.Series["Price15"].Points.AddXY(candles[i].OpenTime,candles[i].High);
            // adding low
            chart1.Series["Price15"].Points[i].YValues[1] = (double)candles[i].Low;
            //adding open
            chart1.Series["Price15"].Points[i].YValues[2] = (double)candles[i].Open;
            // adding close
            chart1.Series["Price15"].Points[i].YValues[3] = (double)candles[i].Close;
            
        }

这一切都有效,但我创建了 2 个我认为具有相同问题来源的函数

一个功能是允许放大图表区域,但这不能正常工作(?) 因为 X 轴不能正确显示日期,所以它只是从左到右真正缩放(即如果光标位于图表中间则不会缩放。这样做是这样的:

private void chart1_MouseWheel(object sender,MouseEventArgs e)
    {
        try
        {
            Axis xAxis = chart1.ChartAreas[0].AxisX;
            double xMin = xAxis.ScaleView.ViewMinimum;
            double xMax = xAxis.ScaleView.ViewMaximum;
            double xPixelPos = xAxis.PixelPositionTovalue(e.Location.X);

            if (e.Delta < 0)
            {
              
                var posXStart = xAxis.PixelPositionTovalue(e.Location.X) - (xMax - xMin) / 0.75;
                var posXFinish = xAxis.PixelPositionTovalue(e.Location.X) + (xMax - xMin) / 1;
               

                xAxis.ScaleView.Zoom(posXStart,posXFinish);
               
            }
            else if (e.Delta > 0)
            {
                
                var posXStart = xAxis.PixelPositionTovalue(e.Location.X) - (xMax - xMin) * 0.75;
                var posXFinish = xAxis.PixelPositionTovalue(e.Location.X) + (xMax - xMin) * 1;
                xAxis.ScaleView.Zoom(posXStart,posXFinish);
                FZoomLeveL++;
            }
        }
        catch { }
    }

第二个函数是尝试找到我的坐标值的 Hittest。这适用于 Y 轴,但仍然没有 X 轴的值。这是这样做的:

 private void chart1_GetToolTipText(object sender,ToolTipEventArgs e)
    {
        System.Windows.Forms.DataVisualization.Charting.HitTestResult htr = chart1.HitTest(e.X,e.Y);
        if (htr.ChartElementType != ChartElementType.PlottingArea && htr.ChartElementType != ChartElementType.DataPoint && htr.ChartElementType != ChartElementType.Gridlines&& htr.ChartElementType!= ChartElementType.Axis)
            return;

        ChartArea ca = chart1.ChartAreas[0]; 

        double yCoord = ca.AxisY2.PixelPositionTovalue(e.Y);
        string s = e.X.ToString("s");
         double xCord = ca.AxisX.PixelPositionTovalue(e.X);
        
        


        e.Text = "\nY = " + Math.Round(yCoord,2).ToString();
        e.Text = "\nX = " + xCord.ToString();
    }

我的问题是如何像 TradingView 一样格式化我的 X 轴(例如)?现在它可以自动计算日期范围。即如果我想要从这个日期开始的 15 分钟蜡烛数据,它将从 2021-05-18 开始到 2021-05-28,但它不会显示小时和 x 值。

背景:我正在尝试创建一个algoTrading环境

解决方法

chart1.Series[0].XValueType = ChartValueType.DateTime; 
        chart1.ChartAreas[0].AxisX.IntervalType = (DateTimeIntervalType)DateRangeType.DayOfMonth;
       chart1.ChartAreas[0].AxisX.LabelStyle.Format = "mm-hh-dd";

您可以通过首先将 XValueType 设置为 TimeDateTime 来编辑 x 轴的格式

不完美,但放大时可以看到更多细节。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?