Skip to content
This repository has been archived by the owner on Feb 16, 2020. It is now read-only.

export useful info in backtestResultExporter #2509

Merged
merged 36 commits into from
Oct 7, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
16f57bf
v0.6 support for bitx (aka Luno)
hiyan Jul 19, 2018
bbf8c9c
v0.6 support for bitx (aka Luno)
hiyan Jul 19, 2018
248a393
remove log
hiyan Jul 20, 2018
5bd8595
Merge pull request #1 from askmike/develop
hiyan Jul 23, 2018
734b8c0
move dependency to gb
hiyan Jul 23, 2018
90fd81d
rename bitx to luno
hiyan Jul 23, 2018
0d4c31f
rename bitx to luno
hiyan Jul 23, 2018
4b5d09f
temp fix simultaneous advice error
hiyan Jul 24, 2018
4b6846b
Merge pull request #2 from askmike/develop
hiyan Jul 26, 2018
a63f616
Merge pull request #3 from hiyan/develop
hiyan Jul 26, 2018
f576abe
Merge pull request #4 from askmike/develop
hiyan Jul 27, 2018
1f29ad4
Merge pull request #5 from hiyan/develop
hiyan Jul 27, 2018
81a8f5c
Merge pull request #6 from askmike/develop
hiyan Aug 3, 2018
522f359
Merge pull request #7 from hiyan/develop
hiyan Aug 3, 2018
06acc7d
- re-add logging
hiyan Aug 8, 2018
844f271
update
hiyan Aug 8, 2018
28735e0
update
hiyan Aug 8, 2018
abc7519
update
hiyan Aug 8, 2018
a5855c2
revert 4b5d09f
hiyan Aug 8, 2018
67064b5
Merge pull request #8 from hiyan/gekkowk
hiyan Aug 8, 2018
0b92e40
Merge pull request #9 from askmike/develop
hiyan Aug 8, 2018
f93d435
Merge pull request #10 from hiyan/develop
hiyan Aug 8, 2018
1af6db5
Merge pull request #11 from askmike/develop
hiyan Aug 14, 2018
5161000
Merge pull request #12 from hiyan/develop
hiyan Aug 14, 2018
441cb49
Merge pull request #13 from askmike/develop
hiyan Aug 20, 2018
3a6fc0b
Merge pull request #14 from hiyan/develop
hiyan Aug 20, 2018
e982c24
Merge pull request #15 from askmike/develop
hiyan Aug 28, 2018
2a6fa21
Merge pull request #16 from hiyan/develop
hiyan Aug 28, 2018
53dfb45
Merge pull request #17 from askmike/develop
hiyan Sep 3, 2018
fe092dc
Merge pull request #18 from hiyan/develop
hiyan Sep 3, 2018
4e83d34
add useful info to export
hiyan Sep 6, 2018
55e6c90
Merge pull request #19 from hiyan/gekkowk
hiyan Sep 6, 2018
aab894f
Merge pull request #20 from askmike/develop
hiyan Sep 6, 2018
51566bc
standardize naming
hiyan Sep 6, 2018
7de18ac
Merge pull request #21 from askmike/develop
hiyan Sep 13, 2018
851e24b
Merge pull request #23 from askmike/develop
hiyan Sep 18, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
v0.6 support for bitx (aka Luno)
  • Loading branch information
