Multi-asset price.js
This commit is contained in:
parent
67c31d79a9
commit
dbad25044a
@ -444,8 +444,8 @@ function blockchainReCheck() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
get rate() {
|
get rates() {
|
||||||
return coupling.price.currentRate;
|
return coupling.price.currentRates;
|
||||||
},
|
},
|
||||||
addBuyOrder,
|
addBuyOrder,
|
||||||
addSellOrder,
|
addSellOrder,
|
||||||
|
|||||||
90
src/price.js
90
src/price.js
@ -10,37 +10,41 @@ const MIN_TIME = 10 * 1000, // 1 * 60 * 60 * 1000,
|
|||||||
|
|
||||||
var DB; //container for database
|
var DB; //container for database
|
||||||
|
|
||||||
var cur_rate, //container for FLO price (from API or by model)
|
var cur_rate = {}, //container for FLO price (from API or by model)
|
||||||
lastTime = Date.now(), //container for timestamp of the last tx
|
lastTime = {}, //container for timestamp of the last tx
|
||||||
noBuyOrder,
|
noBuyOrder = {},
|
||||||
noSellOrder;
|
noSellOrder = {};
|
||||||
|
|
||||||
const updateLastTime = () => lastTime = Date.now();
|
const updateLastTime = asset => lastTime[asset] = Date.now();
|
||||||
|
|
||||||
//store FLO price in DB every 1 hr
|
//store FLO price in DB every 1 hr
|
||||||
function storeRate(rate = cur_rate) {
|
function storeRate(asset, rate) {
|
||||||
DB.query("INSERT INTO priceHistory (rate) VALUE (?)", rate)
|
DB.query("INSERT INTO priceHistory (asset, rate) VALUE (?, ?)", [asset, rate])
|
||||||
.then(_ => null).catch(error => console.error(error))
|
.then(_ => null).catch(error => console.error(error))
|
||||||
}
|
}
|
||||||
setInterval(storeRate, REC_HISTORY_INTERVAL)
|
setInterval(() => {
|
||||||
|
for (let asset in cur_rate)
|
||||||
|
storeRate(asset, cur_rate[asset]);
|
||||||
|
}, REC_HISTORY_INTERVAL)
|
||||||
|
|
||||||
function getPastRate(hrs = 24) {
|
function getPastRate(asset, hrs = 24) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
DB.query("SELECT rate FROM priceHistory WHERE rec_time >= NOW() - INTERVAL ? hour ORDER BY rec_time LIMIT 1", [hrs])
|
DB.query("SELECT rate FROM priceHistory WHERE asset=? AND rec_time >= NOW() - INTERVAL ? hour ORDER BY rec_time LIMIT 1", [asset, hrs])
|
||||||
.then(result => result.length ? resolve(result[0].rate) : reject('No records found in past 24hrs'))
|
.then(result => result.length ? resolve(result[0].rate) : reject('No records found in past 24hrs'))
|
||||||
.catch(error => reject(error))
|
.catch(error => reject(error))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadRate() {
|
function loadRate(asset) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (typeof cur_rate !== "undefined")
|
if (typeof cur_rate[asset] !== "undefined")
|
||||||
return resolve(cur_rate);
|
return resolve(cur_rate[asset]);
|
||||||
DB.query("SELECT rate FROM priceHistory ORDER BY rec_time DESC LIMIT 1").then(result => {
|
updateLastTime(asset);
|
||||||
|
DB.query("SELECT rate FROM priceHistory WHERE asset=? ORDER BY rec_time DESC LIMIT 1", [asset]).then(result => {
|
||||||
if (result.length)
|
if (result.length)
|
||||||
resolve(cur_rate = result[0].rate);
|
resolve(cur_rate[asset] = result[0].rate);
|
||||||
else
|
else
|
||||||
fetchRates().then(rate => resolve(cur_rate = rate)).catch(error => reject(error));
|
fetchRates().then(rate => resolve(cur_rate[asset] = rate)).catch(error => reject(error));
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -84,50 +88,50 @@ fetchRates.USD_INR = function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRates() {
|
function getRates(asset) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
loadRate().then(_ => {
|
loadRate(asset).then(_ => {
|
||||||
console.debug(cur_rate);
|
console.debug(cur_rate[asset]);
|
||||||
let cur_time = Date.now();
|
let cur_time = Date.now();
|
||||||
if (cur_time - lastTime < MIN_TIME) //Minimum time to update not crossed: No update required
|
if (cur_time - lastTime[asset] < MIN_TIME) //Minimum time to update not crossed: No update required
|
||||||
resolve(cur_rate);
|
resolve(cur_rate[asset]);
|
||||||
else if (noBuyOrder && noSellOrder) //Both are not available: No update required
|
else if (noBuyOrder[asset] && noSellOrder[asset]) //Both are not available: No update required
|
||||||
resolve(cur_rate);
|
resolve(cur_rate[asset]);
|
||||||
else if (noBuyOrder === null || noSellOrder === null) //An error has occured during last process: No update (might cause price to crash/jump)
|
else if (noBuyOrder[asset] === null || noSellOrder[asset] === null) //An error has occured during last process: No update (might cause price to crash/jump)
|
||||||
resolve(cur_rate);
|
resolve(cur_rate[asset]);
|
||||||
else
|
else
|
||||||
getPastRate().then(ratePast24hr => {
|
getPastRate(asset).then(ratePast24hr => {
|
||||||
if (noBuyOrder) {
|
if (noBuyOrder[asset]) {
|
||||||
//No Buy, But Sell available: Decrease the price
|
//No Buy, But Sell available: Decrease the price
|
||||||
let tmp_val = cur_rate * (1 - DOWN_RATE);
|
let tmp_val = cur_rate[asset] * (1 - DOWN_RATE);
|
||||||
if (tmp_val >= ratePast24hr * (1 - MAX_DOWN_PER_DAY)) {
|
if (tmp_val >= ratePast24hr * (1 - MAX_DOWN_PER_DAY)) {
|
||||||
cur_rate = tmp_val;
|
cur_rate[asset] = tmp_val;
|
||||||
updateLastTime();
|
updateLastTime(asset);
|
||||||
} else
|
} else
|
||||||
console.debug("Max Price down for the day has reached");
|
console.debug("Max Price down for the day has reached");
|
||||||
resolve(cur_rate);
|
resolve(cur_rate[asset]);
|
||||||
} else if (noSellOrder) {
|
} else if (noSellOrder[asset]) {
|
||||||
//No Sell, But Buy available: Increase the price
|
//No Sell, But Buy available: Increase the price
|
||||||
checkForRatedSellers().then(result => {
|
checkForRatedSellers().then(result => {
|
||||||
if (result) {
|
if (result) {
|
||||||
let tmp_val = cur_rate * (1 + UP_RATE);
|
let tmp_val = cur_rate[asset] * (1 + UP_RATE);
|
||||||
if (tmp_val <= ratePast24hr * (1 + MAX_UP_PER_DAY)) {
|
if (tmp_val <= ratePast24hr * (1 + MAX_UP_PER_DAY)) {
|
||||||
cur_rate = tmp_val;
|
cur_rate[asset] = tmp_val;
|
||||||
updateLastTime();
|
updateLastTime(asset);
|
||||||
} else
|
} else
|
||||||
console.debug("Max Price up for the day has reached");
|
console.debug("Max Price up for the day has reached");
|
||||||
}
|
}
|
||||||
}).catch(error => console.error(error)).finally(_ => resolve(cur_rate));
|
}).catch(error => console.error(error)).finally(_ => resolve(cur_rate[asset]));
|
||||||
}
|
}
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
resolve(cur_rate);
|
resolve(cur_rate[asset]);
|
||||||
});
|
});
|
||||||
}).catch(error => reject(error));
|
}).catch(error => reject(error));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkForRatedSellers() {
|
function checkForRatedSellers(asset) {
|
||||||
//Check if there are best rated sellers?
|
//Check if there are best rated sellers?
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
DB.query("SELECT MAX(sellPriority) as max_p FROM TagList").then(result => {
|
DB.query("SELECT MAX(sellPriority) as max_p FROM TagList").then(result => {
|
||||||
@ -144,14 +148,14 @@ function checkForRatedSellers() {
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
getRates,
|
getRates,
|
||||||
updateLastTime,
|
updateLastTime,
|
||||||
noOrder(buy, sell) {
|
noOrder(asset, buy, sell) {
|
||||||
noBuyOrder = buy;
|
noBuyOrder[asset] = buy;
|
||||||
noSellOrder = sell;
|
noSellOrder[asset] = sell;
|
||||||
},
|
},
|
||||||
set DB(db) {
|
set DB(db) {
|
||||||
DB = db;
|
DB = db;
|
||||||
},
|
},
|
||||||
get currentRate() {
|
get currentRates() {
|
||||||
return cur_rate
|
return Object.assign({}, cur_rate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -272,7 +272,7 @@ function getRate(req, res) {
|
|||||||
if (!serving)
|
if (!serving)
|
||||||
res.status(INVALID.e_code).send(INVALID_SERVER_MSG);
|
res.status(INVALID.e_code).send(INVALID_SERVER_MSG);
|
||||||
else
|
else
|
||||||
res.send(`${market.rate}`);
|
res.send(`${market.rates}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Account(req, res) {
|
function Account(req, res) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user