您的位置:首页 > 其它

利用JFreeChart绘制股票K线图

2017-04-28 23:34 169 查看
因为工作的需要,接触了一些股票图形绘制类的工作,其中最主要的还是股票K线图的绘制了,如果利用编程语言最底层的图形绘制方法去绘制这类图形,如果对编程语言不是特别熟悉的话,一般是有很大的困难的,通过在网上搜索发现,以自己最熟悉的两门语言为例,其中有PHP版的开源JPGraph画图程序和JAVA版的JFreeChart画图工具包,jpgraph用过一段时间,但是发现,其中图形细节方面处理的不够细腻和精致,最后转向使用jfreechart,这是国外一个开源的图形绘制的java包,里面的画图功能也相当的强大,更主要的利用java强大的面向对象的功能,可以进行很多方面的定制和修改。

网上有很多人在询问如何使用jfreechart来绘制股票K线图,通过阅读其中的一些例子来看,大多比较的凌乱,没有给出一个符合中国股票市场的K线图实例,因为中国的股票市场K线图的颜色表示与国外存在一点差异,也有很多人遇到了如何去掉周六,周日这类不存在交易的日期,网上没有一个很满意的答案,通过实践,本人整理出一个完整的实例,给出完整的注释,只要在eclipse中配置好相应的classpath,甚至不要修改就可以运行,得到一个包含日K线和日成交量的组合图,希望给大家提供一点帮助,同时也希望大家能够一起交流,改进和挖掘更多的功能!

在进行源代码讲解之前,有必要将本人所领悟到的一些关于jfreechart的概念讲述下,jfreechart工具基本上把一个图形分成了几个逻辑部分。

1.首先是整个的画布对象(chart),画布就相当与一个大的容器,包含一些图形元素,比如为一张白纸

2.然后是画图区域对象(plot),就是实际图形所占据的区域,比如为白纸上的一个长方形

3.然后是图形所需要两条轴对象(axis),比如为白纸上的两条轴线

4.最后是如何进行图像的绘制对象(render),比如为一只画图的笔

5.除开上面的这些对象,还有一个最主要的就是通过必须的数据集(dataset)来生成图形了

至于一些具体的对象细节,就只好请各位去阅读相关的API文档了,在这里就不详细的说明

package msTest;

import java.awt.Color;//颜色系统

import java.text.SimpleDateFormat;//时间格式

import java.awt.Paint;//画笔系统

import org.jfree.data.time.*;

import org.jfree.data.time.Day;

import org.jfree.data.time.ohlc.OHLCSeries;

import org.jfree.data.time.ohlc.OHLCSeriesCollection;

import org.jfree.chart.renderer.xy.*;

import org.jfree.chart.axis.*;

import org.jfree.chart.plot.*;

import org.jfree.chart.*;

