Problem calculating RSI from the Binance node API

Viewed 3408

I have written a program in javascript (Node) that is supposed to calculate the RSI using the Binance api.

The only thing is that my program does not calculate the "real" RSI. For example, if i set my period to be 14 days, as the formula says - I get an RSI value equal to ~28 and the real RSI being 38.

If i change the period and set it to 20, i get an RSI pretty close to the real one, with mine being 39 and the real one being 38.

I can't figure it out.what am i doing wrong. Any suggestion?

Here is my code :

const binance = require('node-binance-api')().options({
        APIKEY: 'xxx',
        APISECRET: 'xxx',
        useServerTime: true,
        test: true // True = SandboxMode
    });

    /* VARIABLES */
    let listClose = [];
    let changeUp = 0;
    let changeDown = 0;
    let last_closeHigh = 0;
    let last_closeLow = 0;
    let current_time = Date.now();
    let period = 20;

    function calculateRSI() {
        console.log("Generating RSI");
        binance.candlesticks("ETHBTC", "1d", (error, ticks, symbol) => {
            for (i = 0; i < ticks.length; i++) {
                let last_tick = ticks[i];
                let [time, open, high, low, close, volume, closeTime, assetVolume, trades, buyBaseVolume, buyAssetVolume, ignored] = last_tick;
                listClose.push(close);
                if (i == ticks.length -1 ) {
                    for (x = 0; x < ticks.length; x++) {
                        previous_close = (parseFloat(listClose[x-1]));
                        current_close = (parseFloat(listClose[x]));
                        // HIGH
                        if (current_close > previous_close) {
                            upChange = current_close - previous_close;
                            changeUp += upChange;
                            if (x == ticks.length -1) {
                                last_closeHigh = current_close - previous_close;
                            }
                        }
                        // LOW
                        if (previous_close > current_close) {
                            downChange = previous_close - current_close;
                            changeDown += downChange;
                            if (x == ticks.length - 1) {
                                last_closeLow = previous_close - current_close;
                            }
                        }
                        if (x == ticks.length-1) {
                            AVGHigh = changeUp / period;
                            AVGLow = changeDown / period;
                            Upavg = (AVGHigh * (period -1) + last_closeHigh) / (period);
                            Downavg = (AVGLow * (period -1) + last_closeLow) / (period);
                            RS = Upavg / Downavg;
                            RSI = (100 - (100 / (1 + RS)));
                            console.log(RSI);
                            return RSI;
                        }
                    }
                }
            }
        }, {
            limit: period,
            endTime: current_time
        });
    }
calculateRSI();
1 Answers

Sorry for jumping on this late...but the reason for this is using the Sandbox.

Binance Sandbox is awful and should never be used, it gives bad values.

Related