highstock高级篇之股票分时图

一直在用 highchart 在做图表,最近一段时间突然接到一活,需要用 highstock 帮客户完成一个股票K线图和分时图。虽然用法和 api上与 highchart 没什么区别,但还是研究一番做出了对应的DEMO,于是抽空与大家分享下。

预期想要达成的效果图

highstock 开发股票或者财经的分时图

准备工作

引入 highstock 文件 
这里需要重点注意了,需要引入 highstock 的版本 为 v1.2.5 版本,最新版和老版本有很大的区别,至于为什么随后在代码结束后为大家解释 ! ]

图表的初始化

1. UTC时间的设置和一些公共设置

Highcharts.setOptions({
        global: {
            useUTC: true
        },
        lang : {
            rangeSelectorZoom : ‘‘,
            months : [ ‘一月‘, ‘二月‘, ‘三月‘, ‘四月‘, ‘五月‘, ‘六月‘, ‘七月‘, ‘八月‘, ‘九月‘, ‘十月‘, ‘十一月‘, ‘十二月‘ ],
            shortMonths : [ ‘1月‘, ‘2月‘, ‘3月‘, ‘4月‘, ‘5月‘, ‘6月‘, ‘7月‘, ‘8月‘,
                    ‘9月‘, ‘10月‘, ‘11月‘, ‘12月‘ ],
            weekdays : [ ‘周日‘, ‘周一‘, ‘周二‘, ‘周三‘, ‘周四‘, ‘周五‘, ‘周六‘ ]
        }
    });

2. 渲染图表方法

