Nodejs MetaAPI Cloud / Calculate Moving Average
P粉715274052
P粉715274052 2023-09-03 09:12:59
0
2
273
<p>I am making a trading bot using metaapi.cloud and I am trying to calculate moving average (fast/exponential) but it returns me invalid values, here is my code: </p> <pre class="brush:js;toolbar:false;">async movingAverage(symbol, period, type = "S") { let candles = (await this.account.getHistoricalCandles(symbol, this.params.timeframe, null, period)).map(c => c.close); const result = []; let sum = 0; if (type === "S") { for (let i = 0; i < period; i ) { sum = candles[i]; } result.push(sum / period); for (let i = period; i < candles.length; i ) { sum = sum - candles[i - period] candles[i]; result.push(sum / period) } } else if (type === "E") { const weight = 2 / (period 1); for (let i = 0; i < period; i ) { sum = candles[i]; } sum /= period; result.push(sum); for (let i = period; i < candles.length; i ) { sum = (candles[i] * weight) (sum * (1 - weight)); result.push(sum); } } else { // throwError() } return result; } </pre> <p>Here’s how I use it: </p> <pre class="brush:js;toolbar:false;">async onTick(infos) { let sma = await this.movingAverage(infos.symbol, this.params.fast, "S"); console.log('SMA ' sma[0]); } </pre> <p>Now when I test it, the SMA should return "1906.6963" but it gives me "1900.7813" Maybe I'm using the wrong way to calculate them? If anyone has a solution! Thanks in advance. </p>
P粉715274052
P粉715274052

reply all(2)
P粉071743732
  • SMA looks correct, EMA has many different patterns. Since you didn't post a sample dataset, it's hard to guess what is being passed from the server, but there could be a lot of values ​​that cannot be converted, such as NaN, null, empty strings or numbers with commas, exponents, etc. Just replaced the candles with an array with wrong values. Do some filtering and then do the calculation
  • Consider period > dataset. In this case, set period to length.

In the example below, set period to 1 to see all values ​​processed, and set period to a very large number to see the entire average.

There are definitely other edge cases that I haven't thought of. For brevity, the following examples use SMA.

async function movingAverage(symbol, period, type = "S") {
        let candles = [1,2,3,"","",4, "0",0, null, "99,9123", undefined,"0.123e5", "wrongval", 9, 10, 20, 100]
        .map(d => parseFloat((d ?? "").toString().replace(",",".")))
        .filter(d => +d || +d === 0);
        const result = [];
        if (candles.length <= 0){return result}
        let sum = 0;
        period = Math.min(candles.length, period) || 1;
        for (let i = 0; i < period; i++) {
            sum += candles[i];
        }
        result.push(sum / period);
        for (let i = period; i < candles.length; i++) {
            sum = sum - candles[i - period] + candles[i];
            result.push(sum / period)
        }
        return result;
    }
    movingAverage("SPX",500).then(x => document.getElementById("result").textContent = x)
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!