定时任务更新股票实时行情例子(Mysql)

  场景说明:小系统保存已完成交易(买入)的股票记录,保存已买入股票的准实时行情信息,并监控保存的交易是否符合预警条件,系统对预警的交易记录作出对应的提醒,这里简要列出股票价格更新的例子。

  这篇文章简要的呈现这个场景中更新股票实时行情数据并入库的过程,将使用到以下资源:
  1.请求接口: http://apistore.baidu.com/apiworks/servicedetail/115.html

http://apistore.baidu.com,提供的服务还是挺全面的,示例代码也相对齐全,可以当做参考。

  2.数据库:mysql
  3.环境: jdk1.6
  4.开发工具:Myeclipse 6.5
  5.json在线校验:http://www.bejson.com/
  6.很实用的工具fastjson :http://git.oschina.net/wenshao/fastjson
  7.工程截图和其他的就不说了……
  先看下示例的结果,今天已经更新完成了

  上海机场(600009)的三天最新行情价格:

股票行情历史表:

示例涉及的表为3张,分别为股票代码维表,股票实时行情表和股票行情历史表,不确定专业做证券数据的公司是怎么保存,希望有人可以提下看法或者意见,谢谢。
(1)股票代码表:

CREATE TABLE `t_cfg_stock` (
`stock_id` varchar(20) NOT NULL COMMENT '股票编码',
`stock_name` varchar(50) NOT NULL COMMENT '股票名称',
`stock_type` varchar(10) DEFAULT NULL,
PRIMARY KEY (`stock_id`)
)

(2)股票行情单股每天保存一条记录(更新记录会回触发预警的判断):
CREATE TABLE `t_stock_quotes` (
`code` varchar(30) NOT NULL COMMENT '股票编码',
`name` varchar(50) DEFAULT NULL COMMENT '股票名称',
`load_date` date DEFAULT NULL COMMENT '当前显示股票信息的日期',
`now_time` varchar(20) DEFAULT NULL COMMENT '具体时间',
`openningPrice` decimal(15,2) DEFAULT NULL COMMENT '今日开盘价',
`closingPrice` decimal(15,2) DEFAULT NULL COMMENT '昨日收盘价',
`currentPrice` decimal(15,2) DEFAULT NULL COMMENT '当前价格',
`hPrice` decimal(15,2) DEFAULT NULL COMMENT '今日最高价',
`lPrice` decimal(15,2) DEFAULT NULL COMMENT '今日最低价 ',
`competitivePrice` decimal(15,2) DEFAULT NULL COMMENT '买一报价',
`auctionPrice` int(11) DEFAULT NULL COMMENT '成交的股票数',
`totalNumber` int(15) DEFAULT NULL COMMENT '成交的股票数',
`turnover` decimal(15,2) DEFAULT NULL COMMENT '成交额,以元为单位',
`buyOne` int(11) DEFAULT NULL COMMENT '买一',
`buyOnePrice` decimal(15,2) DEFAULT NULL COMMENT '买一价格',
`buyTwo` int(11) DEFAULT NULL COMMENT '买二',
`buyTwoPrice` decimal(15,2) DEFAULT NULL COMMENT '买二价格',
`buyThree` int(11) DEFAULT NULL COMMENT '买三',
`buyThreePrice` decimal(15,2) DEFAULT NULL COMMENT '买三价格',
`buyFour` int(11) DEFAULT NULL COMMENT '买四',
`buyFourPrice` decimal(15,2) DEFAULT NULL COMMENT '买四价格',
`buyFive` int(11) DEFAULT NULL COMMENT '买五',
`buyFivePrice` decimal(15,2) DEFAULT NULL COMMENT '买五价格',
`sellOne` int(11) DEFAULT NULL COMMENT '卖一',
`sellOnePrice` decimal(15,2) DEFAULT NULL COMMENT '卖一价格',
`sellTwo` int(11) DEFAULT NULL COMMENT '卖二',
`sellTwoPrice` decimal(15,2) DEFAULT NULL COMMENT '卖二价格',
`sellThree` int(11) DEFAULT NULL COMMENT '卖三',
`sellThreePrice` decimal(15,2) DEFAULT NULL COMMENT '卖三价格',
`sellFour` int(11) DEFAULT NULL COMMENT '卖四',
`sellFourPrice` decimal(15,2) DEFAULT NULL COMMENT '卖四价格',
`sellFive` int(11) DEFAULT NULL COMMENT '卖五',
`sellFivePrice` decimal(15,2) DEFAULT NULL COMMENT '卖五价格',
`load_time` datetime DEFAULT NULL,
KEY `idx_stock_code` (`code`)
)

