Although there are already several APIs that include this functionality, it does not hurt to know how to implement it so as not to depend on third-party functions, I share this code snippet that I wrote myself and that I hope will help you in your own applications, it still requires validation code. but it works in the cases that the data is passed correctly, I also wait for corrections of it from you to improve it little by little
const burl = 'https://api.binance.com';
const bwsurl = 'wss://stream.binance.com:9443/ws/';
const intervals = {
'1m': {
'ms': 1000 * 60,
'intervalNum': 1,
'intervalLetter': 'm'
},
'3m': {
'ms': 1000 * 60 * 3,
'intervalNum': 3,
'intervalLetter': 'm'
},
'5m': {
'ms': 1000 * 60 * 5,
'intervalNum': 5,
'intervalLetter': 'm'
},
'15m': {
'ms': 1000 * 60 * 15,
'intervalNum': 15,
'intervalLetter': 'm'
},
'30m': {
'ms': 1000 * 60 * 30,
'intervalNum': 30,
'intervalLetter': 'm'
},
'1h': {
'ms': 1000 * 60 * 60,
'intervalNum': 1,
'intervalLetter': 'h'
},
'2h': {
'ms': 1000 * 60 * 60 * 2,
'intervalNum': 2,
'intervalLetter': 'h'
},
'4h': {
'ms': 1000 * 60 * 60 * 4,
'intervalNum': 4,
'intervalLetter': 'h'
},
'6h': {
'ms': 1000 * 60 * 60 * 6,
'intervalNum': 6,
'intervalLetter': 'h'
},
'8h': {
'ms': 1000 * 60 * 60 * 8,
'intervalNum': 8,
'intervalLetter': 'h'
},
'12h': {
'ms': 1000 * 60 * 60 * 12,
'intervalNum': 12,
'intervalLetter': 'h'
},
'1d': {
'ms': 1000 * 60 * 60 * 24,
'intervalNum': 1,
'intervalLetter': 'd'
},
'3d': {
'ms': 1000 * 60 * 60 * 24 * 3,
'intervalNum': 3,
'intervalLetter': 'd'
},
'1w': {
'ms': 1000 * 60 * 60 * 24 * 7,
'intervalNum': 1,
'intervalLetter': 'w'
},
'1M': {
'ms': 1000 * 60 * 60 * 24 * 30,
'intervalNum': 1,
'intervalLetter': 'M'
}
};
function klines(symbol = ‘BTCUSDT’, interval = ‘1d’, limit = 1000, startTime = null, endTime = null, callback = () => {}) {
extKlines(klArray = , symbol, interval, limit, startTime, endTime, callback);
}
function extKlines(klArray, symbol, interval, limit, startTime, endTime, callback) {
var endpoint = ‘/api/v3/klines’,
url = burl + endpoint + ‘?symbol=’ + symbol + ‘&interval=’ + interval;
if(limit > 0) {
var xhttp = new XMLHttpRequest();
url += '&limit=' + (limit > 1000 ? 1000 : limit);
url += '&startTime=' + (startTime ? startTime : Date.now() - (intervals[interval].ms * limit));
url += endTime ? (limit > 1000 ? '' : '&endTime=' + endTime) : '';
xhttp.responseType = 'json';
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200){
klArray.length != 0 ? klArray = klArray.concat(this.response) : klArray = this.response;
limit -= 1000;
startTime = this.response[this.response.length - 1][0] + intervals[interval].ms;
setTimeout(extKlines(klArray, symbol, interval, limit, startTime, endTime, callback), 1000);
}
};
xhttp.open('GET', url, true);
xhttp.send();
}else{
callback(klArray);
}
}