美文网首页
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