以下是关于在ASP.NET中绘制K线图的详细内容:
一、使用开源绘图控件ZedGraph绘制K线图
1、初始化图表面板:创建一个GraphPane
对象,并设置标题、X轴和Y轴的标题及字体颜色等属性。
GraphPane myPane = new GraphPane();
myPane.Title.Text = "K线图";
myPane.XAxis.Title.Text = "日期";
myPane.XAxis.Title.FontSpec.FontColor = Color.Black;
myPane.YAxis.Title.Text = "价格";
myPane.YAxis.Title.FontSpec.FontColor = Color.Black;
2、获取数据:定义一个StockPointList
来存储股票数据点,通过随机数生成模拟数据,包括开盘价、收盘价、最高价、最低价等信息。
StockPointList spl = new StockPointList();
Random rand = new Random();
XDate xDate = new XDate(2006, 1, 1);
循环生成数据并添加到spl
中。
3、添加K线曲线:使用AddJapaneseCandleStick
方法将数据添加到图表面板中,并设置曲线的相关属性,如下跌填充色、上涨填充色、边框颜色等。
JapaneseCandleStickItem myCurve = myPane.AddJapaneseCandleStick("", spl);
myCurve.Stick.FallingFill = new Fill(Color.Green);
myCurve.Stick.RisingFill = new Fill(Color.Red);
myCurve.Stick.FallingBorder = new Border(Color.Green, 1);
myCurve.Stick.RisingBorder = new Border(Color.Red, 1);
4、设置坐标轴格式:根据需要设置X轴和Y轴的类型、刻度格式、字体颜色等。
myPane.XAxis.Type = AxisType.Date;
myPane.XAxis.Scale.Format = "MM-dd";
myPane.XAxis.Scale.FontSpec.Angle = 45;
myPane.YAxis.Scale.MajorStep = 0.01;
myPane.XAxis.Scale.FontSpec.FontColor = Color.Black;
myPane.YAxis.Scale.FontSpec.FontColor = Color.Black;
5、刷新图表:调用zgc.Refresh()
方法显示K线图像。
二、使用Futu API获取实时K线数据并绘制
1、订阅K线数据:在使用Futu API获取实时K线数据之前,需要先订阅相应的股票代码和K线类型。
ret, data = quote_ctx.get_cur_kline('HK.00700', 2, KLType.K_DAY, AuType.QFQ)
如果订阅成功,会持续收到服务器推送的K线数据。
2、处理接收到的数据:当接收到K线数据后,可以根据需要进行数据处理和分析,然后使用绘图函数将数据显示在图表上,可以提取换手率等数据进行展示或分析。
1、DRAWKLINE函数:该函数只能通过高开低收四个参数画K线,功能相对单一,但可以实现一些简单的比较功能,如比较个股和大盘的相对强度等。
DRAWKLINE(HIGH, OPEN, LOW, CLOSE);
DRAWKLINE(INDEXH, INDEXO, INDEXL, INDEXT);
2、STICKLINE函数:STICKLINE函数可以画柱线,通过参数的设定可以实现完全重画K线,包括调整宽度、线型、颜色等,真正做到自定义。
STICKLINE(COND, PRICE1, PRICE2, WIDTH, EMPTY);
当满足条件时,在指定位置之间画柱线,可设置柱线的宽度、实心或空心等属性。
可以利用STICKLINE函数画出不同条件下的K线,如根据成交量正负画出不同颜色的成交量柱等。
1、减少绘图指令:观察图形结构,尽量减少不必要的画布状态改变和绘图指令,将绘制K线的三段直线合并为两段,或者将图形数据分组后一次性绘制相同属性的图形。
2、合理使用缓存:将绘制过的图像缓存下来,在需要重绘时直接调用drawImage
绘制图像,避免重复执行绘图指令,提高渲染性能,利用缓存还可以实现图形的拖拽加载、缩放等功能。
以下是一个简单的C# + WPF程序示例,用于创建包含K线数据模型的类,并在界面上显示K线图的基本框架:
using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace KLineChartExample { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void DrawKLineChart() { // 创建图表容器 Canvas canvas = new Canvas(); canvas.Width = 800; canvas.Height = 600; this.Content = canvas; // 创建K线数据列表 List<KLineData> kLineDataList = new List<KLineData>() { new KLineData(DateTime.Now.AddDays(-1), 100, 110, 95, 105, 10000), new KLineData(DateTime.Now.AddDays(-2), 105, 120, 100, 110, 15000), // 添加更多数据... }; // 遍历数据列表并绘制K线 foreach (var data in kLineDataList) { DrawKLine(canvas, data); } } private void DrawKLine(Canvas canvas, KLineData data) { // 根据数据计算K线的位置和尺寸 double x = 50; // 示例X坐标 double yOpen = canvas.Height (data.Open 90) 10; // 计算开盘价对应的Y坐标 double yClose = canvas.Height (data.Close 90) 10; // 计算收盘价对应的Y坐标 double yHigh = canvas.Height (data.High 90) 10; // 计算最高价对应的Y坐标 double yLow = canvas.Height (data.Low 90) 10; // 计算最低价对应的Y坐标 // 绘制K线实体 Rectangle rect = new Rectangle(); rect.Width = 30; rect.Height = Math.Abs(yClose yOpen); rect.Fill = data.Close >= data.Open ? Brushes.Red : Brushes.Green; Canvas.SetLeft(rect, x); Canvas.SetTop(rect, Math.Min(yOpen, yClose)); canvas.Children.Add(rect); // 绘制上影线和下影线 Line upperShadow = new Line(); upperShadow.X1 = x + 15; upperShadow.Y1 = yHigh; upperShadow.X2 = x + 15; upperShadow.Y2 = Math.Min(yOpen, yClose); upperShadow.Stroke = Brushes.Black; canvas.Children.Add(upperShadow); Line lowerShadow = new Line(); lowerShadow.X1 = x + 15; lowerShadow.Y1 = yLow; lowerShadow.X2 = x + 15; lowerShadow.Y2 = Math.Max(yOpen, yClose); lowerShadow.Stroke = Brushes.Black; canvas.Children.Add(lowerShadow); } } }
在上述代码中,首先创建了一个MainWindow
类,其中包含一个DrawKLineChart
方法用于绘制K线图,在该方法中,创建了一个Canvas
作为图表容器,并创建了一个包含K线数据的列表,然后遍历数据列表,调用DrawKLine
方法根据每个数据点绘制K线,在DrawKLine
方法中,根据数据计算K线的位置和尺寸,并绘制K线实体、上影线和下影线,最后将绘制好的K线添加到Canvas
中并显示在窗口上,这只是一个简单的示例,实际应用中可能需要根据具体需求进行更多的定制和优化。