vue使用Echarts繪制自己股票K線圖,包含數(shù)據(jù)接口

安裝Echarts

首先下載安裝Echarts,可以通過 npm install echarts --save命令下載。在這個文件中引入echarts,創(chuàng)建echarts的掛載實例,在mounted中初始化echarts實例,進行相關的K線圖繪制就可以,這里不詳細介紹。

Echarts官方K線示例

Echarts官方K線示例.

在這里插入圖片描述

官方示例效果已經(jīng)很完善了,但實際使用過程中發(fā)現(xiàn)官方示例并不能很好的滿足我的需求,主要一下原因。

1,在數(shù)據(jù)量很大的時候,計算多日均線數(shù)據(jù)的時候瀏覽器的性能開銷過大,很容易出現(xiàn)卡頓,特別是一個頁面有多張K線圖時,在部分比較老舊的瀏覽器中情況尤為明顯。
2,數(shù)據(jù)量不足以計算均線時會出現(xiàn)null值,比如30日均線的前30條數(shù)據(jù)都是null值,數(shù)據(jù)缺失影響展示效果。
3,tooltip的顯示,相比open,close,max,min,我更喜歡開盤,收盤,最高,最低這種顯示方式。

針對上述原因改進后的K線示例

使用數(shù)據(jù)集的方式渲染減小前端的運算壓力,把均線計算放到服務端。
在這里插入圖片描述

option的主要結構

// An highlighted block
option: {
                    title: {
                        left: 'left',
                        text: '',
                        textStyle: {
                            color: '#909399',
                        }
                    },
                    type: 'stock',
                    backgroundColor: '#303133',
                    legend: {
                        data: ['日K', '5日均線', '10日均線', '20日均線', '30日均線'],
                        inactiveColor: '#777',
                        textStyle: {
                            color: '#fff'
                        }
                    },
                    dataset: {
                        // 直接把數(shù)據(jù)放進source就渲染完了
                        source: null
                    },
                    // dataZoom是設置最下方的滑動條型數(shù)據(jù)區(qū)域縮放組件,不需要可以刪除
                    dataZoom: [{
                        type: 'inside',
                        start: 80,
                        end: 100
                    }, {
                        type: 'slider',
                        height: 8,
                        bottom: 20,
                        borderColor: 'transparent',
                        backgroundColor: '#e2e2e2',
                        handleIcon: 'M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', // jshint ignore:line
                        handleSize: 20,
                        handleStyle: {
                            shadowBlur: 6,
                            shadowOffsetX: 1,
                            shadowOffsetY: 2,
                            shadowColor: '#aaa'
                        }
                    }],
                    tooltip: {
                        confine: true,
                        trigger: 'axis',
                        axisPointer: {
                            animation: false,
                            type: 'cross',
                            lineStyle: {
                                color: '#376df4',
                                width: 2,
                                opacity: 1
                            }
                        }
                    },
                    xAxis: {
                        type: 'category',
                        axisLine: {lineStyle: {color: '#8392A5'}}
                    },
                    yAxis: {
                        scale: true,
                        axisLine: {lineStyle: {color: '#8392A5'}},
                        splitLine: {show: false}
                    },
                    series: [
                        {
                            type: 'candlestick',
                            name: '日K',
                            // 重點
                            encode: {
                                // 日期作為X軸
                                x: '日期',
                                //這里是將["開盤", "收盤", "最高", "最低"]四個屬性渲染到K線圖上
                                y: ["開盤", "收盤", "最高", "最低"],
                                //這里是將["開盤", "收盤", "最高", "最低","漲幅", "成交量"]顯示在tooltip上
                                tooltip: ["開盤", "收盤", "最高", "最低", "漲幅", "成交量"]
                            },
                            // 設置K線顏色
                            itemStyle: {
                                normal: {
                                    color: '#FD1050',
                                    color0: '#0CF49B',
                                    borderColor: '#FD1050',
                                    borderColor0: '#0CF49B'
                                }
                            },
                        },
                        {
                            name: '5日均線',
                            type: 'line',
                            encode: {
                                x: '日期',
                                y: '5日均線',
                            },
                            smooth: true,
                            showSymbol: false,
                            lineStyle: {
                                normal: {
                                    width: 1
                                }
                            }
                        },
                        {
                            name: '10日均線',
                            type: 'line',
                            encode: {
                                // 將 "product" 列映射到 X 軸。
                                x: '日期',
                                // 將 "product" 列映射到 Y 軸。
                                y: '10日均線'
                            },
                            smooth: true,
                            showSymbol: false,
                            lineStyle: {
                                normal: {
                                    width: 1
                                }
                            }
                        },
                        {
                            name: '20日均線',
                            type: 'line',
                            encode: {
                                // 將 "product" 列映射到 X 軸。
                                x: '日期',
                                // 將 "product" 列映射到 Y 軸。
                                y: '20日均線'
                            },
                            smooth: true,
                            showSymbol: false,
                            lineStyle: {
                                normal: {
                                    width: 1
                                }
                            }
                        },
                        {
                            name: '30日均線',
                            type: 'line',
                            smooth: true,
                            encode: {
                                x: '日期',
                                y: '30日均線'
                            },
                            showSymbol: false,
                            lineStyle: {
                                normal: {
                                    width: 1
                                }
                            }
                        }
                    ]
                },
接下來選擇一個帶均線的數(shù)據(jù)源放進去就行了

這里我們選擇小熊同學的數(shù)據(jù)源,api.doctorxiong.club/v1/stock/detail?code=000001

然后只需要直接把數(shù)據(jù)放進數(shù)據(jù)集就完成了整個K線圖的渲染,JS代碼如下

// An highlighted block
// 先再數(shù)據(jù)集加入一行數(shù)據(jù)屬性
const dataset = [["日期", "開盤", "收盤", "最高", "最低", "漲幅", "成交量", "5日均線", "10日均線", "20日均線", "30日均線"]]
// 這里是我封裝的ajax請求,不同的人此處代碼不一樣,data就是歷史K線數(shù)據(jù)
const data = await getStockDetail(code, 1).then(
      res => {
            return res.data.dailyData
      }).catch(err => {
            console.log(err)
      })
// 把data合并到dataset
dataset.push.apply(dataset, data)
// 把數(shù)據(jù)放進數(shù)據(jù)基就渲染完了
this.option.dataset.source = dataset
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容