From 94831e3b819a24b54e4b85f0d6c7812f0eeeaed4 Mon Sep 17 00:00:00 2001 From: joeuhren Date: Fri, 18 Oct 2019 23:53:54 -0600 Subject: [PATCH] add support for Crex24 exchange --- lib/database.js | 6 ++ lib/locale.js | 1 + lib/markets/crex.js | 136 +++++++++++++++++++++++++++++++++++++++++ locale/en.json | 1 + views/markets/crex.pug | 106 ++++++++++++++++++++++++++++++++ 5 files changed, 250 insertions(+) create mode 100644 lib/markets/crex.js create mode 100644 views/markets/crex.pug diff --git a/lib/database.js b/lib/database.js index 4e99333..cc94853 100644 --- a/lib/database.js +++ b/lib/database.js @@ -18,6 +18,7 @@ var mongoose = require('mongoose') , ccex = require('./markets/ccex') , coinexchange = require('./markets/coinexchange') , stex = require('./markets/stex') + , crex = require('./markets/crex') , coindesk = require('./apis/coindesk'); function find_address(hash, caseSensitive, cb) { @@ -252,6 +253,11 @@ function get_market_data(market, cb) { return cb(err, obj); }); break; + case 'crex': + crex.get_data(settings.markets.coin, settings.markets.exchange, function (err, obj) { + return cb(err, obj); + }); + break; default: return cb(null); } diff --git a/lib/locale.js b/lib/locale.js index e2526ce..8fa60e8 100644 --- a/lib/locale.js +++ b/lib/locale.js @@ -151,6 +151,7 @@ exports.empoex = "Empoex", exports.ccex = "C-Cex", exports.coinexchange = "CoinExchange", exports.stex = "Stex", +exports.crex = "Crex24", exports.reloadLocale = function reloadLocale(locale) { // Discover where the locale file lives diff --git a/lib/markets/crex.js b/lib/markets/crex.js new file mode 100644 index 0000000..06f71d8 --- /dev/null +++ b/lib/markets/crex.js @@ -0,0 +1,136 @@ +var request = require('request'); +var base_url = 'https://api.crex24.com/v2/public'; + +/** + * Get the Trades from the Crex24 API + * + * Request : https://api.crex24.com/v2/public/tickers?instrument=IPS-BTC + * + * + * @param {*} coin = ips + * @param {*} exchange = btc + * @param {*} cb = Callback + */ +function get_summary(coin, exchange, cb) { + var summary = {}; + var url=base_url + '/tickers?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); + request({uri: url, json: true}, function (error, response, body) { + if (error) { + return cb(error, null); + } else if (body.error !== true) { + summary['ask'] = parseFloat(body[0]['ask']).toFixed(8); + summary['bid'] = parseFloat(body[0]['bid']).toFixed(8); + summary['volume'] = parseFloat(body[0]['baseVolume']).toFixed(8); + summary['volume_btc'] = parseFloat(body[0]['volumeInBtc']).toFixed(8); + summary['high'] = parseFloat(body[0]['high']).toFixed(8); + summary['low'] = parseFloat(body[0]['low']).toFixed(8); + summary['last'] = parseFloat(body[0]['last']).toFixed(8); + summary['change'] = parseFloat(body[0]['percentChange']); + return cb(null, summary); + } else { + return cb(error, null); + } + }); +} + +/** + * Get the Latest Trades from the Crex24 API + * + * Request : https://api.crex24.com/v2/public/recentTrades?instrument=LTC-BTC + * Issues : Label is not present in API + * @param {*} coin = ips + * @param {*} exchange = btc + * @param {*} cb = Callback + */ +function get_trades(coin, exchange, cb) { + var req_url = base_url + '/recentTrades?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); + request({ uri: req_url, json: true }, function (error, response, body) { + if(error) + return cb(error, null); + else if (body.error !== true) { + var tTrades = body; + var trades = []; + for (var i = 0; i < tTrades.length; i++) { + var Trade = { + orderpair: tTrades[i].Label, + ordertype: tTrades[i].side, + amount: parseFloat(tTrades[i].volume).toFixed(8), + price: parseFloat(tTrades[i].price).toFixed(8), + // total: parseFloat(tTrades[i].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(tTrades[i].volume).toFixed(8) * parseFloat(tTrades[i].price)).toFixed(8), + timestamp: parseInt((new Date(tTrades[i].timestamp).getTime() / 1000).toFixed(0)) + } + trades.push(Trade); + } + return cb(null, trades); + } else { + return cb(body.Message, null); + } + }); +} + +/** + * Get the Latest Orders from the Crex24 API + * + * Request : https://api.crex24.com/v2/public/orderBook?instrument=IPS-BTC + * + * @param {*} coin = ips + * @param {*} exchange = btc + * @param {*} cb = Callback + */ +function get_orders(coin, exchange, cb) { + var req_url = base_url + '/orderBook?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); + request({ uri: req_url, json: true }, function (error, response, body) { + if(error) + return cb(error, null); + else if (body.error !== true) { + var buyorders = body['buyLevels']; + var sellorders = body['sellLevels']; + var buys = []; + var sells = []; + if (buyorders.length > 0){ + for (var i = 0; i < buyorders.length; i++) { + var order = { + amount: parseFloat(buyorders[i].volume).toFixed(8), + price: parseFloat(buyorders[i].price).toFixed(8), + // total: parseFloat(orders.BuyOrders[i].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(buyorders[i].volume).toFixed(8) * parseFloat(buyorders[i].price)).toFixed(8) + } + buys.push(order); + } + } + if (sellorders.length > 0) { + for (var x = 0; x < sellorders.length; x++) { + var order = { + amount: parseFloat(sellorders[x].volume).toFixed(8), + price: parseFloat(sellorders[x].price).toFixed(8), + // total: parseFloat(orders.SellOrders[x].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(sellorders[x].volume).toFixed(8) * parseFloat(sellorders[x].price)).toFixed(8) + } + sells.push(order); + } + } + return cb(null, buys, sells); + } else + return cb(body.Message, [], []) + }); +} + +module.exports = { + get_data: function(coin, exchange, cb) { + var error = null; + get_orders(coin, exchange, function(err, buys, sells) { + if (err) { error = err; } + get_trades(coin, exchange, function(err, trades) { + if (err) { error = err; } + get_summary(coin, exchange, function(err, stats) { + if (err) { error = err; } + return cb(error, {buys: buys, sells: sells, chartdata: [], trades: trades, stats: stats}); + }); + }); + }); + } +}; \ No newline at end of file diff --git a/locale/en.json b/locale/en.json index 60158f0..b7cc87f 100644 --- a/locale/en.json +++ b/locale/en.json @@ -141,6 +141,7 @@ "ccex": "C-Cex", "coinexchange": "CoinExchange", "stex": "Stex", + "crex": "Crex24", // Heavy rewards view "heavy_title": "Reward/voting information", diff --git a/views/markets/crex.pug b/views/markets/crex.pug new file mode 100644 index 0000000..57c10d8 --- /dev/null +++ b/views/markets/crex.pug @@ -0,0 +1,106 @@ +extends menu + +block market_view + .row + .col-md-12 + .panel.panel-default + .panel-heading + strong #{settings.locale.crex} - #{marketdata.coin}/#{marketdata.exchange} - #{settings.locale.mkt_hours} + a(href='#') + span.fas.fa-chart-line.pull-right.view-chart-disabled.iquidus.market-toggle(data-toggle='tooltip', data-placement='bottom', title=settings.locale.mkt_no_chart) + table.table.table-bordered.summary-table + thead + tr + th #{settings.locale.mkt_high} + th #{settings.locale.mkt_low} + th #{settings.locale.mkt_volume} + th.hidden-xs #{settings.locale.mkt_top_bid} + th.hidden-xs #{settings.locale.mkt_top_ask} + th.hidden-xs #{settings.locale.mkt_last} + tbody + tr + td #{marketdata.data.summary.high} + td #{marketdata.data.summary.low} + td #{marketdata.data.summary.volume} + td.hidden-xs #{marketdata.data.summary.bid} + td.hidden-xs #{marketdata.data.summary.ask} + td.hidden-xs #{marketdata.data.summary.last} + .row + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_buy_orders} + table.table.table-striped.table-bordered.order-table + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each buy in marketdata.data.buys + tr + td + =buy.price + td + =buy.amount + td.hidden-xs + =buy.total + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_sell_orders} + table.table.table-striped.table-bordered.order-table + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each sell in marketdata.data.sells + tr + td + =sell.price + td + =sell.amount + td.hidden-xs + =sell.total + .row + .col-md-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_trade_history} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th.hidden-xs #{settings.locale.mkt_type} + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_total} (#{marketdata.exchange}) + th.hidden-xs #{settings.locale.mkt_time_stamp} + tbody + each order in marketdata.data.history + if order.ordertype.toUpperCase() == 'BUY' + tr.success + td.hidden-xs + =order.ordertype + td + =order.amount + td + =order.price + td + =order.total + td.hidden-xs + =(new Date(order.timestamp * 1000).toUTCString()) + else + tr.danger + td.hidden-xs + =order.ordertype + td + =order.amount + td + =order.price + td + =order.total + td.hidden-xs + =(new Date(order.timestamp * 1000).toUTCString()) + .footer-padding \ No newline at end of file