John Jiang

a cup of Java, cheers!
https://github.com/johnshajiang/blog

   :: 首页 ::  :: 联系 :: 聚合  :: 管理 ::
  131 随笔 :: 1 文章 :: 530 评论 :: 0 Trackbacks
JStockChart -- Getting Started(Timeseries)
     本文以一个示例介绍了如何利用JStockChart生成金融时序图。(2009.11.23最后更新)

1. 环境要求
    需要JDK 1.5或更高版本。

2. 下载与安装
    从JStockChart的站点中下载它的最新版本,当前版本是0.4.2。
    解压JStockChart的zip文件(jstockchart-0.4.2.zip)后,将jstockchart目录中的jstockchart-0.4.2.jar和jstockchart/lib目录中的jcommon-1.0.16.jar和jfreechart-1.0.13.jar加到classpath中。

3. 示例
    在JStockChart的发行包中,有一个demo目录。该目录包含了一个简单的例子,展示了如何利用JStockChart去生成时序图。demo目录中有一个Ant脚本build.xml,在该目录下执行命令ant即可运行该示例程序。下面是该示例的关键代码及其说明。
public class TimeseriesChartDemo {

    
public static void main(String[] args) throws IOException {
        
// 

        
// 创建一个包含TimeseriesItem的List实例。
        // 在此处,通过查询db4o的数据库文件,直接获得该List.
        
// 注意:所有的数据,都必须在"同一天"内。
        List data = ;

        
// 创建SegmentedTimeline实例,表示时间区间"00:00-11:30,13:00-24:00"(即24小时中空缺了"11:31-12:59"这段时间)。
        SegmentedTimeline timeline = new SegmentedTimeline(
                SegmentedTimeline.MINUTE_SEGMENT_SIZE, 
135189);
        timeline.setStartTime(SegmentedTimeline.firstMondayAfter1900()
                
+ 780 * SegmentedTimeline.MINUTE_SEGMENT_SIZE);

        
// 创建TimeseriesDataset实例,时间间隔为1分钟。
        TimeseriesDataset dataset = new TimeseriesDataset(Minute.class1, timeline, true);
        
// 向dataset中加入TimeseriesItem的List。
        dataset.addDataItems(data);

        
// 创建逻辑价格坐标轴。指定中间价为21,显示9个坐标值,坐标值的格式为".00"。
        CentralValueAxis fixedPriceAxis = new CentralValueAxis(new Double("21"), new Range(
                dataset.getMinPrice().doubleValue(), dataset.getMaxPrice().doubleValue()),
                
9new DecimalFormat(".00"));
        
// 创建价格区域
        PriceArea priceArea = new PriceArea(fixedPriceAxis);

        
// 创建逻辑量坐标轴。显示5个坐标值,坐标值的格式为"0"。
        FixedNumberAxis fixedVolumeAxis = new FixedNumberAxis(new Range(dataset
                .getMinVolume().doubleValue(), dataset.getMaxVolume()
                .doubleValue()), 
5new DecimalFormat("0"));
        
// 创建量区域
        VolumeArea volumeArea = new VolumeArea(fixedVolumeAxis);

        
// 创建时序图区域
        TimeseriesArea timeseriesArea = new TimeseriesArea(priceArea,
                volumeArea, createFixedDateAxis(DateUtils.createDate(
200811)));

        
// 通过JStockChartFactory的工厂方法生成JFreeChart实例。
        
// 指定了该图的标题为"Timeseries Chart Demo",并且不生成图例(legend)。
        JFreeChart jfreechart = JStockChartFactory.createTimeseriesChart(
                
"Timeseries Chart Demo", dataset, timeline, timeseriesArea, false);

        

        
// 创建图像文件。图像格式为PNG,长为545,宽为300。
        ChartUtilities.saveChartAsPNG(new File(imageFile), jfreechart, 545300);
    }

    
// 指定时期坐标轴中的逻辑坐标。
    private static FixedDateAxis createFixedDateAxis(Date baseDate) {
        FixedDateAxis fixedDateAxis 
= new FixedDateAxis(baseDate,
                
new SimpleDateFormat("HH:mm"));
        fixedDateAxis.addDateTick(
"09:30", TickAlignment.START);
        fixedDateAxis.addDateTick(
"10:00");
        fixedDateAxis.addDateTick(
"10:30");
        fixedDateAxis.addDateTick(
"11:00");
        fixedDateAxis.addDateTick(
"11:30", TickAlignment.END);
        fixedDateAxis.addDateTick(
"13:00", TickAlignment.START);
        fixedDateAxis.addDateTick(
"13:30");
        fixedDateAxis.addDateTick(
"14:00");
        fixedDateAxis.addDateTick(
"14:30");
        fixedDateAxis.addDateTick(
"15:00", TickAlignment.END);
        
return fixedDateAxis;
    }
}
运行该示例程序后,可以生成如下图片:
jstockchart-timeseries

