Skip to content

Commit

Permalink
websocket average bids/asks
Browse files Browse the repository at this point in the history
  • Loading branch information
Your Name committed Mar 25, 2019
1 parent 2fdc4a4 commit deef1b3
Show file tree
Hide file tree
Showing 6 changed files with 4,966 additions and 50 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ To use:
5. Clone this repo, cd into directory


6. Run npm i hitbtc-api express request ejs body-parser portfolio-analytics
6. Run npm i hitbtc-api express request ejs body-parser portfolio-analytics moment bit_mex_api underscore dotenv socks-proxy-agent mongodb bitfinex-api-node binance-api-node system-sleep @okfe/okex-node


7. Run node hitbtc.js
25 changes: 25 additions & 0 deletions bfx.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

require('dotenv').config()

const BFX = require('bitfinex-api-node')
const SocksProxyAgent = require('socks-proxy-agent')

const { API_KEY, API_SECRET, REST_URL, WS_URL, SOCKS_PROXY_URL } = process.env
const agent = SOCKS_PROXY_URL ? new SocksProxyAgent(SOCKS_PROXY_URL) : null

const bfx = new BFX({
apiKey: API_KEY,
apiSecret: API_SECRET,

ws: {
url: WS_URL,
agent
},

rest: {
url: REST_URL,
agent
}
})

module.exports = bfx
307 changes: 294 additions & 13 deletions hitbtc.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@ const HitBTC = require('hitbtc-api').default
var PortfolioAnalytics = require('portfolio-analytics');



const express = require('express');
const app = express();
var request = require("request")
var bodyParser = require('body-parser')
let key = "d236e08c5eb56e8c33b6eb4708804aa8";
let secret = "e9bc8024b9fae13f25f2947c1cbcb0e2";

let targetSpread = 1.05;
let targetSpread = 0.9;
let targetVolDiv = 6;
let targetVolMult = 350;
let maxOrder = 1800000;
Expand All @@ -17,6 +22,286 @@ let returnPortfolio;
let benchmark;
let zeroRisk;
let sharpe;

const Binance = require('binance-api-node').default
var sleep2 = require('system-sleep')
const binance = Binance({
apiKey: '',
apiSecret: ''
})
var ccxt = require("ccxt")
const {
PublicClient
} = require("@okfe/okex-node");
const {
V3WebsocketClient
} = require("@okfe/okex-node");
const {
AuthenticatedClient
} = require("@okfe/okex-node");
const pClient = new PublicClient();
const wss = new V3WebsocketClient();
wss.connect();

var _ = require("underscore")

var moment = require("moment");


const WebSocket = require('ws');

wss.on('open', function open() {
//console.log('opened!');

});
var asks = []
var bids = []
const bfx = require('./bfx.js')
const ws2 = bfx.ws(2, {
transform: true
})

const rest = bfx.rest(2, {});
let keys = []
let keys2 = []
rest.symbols().then(symbols => {
for (var s in symbols) {
//console.log('t' + symbols[s].toUpperCase());
if (symbols[s].toUpperCase().slice(-3) == "ETH" || symbols[s].toUpperCase().slice(-3) == "BTC" || symbols[s].toUpperCase().slice(-3) == "USD") {
keys.push('trade:1m:t' + symbols[s].toUpperCase());

keys2.push('t' + symbols[s].toUpperCase());



}
}
})
wss.on('message', function incoming(data) {
try {
for (var v in JSON.parse(data).data) {
if (JSON.parse(data).data[v].last) {
var symbol = JSON.parse(data).data[v].instrument_id.replace('-', '')
if (asks[symbol] == undefined) {
asks[symbol] = []
bids[symbol] = []
}
if (asks[symbol]['okex'] == undefined) {
asks[symbol]['okex'] = JSON.parse(data).data[v].best_ask;
bids[symbol]['okex'] = JSON.parse(data).data[v].best_bid;
}
asks[symbol]['okex'] = JSON.parse(data).data[v].best_ask;
bids[symbol]['okex'] = JSON.parse(data).data[v].best_bid;
}
}

gogo['okexTrades'] = true
} catch (err) {

}
});


app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
extended: true
}));

app.set('view engine', 'ejs');
var MongoClient = require('mongodb').MongoClient;

app.listen(process.env.PORT || 8080, function() {});

var sortBy = (function() {
var toString = Object.prototype.toString,
// default parser function
parse = function(x) {
return x;
},
// gets the item to be sorted
getItem = function(x) {
var isObject = x != null && typeof x === "object";
var isProp = isObject && this.prop in x;
return this.parser(isProp ? x[this.prop] : x);
};

/**
* Sorts an array of elements.
*
* @param {Array} array: the collection to sort
* @param {Object} cfg: the configuration options
* @property {String} cfg.prop: property name (if it is an Array of objects)
* @property {Boolean} cfg.desc: determines whether the sort is descending
* @property {Function} cfg.parser: function to parse the items to expected type
* @return {Array}
*/
return function sortby(array, cfg) {
if (!(array instanceof Array && array.length)) return [];
if (toString.call(cfg) !== "[object Object]") cfg = {};
if (typeof cfg.parser !== "function") cfg.parser = parse;
cfg.desc = !!cfg.desc ? -1 : 1;
return array.sort(function(a, b) {
a = getItem.call(cfg, a);
b = getItem.call(cfg, b);
return cfg.desc * (a < b ? -1 : +(a > b));
});
};

}());
var gogo = []
var msg = "";

var result3 = []
var result4 = []
var result5 = []
var result6 = []
var result7 = []
var result8 = []
var result9 = []
var result10 = []
var result11 = []
var result12 = []
var result13 = []
var result14 = []

app.post('/', (req, res) => {
doPost(req, res);

});
// See 'options' reference below
let sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
let avgBids = {}
let avgAsks = {}
setInterval(function(){


for (var b in bids) {
let total = 0;
let c = 0;
for( var ex in bids[b]){
total+=parseFloat(bids[b][ex])
c++;
}
avgBids[b] = total / c

total = 0;
c = 0;
for( var ex in asks[b]){
total+=parseFloat(asks[b][ex])
c++;
}
avgAsks[b] = total / c
}
console.log(avgs)
}, 15000)
setTimeout(async function() {


for (var p in pairs) {

wss.subscribe("spot/ticker:" + pairs[p].replace('/', '-'));
sleep2(2)
doOthers({
symbol: pairs[p]
});
}

}, 10000);
let pairs = []
binance.ws.allTickers(tickers => {
for (var t in tickers) {
if (asks[tickers[t].symbol] == undefined) {
asks[tickers[t].symbol] = {}
bids[tickers[t].symbol] = {}
}
let pair;
if (tickers[t].symbol.substring(tickers[t].symbol.length - 4, tickers[t].symbol.length).startsWith('USD')) {
pair = tickers[t].symbol.substring(0, tickers[t].symbol.length - 4) + '/' + tickers[t].symbol.substring(tickers[t].symbol.length - 4, tickers[t].symbol.length);
} else {
pair = tickers[t].symbol.substring(0, tickers[t].symbol.length - 3) + '/' + tickers[t].symbol.substring(tickers[t].symbol.length - 3, tickers[t].symbol.length);

}
if (!pairs.includes(pair)) {
pairs.push(pair);
}
asks[tickers[t].symbol]['binance'] = tickers[t].bestAsk
bids[tickers[t].symbol]['binance'] = tickers[t].bestBid
}
})