public class KLineCombineChart {

public static void main(String[] args) {

     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式

     double highValue = Double.MIN_VALUE;// 设置K线数据当中的最大值

     double minValue = Double.MAX_VALUE;// 设置K线数据当中的最小值

     double high2Value = Double.MIN_VALUE;// 设置成交量的最大值

     double min2Value = Double.MAX_VALUE;// 设置成交量的最低值

     OHLCSeries series = new OHLCSeries("");// 高开低收数据序列,股票K线图的四个数据,依次是开,高,低,收

     series.add(new Day(28, 9, 2007), 9.2, 9.58, 9.16, 9.34);

     series.add(new Day(27, 9, 2007), 8.9, 9.06, 8.83, 8.96);

     series.add(new Day(26, 9, 2007), 9.0, 9.1, 8.82, 9.04);

     series.add(new Day(25, 9, 2007), 9.25, 9.33, 8.88, 9.00);

     series.add(new Day(24, 9, 2007), 9.05, 9.50, 8.91, 9.25);

     series.add(new Day(21, 9, 2007), 8.68, 9.05, 8.40, 9.00);

     series.add(new Day(20, 9, 2007), 8.68, 8.95, 8.50, 8.69);

     series.add(new Day(19, 9, 2007), 8.80, 8.94, 8.50, 8.66);

     series.add(new Day(18, 9, 2007), 8.88, 9.17, 8.69, 8.80);

     series.add(new Day(17, 9, 2007), 8.26, 8.98, 8.15, 8.89);

     series.add(new Day(14, 9, 2007), 8.44, 8.45, 8.13, 8.33);

     series.add(new Day(13, 9, 2007), 8.13, 8.46, 7.97, 8.42);

     series.add(new Day(12, 9, 2007), 8.2, 8.4, 7.81, 8.13);

     series.add(new Day(11, 9, 2007), 9.0, 9.0, 8.1, 8.24);

     series.add(new Day(10, 9, 2007), 8.6, 9.03, 8.40, 8.95);

     series.add(new Day(7, 9, 2007), 8.89, 9.04, 8.70, 8.73);

     series.add(new Day(6, 9, 2007), 8.4, 9.08, 8.33, 8.88);

     series.add(new Day(5, 9, 2007), 8.2, 8.74, 8.17, 8.36);

     series.add(new Day(4, 9, 2007), 7.7, 8.46, 7.67, 8.27);

     series.add(new Day(3, 9, 2007), 7.5, 7.8, 7.48, 7.69);

     series.add(new Day(31, 8, 2007), 7.4, 7.6, 7.28, 7.43);

     series.add(new Day(30, 8, 2007), 7.42, 7.56, 7.31, 7.40);

     series.add(new Day(29, 8, 2007), 7.42, 7.66, 7.22, 7.33);

     series.add(new Day(28, 8, 2007), 7.31, 7.70, 7.15, 7.56);

     series.add(new Day(27, 8, 2007), 7.05, 7.46, 7.02, 7.41);

     series.add(new Day(24, 8, 2007), 7.05, 7.09, 6.90, 6.99);

     series.add(new Day(23, 8, 2007), 7.12, 7.16, 7.00, 7.03);

     series.add(new Day(22, 8, 2007), 6.96, 7.15, 6.93, 7.11);

     series.add(new Day(21, 8, 2007), 7.10, 7.15, 7.02, 7.07);

     series.add(new Day(20, 8, 2007), 7.02, 7.19, 6.94, 7.14);

     final OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection();// 保留K线数据的数据集,必须申明为final,后面要在匿名内部类里面用到

     seriesCollection.addSeries(series);

     TimeSeries series2=new TimeSeries("");// 对应时间成交量数据

     series2.add(new Day(28, 9, 2007), 260659400/100);

     series2.add(new Day(27, 9, 2007), 119701900/100);

     series2.add(new Day(26, 9, 2007), 109719000/100);

     series2.add(new Day(25, 9, 2007), 178492400/100);

     series2.add(new Day(24, 9, 2007), 269978500/100);

     series2.add(new Day(21, 9, 2007), 361042300/100);

     series2.add(new Day(20, 9, 2007), 173912600/100);

     series2.add(new Day(19, 9, 2007), 154622600/100);

     series2.add(new Day(18, 9, 2007), 200661600/100);

     series2.add(new Day(17, 9, 2007), 312799600/100);

     series2.add(new Day(14, 9, 2007), 141652900/100);

     series2.add(new Day(13, 9, 2007), 221260400/100);

     series2.add(new Day(12, 9, 2007), 274795400/100);

     series2.add(new Day(11, 9, 2007), 289287300/100);

     series2.add(new Day(10, 9, 2007), 289063600/100);

     series2.add(new Day(7, 9, 2007), 351575300/100);

     series2.add(new Day(6, 9, 2007), 451357300/100);

     series2.add(new Day(5, 9, 2007), 442421200/100);

     series2.add(new Day(4, 9, 2007), 671942600/100);

     series2.add(new Day(3, 9, 2007), 349647800/100);

     series2.add(new Day(31, 8, 2007), 225339300/100);

     series2.add(new Day(30, 8, 2007), 160048200/100);

     series2.add(new Day(29, 8, 2007), 247341700/100);

     series2.add(new Day(28, 8, 2007), 394975400/100);

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: