使用WPF中amCharts绘制股票K线图
创始人
2024-07-26 08:01:02
0

本想自己用GDI绘图, 通过数据直接绘制一张蜡柱图, 但觉得这样子的功能比较少, 所以到网上搜索一些能画出K线图的控件. 发现DynamicDataDisplay挺好的, 在它的开发截图里也发现可以绘制蜡柱图, 但文档好像做的不是很好, 不知道怎么用它来画, 在寻找它比较好的例子的时候发现有人推荐用amCharts绘制, 所以便去看了一下, 发现挺好用的, 效果如下:

准备工作

先要去这里下载amCharts Stock Chart for WPF并解压, 新建一个WPF Project, 在Toolbox里右击, 选择Choose Items, 然后点击Browse, 找到解压后的文件夹里有一个AmCharts.Windows.Stock.dll, 单击Okay, 准备工作就做好了.

界面中amCharts控件的配置

用于在窗口中添加这样一个控件, 先看看这个控件是怎么绑定数据的:

  1.    
  2.  
  3.  ItemsSource="{Binding Data}"   
  4.  DateMemberPath="date"   
  5. OpenMemberPath="open" HighMemberPath="high"   
  6. LowMemberPath="low" CloseMemberPath="close"   
  7.  ValueMemberPath="close" VolumeMemberPath="volume"   
  8. />   
  9.    

其中ItemSource中的Data是在程序里产生的, 它是一个StockInfo类的集合. DataMenberPath, HighMenberPath, LowMenberPath, CloseMenberPath, ValueMenberPath, VolumeMenberPath指定的元素都是Data集合中StockInfo的属性. StockInfo类结构如下:

  1. public class StockInfo   
  2.  {   
  3.  public DateTime date { get; set; }   
  4.  public double open { get; set; }   
  5.  public double high { get; set; }   
  6.  public double low { get; set; }   
  7.  public double close { get; set; }   
  8.  public double volume { get; set; }   
  9. }  

标签用于插入表格, 表格中可以插入多个图形, 用标签来创建图形. 比如下面的代码就创建了一个图形:

  1.     
  2.     
  3.     
  4.  
  5.  NegativeBrush="Green" PositiveBrush="Red"   
  6.  LegendItemType="Ohlc" LegendPeriodItemType="Ohlc"   
  7. CursorBrush="Blue" CursorSize="6" />   
  8.     
  9.    
  10.   

注意其中的NegativeBrush和PositiveBrush属性, 如果不指定颜色的话, 就会默认按照美国股市的颜色来显示. 在美国, 股票涨了用绿色表示, 跌了用红色表示, 这与中国是完全相反的, 因此需要指定颜色. LegentItemType和LegendPeriodItemType用于指定鼠标悬停在图形上, 图形上方的信息显示什么内容, 这里我指定的是OHLC, 也就是Open(开盘), High(***价), Low(***价), Close(收盘).

除此之外, 在标签中我们还可以设置其它属性, 比如线条颜色, 标尺颜色, 信息显示颜色, 是否显示日期:

  1.    
  2.     
  3.     
  4.     
  5.  
  6.  StrokeThickness="0" TickLength="0" />   
  7.     
  8.     
  9.  
  10.  PositiveValueForeground="Red" NegativeValueForeground="Green"   
  11.  IsDateVisible="True"/>   
  12.   

上面的代码都是产生的K线图, amCharts控件还可以在K线图下面画一个成交量的柱形图或者折线图.

  1.    
  2. ams:Chart.Graphs>   
  3. LegendItemType="Value" LegendPeriodItemType="Value"   
  4. DataField="Volume" PeriodValue="Sum"   
  5. CursorBrush="Blue" CursorSize="6"   
  6. />   
  7.    
  8.    
  9.    
  10.    
  11.    
  12. StrokeThickness="0" TickLength="0"   
  13. />   
  14.    
  15.    
  16.    
  17.    
  18.    
  19.   

在文章上方截图的右下角有个缩放功能, 这个功能在标签里实现的:

  1.    
  2.  
  3.  Margin="0,5,0,0">   
  4.     
  5.     
  6.    
  7.    
  8.     
  9.     
  10.     
  11.     
  12.    
  13.   

对数据进行分析

至此, 关于控件的界面方面就是这些内容. 上面提到了绑定了程序里的Data, 这个Data是怎么来的呢? 数据是从国信金太阳网上交易专业版里下载的日线数据, 这个数据格式还是比较有规则的, ***行表示股票信息, 第二行表示数据类型, 接下来就是数据了, 每个数据之间用\t制表符分隔开.

先看一下Data的定义:

  1. public List Data { get; set; }  

当选择了一个上图所示的格式的文本文件, 程序会对这个文本文件进行解析, 注意从国信金太阳下载的数据编码用的是ANSI编码. 解析步骤如下:

  1. private List LoadStockInfo(string fileName)   
  2. {   
  3.  using (Stream resourceStream =new FileStream(fileName, FileMode.Open))   
  4. {   
  5. using (StreamReader reader = new StreamReader(resourceStream, Encoding.GetEncoding("GB2312")))   
  6.  {   
  7.  //读文本中的每一行   
  8.  var strings = reader.ReadToEnd().Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);   
  9. //获取股票名称   
  10.  stockName = strings[0].Replace("\r", "");   
  11.  var res = new List(strings.Length - 2);   
  12. //***行是股票名称, 第二行是类型名称, 第3行才是股票数据   
  13.  for (int i = 2; i < strings.Length; i++)   
  14. {   
  15.  string line = strings[i];   
  16.  string[] subLines = line.Split('\t');   
  17.  DateTime date = DateTime.Parse(subLines[0]);   
  18. Double open = Double.Parse(subLines[1]);   
  19.  Double high = Double.Parse(subLines[2]);   
  20. Double low = Double.Parse(subLines[3]);   
  21.  Double close = Double.Parse(subLines[4]);   
  22.  Double volumn = Double.Parse(subLines[5]);   
  23.  res.Add(   
  24.  new StockInfo {   
  25.  date = date,   
  26.  open = open,   
  27.  high = high,   
  28.  low = low,   
  29. close = close,   
  30.  volume = volumn   
  31.  });   
  32.  }   
  33.  return res;   
  34.  }   
  35.  }   
  36.  }  

在程序中有一个按钮用来打开一个"打开文件对话框", 选择了一个文件之后, 调用LoadData方法进行数据的显示:

  1. private void LoadData(string path)   
  2.  {   
  3.  Data = LoadStockInfo(path);   
  4.  stockChart.Charts[0].Graphs[0].Title = stockName;   
  5.  stockChart.Charts[1].Graphs[0].Title = stockName;   
  6.  }  

原文链接:http://www.cnblogs.com/technology/archive/2011/04/19/2020910.html

【编辑推荐】

  1. 深入浅出WPF
  2. 教你制作一个简单的WPF图片浏览器
  3. WPF中两种不同的视频流的使用
  4. 新版本WPF功能 彰显赏心悦目的图形
  5. C++实现WPF动画具体操作方法详解

 

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...