@amcharts/amcharts5
Version:
amCharts 5
97 lines • 3.68 kB
JavaScript
import { ChartIndicator } from "./ChartIndicator";
import { LineSeries } from "../../xy/series/LineSeries";
import * as $array from "../../../core/util/Array";
/**
* An implementation of a [[StockChart]] indicator.
*
* @see {@link https://www.amcharts.com/docs/v5/charts/stock/indicators/} for more info
*/
export class AverageTrueRange extends ChartIndicator {
constructor() {
super(...arguments);
this._editableSettings = [{
key: "period",
name: this.root.language.translateAny("Period"),
type: "number",
minValue: 3,
maxValue: 50,
step: 1
}, {
key: "seriesColor",
name: this.root.language.translateAny("Color"),
type: "color"
}];
}
_afterNew() {
this._themeTags.push("averagetruerange");
super._afterNew();
}
_createSeries() {
return this.panel.series.push(LineSeries.new(this._root, {
themeTags: ["indicator"],
xAxis: this.xAxis,
yAxis: this.yAxis,
valueXField: "valueX",
valueYField: "atr",
fill: undefined
}));
}
_getDataArray(dataItems) {
const data = [];
$array.each(dataItems, (dataItem) => {
data.push({ valueX: dataItem.get("valueX"), value_close: dataItem.get("valueY"), value_high: dataItem.get("highValueY"), value_low: dataItem.get("lowValueY") });
});
return data;
}
/**
* @ignore
*/
prepareData() {
super.prepareData();
if (this.series) {
let period = this.get("period", 20);
const stockSeries = this.get("stockSeries");
const dataItems = stockSeries.dataItems;
let data = this._getDataArray(dataItems);
let i = 0;
let index = 0;
let tr = 0;
let prevClose;
let prevATR;
$array.each(data, (dataItem) => {
let valueClose = dataItem.value_close;
if (valueClose != null && prevClose != null) {
i++;
tr = Math.max(dataItem.value_high - dataItem.value_low, Math.abs(dataItem.value_high - prevClose), Math.abs(dataItem.value_low - prevClose));
dataItem.tr = tr;
if (i >= period) {
if (i == period) {
let sum = 0;
let k = 0;
for (let j = index; j >= 0; j--) {
sum += data[j].tr;
k++;
if (k == period) {
break;
}
}
dataItem.atr = sum / period;
}
else {
if (prevATR != null) {
dataItem.atr = (prevATR * (period - 1) + tr) / period;
}
}
prevATR = dataItem.atr;
}
}
prevClose = valueClose;
index++;
});
this.series.updateData(data);
}
}
}
AverageTrueRange.className = "AverageTrueRange";
AverageTrueRange.classNames = ChartIndicator.classNames.concat([AverageTrueRange.className]);
//# sourceMappingURL=AverageTrueRange.js.map