bluebot
Version:
A bitcoin trading bot for auto trading at various exchanges
979 lines (834 loc) • 25.9 kB
JavaScript
var tulind = require("tulind");
var semver = require("semver");
var _ = require('lodash');
var tulindError = 'BlueBot was unable to configure Tulip Indicators:\n\t';
// Wrapper that executes a tulip indicator
var execute = function(callback, params) {
var tulindCallback = function(err, result) {
if (err) return callback(err);
var table = {}
for (var i = 0; i < params.results.length; ++i) {
table[params.results[i]] = result[i];
}
callback(null, table);
};
return params.indicator.indicator(params.inputs, params.options, tulindCallback);
}
// Helper that makes sure all required parameters
// for a specific talib indicator are present.
var verifyParams = (methodName, params) => {
var requiredParams = methods[methodName].requires;
_.each(requiredParams, paramName => {
if(!_.has(params, paramName))
throw tulindError + methodName + ' requires ' + paramName + '.';
var val = params[paramName];
if(!_.isNumber(val))
throw tulindError + paramName + ' needs to be a number';
});
}
var methods = {};
methods.ad = {
requires: [],
create: (params) => {
verifyParams('ad', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.ad,
inputs: [data.high, data.low, data.close, data.volume],
options: [],
results: ['result'],
});
}
}
methods.adosc = {
requires: ['optInFastPeriod', 'optInSlowPeriod'],
create: (params) => {
verifyParams('adosc', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.adosc,
inputs: [data.high, data.low, data.close, data.volume],
options: [params.optInFastPeriod, params.optInSlowPeriod],
results: ['result'],
});
}
}
methods.adx = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('adx', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.adx,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.adxr = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('adxr', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.adxr,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.ao = {
requires: [],
create: (params) => {
verifyParams('ao', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.ao,
inputs: [data.high, data.low],
options: [],
results: ['result'],
});
}
}
methods.apo = {
requires: ['optInFastPeriod', 'optInSlowPeriod'],
create: (params) => {
verifyParams('apo', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.apo,
inputs: [data.close],
options: [params.optInFastPeriod, params.optInSlowPeriod],
results: ['result'],
});
}
}
methods.aroon = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('aroon', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.aroon,
inputs: [data.high, data.low],
options: [params.optInTimePeriod],
results: ['aroonDown', 'aroonUp'],
});
}
}
methods.aroonosc = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('arronosc', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.aroonosc,
inputs: [data.high, data.low],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.atr = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('atr', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.atr,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.avgprice = {
requires: [],
create: (params) => {
verifyParams('avgprice', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.avgprice,
inputs: [data.open, data.high, data.low, data.close],
options: [],
results: ['result'],
});
}
}
methods.bbands = {
requires: ['optInTimePeriod', 'optInNbStdDevs'],
create: (params) => {
verifyParams('bbands', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.bbands,
inputs: [data.close],
options: [params.optInTimePeriod, params.optInNbStdDevs],
results: ['bbandsLower', 'bbandsMiddle', 'bbandsUpper'],
});
}
}
methods.bop = {
requires: [],
create: (params) => {
verifyParams('bop', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.bop,
inputs: [data.open, data.high, data.low, data.close],
options: [],
results: ['result'],
});
}
}
methods.cci = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('cci', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.cci,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.cmo = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('cmo', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.cmo,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.cvi = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('cvi', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.cvi,
inputs: [data.high, data.low],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.dema = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('dema', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.dema,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.di = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('di', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.di,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['diPlus', 'diMinus'],
});
}
}
methods.dm = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('dm', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.dm,
inputs: [data.high, data.low],
options: [params.optInTimePeriod],
results: ['dmPlus', 'dmLow'],
});
}
}
methods.dpo = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('dpo', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.dpo,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.dx = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('dx', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.dx,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.ema = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('ema', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.ema,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.emv = {
requires: [],
create: (params) => {
verifyParams('emv', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.emv,
inputs: [data.high, data.low, data.volume],
options: [params.optInTimePeriod],
results: [],
});
}
}
methods.fisher = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('fisher', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.fisher,
inputs: [data.high, data.low],
options: [params.optInTimePeriod],
results: ['fisher', 'fisherPeriod'],
});
}
}
methods.fosc = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('fosc', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.fosc,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.hma = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('hma', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.hma,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.kama = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('kama', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.kama,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.kvo = {
requires: ['optInFastPeriod', 'optInSlowPeriod'],
create: (params) => {
verifyParams('kvo', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.kvo,
inputs: [data.high, data.low, data.close, data.volume],
options: [params.optInFastPeriod, params.optInSlowPeriod],
results: ['result'],
});
}
}
methods.linreg = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('linreg', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.linreg,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.linregintercept = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('linregintercept', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.linregintercept,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.linregslope = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('linregslope', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.linregslope,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.macd = {
requires: ['optInFastPeriod', 'optInSlowPeriod', 'optInSignalPeriod'],
create: (params) => {
verifyParams('macd', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.macd,
inputs: [data.close],
options: [params.optInFastPeriod, params.optInSlowPeriod, params.optInSignalPeriod],
results: ['macd', 'macdSignal', 'macdHistogram'],
});
}
}
methods.marketfi = {
requires: [],
create: (params) => {
verifyParams('marketfi', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.marketfi,
inputs: [data.high, data.low, data.volume],
options: [],
results: ['result'],
});
}
}
methods.mass = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('mass', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.mass,
inputs: [data.high, data.low],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.medprice = {
requires: [],
create: (params) => {
verifyParams('medprice', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.medprice,
inputs: [data.high, data.low],
options: [],
results: ['result'],
});
}
}
methods.mfi = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('mfi', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.mfi,
inputs: [data.high, data.low, data.close, data.volume],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.msw = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('msw', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.msw,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['mswSine', 'mswLead'],
});
}
}
methods.natr = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('natr', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.natr,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.nvi = {
requires: [],
create: (params) => {
verifyParams('nvi', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.nvi,
inputs: [data.close, data.volume],
options: [],
results: ['result'],
});
}
}
methods.obv = {
requires: [],
create: (params) => {
verifyParams('obv', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.obv,
inputs: [data.close, data.volume],
options: [],
results: ['result'],
});
}
}
methods.ppo = {
requires: ['optInFastPeriod', 'optInSlowPeriod'],
create: (params) => {
verifyParams('ppo', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.ppo,
inputs: [data.close],
options: [params.optInFastPeriod, params.optInSlowPeriod],
results: ['result'],
});
}
}
methods.psar = {
requires: ['optInAcceleration', 'optInMaximum'],
create: (params) => {
verifyParams('psar', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.psar,
inputs: [data.high, data.low],
options: [params.optInAcceleration, params.optInMaximum],
results: ['result'],
});
}
}
methods.pvi = {
requires: [],
create: (params) => {
verifyParams('pvi', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.pvi,
inputs: [data.close, data.volume],
options: [],
results: ['result'],
});
}
}
methods.qstick = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('qstick', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.qstick,
inputs: [data.open, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.roc = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('roc', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.roc,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.rocr = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('rocr', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.rocr,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.rsi = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('rsi', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.rsi,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.sma = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('sma', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.sma,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.stoch = {
requires: ['optInFastKPeriod', 'optInSlowKPeriod', 'optInSlowDPeriod'],
create: (params) => {
verifyParams('stoch', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.stoch,
inputs: [data.high, data.low, data.close],
options: [params.optInFastKPeriod, params.optInSlowKPeriod, params.optInSlowDPeriod],
results: ['sotchK', 'stochD'],
});
}
}
methods.sum = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('sum', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.sum,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.tema = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('tema', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.tema,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.tr = {
requires: [],
create: (params) => {
verifyParams('tr', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.tr,
inputs: [data.high, data.low, data.close],
options: [],
results: ['result'],
});
}
}
methods.trima = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('trima', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.trima,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.trix = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('trix', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.trix,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.tsf = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('tsf', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.tsf,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.typprice = {
requires: [],
create: (params) => {
verifyParams('typprice', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.typprice,
inputs: [data.high, data.low, data.close],
options: [],
results: ['result'],
});
}
}
methods.ultosc = {
requires: ['optInTimePeriod1', 'optInTimePeriod2', 'optInTimePeriod3'],
create: (params) => {
verifyParams('ultosc', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.ultosc,
inputs: [data.close],
options: [params.optInTimePeriod1, params.optInTimePeriod2, params.optInTimePeriod3],
results: ['result'],
});
}
}
methods.vhf = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('vhf', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.vhf,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.vidya = {
requires: ['optInFastPeriod', 'optInSlowPeriod', 'optInAlpha'],
create: (params) => {
verifyParams('vidya', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.vidya,
inputs: [data.close],
options: [params.optInFastPeriod, params.optInSlowPeriod, params.optInAlpha],
results: ['result'],
});
}
}
methods.volatility = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('volatility', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.volatility,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.vosc = {
requires: ['optInFastPeriod', 'optInSlowPeriod'],
create: (params) => {
verifyParams('vosc', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.vosc,
inputs: [data.volume],
options: [params.optInFastPeriod, params.optInSlowPeriod],
results: ['result'],
});
}
}
methods.vwma = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('vwma', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.vwma,
inputs: [data.close, data.volume],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.wad = {
requires: [],
create: (params) => {
verifyParams('wad', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.wad,
inputs: [data.high, data.low, data.close],
options: [],
results: ['result'],
});
}
}
methods.wcprice = {
requires: [],
create: (params) => {
verifyParams('wcprice', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.wcprice,
inputs: [data.high, data.low, data.close],
options: [],
results: ['result'],
});
}
}
methods.wilders = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('wilders', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.wilders,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.willr = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('willr', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.willr,
inputs: [data.high, data.low, data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.wma = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('wma', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.wma,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
methods.zlema = {
requires: ['optInTimePeriod'],
create: (params) => {
verifyParams('zlema', params);
return (data, callback) => execute(callback, {
indicator: tulind.indicators.zlema,
inputs: [data.close],
options: [params.optInTimePeriod],
results: ['result'],
});
}
}
module.exports = methods;