美文网首页
基于canvas生成股票k线(60日线简版)

基于canvas生成股票k线(60日线简版)

作者: Mr无愧于心 | 来源:发表于2022-04-11 20:43 被阅读0次

一般绘图的插件eChart / highChart体积太大,(react-sparklines / vue-sparklines)存在兼容性问题,索性自己用canvas画一个。

canvas大神可以略过。。。

const data=[1,2,3,4,5,6,8]
function getBrokenLine (el, data) {
      if (data.length < 60) {// 数据少于60日,补齐
        data = [...data, ...new Array(60).fill(-1)].slice(0, 60);
      }
      var cv = document.getElementById(el);
      cv.style.width = '70px';
      cv.style.height = '30px';
      cv.width = 70;
      cv.height = 30;
      var ctx = cv.getContext('2d');
      var maxNum = Math.max.apply(null, data); // 求数组中的最大值
      var minNum = Math.min.apply(null, data); // 求数组中的最小值
      var xLength = cv.width; // x轴的长度
      var yLength = cv.height; // y轴的长度
      var pointsWidth = xLength / (data.length - 1); // 折线上每个点之间的距离
      // 绘制右侧y轴
      var radio = 1;
      if (minNum < 0) {
        radio = maxNum - minNum;
      } else {
        radio = maxNum;
      }
      ctx.beginPath();
      for (let i = 0; i < data.length; i++) {
        const pointX = i * pointsWidth;
        let pointY = 0;
        if (minNum < 0) {
          pointY = (1 + minNum / radio - data[i] / radio) * yLength + 1;
        } else {
          if (1 - data[i] / radio !== 1) {
            pointY = (1 - data[i] / radio) * yLength + 1;
          } else {
            pointY = (1 - data[i] / radio) * yLength;
          }
        }
        ctx.lineTo(pointX, pointY);
      }
      ctx.lineWidth = 1;
      ctx.strokeStyle = 'rgb(0,102,204)';
      ctx.stroke();

      ctx.beginPath();// 控制绘制的折线不受坐标轴样式属性的影响
      ctx.moveTo(xLength, (1 - data[data.length - 1] / radio) * yLength);
      ctx.lineTo(xLength, yLength);
      // 绘制x轴
      ctx.lineTo(0, yLength);
      // 绘制y轴
      ctx.lineTo(0, yLength);

      // 绘制折线
      for (let i = 0; i < data.length; i++) {
        const pointX = i * pointsWidth;
        let pointY = 0;
        if (minNum < 0) {
          pointY = (1 + minNum / radio - data[i] / radio) * yLength + 1;
        } else {
          pointY = (1 - data[i] / radio) * yLength + 1;
        }
        ctx.lineTo(pointX, pointY);
      }
      ctx.closePath();
      ctx.fillStyle = 'rgba(0,102,204,0.1)';
      ctx.fill();
      ctx.strokeStyle = 'rgba(0,102,204,0.1)';
      ctx.stroke();
    }
  }
效果时这样的

相关文章

  • 基于canvas生成股票k线(60日线简版)

    一般绘图的插件eChart / highChart体积太大,(react-sparklines[https://w...

  • 杂谈|股市(一)

    从过完春节,股市一开盘,就一路在稳步上涨,成交量也在逐步放大,k线跨过120日线,60日线,30日线和20日线也很...

  • 安少五日线法:

    五日线法: 在日K线找到5日线,图片黄色的是5日线 当K线高于且远离5日线即可减仓; 当K线高于且接近5日线即可加...

  • 大事·······

    上图是今世缘的日线,下方绿色线为60日线生命线;看近期走势可知,今世缘回踩到60日线后,很快就走反弹,说明60日线...

  • 如何根据均线操作股票

    均线系统就是常说的5日线,10日线,20日线,60日线,144日线,半年线,年线等。 平时我们根据...

  • 稳稳的幸福

    最近大盘稳定的站上了60日线。 只要是稳定的站上60日线,并且形成多头排列,大盘都要走一波不错的行情。说60日线是...

  • 2021.06.15 周二收评

    #股票##财经##缠论股票投资# 2021.06.15 周二收评 日线回调,K线数量够了,成笔! 上周一直在提示三...

  • 卖出

    妖股、急涨股:以10日线或者20日为准,跌破10日线或者20日线就卖。 缓缓上涨的票:以60日均线为准,跌破60日...

  • 风险犹存,保持小仓位轮动

    大盘分析 昨日沪指上涨,今日依旧受制于60日线的压力,并且10日线马死叉60日线,压力较大。流动资金持续翻绿,成交...

  • mark 2020-07-23

    mark 一下时间点判断这里可以比照去年的情况,回踩20日线后下一次调整要回踩60日线,不过现在60日线还太远,所...

网友评论

      本文标题:基于canvas生成股票k线(60日线简版)

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