问题描述
我有一个图表显示最新的 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 值。
解决方法
chart1.Series[0].XValueType = ChartValueType.DateTime;
chart1.ChartAreas[0].AxisX.IntervalType = (DateTimeIntervalType)DateRangeType.DayOfMonth;
chart1.ChartAreas[0].AxisX.LabelStyle.Format = "mm-hh-dd";
您可以通过首先将 XValueType
设置为 Time
或 DateTime
来编辑 x 轴的格式
不完美,但放大时可以看到更多细节。