'use strict';
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var constants = require('./constants');
var utils = require('./utils');
var utilsLite = require('utils-lite');
require('echarts/lib/chart/bar');
require('echarts/lib/chart/line');
require('echarts/lib/chart/candlestick');
require('echarts/lib/component/visualMap');
require('echarts/lib/component/dataZoom');
var Core = _interopDefault(require('./core'));
var DEFAULT_MA = [5, 10, 20, 30];
var DEFAULT_K_NAME = '日K';
var DEFAULT_DOWN_COLOR = '#ec0000';
var DEFAULT_UP_COLOR = '#00da3c';
var DEFAULT_START = 50;
var DEFAULT_END = 100;
var SHOW_FALSE = { show: false };
function getCandleLegend(args) {
var showMA = args.showMA,
MA = args.MA,
legendName = args.legendName,
labelMap = args.labelMap;
var data = [DEFAULT_K_NAME];
if (showMA) data = data.concat(MA.map(function (v) {
return 'MA' + v;
}));
if (labelMap) data = data.map(function (v) {
return labelMap[v] == null ? v : labelMap[v];
});
return {
data: data,
formatter: function formatter(name) {
return legendName[name] != null ? legendName[name] : name;
}
};
}
function getCandleTooltip(args) {
var metrics = args.metrics,
dataType = args.dataType,
digit = args.digit,
labelMap = args.labelMap;
return {
trigger: 'axis',
axisPointer: { type: 'cross' },
position: function position(pos, params, el, elRect, size) {
var result = { top: 10 };
var side = pos[0] < size.viewSize[0] / 2 ? 'right' : 'left';
result[side] = 60;
return result;
},
formatter: function formatter(options) {
var tpl = [];
tpl.push(options[0].axisValue + '
');
options.forEach(function (option) {
var data = option.data,
seriesName = option.seriesName,
componentSubType = option.componentSubType,
color = option.color;
var name = labelMap[seriesName] == null ? seriesName : labelMap[seriesName];
tpl.push(constants.itemPoint(color) + ' ' + name + ': ');
if (componentSubType === 'candlestick') {
tpl.push('
');
metrics.slice(0, 4).forEach(function (m, i) {
var name = labelMap[m] != null ? labelMap[m] : m;
var val = utils.getFormated(data[i + 1], dataType, digit);
tpl.push('- ' + name + ': ' + val + '
');
});
} else if (componentSubType === 'line') {
var val = utils.getFormated(data, dataType, digit);
tpl.push(val + '
');
} else if (componentSubType === 'bar') {
var _val = utils.getFormated(data[1], dataType, digit);
tpl.push(_val + '
');
}
});
return tpl.join('');
}
};
}
function getCandleVisualMap(args) {
var downColor = args.downColor,
upColor = args.upColor,
MA = args.MA,
showMA = args.showMA;
return {
show: false,
seriesIndex: showMA ? 1 + MA.length : 1,
dimension: 2,
pieces: [{ value: 1, color: downColor }, { value: -1, color: upColor }]
};
}
function getCandleGrid(args) {
var showVol = args.showVol;
return [{
left: '10%',
right: '8%',
top: '10%',
height: showVol ? '50%' : '65%',
containLabel: false
}, {
left: '10%',
right: '8%',
top: '65%',
height: '16%',
containLabel: false
}];
}
function getCandleXAxis(args) {
var data = args.dims;
var type = 'category';
var scale = true;
var boundaryGap = false;
var splitLine = SHOW_FALSE;
var axisLine = { onZero: false };
var axisTick = SHOW_FALSE;
var axisLabel = SHOW_FALSE;
var min = 'dataMin';
var max = 'dataMax';
var gridIndex = 1;
return [{ type: type, data: data, scale: scale, boundaryGap: boundaryGap, axisLine: axisLine, splitLine: splitLine, min: min, max: max }, { type: type, gridIndex: gridIndex, data: data, scale: scale, boundaryGap: boundaryGap, axisLine: axisLine, axisTick: axisTick, splitLine: splitLine, axisLabel: axisLabel, min: min, max: max }];
}
function getCandleYAxis(args) {
var dataType = args.dataType,
digit = args.digit;
var scale = true;
var gridIndex = 1;
var splitNumber = 2;
var axisLine = SHOW_FALSE;
var axisTick = SHOW_FALSE;
var axisLabel = SHOW_FALSE;
var splitLine = SHOW_FALSE;
var formatter = function formatter(val) {
return utils.getFormated(val, dataType, digit);
};
return [{ scale: scale, axisTick: axisTick, axisLabel: { formatter: formatter } }, { scale: scale, gridIndex: gridIndex, splitNumber: splitNumber, axisLine: axisLine, axisTick: axisTick, splitLine: splitLine, axisLabel: axisLabel }];
}
function getCandleDataZoom(args) {
var start = args.start,
end = args.end;
return [{
type: 'inside',
xAxisIndex: [0, 1],
start: start,
end: end
}, {
show: true,
xAxisIndex: [0, 1],
type: 'slider',
top: '85%',
start: start,
end: end
}];
}
function getCandleSeries(args) {
var values = args.values,
volumes = args.volumes,
upColor = args.upColor,
downColor = args.downColor,
showMA = args.showMA,
MA = args.MA,
showVol = args.showVol,
labelMap = args.labelMap,
digit = args.digit,
itemStyle = args.itemStyle;
var style = itemStyle || {
normal: {
color: upColor,
color0: downColor,
borderColor: null,
borderColor0: null
}
};
var lineStyle = { normal: { opacity: 0.5 } };
var series = [{
name: labelMap[DEFAULT_K_NAME] == null ? DEFAULT_K_NAME : labelMap[DEFAULT_K_NAME],
type: 'candlestick',
data: values,
itemStyle: style
}];
if (showMA) {
MA.forEach(function (d) {
var name = 'MA' + d;
series.push({
name: labelMap[name] == null ? name : labelMap[name],
data: calculateMA(d, values, digit),
type: 'line',
lineStyle: lineStyle,
smooth: true
});
});
}
if (showVol) {
series.push({
name: 'Volume',
type: 'bar',
xAxisIndex: 1,
yAxisIndex: 1,
data: volumes
});
}
return series;
}
function calculateMA(dayCount, data, digit) {
var result = [];
data.forEach(function (d, i) {
if (i < dayCount) {
result.push('-');
} else {
var sum = 0;
for (var j = 0; j < dayCount; j++) {
sum += data[i - j][1];
}result.push(+(sum / dayCount).toFixed(digit));
}
});
return result;
}
var candle = function candle(columns, rows, settings, status) {
var _settings$dimension = settings.dimension,
dimension = _settings$dimension === undefined ? columns[0] : _settings$dimension,
_settings$metrics = settings.metrics,
metrics = _settings$metrics === undefined ? columns.slice(1, 6) : _settings$metrics,
_settings$digit = settings.digit,
digit = _settings$digit === undefined ? 2 : _settings$digit,
itemStyle = settings.itemStyle,
_settings$labelMap = settings.labelMap,
labelMap = _settings$labelMap === undefined ? {} : _settings$labelMap,
_settings$legendName = settings.legendName,
legendName = _settings$legendName === undefined ? {} : _settings$legendName,
_settings$MA = settings.MA,
MA = _settings$MA === undefined ? DEFAULT_MA : _settings$MA,
_settings$showMA = settings.showMA,
showMA = _settings$showMA === undefined ? false : _settings$showMA,
_settings$showVol = settings.showVol,
showVol = _settings$showVol === undefined ? false : _settings$showVol,
_settings$showDataZoo = settings.showDataZoom,
showDataZoom = _settings$showDataZoo === undefined ? false : _settings$showDataZoo,
_settings$downColor = settings.downColor,
downColor = _settings$downColor === undefined ? DEFAULT_DOWN_COLOR : _settings$downColor,
_settings$upColor = settings.upColor,
upColor = _settings$upColor === undefined ? DEFAULT_UP_COLOR : _settings$upColor,
_settings$start = settings.start,
start = _settings$start === undefined ? DEFAULT_START : _settings$start,
_settings$end = settings.end,
end = _settings$end === undefined ? DEFAULT_END : _settings$end,
dataType = settings.dataType;
var tooltipVisible = status.tooltipVisible,
legendVisible = status.legendVisible;
var isLiteData = utilsLite.isArray(rows[0]);
var dims = [];
var values = [];
var volumes = [];
var candleMetrics = metrics.slice(0, 4);
var volumeMetrics = metrics[4];
if (isLiteData) {
rows.forEach(function (row) {
var itemResult = [];
dims.push(row[columns.indexOf(dimension)]);
candleMetrics.forEach(function (item) {
itemResult.push(row[columns.indexOf(item)]);
});
values.push(itemResult);
if (volumeMetrics) volumes.push(row[columns.indexOf(volumeMetrics)]);
});
} else {
rows.forEach(function (row, index) {
var itemResult = [];
dims.push(row[dimension]);
candleMetrics.forEach(function (item) {
itemResult.push(row[item]);
});
values.push(itemResult);
if (volumeMetrics) {
var _status = row[metrics[0]] > row[metrics[1]] ? 1 : -1;
volumes.push([index, row[volumeMetrics], _status]);
}
});
}
var legend = legendVisible && getCandleLegend({ showMA: showMA, MA: MA, legendName: legendName, labelMap: labelMap });
var tooltip = tooltipVisible && getCandleTooltip({ metrics: metrics, dataType: dataType, digit: digit, labelMap: labelMap });
var visualMap$$1 = showVol && getCandleVisualMap({ downColor: downColor, upColor: upColor, MA: MA, showMA: showMA });
var dataZoom$$1 = showDataZoom && getCandleDataZoom({ start: start, end: end });
var grid = getCandleGrid({ showVol: showVol });
var xAxis = getCandleXAxis({ dims: dims });
var yAxis = getCandleYAxis({ dataType: dataType, digit: digit });
var series = getCandleSeries({
values: values,
volumes: volumes,
upColor: upColor,
downColor: downColor,
showMA: showMA,
MA: MA,
showVol: showVol,
labelMap: labelMap,
digit: digit,
itemStyle: itemStyle
});
var axisPointer = { link: { xAxisIndex: 'all' } };
return { legend: legend, tooltip: tooltip, visualMap: visualMap$$1, grid: grid, xAxis: xAxis, yAxis: yAxis, dataZoom: dataZoom$$1, series: series, axisPointer: axisPointer };
};
var _extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
var index = _extends({}, Core, {
name: 'VeCandle',
data: function data() {
this.chartHandler = candle;
return {};
}
});
module.exports = index;