Bot & Automation
Treding Forex Ai
/root/hermes-projects/Treding Forex Ai
dist/src/utils/math.js
text
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.clamp = clamp;
exports.roundTo = roundTo;
exports.simpleMovingAverage = simpleMovingAverage;
exports.exponentialMovingAverage = exponentialMovingAverage;
exports.relativeStrengthIndex = relativeStrengthIndex;
exports.averageTrueRange = averageTrueRange;
exports.macdHistogram = macdHistogram;
exports.supportResistance = supportResistance;
function clamp(value, min, max) {
return Math.min(Math.max(value, min), max);
}
function roundTo(value, digits = 5) {
const factor = 10 ** digits;
return Math.round(value * factor) / factor;
}
function simpleMovingAverage(values, period) {
if (values.length < period) {
return average(values);
}
return average(values.slice(-period));
}
function exponentialMovingAverage(values, period) {
if (values.length === 0) {
return 0;
}
const smoothing = 2 / (period + 1);
const seed = simpleMovingAverage(values.slice(0, Math.min(period, values.length)), period);
return values.slice(1).reduce((previous, current) => {
return current * smoothing + previous * (1 - smoothing);
}, seed);
}
function relativeStrengthIndex(values, period = 14) {
if (values.length <= period) {
return 50;
}
const changes = values.slice(1).map((value, index) => value - values[index]);
const recent = changes.slice(-period);
const gains = recent.filter((value) => value > 0).reduce((sum, value) => sum + value, 0);
const losses = Math.abs(recent.filter((value) => value < 0).reduce((sum, value) => sum + value, 0));
if (losses === 0) {
return 100;
}
const relativeStrength = gains / losses;
return 100 - 100 / (1 + relativeStrength);
}
function averageTrueRange(candles, period = 14) {
if (candles.length < 2) {
return 0;
}
const trueRanges = candles.slice(1).map((candle, index) => {
const previousClose = candles[index].close;
return Math.max(candle.high - candle.low, Math.abs(candle.high - previousClose), Math.abs(candle.low - previousClose));
});
return simpleMovingAverage(trueRanges, Math.min(period, trueRanges.length));
}
function macdHistogram(values) {
const ema12 = exponentialMovingAverage(values, 12);
const ema26 = exponentialMovingAverage(values, 26);
const macdLine = ema12 - ema26;
const recentMacdValues = values.slice(-9).map((_, index, recent) => {
const sliceEnd = values.length - recent.length + index + 1;
const slice = values.slice(0, sliceEnd);
return exponentialMovingAverage(slice, 12) - exponentialMovingAverage(slice, 26);
});
const signalLine = exponentialMovingAverage(recentMacdValues, 9);
return macdLine - signalLine;
}
function supportResistance(candles, lookback = 40) {
const recent = candles.slice(-lookback);
return {
support: Math.min(...recent.map((candle) => candle.low)),
resistance: Math.max(...recent.map((candle) => candle.high))
};
}
function average(values) {
if (values.length === 0) {
return 0;
}
return values.reduce((sum, value) => sum + value, 0) / values.length;
}