Проблема с вычислением RSI из API узла Binance - PullRequest
1 голос
/ 17 июня 2020

Я написал программу на javascript (Node), которая должна рассчитывать RSI с использованием API Binance.

Единственное, что моя программа не вычисляет «настоящий» RSI. Например, если я установил свой период 14 дней, как говорит формула - я получаю значение RSI, равное ~ 28, а реальный RSI равен 38.

Если я изменяю период и устанавливаю его на 20 , я получаю RSI, довольно близкий к реальному: у меня 39, а у меня 38.

Я не могу понять. Что я делаю не так. Есть предложения?

Вот мой код:

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();
...