async function doOthers(mv) {

var pair = mv.symbol.replace('/', '')
if (pair.slice(-3) == "USD") {
pair += "T"
}
var ts = Math.round(new Date().getTime() / 1000);
var tsYesterday = ts - (0.005 * 3600);

if (pair == "BTCUSDT") {
var p = "XBTUSD";
} else {
var p = pair;
}
var opts = {
'symbol': p,
'startTime': moment(tsYesterday * 1000).format()
};
//console.log(opts);

var pd = pair.split('/')[0]
if (pd.slice(-3) == "USD") {
pd += "T"
}
//console.log(pd);

try {
var p;
if (pair == "BTC/USDT") {
p = 'btc_usdt';
} else {
p = pair


}

} catch (err) { ////console.log(err); gogo['okexTrades'] = true;
}

try {

if (pair.slice(-4) == "USDT") {
var p = pair.substr(0, pair.length - 1).split('/')[0];
} else {
var p = pair.split('/')[0];
}

if (keys2.includes('t' + p)){
ws2.subscribeTicker("t" + p)
}


} catch (err) {
gogo['bitfinexTrades'] = true;
}
}
ws2.onTicker({}, (ticker) => {
var p = ticker.symbol.substr(1, ticker.symbol.length)
if (p.slice(-3) == 'USD') {
p += "T"
}
if (asks[p] == undefined) {
asks[p] = []
bids[p] = []
}
asks[p]['bitfinex'] = ticker.ask
bids[p]['bitfinex'] = ticker.bid
gogo['bitfinexTrades'] = true;

})
ws2.open()
var done = []

setInterval(function(){
doSharpe();

Expand Down Expand Up @@ -61,11 +346,6 @@ let buyQtys = {}
let lalesss = {};
let hblesss = {};

const express = require('express');
const app = express();
var request = require("request")
var bodyParser = require('body-parser')

app.use(bodyParser.json()); // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
extended: true
Expand All @@ -91,9 +371,9 @@ app.post('/', (req, res) => {
})
let maxbal = 50;
let total2 = 0;
let btcstart = 0.013381376071530442;
let ethstart = 0.3958733866351123;
let usdstart = 53.18361012749416;
let btcstart = 0.014168187435742434;
let ethstart = 0.42012825241522367;
let usdstart =56.23962825305909;


let btcref = 3987;
Expand Down Expand Up @@ -721,10 +1001,10 @@ async function doit() {
dontgo = true;
}
////console.log(bp)
if ((neversellataloss == true && sp < buyOs[symbol])){
if ((neversellataloss == true && ((avgBids[symbol] != undefined && sp < avgBids[symbol]) || (avgBids[symbol] == undefined && sp > buyOs[symbol])))){
dontbuy[symbol] = true;
}
if (dontgo == false && sellQty > 0.00000001 && (neversellataloss == true && sp > buyOs[symbol])) {
if (dontgo == false && sellQty > 0.00000001 && (neversellataloss == true && ((avgBids[symbol] != undefined && sp < avgBids[symbol]) || (avgBids[symbol] == undefined && sp > buyOs[symbol])))) {
dontbuy[symbol] = false;
//lala++;
try {
Expand Down Expand Up @@ -909,10 +1189,10 @@ async function doit() {
////console.log(buyQty)
////console.log(bp)

if ((neversellataloss == true && sp < buyOs[symbol])){
if ((neversellataloss == true && ((avgBids[symbol] != undefined && sp < avgBids[symbol]) || (avgBids[symbol] == undefined && sp > buyOs[symbol])))){
dontbuy[symbol] = true;
}
if (dontgo == false && sellQty > 0.00001 && (neversellataloss == true && sp > buyOs[symbol])) {
if (dontgo == false && sellQty > 0.00001 && (neversellataloss == true && ((avgBids[symbol] != undefined && sp < avgBids[symbol]) || (avgBids[symbol] == undefined && sp > buyOs[symbol])))) {
dontbuy[symbol] = false;
//lala++;
try {
Expand Down Expand Up @@ -1088,6 +1368,7 @@ if (true){
//console.log('dontgo minqty ' + symbol)
dontgo = true;
}

if (dontgo == false && buyQty > 0.00001 && ((neversellataloss == true && dontbuy[symbol] == false) || (dontbuy[symbol] == undefined))) {
renew[symbol] = false;
buyOs[symbol] = bp;
Expand Down
Loading

0 comments on commit deef1b3

Please sign in to comment.