hiyan committed Jul 19, 2018
commit bbf8c9cc47826445647c0e7c878c3641104e9955
4 changes: 2 additions & 2 deletions docs/introduction/supported_exchanges.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Gekko is able to directly communicate with the APIs of a number of exchanges. Ho
| [Okcoin.cn][11]* | ✓ | ✓ | ✕ | China, see [#352][20] |
| [Cex.io][12]* | ✓ | ✕ | ✕ | |
| [BTC Markets][13]* | ✓ | ✓ | ✕ | |
| [bitX][14]* | ✓ | | | |
| [bitX][14] | ✓ | | | aka Luno |
| [lakeBTC][15]* | ✓ | ✕ | ✕ | |
| [meXBT][16]* | ✓ | ✕ | ✕ | see [here][21] |
| [zaif][17]* | ✓ | ✕ | ✕ | |
Expand All @@ -47,7 +47,7 @@ Gekko is able to directly communicate with the APIs of a number of exchanges. Ho
[11]: https://www.okcoin.cn
[12]: https://cex.io
[13]: https://btcmarkets.net
[14]: https://www.bitx.co
[14]: https://www.luno.com
[15]: https://lakebtc.com
[16]: https://mexbt.com
[17]: https://zaif.jp/trade_btc_jpy
Expand Down
153 changes: 84 additions & 69 deletions importers/exchanges/bitx.js
Original file line number Diff line number Diff line change
@@ -1,96 +1,111 @@
const moment = require('moment');
const util = require('../../core/util.js');
const _ = require('lodash');
const log = require('../../core/log');
const retry = require('../../exchange/exchangeUtils').retry;

var config = util.getConfig();
var dirs = util.dirs();

var Fetcher = require(dirs.exchanges + 'bitx');
const config = util.getConfig();
const dirs = util.dirs();
const Fetcher = require(dirs.exchanges + 'bitx');

util.makeEventEmitter(Fetcher);

var end = false;
var from = false;
var next = false;
const REQUEST_INTERVAL = 15 * 1000;
const REQUEST_INTERVAL = 5 * 1000;

Fetcher.prototype.getTrades = function(since, callback, descending) {
let retryCritical = {
retries: 10,
factor: 1.25,
minTimeout: REQUEST_INTERVAL,
maxTimeout: REQUEST_INTERVAL * 10
};

let handleResponse = (callback) => {
return (error, body) => {
if (body && !_.isEmpty(body.code)) {
error = new Error(`ERROR ${body.code}: ${body.msg}`);
}
if(error) log.error('ERROR:', error.message, 'Retrying...');
return callback(error, body);
const recoverableErrors = [
'SOCKETTIMEDOUT',
'TIMEDOUT',
'CONNRESET',
'CONNREFUSED',
'NOTFOUND'
];

const processResponse = function(funcName, callback) {
return (error, body) => {
if (!error && !body) {
error = new Error('Empty response');
}

if (error) {
console.log(funcName, 'processResponse received ERROR:', error.message);
if (includes(error.message, recoverableErrors)) {
error.notFatal = true;
}
}

let process = (err, result) => {
if (err) {
log.error('Error importing trades:', err);
return;
if (includes(error.message, ['BitX error 429'])) {
error.notFatal = true;
error.backoffDelay = 10000;
}
trades = _.map(result.trades, function(t) {
return {
price: t.price,
date: Math.round(t.timestamp / 1000),
amount: t.volume,
tid: t.timestamp
};
});
callback(null, trades.reverse());
}

if(moment.isMoment(since)) since = since.valueOf();
(_.isNumber(since) && since > 0) ? since : since = null;

let handler = (cb) => this.bitx.getTrades({ since: since, pair: this.pair }, handleResponse(cb));
util.retryCustom(retryCritical, _.bind(handler, this), _.bind(process, this));
}

var fetcher = new Fetcher(config.watch);
return callback(error, undefined);
}

var fetch = () => {
fetcher.import = true;
setTimeout( () => fetcher.getTrades(from, handleFetch), REQUEST_INTERVAL);
};
return callback(undefined, body);
}
};

var handleFetch = (err, trades) => {
const process = (err, result) => {
if (err) {
log.error(`There was an error importing from BitX ${err}`);
fetcher.emit('done');
return fetcher.emit('trades', []);
console.log('Error importing trades:', err);
return;
}
trades = _.map(result.trades, function(t) {
return {
price: t.price,
date: Math.round(t.timestamp / 1000),
amount: t.volume,
tid: t.timestamp
};
});
callback(null, trades.reverse());
}

if (moment.isMoment(since)) since = since.valueOf();
(_.isNumber(since) && since > 0) ? since: since = 0;

console.log('importer getting trades from BitX since', moment(since).format('YYYY-MM-DD HH:mm:ss'));

const handler = cb => this.bitx.getTrades({ since: since, pair: this.pair }, processResponse('getTrades', cb));
retry(null, handler, process);
}

if (trades.length > 0) {
from = moment.utc(_.last(trades).tid + 1).clone();
} else {
fetcher.emit('done');
}
const fetcher = new Fetcher(config.watch);

if (from >= end) {
fetcher.emit('done');
var endUnix = end.unix();
trades = _.filter(trades, t => t.date <= endUnix);
}
const fetch = () => {
fetcher.import = true;
setTimeout(() => fetcher.getTrades(from, handleFetch), REQUEST_INTERVAL);
};

fetcher.emit('trades', trades);
const handleFetch = (err, trades) => {
if (err) {
console.log(`There was an error importing from BitX ${err}`);
fetcher.emit('done');
return fetcher.emit('trades', []);
}

if (trades.length > 0) {
from = moment.utc(_.last(trades).tid + 1).clone();
} else {
fetcher.emit('done');
}

if (from >= end) {
fetcher.emit('done');
const endUnix = end.unix();
trades = _.filter(trades, t => t.date <= endUnix);
}

fetcher.emit('trades', trades);
};

module.exports = function(daterange) {
from = daterange.from.clone().utc();
end = daterange.to.clone().utc();
from = daterange.from.clone().utc();
end = daterange.to.clone().utc();

return {
bus: fetcher,
fetch: fetch,
};
return {
bus: fetcher,
fetch: fetch,
};
};