美文网首页
Ruby实现股票实时数据和历史数据同屏

Ruby实现股票实时数据和历史数据同屏

作者: 诗与星空 | 来源:发表于2017-06-15 16:11 被阅读202次

昨天用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表里。

五、缺点:
由于同时调用了腾讯接口和新浪接口,导致每一支股票读取数据时都要卡一下,最多大约两三秒的时间,还好一般情况下股票池不会数量太多,时间还可以忍受。

相关文章

网友评论

      本文标题:Ruby实现股票实时数据和历史数据同屏

      本文链接:https://www.haomeiwen.com/subject/jocuqxtx.html