@amcharts/amcharts5
Version:
amCharts 5
122 lines • 4.46 kB
JavaScript
import { ChartIndicator } from "./ChartIndicator";
import { LineSeries } from "../../xy/series/LineSeries";
import * as $array from "../../../core/util/Array";
import * as $type from "../../../core/util/Type";
/**
* An implementation of a [[StockChart]] indicator.
*
* @see {@link https://www.amcharts.com/docs/v5/charts/stock/indicators/} for more info
*/
export class Trix extends ChartIndicator {
constructor() {
super(...arguments);
this._editableSettings = [{
key: "period",
name: this.root.language.translateAny("Period"),
type: "number",
minValue: 2,
maxValue: 100,
step: 1
}, {
key: "seriesColor",
name: this.root.language.translateAny("Color"),
type: "color"
}, {
key: "signalPeriod",
name: this.root.language.translateAny("Signal period"),
type: "number",
minValue: 2,
maxValue: 40,
step: 1
}, {
key: "signalColor",
name: this.root.language.translateAny("Signal color"),
type: "color"
}];
this._themeTag = "trix";
}
_createSeries() {
return this.panel.series.push(LineSeries.new(this._root, {
themeTags: ["indicator"],
xAxis: this.xAxis,
yAxis: this.yAxis,
valueXField: "valueX",
valueYField: "trix",
fill: undefined
}));
}
_afterNew() {
this._themeTags.push("trix");
super._afterNew();
const chart = this.panel;
if (chart) {
const signalSeries = chart.series.push(LineSeries.new(this._root, {
valueXField: "valueX",
valueYField: "signal",
xAxis: this.xAxis,
yAxis: this.yAxis,
groupDataDisabled: true,
themeTags: ["indicator", "signal"]
}));
this.signalSeries = signalSeries;
}
}
_prepareChildren() {
super._prepareChildren();
if (this.isDirty("signalPeriod")) {
this.markDataDirty();
this.setCustomData("signalPeriod", this.get("signalPeriod"));
}
}
_updateChildren() {
super._updateChildren();
if (this.isDirty("signalColor")) {
this._updateSeriesColor(this.signalSeries, this.get("signalColor"), "signalColor");
}
const dataItem = this.series.dataItem;
if (dataItem) {
const dataContext = dataItem.dataContext;
if (dataContext) {
dataContext.signalPeriod = this.get("signalPeriod");
const signalColor = this.get("signalColor");
if (signalColor) {
dataContext.signalColor = signalColor.toCSSHex();
}
}
}
}
/**
* @ignore
*/
prepareData() {
super.prepareData();
if (this.series) {
let period = this.get("period", 14);
const stockSeries = this.get("stockSeries");
const dataItems = stockSeries.dataItems;
let data = this._getDataArray(dataItems);
this._ema(data, period, "value_y", "ema");
this._ema(data, period, "ema", "ema2");
this._ema(data, period, "ema2", "ema3");
let previousDataItem;
let previousValue;
$array.each(data, (dataItem) => {
let value = dataItem.ema3;
if (previousDataItem) {
previousValue = previousDataItem.ema3;
}
if ($type.isNumber(value) && $type.isNumber(previousValue)) {
dataItem.trix = 100 * (value - previousValue) / previousValue;
}
previousDataItem = dataItem;
});
this.series.updateData(data);
period = this.get("signalPeriod", 9);
this._sma(data, period, "trix", "signal");
this.signalSeries.updateData(data);
}
}
}
Trix.className = "Trix";
Trix.classNames = ChartIndicator.classNames.concat([Trix.className]);
//# sourceMappingURL=Trix.js.map