function initHourChart(){
    var chart=null;
    //需要请求的api action 地址
    var path="/highstock/hour.json";
    $.getJSON(path,function(data) {
        if(data.datas.length==0)
        {
            return;
        }
        var Price = [];
        //获取首个变量的时间,用来计算获取时间的最小值和最大值
        var firstData=data.datas[0].updatetime;
        var minTime=Date.UTC(parseInt(firstData.substring(0,4)), parseInt(firstData.substring(4,6))-1, parseInt(firstData.substring(6,8)), 8);
        var maxTime=Date.UTC(parseInt(firstData.substring(0,4)), parseInt(firstData.substring(4,6))-1, parseInt(firstData.substring(6,8)), 20);
        for (i = 0; i < data.datas.length; i++)
        {
               Price.push([
                   UTC(data.datas[i].updatetime),
                   parseFloat(data.datas[i].open)
               ]);
        }
        Price.sort();
        var option={
            colors:[‘#4d73a8‘],
            chart: {
              renderTo:"container",// 需要渲染的DIV 的ID名称
              alignTicks: true
            },
             navigator: false,
             scrollbar: false,
             rangeSelector: false,
             plotOptions: {
                 line: {
                   lineWidth: 1
                 }
             },
             xAxis:[{
                    tickInterval:60 * 1000 * 60 *2.5,
                    min:minTime,
                    max:maxTime,
                    startOnTick:true,
                    endOntick:true,
                    gridLineColor: ‘#ccc‘,
                    gridLineDashStyle: ‘dotted‘,
                    gridLineWidth: 1,
                    tickColor:‘none‘,
                    lineColor: ‘#ccc‘,
                       labels:{
                           formatter:function(){
                             var date = new Date(this.value)
                             var hours = date.getHours()
                             if(hours<8){
                               hours = hours + 24
                             }
                             return addZero(hours-8)+‘:‘+addZero(date.getMinutes())
                             }
                       }
             }],
             yAxis:[{
                      gridLineWidth: 1,
                      lineColor: ‘#f00‘,
                      labels: {
                          align: ‘right‘
                      },
                      offset:15,
                      min:0,
                      gridLineColor: ‘#ccc‘,
                      gridLineDashStyle: ‘solid‘
                }],
             credits: false,
             series : [{
                name : ‘当前价‘,
                   color: ‘#30527e‘,
                   lineWidth: 1,
                   type:‘line‘,
                   yAxis:0,
                   xAxis:0,
                   pointStart: minTime,
                data:Price
             }]
        }
        chart=new Highcharts.StockChart(option);
    });
}

3. 渲染方法里需要用到的辅助方法,如UTC 的格式化,X轴时间的格式化等等

function addZero(str){
        if(str<10){
          return str = ‘0‘ + str
        }
        return str
}
function UTC(time){
        if(time==undefined) return
          if (time.length < 10) {
            time = ‘‘ + time;
            return Date.UTC(time.substring(0, 4), time.substring(4, 6) - 1, time.substring(6,8));
          } else {
            time = ‘‘ + time;
            return Date.UTC(time.substring(0, 4), time.substring(4, 6) - 1, time.substring(6, 8), time.substring(9, 11), time.substring(12, 14), time.substring(15, 17));
          }
}

4. 请求的 json 格式,当然格式可以自己定义 ,但是需要修改上面方法里的属性

{
   "datas": [
       {
           "open": 2055,
           "updatetime": "20150129 08:00:00",
           "status": 1,
           "high": 2055,
           "low": 2053,
           "close": 2054
       },
       {
           "open": 2055,
           "updatetime": "20150129 08:01:00",
           "status": 1,
           "high": 2055,
           "low": 2054,
           "close": 2054
       },
       {
           "open": 2055,
           "updatetime": "20150129 08:02:00",
           "status": 1,
           "high": 2055,
           "low": 2055,
           "close": 2055
       }]
}

5. 最后完成的效果图(当然样式和其他方面还得做调整)

    1.  

      方法解释说明

      initHourChart 方法为渲染的核心方法,它先请求服务端的 json数据 ,拿到 json数据 后,循环遍历开始组建图表所需要的data格式 ,一个 UTC 时间戳,另外一个就是对应的数据值 。需要注意的是 xAxis 属性里需要设置 tickInterval 、 min 和 max参数,而且必须要设置。因为股票的分时图一般会有开盘时间和收盘时间,这里的 min 和 max 决定了 轴时间的 开始 和 结束 tickInterval 决定了 的间隔时间(例子里我以2小时为间隔展示了一天的数据)。

    接着我来解释为什么前面我说必须要用 v1.2.5 版本

    1. 旧版支持时间段固定显示模式,例如上图初始化 就可以显示 早上8点到晚上8点的刻度值,即使当前的数据没有16点以后的数据。而新版当没有16点以后的数据时,会无法显示后面时间段的空白区域,除非将时间点填充null的值,如果后面点有值了动态去更新
    2. 定时器功能,我们会在load事件里增加一个定时器,动态为图表增加新的点。因为从开盘后,不是所有时间段的数据都会有。然而这点上,新版增加数据后整个线会向左移动,然后新添加的点才增加进来,具体看官网的DEMO。旧版的处理方式是图表不懂,自动在最后一个点上增加新的数据 

    附上2张图分别采用新版和旧版,解释上面2个观点 
     

大家可以对比看看2张图的效果!也许新版有其他的解决方案。如果有也可以联系我与大家分享。今天就讲到这里,下篇为大家带来K线图的实例。

时间: 2024-10-05 23:50:27

highstock高级篇之股票分时图的相关文章

SSRS 2012 高级图表类型 -- 股票图

SSRS 2012 高级图表类型 -- 股票图 股票图是专门用于分析价格波动的图表,其中"K线图"是最广为投资人使用的分析图表.K线图又被称为阴阳线,最初是日本米商用来标示米价涨跌状况的工具,后来因为其直观.立体感强的特点而深受投资者欢迎引入股市与期货市场,事实证明K线图可以较准确地预测后市走向,也可以较明确地判断多空双方的力量对比,从而为投资决策提供重要参考. 它是以每个交易日的开盘价.最高价.最低价和收盘价绘制而成,K线的结构可分为上影线.下影线及中间实体三个部分.所谓的上影线即为

awk(四)高级篇

前面三篇总结了awk的基本结构,常用系统变量,流程控制,和函数. 这一篇总结下awk剩余的一些话题. getline函数 getline函数是从输入,标准输入,文件或管道读取另一行 getline和next有点类似,它俩都导致下一个输入行被读取.不同的,next语句将控制返回到脚本的顶部.而getline得到新的一行,但没有改变脚本的控制. next类似于sed中命令d. 而getline函数则类似于sed中命令N,不过和N还是有点小区别的. sed中的N命令,是读取新行,旧行和新行之间用换行符

PHP注入大全,分低级篇,中级篇,高级篇

谨以此献给黑客x档案的新手们 前言:现在的网络,最流行的攻击手段有两种,一种是缓冲区溢出攻击,一种是SQL注入,相对而言,最流行的还是脚本注入,而脚本注入漏洞更是风靡黑客界.不管是老鸟还是新起步的小菜,都会为它那巨大的威力和灵活多变的招式所着迷! 正是因为注入攻击的流行,使的市面上的注入工具层出不穷!比较出名的有小竹的NBSI.教主的HDSI和啊D的注入工具等等!这大大方便的小菜们掌握注入漏洞!可是,工具是死的,注入的手法却是活的,能否根据实际情况灵活地构造SQL注入语句,得到自己想要的信息,是

FreeRTOS高级篇3---启动调度器

使用FreeRTOS,一个最基本的程序架构如下所示: int main(void) { 必要的初始化工作; 创建任务1; 创建任务2; ... vTaskStartScheduler(); /*启动调度器*/ while(1); } 任务创建完成后,静态变量指针pxCurrentTCB(见<FreeRTOS高级篇2---FreeRTOS任务创建分析>第7节内容)指向优先级最高的就绪任务.但此时任务并不能运行,因为接下来还有关键的一步:启动FreeRTOS调度器. 调度器是FreeRTOS操作系

FreeRTOS高级篇5---FreeRTOS队列分析

FreeRTOS提供了多种任务间通讯方式,包括: 任务通知(版本V8.2以及以上版本) 队列 二进制信号量 计数信号量 互斥量 递归互斥量 其中,二进制信号量.计数信号量.互斥量和递归互斥量都是使用队列来实现的,因此掌握队列的运行机制,是很有必要的.      队列是FreeRTOS主要的任务间通讯方式.可以在任务与任务间.中断和任务间传送信息.发送到队列的消息是通过拷贝实现的,这意味着队列存储的数据是原数据,而不是原数据的引用.先看一下队列的数据结构: typedef struct Queue

搭建属于你的家庭网络实时监控–HTML5在嵌入式系统中的应用&#183;高级篇

*本文已刊登在<无线电>2014年第6期 <搭建属于你的在线实时采集系统>中已经对HTML5平台有了初步的认识,并基于此向大家展示了如何将采集到的数据上传至网络,实现实时观测.HTML 5是近十年来Web开发标准最巨大的飞跃.想必你已经体会到了HTML5的便捷之处,为了帮助大家更好在此平台上拓展应用,本文更加深入的探析"智能家居"与HTML5的完美结合,让家庭网络实时监控轻松实现. 关于智能家居  2013年,太多公司包括三星和飞利浦在内都对智能家居动了念头,在

FreeRTOS高级篇2---FreeRTOS任务创建分析

在FreeRTOS基础系列<FreeRTOS系列第10篇---FreeRTOS任务创建和删除>中介绍了任务创建API函数xTaskCreate(),我们这里先回顾一下这个函数的声明: BaseType_t xTaskCreate( TaskFunction_tp vTaskCode, const char * constpcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHan

FreeRTOS高级篇6---FreeRTOS信号量分析

FreeRTOS的信号量包括二进制信号量.计数信号量.互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量).关于它们的区别可以参考< FreeRTOS系列第19篇---FreeRTOS信号量>一文. 信号量API函数实际上都是宏,它使用现有的队列机制.这些宏定义在semphr.h文件中.如果使用信号量或者互斥量,需要包含semphr.h头文件. 二进制信号量.计数信号量和互斥量信号量的创建API函数是独立的,但是获取和释放API函数都是相同的:递归互斥信号量的创建.获取和释放AP

FreeRTOS高级篇4---FreeRTOS任务切换分析

FreeRTOS任务相关的代码大约占总代码的一半左右,这些代码都在为一件事情而努力,即找到优先级最高的就绪任务,并使之获得CPU运行权.任务切换是这一过程的直接实施者,为了更快的找到优先级最高的就绪任务,任务切换的代码通常都是精心设计的,甚至会用到汇编指令或者与硬件相关的特性,比如Cortex-M3的CLZ指令.因此任务切换的大部分代码是由硬件移植层提供的,不同的平台,实现发方法也可能不同,这篇文章以Cortex-M3为例,讲述FreeRTOS任务切换的过程. FreeRTOS有两种方法触发任务