昨天用VBA实现了实时数据的展示,但是历史数据比较复杂,没能成功。
今天牺牲中午休息的时间,用Ruby实现了实时数据和任意历史数据的获取,能够实现任意时间段的数据对比。
一、使用了两个接口
1、腾讯证券接口
之前一直在用新浪的实时数据接口,后来测试了下腾讯接口,发现对编程人员更加友好,字段截取也很容易并且很合理。于是把以前写的代码转成了腾讯接口。
腾讯接口里几乎有任何炒股软件里内置的所有字段,我用不到那么多,仅以常用的字段为例:
这是腾讯股票实时接口的格式:
2、新浪股票历史数据接口
腾讯的历史数据用了非常诡异的展示方式,我没有很好的截取办法,后来发现新浪的历史数据比较友好,因此历史数据就采用了新浪的接口。我对历史数据要的也不多,只取个指定日期的收盘价格。
这是新浪股票历史数据接口的格式:
二、先做一个股票池。
放了十几个股票代码,由于现在股市出现了代码重复情况,想要剔除重复编码的逻辑非常复杂,我还没有精力做出来。所以暂时在代码之前放上sh、sz表示沪市和深市。
三、放代码
指定的历史日期直接写死到程序里,其实是可以放在某个文件里的----下一步我打算把数据通过excel表读取
# -*- coding: UTF-8 -*-
require 'rubygems'
require 'hpricot'
require 'open-uri'
x = 1
s_date = "20170609"
#获取股票文件stock.txt的总行数
def wc(filename)
$nline = $nword = $nchar = 0 #$符号表示全局变量,普通变量不在def外起作用
File.open(filename) do |io|
io.each_line do |line|
words = line.split(/\s+/).reject{|w| w.empty? }
#本例中使用了split方法分割单词,当行首有空白字符时,split方法的执行结果中会产生空白字符串,因此我们
#会删除该空白字符串。
$nline += 1
$nword += words.length
$nchar += line.length
end
end
#puts "文件的行数为:#{$nline}\n文件的单词数为:#{$nword}\n文件的字符数为:#{$nchar}"
puts "股票池股票数:#{$nword}\n"
end
wc("d:/rb/stock/stock.txt")
#puts $nword
#循环开始
while x <= $nword
#puts "轮询中:"
stock_lines = IO.readlines("d:/rb/stock/stock.txt");
s_code = stock_lines[x]
scode = s_code.chomp # chomp用来删除文本里带过来的换行符
puts "-----------------------"
doc = Hpricot(open('http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=' + "#{scode}" + '&end_date=' + "#{s_date}" + '&begin_date=' + "#{s_date}" )) #调用新浪股票历史数据接口
#puts doc
out_file = open('d:/rb/stock/temp.txt', 'w')
out_file.write(doc)
out_file.close
str = IO.read("d:/rb/stock/temp.txt");
#puts str.length;
#puts str[0,30]
str.split(/"/) #分隔符为双引号
arr = str.split(/"/)
doc1 = Hpricot(open('http://qt.gtimg.cn/q=' + "#{scode}")) #调用腾讯股票实时接口
#puts doc
out_file1 = open('d:/rb/stock/temp1.txt', 'w')
out_file1.write(doc1)
out_file1.close
str1 = IO.read("d:/rb/stock/temp1.txt");
#puts str.length;
#puts str[0,30]
str1.split(/~/)
arr1 = str1.split(/~/)
#定义股票接口对应的字段名
s_name = arr1[1] #股票名
s_number = arr1[2]
s_current_price = arr1[3] #当前价格
s_closing_price = arr1[4] #昨收
s_opening_price = arr1[5] #今开
#定义股票接口对应的字段名
s_last_week_closeprice = arr[7] #经测试,新浪历史数据局的接口,第8个数组是历史数据的收盘价。
#显示查询结果
#puts "股票代码:" + s_code
#puts "股票: " + s_number
puts s_number + s_name
puts s_date + "收盘价:" + s_last_week_closeprice
puts "当前价格:" + s_current_price
puts "昨收: " + s_closing_price
puts "今开: " + s_opening_price
puts s_date + "收盘价:" + s_last_week_closeprice
x = x + 1
end
四、代码执行效果:
暂时通过最简单的方式展示出来,下一个程序会写入到excel表里。
五、缺点:
由于同时调用了腾讯接口和新浪接口,导致每一支股票读取数据时都要卡一下,最多大约两三秒的时间,还好一般情况下股票池不会数量太多,时间还可以忍受。
网友评论