4. 定制图表
    由于JFreeChart具有高度的可定制性,所以当生成了JFreeChart实例后,你可以从中获取图表中的各个元素,如Plot,然后再定制它们的属性。详细信息请参见JFreeChart的站点和论坛。
    另外,在创建JStockChart的XXXArea对象时,也可以直接定制若干属性。如,通过PriceArea类,可以设置价格线的颜色(PriceArea.setPriceColor),均线的颜色(PriceArea.setAverageColor);是否显示均线(PriceArea.setAverageVisible);是否显示涨跌幅(PriceArea.setRateVisible);...。详细信息请参见JStockChart的API文档。

posted on 2008-09-08 16:12 John Jiang 阅读(3854) 评论(15)  编辑  收藏 所属分类: JavaJStockChartJFreeChart原创

评论

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-09-08 22:16 扭曲的铅笔
你好,目前正在利用JFreechart做实时数据监控。苦于没有思路,不知能否告知方法  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-09-09 00:10 4593
// 创建SegmentedTimeline实例,表示时间区间"09:30-11:30,13:00-15:00"。
SegmentedTimeline timeline = new SegmentedTimeline(
SegmentedTimeline.MINUTE_SEGMENT_SIZE, 1351, 89);
timeline.setStartTime(SegmentedTimeline.firstMondayAfter1900()
+ 780 * SegmentedTimeline.MINUTE_SEGMENT_SIZE);

这段代码剥离中间11:30---13:00中午闭市的依据是什么?没看懂1351, 89的由来  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-09-09 14:50 Sha Jiang
> 你好,目前正在利用JFreechart做实时数据监控。
> 苦于没有思路,不知能否告知方法
能否简述一下需求吗?
我猜测是,一个程序不停地(计划任务)获取某种数据,然后根据该数据,动态地显示出图表。
JFreeChart可以显示动态图表。  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-09-09 14:56 Sha Jiang
> 这段代码剥离中间11:30---13:00中午闭市的依据是什么?
> 没看懂1351, 89的由来
一天有89分钟(11:30-13:00)+1351分钟(其它时段)=1440分钟。
建议你看看SegmentedTimeline的API文档。  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-10-18 18:29 maladuola
你好,看你的jstockchart 很不错。
不过K线的图形怎么没有发布啊?  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-10-18 21:37 Sha Jiang
@maladuola
目前只实现了时序线部分,K线部分还没去做。
以后有时间,再慢慢做吧 ^_^  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-12-11 16:52 佐佐木屎壳郎
不错~
关注中~  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-12-30 14:35 figo
你好,请问jstockchart可以将时间轴分为3段显示吗?比如,新浪上面的黄金期货可以从上一日的21:00到今日2:30,9:00到11:30,13:30到15:30,我按你的demo修改了我的程序,但得到一个很奇怪的图形,不能显示0:00之后的图形  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2008-12-30 23:02 Sha Jiang
我想应该是可以的。请尝试嵌套使用SegmentedTimeline。  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2009-01-13 15:53 likuan
楼主能不能稍详细讲解SegmentedTimeline的用法呢。谢谢,比如我要去掉十一期间:2008-09-29至2008-10-5日之间的日期。试着写一个方法来灵活去掉指定日期,比如:
List<Date> segmentTimeList = new ArrayList<Date>();
然后去掉segmentTimeLis集合中的指定日期。试着写了一下,由于对SegmentedTimelin用法不大熟悉,未能成功。楼主能否指点一二,非常感谢。  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2009-11-23 11:05 Sha Jiang
[Announcement]JStockChart 0.4.2已经发布了!
从该版本开始,JStockChart将只支持5.0或更高版本的JDK;且兼容JFreeChart 1.0.13。  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2010-07-16 11:25 burgess yang
FixedDateAxis 这个类我怎么没有找到?  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2010-07-16 19:55 Sha Jiang
FixedDateAxis --> LogicDateAxis  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2010-08-23 20:32 BeanSoft
@Sha Jiang
JFreeChart 在实时绘图上效率极差, 因此作者本人也承认不能用于下列场合:
1. 数据量过大(例如大于1万数据);
2. 刷新频率不能过快(甚至一秒一帧都保证不了, 因为它每次都是重绘整个图);
3. 图多时极易卡死(例如有40个曲线图, 那么基本上就歇菜了).

本人开发WebLogic Monitor 时深切体验到其局限性, 最后不得不抛弃之.  回复  更多评论
  

# re: JStockChart -- Getting Started(Timeseries)(原) 2010-08-24 18:49 Sha Jiang
@BeanSoft
感谢你的回复。

> JFreeChart 在实时绘图上效率极差
对于JFreeChart的性能确实一直没有关注过,因为未用在实时环境中。

> 本人开发WebLogic Monitor 时深切体验到其局限性, 最后不得不抛弃之.
想请教一下,你最终是使用什么技术?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: