`
friping
  • 浏览: 130686 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

k线图解决方案

阅读更多

在进行源代码讲解之前,有必要将本人所领悟到的一些关于jfreechart的概念讲述下,jfreechart工具基本上把一个图形分成了几个逻辑部分。 1.首先是整个的画布对象(chart),画布就相当与一个大的容器,包含一些图形元素,比如为一张白纸
2.然后是画图区域对象(plot),就是实际图形所占据的区域,比如为白纸上的一个长方形
3.然后是图形所需要两条轴对象(axis),比如为白纸上的两条轴线
4.最后是如何进行图像的绘制对象(render),比如为一只画图的笔
5.除开上面的这些对象,还有一个最主要的就是通过必须的数据集(dataset)来生成图形了
至于一些具体的对象细节,就只好请各位去阅读相关的API文档了,在这里就不详细的说明

package chart;
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);
     series2.add(new Day(27, 8, 2007), 475797500/100);
     series2.add(new Day(24, 8, 2007), 297679500/100);
     series2.add(new Day(23, 8, 2007), 191760600/100);
     series2.add(new Day(22, 8, 2007), 232570200/100);
     series2.add(new Day(21, 8, 2007), 215693200/100);
     series2.add(new Day(20, 8, 2007), 200287500/100);
     TimeSeriesCollection timeSeriesCollection=new TimeSeriesCollection();//保留成交量数据的集合
     timeSeriesCollection.addSeries(series2);
  
     //获取K线数据的最高值和最低值
     int seriesCount = seriesCollection.getSeriesCount();//一共有多少个序列,目前为一个
     for (int i = 0; i < seriesCount; i++) {
      int itemCount = seriesCollection.getItemCount(i);//每一个序列有多少个数据项
      for (int j = 0; j < itemCount; j++) {
       if (highValue < seriesCollection.getHighValue(i, j)) {//取第i个序列中的第j个数据项的最大值
        highValue = seriesCollection.getHighValue(i, j);
       }
       if (minValue > seriesCollection.getLowValue(i, j)) {//取第i个序列中的第j个数据项的最小值
        minValue = seriesCollection.getLowValue(i, j);
       }
      }
     }
     //获取最高值和最低值
     int seriesCount2 = timeSeriesCollection.getSeriesCount();//一共有多少个序列,目前为一个
     for (int i = 0; i < seriesCount2; i++) {
      int itemCount = timeSeriesCollection.getItemCount(i);//每一个序列有多少个数据项
      for (int j = 0; j < itemCount; j++) {
       if (high2Value < timeSeriesCollection.getYValue(i,j)) {//取第i个序列中的第j个数据项的值
        high2Value = timeSeriesCollection.getYValue(i,j);
       }
       if (min2Value > timeSeriesCollection.getYValue(i, j)) {//取第i个序列中的第j个数据项的值
        min2Value = timeSeriesCollection.getYValue(i, j);
       }
      }
     }
     final CandlestickRenderer candlestickRender=new CandlestickRenderer();//设置K线图的画图器,必须申明为final,后面要在匿名内部类里面用到
     candlestickRender.setUseOutlinePaint(true); //设置是否使用自定义的边框线,程序自带的边框线的颜色不符合中国股票市场的习惯
     candlestickRender.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_AVERAGE);//设置如何对K线图的宽度进行设定
     candlestickRender.setAutoWidthGap(0.001);//设置各个K线图之间的间隔
     candlestickRender.setUpPaint(Color.RED);//设置股票上涨的K线图颜色
     candlestickRender.setDownPaint(Color.GREEN);//设置股票下跌的K线图颜色
     DateAxis x1Axis=new DateAxis();//设置x轴,也就是时间轴
     x1Axis.setAutoRange(false);//设置不采用自动设置时间范围
     try{
      x1Axis.setRange(dateFormat.parse("2007-08-20"),dateFormat.parse("2007-09-29"));//设置时间范围,注意时间的最大值要比已有的时间最大值要多一天
     }catch(Exception e){
      e.printStackTrace();
     }
     x1Axis.setTimeline(SegmentedTimeline.newMondayThroughFridayTimeline());//设置时间线显示的规则,用这个方法就摒除掉了周六和周日这些没有交易的日期(很多人都不知道有此方法),使图形看上去连续
     x1Axis.setAutoTickUnitSelection(false);//设置不采用自动选择刻度值
     x1Axis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);//设置标记的位置
     x1Axis.setStandardTickUnits(DateAxis.createStandardDateTickUnits());//设置标准的时间刻度单位
     x1Axis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,7));//设置时间刻度的间隔,一般以周为单位
     x1Axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));//设置显示时间的格式
     NumberAxis y1Axis=new NumberAxis();//设定y轴,就是数字轴
     y1Axis.setAutoRange(false);//不不使用自动设定范围
     y1Axis.setRange(minValue*0.9, highValue*1.1);//设定y轴值的范围,比最低值要低一些,比最大值要大一些,这样图形看起来会美观些
     y1Axis.setTickUnit(new NumberTickUnit((highValue*1.1-minValue*0.9)/10));//设置刻度显示的密度
     XYPlot plot1=new XYPlot(seriesCollection,x1Axis,y1Axis,candlestickRender);//设置画图区域对象
  
     XYBarRenderer xyBarRender=new XYBarRenderer(){
     private static final long serialVersionUID = 1L;//为了避免出现警告消息,特设定此值
     public Paint getItemPaint(int i, int j){//匿名内部类用来处理当日的成交量柱形图的颜色与K线图的颜色保持一致
       if(seriesCollection.getCloseValue(i,j)>seriesCollection.getOpenValue(i,j)){//收盘价高于开盘价,股票上涨,选用股票上涨的颜色
        return candlestickRender.getUpPaint();
       }else{
        return candlestickRender.getDownPaint();
       }
     }};
     xyBarRender.setMargin(0.1);//设置柱形图之间的间隔
     NumberAxis y2Axis=new NumberAxis();//设置Y轴,为数值,后面的设置,参考上面的y轴设置
     y2Axis.setAutoRange(false);
     y2Axis.setRange(min2Value*0.9, high2Value*1.1);
     y2Axis.setTickUnit(new NumberTickUnit((high2Value*1.1-min2Value*0.9)/4));
     XYPlot plot2=new XYPlot(timeSeriesCollection,null,y2Axis,xyBarRender);//建立第二个画图区域对象,主要此时的x轴设为了null值,因为要与第一个画图区域对象共享x轴
     CombinedDomainXYPlot combineddomainxyplot = new CombinedDomainXYPlot(x1Axis);//建立一个恰当的联合图形区域对象,以x轴为共享轴
     combineddomainxyplot.add(plot1, 2);//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域2/3
        combineddomainxyplot.add(plot2, 1);//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域1/3
        combineddomainxyplot.setGap(10);//设置两个图形区域对象之间的间隔空间
        JFreeChart chart = new JFreeChart("中国联通", JFreeChart.DEFAULT_TITLE_FONT, combineddomainxyplot, false);
        ChartFrame frame = new ChartFrame("中国联通股票", chart);
     frame.pack();
     frame.setVisible(true);
}
}

为了能够保证K线图的上影线和下影线能够和K线图本身的颜色保持一致,找了很多的方法设置都不成功,可以说目前暂不提供单独绘制K线边框颜色的方法,所以,经过本人的实验,对其中的源代码进行了下修改,具体修改的地方是在下载回来的文件目中source\org\jfree\chart\renderer\xy\CandlestickRenderer.java文件,将
Paint p = getItemPaint(series, item);
Paint outlinePaint = null;
outlinePaint = getItemOutlinePaint(series, item);
}
修改为如下的代码,这样就会保证K线图的上影线和下影线能够和K线图本身的颜色保持一致,符合中国股票市场K线图形颜色的习惯:
Paint p = getItemPaint(series, item);
Paint outlinePaint = null;
if (this.useOutlinePaint) {
if(yClose>yOpen){
if (this.upPaint != null) {
outlinePaint=this.upPaint;
}
else {
outlinePaint=p;
}
}else{
if (this.downPaint != null) {
outlinePaint=this.downPaint;
}
else {
outlinePaint=p;
}
}
}
然后使用ant集成编译工具,编译重新生成最新的开发包就可以了,如果各位在使用过程中遇到什么问题,欢迎留言探讨,也希望这个实例对大家有所帮助,等有时间了再给大家介绍下jpgraph的K线图的绘制,敬请期待,呵呵!
最终的效果图如下:

分享到:
评论

相关推荐

    基于JFreeChart的股票交易K线图停牌日期缺口优化完整解决方案

    针对股票交易K线图停牌日期缺口的优化,使得K线图连续不间断显示数据波动变化,一眼就可以看出股票行情,具有统计分析的意义。

    分时叠K线自移分时主图源码T短利器通达信指标公式源码.doc

    分时叠K线自移分时主图源码T短利器通达信指标公式源码是基于通达信指标公式的设计理念和实现方法,旨在解决分时叠K线的问题,并提供了一种实用的解决方案。 在使用分时叠K线自移分时主图源码时,读者需要具备一定的...

    高频大数据解决方案.pptx

    这个表也表明VoltDB线性扩展具备K-Safety 高频大数据解决方案全文共28页,当前为第8页。 关键特性: 内置异常恢复/HA功能 9 分区就是复制的单位 事务复制操作(不是更改记录)使用Active/Active 同步复制方式 应用...

    智能门锁管理系统解决方案.pptx

    智能门锁管理系统解决方案 智能门锁管理系统解决方案全文共15页,当前为第1页。 刷脸 改变着"身份证" 苹果 改变了"手机" 物联锁 将改变"钥匙" 微信 改变了"钱包" 出门四大件: 身 、手 、 钥 、钱 物联网+锁建设背景 ...

    股票77种K线形态_图例举(实战版学习资料)

    股票77种K线形态(实战版学习资料)+图解: 1、十字线可能构成重要的警告信号。原趋势停顿或反转。 2、只有在一个市场不经常出现十字线的条件下,十字线才具有重 要意义。 3、如果具有很长的上影线,或者具有很长的...

    赢顺云指标公式源码文华财经指标 买卖多空变色K线.doc

    赢顺云指标公式源码是基于文华财经指标的实现,旨在提供一个灵活、可靠的技术指标解决方案。 指标公式解读 从提供的部分内容中,我们可以看到该指标的公式实现了四个变量:AA、BB、CC、DD。这些变量的计算公式如下...

    海康威视DS-K2210梯控接线指南.docx

    海康威视拥有视音频编解码、视频图像处理、视音频数据存储等核心技术,并在公共安全、交通、司法、文教卫、金融、能源和智能楼宇等行业提供专业的细分产品、IVM智能可视化管理解决方案和大数据服务。 海康威视在...

    提供更友好的数据可视化解决方案。.zip

    3. **丰富图表类型**:包括但不限于折线图、柱状图、散点图、饼图、K线图、盒形图、地图、热力图、线图、关系图、treemap、旭日图、平行坐标、漏斗图、仪表盘等,以及三维可视化组件(通过 ECharts GL 扩展)。...

    《Python 数据分析:基于 Plotly 的动态可视化绘图》源代码

     第5章是金融绘图部分,主要为金融领域的特殊图形尤其是K线图的绘制提供解决方案。  第6章是Matplotlib部分,主要介绍了如何把Matplotlib绘图迁移到Plotly中。  第7章是网页开发部分,主要介绍了Plotly在Python...

    无线网络监控方案-无线组网方案.docx

    Lynx 系列数字微波传输设备提供了范围广泛的点对点固定无线连接解决方案,可为电信交换连接应用提供租用线路以外的成熟且低成本的替代解决方案。Lynx 系列数字微波设备可提供从 T1/E1 到 OC-3 容量的不通无线连接...

    Lucent homestar智能住宅(小区)布线系统

    2.4.1. 结构化网联解决方案在中国的地位及遵循的标准 2?12 2.4.2. 朗讯科技端对端PowerSum系统的功能与特点 2?15 2.4.3. 朗讯科技端对端GigaSPEEDTM系统特点与功能 2?16 2.4.4. 朗讯科技Fiber-Optic光纤系统的...

    海康威视DS-K2600接入平台操作手册.docx

    * 海康威视产品和解决方案应用在 150 多个国家和地区,在 G20 杭州峰会、北京奥运会、上海世博会、APEC会议、德国纽伦堡高铁站、韩国首尔平安城市等重大项目中发挥了极其重要的作用。 本操作手册详细介绍了海康威视...

    数据中心(Data Center)供电解决方案分享-电路方案

    Vicor公司设计、制造和销售模块化功率元件,这些电源转换解决方案产品广泛应用于航空航天、高性能计算机、工业设备和自动化、电信、网络基础设施,以及车辆和运输领域。近年来云计算、大数据、社交、移动等热点不断...

    优质资源包 量化投资-以MATLAB为工具 源码&数据&文档.rar

    05高级篇-K线图以及常用技术指标的MATLAB实现-L 06高级篇-基于MATLAB的行情软件-L 07高级篇-基于MATLAB的随机模拟-Z 08高级篇-基于MATLAB的风险管理-Z 09高级篇-期权定价模型的MATLAB实现-L 10高级篇-基于MATLAB的...

    C#二维三维图形绘制工程实例宝典

    6.4.4 K线图(阴阳烛图) 6.5 面积图 6.6 综合图 第三部分 三维图形的相关知识及三维图形的实现第7章 三维矩阵和变换 7.1 三维数学概念 7.1.1 操作三维对象 7.1.2 数学结构 7.2 三维中的基本矩阵和变换 7.2.1 C#中...

    海康威视DS-K2600系列接485读卡器操作手册.docx

    海康威视是以视频为核心的物联网解决方案提供商,面向全球提供综合安防、智慧业务与大数据服务。海康威视全球员工超26000人(截止2017年底),其中研发人员和技术服务人员超13000人,研发投入占企业销售额的7-8%,...

    QCustomPlot鼠标跟随显示坐标值

    这里解决一个使用图表的都会碰到的问题–跟随鼠标显示值,在QCustomPlot里非常简单,它早就给出了解决方案-QCPItemTracer

    图像模糊matlab代码-CFKM:ConvexFuzzyk-Medoids问题的代码和实现

    解决方案的成本和梯度; :Fuzzy k-Medoids 问题的启发式; : 具有多中心点问题的模糊聚类的启发式; : 计​​算给定代表性的最佳分配; : 计​​算给定分配的最佳代表性; 图形功能 : 显示一个方阵,索引按给定顺序...

    C#二维三维图形绘制工程实例宝典 随书光盘

    6.4.4 k 线图(阴阳烛图) 380 6.5 面积图 389 6.6 综合图 390 第三部分 三维图形的相关知识及三维图形的实现 第7章 三维矩阵和变换 396 7.1 三维数学概念 396 7.1.1 操作三维对象 396 7.1.2 数学结构 397 ...

    图像与图形数字水印技术研究

    不同的解决方案及水印算法。本文从数字水印的实际应用出发,围绕着数字水印 技术在多媒体认证、数字地图和三维模型版权保护三个方面实际应用中需要解决 的问题,并对以上三个方面研究现状进行系统分析与论述的基础上...

Global site tag (gtag.js) - Google Analytics