股票K线图-JfreeChart版
股票的K线图是所有Chart图中最复杂的一种,把一个K线图拆分开来我们可以发现,K线图的上半截实际上是由阴阳线(阴阳线可以表示开盘价,收盘价,最高价,最低价)、和若干条随时间变化的若干条均线组成;下半截则由与阴阳线对应的成交量柱形图和若干条随时间变化的成交量均线组成。如下图:
了解这一点之后,对照JFreeChart我们发现所有的单个Chart它都已经提供了,我们所需要做的就是把这些Chart进行组合,进而形成一张K线图。
股票中的阴阳线,我们可以用OHLCDataset(蜡烛图)来实现,均线可以用IntervalXYDataset来实现,对于与阴阳线对应的成交量的值我们同样可以用OHLCDataset来实现,只是在编程的时候注意些技艺就可以实现了。
表示阴阳线的(蜡烛图)OHLCDataset如下图:
表示均线的IntervalXYDataset图如下:
对于K线图的上半部分我们可以用JFreeChart中的蜡烛图与时间线图的叠加来完成,下半部分我们同样可以用JFreeChart中的蜡烛图与时间线图的叠加来完成。完成之后我们只需要将上下两部分Chart用CombinedDomainXYPlot进行组合,得到的结果就是我们想要的K线图。知道中明确了这些信息之后我们就可以动手来做JFreeChart版的K线图啦。
这里我们采用JFreeChart的最新版jfreechart- 1.0.6 来实现。为了方便我们把做好的K线图放到网页当中我们采用Applet来作为载体。同时为了不让Applet直接去访问数据库我们利用Bstek公司的J2EE前端展现产品Dorado5来在客户端为K线图的Applet传递数据,接下来我们就来一步一步实现我们的K线图JFreeChart版。
1) 构造一个为K线图提供数据的表,表结构如下 :
create table k_line_data( stock_name varchar(100),--股票名称 issue_date date,//日期 open_value double,//开盘价 high_value double,//最高价 low_value double,//最低价 close_value double,//收盘价 volume_value double,//成交量 avg5 double,//5日均价 avg10 double,//10日均价 avg20 double,20日均价 avg60 double,//60日均价 vol_avg5 double,//5日成交量均价 vol_avg10 double//10日成交量均价 ) |
接下来我们需要虚拟一些数据出来提供给K线图使用,我们用Dorado5展现的效果如下:
我们要实现的效果是在客户端通过Dorado5中的Dataset通过JS来调用Applet里的方法,为Applet里的K线图提供数据,这样做就避免了我们在Applet里直接去访问服务器端的数据库里的数据。
2) Applet代码如下:
package test.applet;
import java.awt.Color; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;
import javax.swing.JApplet; import javax.swing.JPanel;
import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.DateTickUnit; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.block.BlockBorder; import org.jfree.chart.block.BlockContainer; import org.jfree.chart.block.BorderArrangement; import org.jfree.chart.labels.StandardXYToolTipGenerator; import org.jfree.chart.plot.CombinedDomainXYPlot; import org.jfree.chart.plot.Plot; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.CandlestickRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.title.LegendTitle; import org.jfree.data.general.Dataset; import org.jfree.data.time.Day; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.DefaultHighLowDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.OHLCDataset; import org.jfree.ui.HorizontalAlignment; import org.jfree.ui.RectangleEdge;
public class TestApplet extends JApplet { List ls = new ArrayList();//定义一个用来保存数据的集合类List
Map map = null;//用来表示一条记录
|