fast-technical-indicators
Version:
High-performance technical indicators with zero dependencies - compatible with technicalindicators package
83 lines (82 loc) • 2.61 kB
JavaScript
export function heikinashi(input) {
const { candles } = input;
if (!candles || candles.length === 0) {
return [];
}
const result = [];
let previousHA = null;
for (let i = 0; i < candles.length; i++) {
const candle = candles[i];
const { open, high, low, close } = candle;
let haOpen;
let haClose;
let haHigh;
let haLow;
// Heikin Ashi Close = (Open + High + Low + Close) / 4
haClose = (open + high + low + close) / 4;
if (previousHA === null) {
// First candle: HA Open = (Open + Close) / 2
haOpen = (open + close) / 2;
}
else {
// HA Open = (Previous HA Open + Previous HA Close) / 2
haOpen = (previousHA.open + previousHA.close) / 2;
}
// HA High = Max(High, HA Open, HA Close)
haHigh = Math.max(high, haOpen, haClose);
// HA Low = Min(Low, HA Open, HA Close)
haLow = Math.min(low, haOpen, haClose);
const haCandle = {
open: haOpen,
high: haHigh,
low: haLow,
close: haClose
};
result.push(haCandle);
previousHA = haCandle;
}
return result;
}
export class HeikinAshi {
constructor(input) {
this.candles = [];
this.previousHA = null;
if (input?.candles?.length) {
input.candles.forEach(candle => this.nextValue(candle));
}
}
nextValue(candle) {
this.candles.push(candle);
const { open, high, low, close } = candle;
let haOpen;
let haClose;
let haHigh;
let haLow;
// Heikin Ashi Close = (Open + High + Low + Close) / 4
haClose = (open + high + low + close) / 4;
if (this.previousHA === null) {
// First candle: HA Open = (Open + Close) / 2
haOpen = (open + close) / 2;
}
else {
// HA Open = (Previous HA Open + Previous HA Close) / 2
haOpen = (this.previousHA.open + this.previousHA.close) / 2;
}
// HA High = Max(High, HA Open, HA Close)
haHigh = Math.max(high, haOpen, haClose);
// HA Low = Min(Low, HA Open, HA Close)
haLow = Math.min(low, haOpen, haClose);
const haCandle = {
open: haOpen,
high: haHigh,
low: haLow,
close: haClose
};
this.previousHA = haCandle;
return haCandle;
}
getResult() {
return heikinashi({ candles: this.candles });
}
}
HeikinAshi.calculate = heikinashi;