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 閱讀(4014) 評論(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 時深切體驗到其局限性, 最后不得不拋棄之.
          想請教一下,你最終是使用什么技術?  回復  更多評論
            

          主站蜘蛛池模板: 八宿县| 鄯善县| 固安县| 三门县| 汉川市| 吉水县| 阿合奇县| 九龙城区| 伊川县| 呼图壁县| 东城区| 德化县| 南充市| 房产| 如皋市| 江陵县| 金塔县| 和田市| 巴里| 阳朔县| 马龙县| 佛冈县| 马山县| 松江区| 津南区| 富宁县| 湘乡市| 东辽县| 乌什县| 绍兴市| 昌都县| 正镶白旗| 鲜城| 清丰县| 曲松县| 巍山| 全南县| 西畴县| 察雅县| 苗栗县| 奈曼旗|