(3)股票行情历史表,每次更新新增一条记录
CREATE TABLE `t_stock_quotes_h` (
     ……字段和t_stock_quotes一样
)

定时任务配置文件spring-task.xml
cron表达式:
9:30-10:00 每5秒更新一次
task:scheduled ref="taskDemoServiceImpl" method="test" cron="0/5 30-59 9 ? * 1-5"
批量请求股票实时行情:

股票实时行情bean:
/**
* api返回股票信息
*/
public class StockQuotes {

private static final long serialVersionUID = 1L;
private String code; //股票代码,SZ指在深圳交易的股票
private String name; //股票名称
private Date date; //当前显示股票信息的日期
private String time; //具体时间
private BigDecimal OpenningPrice; //今日开盘价
private BigDecimal closingPrice; //昨日收盘价
private BigDecimal currentPrice; //当前价格
private BigDecimal hPrice; //今日最高价
private BigDecimal lPrice; //今日最低价
private BigDecimal competitivePrice; //买一报价
private BigDecimal auctionPrice; //卖一报价
private Integer totalNumber; //成交的股票数
private BigDecimal turnover; //成交额,以元为单位
private Integer buyOne; //买一
private BigDecimal buyOnePrice; //买一价格
private Integer buyTwo; //买二
private BigDecimal buyTwoPrice; //买二价格
private Integer buyThree; //买三
private BigDecimal buyThreePrice; //买三价格
private Integer buyFour; //买四
private BigDecimal buyFourPrice; //买四价格
private Integer buyFive; //买五
private BigDecimal buyFivePrice; //买五价格
private Integer sellOne; //卖一
private BigDecimal sellOnePrice; //卖一价格
private Integer sellTwo; //卖二
private BigDecimal sellTwoPrice; //卖二价格
private Integer sellThree; //卖三
private BigDecimal sellThreePrice;//卖三价格
private Integer sellFour; //卖四
private BigDecimal sellFourPrice; //卖四价格
private Integer sellFive; //卖五
private BigDecimal sellFivePrice; //卖五价格
private Date loadTime;//数据加载时间
/**
*
*/
public StockQuotes() {
super();
}
……省略getter/setter方法

请求方法:
//apiurl
private static String HTTPURL = "http://apis.baidu.com/apistore/stockservice/stock";
private static String HTTPARG = "stockid=#&list=1";
private static String APIKEY = "apikey";

/**
* @param stockid 股票代码
请将apikey作为参数添加到header中;
当返回{"errNum":300003,"errMsg":"url is not parse"} 时,请校验是否传入apikey;
SZ指在深证交易所上市的股票代码,SH指在上海交易所上市的股票代码;
当list=1,则stockid=股票代码1,股票代码2,股票代码3,...
当list=其它值,则stockid=股票代码1;
* @return
*/
public static String qryStockInfo(String stockid) {
BufferedReader reader = null;
String result = null;
StringBuffer sbf = new StringBuffer();
String httpUrl = "";
httpUrl = HTTPURL + "?" + HTTPARG.replaceFirst("#", stockid);

try {
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
// 填入apikey到HTTP header
connection.setRequestProperty("apikey", APIKEY);
connection.connect();
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
result = sbf.toString();
System.out.println("返回信息===="+result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

  整个更新的过程差不都就这样,但是这个例子中每次更新的时间间隔短,而且股票维表中保存的数据也不多,因此还需要优化,减少批量更新的耗时,因为每次任务调度的间隔只有5秒,避免造成监控得出的数据不不准确。




    分享到:









点赞

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>