1. 程式人生 > >利用JFreeChart繪製股票K線圖

利用JFreeChart繪製股票K線圖

因為工作的需要,接觸了一些股票圖形繪製類的工作,其中最主要的還是股票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);