227 lines
6 KiB
JavaScript
227 lines
6 KiB
JavaScript
|
|
var echarts = require('echarts');
|
||
|
|
|
||
|
|
var ROOT_PATH = 'https://echarts.apache.org/examples';
|
||
|
|
var UP_COLOR = '#00da3c';
|
||
|
|
var DOWN_COLOR = '#ec0000';
|
||
|
|
|
||
|
|
|
||
|
|
$.get(ROOT_PATH + '/data/asset/data/stock-DJI.json', function (rawData) {
|
||
|
|
var data = splitData(rawData);
|
||
|
|
initTradeChart(elementID, data)
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function splitData(rawData) {
|
||
|
|
var categoryData = [];
|
||
|
|
var values = [];
|
||
|
|
var volumes = [];
|
||
|
|
for (var i = 0; i < rawData.length; i++) {
|
||
|
|
categoryData.push(rawData[i].splice(0, 1)[0]);
|
||
|
|
values.push(rawData[i]);
|
||
|
|
|
||
|
|
volumes.push([
|
||
|
|
i,
|
||
|
|
rawData[i][4],
|
||
|
|
rawData[i][0] > rawData[i][1] ? 1 : -1
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
categoryData: categoryData,
|
||
|
|
values: values,
|
||
|
|
volumes: volumes
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
function calculateMovingAverage(dayCount, data) {
|
||
|
|
var result = [];
|
||
|
|
for (var i = 0, len = data.values.length; i < len; i++) {
|
||
|
|
if (i < dayCount) {
|
||
|
|
result.push('-');
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
var sum = 0;
|
||
|
|
for (var j = 0; j < dayCount; j++) {
|
||
|
|
sum += data.values[i - j][1];
|
||
|
|
}
|
||
|
|
result.push(+(sum / dayCount).toFixed(3));
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
function initTradeChart(elementID, data) {
|
||
|
|
var chartDom = document.getElementById(elementID);
|
||
|
|
var myChart = echarts.init(chartDom);
|
||
|
|
|
||
|
|
myChart.setOption({
|
||
|
|
animation: false,
|
||
|
|
tooltip: {
|
||
|
|
trigger: 'axis',
|
||
|
|
axisPointer: {
|
||
|
|
type: 'cross'
|
||
|
|
},
|
||
|
|
borderWidth: 1,
|
||
|
|
borderColor: '#ccc',
|
||
|
|
padding: 10,
|
||
|
|
textStyle: {
|
||
|
|
color: '#000'
|
||
|
|
},
|
||
|
|
position: function (pos, params, el, elRect, size) {
|
||
|
|
var obj = {top: 10};
|
||
|
|
obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30;
|
||
|
|
return obj;
|
||
|
|
}
|
||
|
|
},
|
||
|
|
axisPointer: {
|
||
|
|
link: {xAxisIndex: 'all'},
|
||
|
|
label: {
|
||
|
|
backgroundColor: '#777'
|
||
|
|
}
|
||
|
|
},
|
||
|
|
visualMap: {
|
||
|
|
show: false,
|
||
|
|
seriesIndex: 1,
|
||
|
|
dimension: 2,
|
||
|
|
pieces: [{
|
||
|
|
value: 1,
|
||
|
|
color: DOWN_COLOR
|
||
|
|
}, {
|
||
|
|
value: -1,
|
||
|
|
color: UP_COLOR
|
||
|
|
}]
|
||
|
|
},
|
||
|
|
grid: [
|
||
|
|
{
|
||
|
|
left: '10%',
|
||
|
|
right: '8%',
|
||
|
|
height: '50%'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
left: '10%',
|
||
|
|
right: '8%',
|
||
|
|
top: '58%',
|
||
|
|
height: '13%'
|
||
|
|
}
|
||
|
|
],
|
||
|
|
xAxis: [
|
||
|
|
{
|
||
|
|
type: 'category',
|
||
|
|
data: data.categoryData,
|
||
|
|
scale: true,
|
||
|
|
boundaryGap: false,
|
||
|
|
axisLine: {onZero: false},
|
||
|
|
splitLine: {show: false},
|
||
|
|
splitNumber: 20,
|
||
|
|
min: 'dataMin',
|
||
|
|
max: 'dataMax',
|
||
|
|
axisPointer: {
|
||
|
|
z: 100
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
type: 'category',
|
||
|
|
gridIndex: 1,
|
||
|
|
data: data.categoryData,
|
||
|
|
scale: true,
|
||
|
|
boundaryGap: false,
|
||
|
|
axisLine: {onZero: false},
|
||
|
|
axisTick: {show: false},
|
||
|
|
splitLine: {show: false},
|
||
|
|
axisLabel: {show: false},
|
||
|
|
splitNumber: 20,
|
||
|
|
min: 'dataMin',
|
||
|
|
max: 'dataMax'
|
||
|
|
}
|
||
|
|
],
|
||
|
|
yAxis: [
|
||
|
|
{
|
||
|
|
scale: true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
scale: true,
|
||
|
|
gridIndex: 1,
|
||
|
|
splitNumber: 2,
|
||
|
|
axisLabel: {show: false},
|
||
|
|
axisLine: {show: false},
|
||
|
|
axisTick: {show: false},
|
||
|
|
splitLine: {show: false}
|
||
|
|
}
|
||
|
|
],
|
||
|
|
dataZoom: [
|
||
|
|
{
|
||
|
|
type: 'inside',
|
||
|
|
xAxisIndex: [0, 1],
|
||
|
|
start: 98,
|
||
|
|
end: 100
|
||
|
|
},
|
||
|
|
{
|
||
|
|
show: true,
|
||
|
|
xAxisIndex: [0, 1],
|
||
|
|
type: 'slider',
|
||
|
|
top: '85%',
|
||
|
|
start: 98,
|
||
|
|
end: 100
|
||
|
|
}
|
||
|
|
],
|
||
|
|
series: [
|
||
|
|
{
|
||
|
|
name: 'Dow-Jones index',
|
||
|
|
type: 'candlestick',
|
||
|
|
data: data.values,
|
||
|
|
itemStyle: {
|
||
|
|
color: UP_COLOR,
|
||
|
|
color0: DOWN_COLOR,
|
||
|
|
borderColor: null,
|
||
|
|
borderColor0: null
|
||
|
|
},
|
||
|
|
tooltip: {
|
||
|
|
formatter: function (param) {
|
||
|
|
param = param[0];
|
||
|
|
return [
|
||
|
|
'Date: ' + param.name + '<hr size=1 style="margin: 3px 0">',
|
||
|
|
'Open: ' + param.data[0] + '<br/>',
|
||
|
|
'Close: ' + param.data[1] + '<br/>',
|
||
|
|
'Lowest: ' + param.data[2] + '<br/>',
|
||
|
|
'Highest: ' + param.data[3] + '<br/>'
|
||
|
|
].join('');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'Volume',
|
||
|
|
type: 'bar',
|
||
|
|
xAxisIndex: 1,
|
||
|
|
yAxisIndex: 1,
|
||
|
|
data: data.volumes
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'MA5',
|
||
|
|
type: 'line',
|
||
|
|
data: calculateMA(7, data),
|
||
|
|
smooth: true,
|
||
|
|
lineStyle: {
|
||
|
|
opacity: 0.5
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'MA20',
|
||
|
|
type: 'line',
|
||
|
|
data: calculateMA(20, data),
|
||
|
|
smooth: true,
|
||
|
|
lineStyle: {
|
||
|
|
opacity: 0.5
|
||
|
|
}
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: 'MA50',
|
||
|
|
type: 'line',
|
||
|
|
data: calculateMA(50, data),
|
||
|
|
smooth: true,
|
||
|
|
lineStyle: {
|
||
|
|
opacity: 0.5
|
||
|
|
}
|
||
|
|
},
|
||
|
|
]
|
||
|
|
}, true);
|
||
|
|
});
|