seerline/clchart

View on GitHub
samples/demo/ddxline.html

Summary

Maintainability
Test Coverage
<!DOCTYPE html>
<html lang="en">
<link href="https://fonts.googleapis.com/css?family=Cousine|Roboto+Mono" rel="stylesheet">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>ClChat Demo</title>
  <link rel="stylesheet" href="../css/client.css">
</head>
<body>
  <div id="container" class="container">
  </div>

  <script src="../ClChart.js"></script>
  <script src="../SisClient.js"></script>
  <script src="./config.js"></script>
  <script>

    const container = document.getElementById('container')

    const syscfg = {
      scale: window.devicePixelRatio,
      axisPlatform: 'web', // 'phone' | 'web'
      container: container
    }
    const  mainCanvas ={
      width: container.offsetWidth * window.devicePixelRatio,
      height: container.offsetHeight * window.devicePixelRatio,
    }
    // Create a single stock Chart instance
    const Chart = ClChart.createSingleChart(syscfg)
    let isInited = false;

    function initLayout() {
      if (isInited) return; 
      isInited = true;

      Chart.clearLayout();
      let minHeight = mainCanvas.height / 12
      let minWidth = 400

      let mainHeight = minHeight * 6
      let mainWidth = Math.max(mainCanvas.width * 0.65, mainCanvas.width - 2 * minWidth)
      
      // 设置画布区域布局
      let mainConfig = ClChart.DEF_UTIL.copyJsonOfDeep(ClChart.DEF_CHART.CHART_NOW);
      mainConfig.lines.push(
        {
          className: 'ClDrawLine',
          source: 'minddx',
          info: {
            showSort: 'idx',
            labelX: 'idx',
            labelY: 'zdmrp',
            color: 'red'
          }
        }
      )
      mainConfig.lines.push(
        {
          className: 'ClDrawLine',
          source: 'minddx',
          info: {
            showSort: 'idx',
            labelX: 'idx',
            labelY: 'zdmcp',
            color: 'green'
          }
        }
      )
      const mainLayoutCfg = {
        layout: ClChart.DEF_CHART.CHART_LAYOUT,
        config: mainConfig,
        rectMain: {
          left: 0,
          top: 0,
          width: mainWidth,
          height: mainHeight
        }
      }
      Chart.createChart('user.minline', 'system.chart', mainLayoutCfg, function (result) {
        //  console.log(result)
      })
      const volumeLayoutCfg = {
        layout: ClChart.DEF_CHART.CHART_LAYOUT,
        config: ClChart.DEF_CHART.CHART_NOWVOL,
        rectMain: {
          left: 0,
          top: mainHeight,
          width: mainWidth,
          height: minHeight * 3
        }
      }
      Chart.createChart('user.minvol', 'system.chart', volumeLayoutCfg, function (result) {
        //  console.log(result)
      })
      let ddxConfig = ClChart.DEF_UTIL.copyJsonOfDeep(ClChart.DEF_CHART.CHART_NOWVOL);
      ddxConfig.title.display = 'texts'
      ddxConfig.title.label = 'DDX'
      ddxConfig.axisY.left.display = 'both'
      ddxConfig.axisY.right.display = 'both'
      ddxConfig.axisY.left.middle = 'zero'
      ddxConfig.axisY.right.middle = 'zero'
      ddxConfig.lines = 
        [
        {
          className: 'ClDrawLine',
          source: 'minddx',
          info: {
            showSort: 'idx',
            labelX: 'idx',
            labelY: 'zdjz',
            format: 'vol',
            color: 'white'
          }
        },
        {
          className: 'ClDrawZVBar',
          extremum: { // 如何取极值
            method: 'fixedLeft', // fixedLeft fixedRight 上下固定,此时需要取axisY.middle的定义
            maxvalue: ['zdmr','zdmc','zdjz'], // 参与计算最大值的标签
            minvalue: ['zdmr','zdmc','zdjz'] // 参与计算最小值的标签
          },
          info: {
            txt: 'IN:',
            labelY: 'zdmr', // 需要显示的变量,从key中获取对应的数据标签
            format: 'vol'
          }
        },
        {
          className: 'ClDrawZVBar',
          info: {
            txt: 'OUT:',
            labelY: 'zdmc', // 需要显示的变量,从key中获取对应的数据标签
            format: 'vol'
          }
        }]
      const ddxlayoutCfg = {
        layout: ClChart.DEF_CHART.CHART_LAYOUT,
        config: ddxConfig,
        rectMain: {
          left: 0,
          top: mainHeight + minHeight * 3,
          width: mainWidth,
          height: mainCanvas.height - mainHeight - minHeight * 3
        }
      }
      Chart.createChart('user.ddx', 'system.chart', ddxlayoutCfg, function (result) {
        //  console.log(result)
      })
      minWidth = (mainCanvas.width - mainWidth) / 2
      const reportLayoutCfg = {
        layout: ClChart.DEF_CHART.CHART_LAYOUT,
        config: {
          // title: {
          //   display: 'none'
          // },
          // listinfo:
          //  [{label:'time', alignTxt:'left'}, 
          //   {label:'price'},
          //   {label:'vol'}
          // ],
          style: 'normal'
        },
        rectMain: {
          left: mainWidth,
          top: 0,
          width: minWidth,
          height: mainCanvas.height
        }
      }
      Chart.createChart('user.report', 'system.report', reportLayoutCfg, function (result) {
        //  console.log(result)
      })
      const orderLayoutCfg = {
        layout: ClChart.DEF_CHART.CHART_LAYOUT,
        config: {
          style: 'normal', 
          title: {
            display: 'text'
          },
          mmpCount : 10
        },
        rectMain: {
          left: mainWidth + minWidth,
          top: 0,
          width: mainCanvas.width - mainWidth - minWidth,
          height: mainCanvas.height
        }
      }
      Chart.createChart('user.board', 'system.board', orderLayoutCfg, function (result) {
        //  console.log(result)
      })
    }   
    function getMinddxline(minddxData, minData) {
      let ddxline = []
      if (minddxData.fields === undefined)
      {
        return ddxline
      }
      let k = 0;
      const offset = 4;
      console.log('minddxData', minddxData);
      
      const ask_vol = minddxData.fields.askv6
      const ask_money = minddxData.fields.askm6
      const bid_vol = minddxData.fields.bidv6
      const bid_money = minddxData.fields.bidm6

      const today = sisdb.tradeDate;//ClChart.DEF_UTIL.getDate(nowData.values[0][0])
      for (let index = 0; index < minddxData.values.length; index++) {
        const element = minddxData.values[index];
        const idx = ClChart.DEF_DATA_UTIL.fromTradeTimeToIndex(element[0],ClChart.DEF_DATA.STOCK_TRADETIME)-1
        if(ClChart.DEF_UTIL.getDate(element[0]) === today)
        {
          for (; k < minData.values.length; k++) 
          {
            if(minData.values[k][0] !== idx)
            {               
              ddxline.push([minData.values[k][0],0,0,
              ddxline.length > 1 ? ddxline[ddxline.length-1][3] : 0,
              ddxline.length > 1 ? ddxline[ddxline.length-1][4] : 0,
              ddxline.length > 1 ? ddxline[ddxline.length-1][5] : 0
            ])
            }
            else
            {
              k++;
              break;
            }
          }
          if (index > 0)
          {
            const ago = minddxData.values[index - 1];
            // console.log('minData', idx, element[18], minddxData.fields);
            const askvol = element[ask_vol] - ago[ask_vol]
            const askmoney = element[ask_money] - ago[ask_money]
            const bidvol = element[bid_vol] - ago[bid_vol]
            const bidmoney = element[bid_money] - ago[bid_money]
            ddxline.push([idx,
              askmoney/100,
              -1*(bidmoney/100),
              (element[ask_money] - element[bid_money])/100,
              // askvol ? askmoney/askvol :  ddxline[ddxline.length-1][4],
              // bidvol ? bidmoney/bidvol :  ddxline[ddxline.length-1][5],
              element[ask_vol] ? element[ask_money]/element[ask_vol] : 0,
              element[bid_vol] ? element[bid_money]/element[bid_vol] : 0
            ])
          }
          else
          {
            ddxline.push([idx,
              element[ask_money]/100,
              -1*element[bid_money]/100,
              (element[ask_money] - element[bid_money])/100,
              element[ask_vol] ? element[ask_money]/element[ask_vol] : 0,
              element[bid_vol] ? element[bid_money]/element[bid_vol] : 0
            ])
          }
        }
      }
      console.log('minddx', today, ddxline)
      return ddxline
    } 
    function paintDrawline() {
      const code = sisdb.code

      const minTime = ClChart.DEF_UTIL.makeTimeT(sisdb.tradeDate, 90000)
      const maxTime = ClChart.DEF_UTIL.makeTimeT(sisdb.tradeDate, 150000)
      console.log(minTime, maxTime);
      
      let infoData
      Promise.all([
        sisClient.getData(code, 'info'),
        sisClient.getData(code, 'tick', { search:{ start:-50,stop:-1 } }),
        sisClient.getData(code, 'min'),
        sisClient.getData(code, 'tick', { search:{ start:-100,stop:-1 } }),
        sisClient.getData(code, 'minddx', { search:{ min: minTime, max: maxTime } }),
        sisClient.getData(code, 'snapshot', { search:{ start:-1,stop:-1 } })
      ])
      .then(([infoData,  tickData,  minData, reportData, minddxData, nowData]) => {
        Chart.clear()
        Chart.initData(sisdb.tradeDate, ClChart.DEF_DATA.STOCK_TRADETIME)
        Chart.setData('INFO', ClChart.DEF_DATA.FIELD_INFO, infoData.values)
        Chart.setData('TICK', ClChart.DEF_DATA.FIELD_TICK, tickData.values)
        Chart.setData('MIN', ClChart.DEF_DATA.FIELD_MIN, minData.values)
        Chart.setData('NOW', nowData.fields, nowData.values)
        Chart.setData('reports', reportData.fields, reportData.values)
        // 数据转换

        Chart.setData('minddx', {time:0,zdmr:1,zdmc:2,zdjz:3,
              zdmrp:4,zdmcp:5}, getMinddxline(minddxData, minData))
        // console.log('min', today, minData.values);
        

        Chart.bindData(Chart.getChart('user.minline'), 'MIN')
        Chart.bindData(Chart.getChart('user.minvol'), 'MIN')
        Chart.bindData(Chart.getChart('user.board'), 'NOW')
        Chart.bindData(Chart.getChart('user.ddx'), 'minddx')
        Chart.bindData(Chart.getChart('user.report'), 'reports')
        Chart.onPaint()

      })
    }
      
    window.onload = () => {
      initLayout()
      paintDrawline()
    }
  </script>
</body>
</html>