Files
Superalgos/Run.js
T
2019-08-09 09:38:48 -03:00

255 lines
9.1 KiB
JavaScript

require('dotenv').config();
const sequenceList = require('./sequence');
global.SHALL_BOT_STOP = false;
global.AT_BREAKPOINT = false; // This is used only when running at the browser.
global.FULL_LOG = process.env.FULL_LOG;
/* Default parameters can be changed by the execution configuration */
global.EXCHANGE_NAME = process.env.EXCHANGE_NAME;
global.MARKET = { assetA: "USDT", assetB: "BTC" };
global.CLONE_EXECUTOR = { codeName: 'AACloud', version: '1.1' };
process.on('uncaughtException', function (err) {
console.log('[INFO] Run -> uncaughtException -> err.message = ' + err.message);
console.log('[INFO] Run -> uncaughtException -> err.stack = ' + err.stack);
process.exit(1)
});
process.on('unhandledRejection', (reason, p) => {
console.log('[INFO] Run -> unhandledRejection -> reason = ' + JSON.stringify(reason));
console.log('[INFO] Run -> unhandledRejection -> p = ' + JSON.stringify(p));
process.exit(1)
});
process.on('exit', function (code) {
console.log('[INFO] Run -> process.on.exit -> About to exit -> code = ' + code);
});
let isRunSequence = false;
let sequenceStep = 0;
let loopCount = 0;
let processedSteps = new Map()
if (process.env.RUN_SEQUENCE !== undefined) {
isRunSequence = JSON.parse(process.env.RUN_SEQUENCE)
}
if (isRunSequence) {
sequenceExecution(sequenceStep);
} else {
readExecutionConfiguration();
}
function sequenceExecution(currentStep) {
let execution = sequenceList[currentStep];
process.env.STOP_GRACEFULLY = true;
execution.devTeam ? process.env.DEV_TEAM = execution.devTeam : undefined;
execution.bot ? process.env.BOT = execution.bot : undefined;
execution.mode ? process.env.START_MODE = execution.mode : undefined;
execution.resumeExecution ? process.env.RESUME_EXECUTION = execution.resumeExecution : undefined;
execution.type ? process.env.TYPE = execution.type : undefined;
execution.process ? process.env.PROCESS = execution.process : undefined;
execution.startYear ? process.env.MIN_YEAR = execution.startYear : undefined;
execution.endYear ? process.env.MAX_YEAR = execution.endYear : undefined;
execution.month ? process.env.MONTH = execution.month : undefined;
execution.beginDatetime ? process.env.BEGIN_DATE_TIME = execution.beginDatetime : undefined;
execution.dataSet ? process.env.DATA_SET = execution.dataSet : undefined;
execution.timePeriod ? process.env.TIME_PERIOD = execution.timePeriod : undefined;
execution.baseAsset ? process.env.BASE_ASSET = execution.baseAsset : undefined;
execution.balanceAssetA ? process.env.INITIAL_BALANCE_ASSET_A = execution.balanceAssetA : undefined;
execution.balanceAssetB ? process.env.INITIAL_BALANCE_ASSET_B = execution.balanceAssetB : undefined;
process.env.CLONE_ID = 1;
execution.exchangeName ? global.EXCHANGE_NAME = execution.exchangeName : undefined;
// global.FULL_LOG = execution.fullLog;
let stepKey = execution.devTeam + '.' + execution.bot + '.' + execution.process;
if (processedSteps.has(stepKey)) {
processedSteps.set(stepKey, processedSteps.get(stepKey) + 1);
} else {
processedSteps.set(stepKey, 0);
}
console.log("EXECUTION: "+JSON.stringify(execution))
readExecutionConfiguration();
sequenceStep++;
}
function onExecutionFinish(result, finishStepKey) {
processedSteps.set(finishStepKey, processedSteps.get(finishStepKey) + 1);
if (processedSteps.get(finishStepKey) > 1) {
console.log("[INFO] onExecutionFinish -> Step already processed.");
} else {
if (sequenceStep < sequenceList.length) {
sequenceExecution(sequenceStep);
} else {
setTimeout(function () {
console.log("[INFO] onExecutionFinish -> New round for sequence execution started.");
loopCount++;
sequenceStep = 0;
processedSteps = new Map();
sequenceExecution(sequenceStep);
}, process.env.EXECUTION_LOOP_DELAY);
}
}
}
function readExecutionConfiguration() {
try {
console.log("[INFO] Run -> readExecutionConfiguration -> Entering function. ");
let startMode
// General Financial Being Configuration
global.DEV_TEAM = process.env.DEV_TEAM
global.CURRENT_BOT_REPO = process.env.BOT + "-" + process.env.TYPE + "-Bot"
if (process.env.TYPE === 'Trading') {
let live = {
run: "false",
resumeExecution: process.env.RESUME_EXECUTION
}
let backtest = {
run: "false",
resumeExecution: process.env.RESUME_EXECUTION,
beginDatetime: process.env.BEGIN_DATE_TIME,
endDatetime: process.env.END_DATE_TIME
}
let competition = {
run: "false",
resumeExecution: process.env.RESUME_EXECUTION,
beginDatetime: process.env.BEGIN_DATE_TIME,
endDatetime: process.env.END_DATE_TIME
}
startMode = {
live: live,
backtest: backtest,
competition: competition
}
} else if (process.env.TYPE === 'Indicator' || process.env.TYPE === 'Sensor') {
let allMonths = {
run: "false",
minYear: process.env.MIN_YEAR,
maxYear: process.env.MAX_YEAR
}
let oneMonth = {
run: "false",
year: process.env.MIN_YEAR,
month: process.env.MONTH
}
let noTime = {
run: "false",
beginDatetime: process.env.BEGIN_DATE_TIME,
resumeExecution: process.env.RESUME_EXECUTION
}
let fixedInterval = {
run: "false",
interval: process.env.INTERVAL
}
startMode = {
allMonths: allMonths,
oneMonth: oneMonth,
noTime: noTime,
fixedInterval: fixedInterval
}
} else {
console.log("[ERROR] readExecutionConfiguration -> Bot Type is invalid.");
throw new Error("readExecutionConfiguration -> Bot Type is invalid.")
}
startMode[process.env.START_MODE].run = "true"
let cloneToExecute = {
enabled: "true",
devTeam: process.env.DEV_TEAM,
bot: process.env.BOT,
process: process.env.PROCESS,
repo: global.CURRENT_BOT_REPO
}
global.EXECUTION_CONFIG = {
cloneToExecute: cloneToExecute,
startMode: startMode,
timePeriod: getTimePeriod(process.env.TIME_PERIOD),
timePeriodFileStorage: process.env.TIME_PERIOD,
dataSet: process.env.DATA_SET
};
global.CLONE_EXECUTOR = {
codeName: 'AACloud',
version: '1.1'
}
startRoot();
}
catch (err) {
console.log("[ERROR] readExecutionConfiguration -> err = " + err);
console.log("[ERROR] readExecutionConfiguration -> Please verify that the Start Mode for the type of Bot configured applies to that type.");
console.log("[ERROR] readExecutionConfiguration -> err = " + err.stack);
}
}
function getTimePeriod(timePeriod) {
if (timePeriod !== undefined) {
try {
let timePeriodMap = new Map()
timePeriodMap.set("24-hs", 86400000)
timePeriodMap.set("12-hs", 43200000)
timePeriodMap.set("08-hs", 28800000)
timePeriodMap.set("06-hs", 21600000)
timePeriodMap.set("04-hs", 14400000)
timePeriodMap.set("03-hs", 10800000)
timePeriodMap.set("02-hs", 7200000)
timePeriodMap.set("01-hs", 3600000)
timePeriodMap.set("45-min", 2700000)
timePeriodMap.set("40-min", 2400000)
timePeriodMap.set("30-min", 1800000)
timePeriodMap.set("20-min", 1200000)
timePeriodMap.set("15-min", 900000)
timePeriodMap.set("10-min", 600000)
timePeriodMap.set("05-min", 300000)
timePeriodMap.set("04-min", 240000)
timePeriodMap.set("03-min", 180000)
timePeriodMap.set("02-min", 120000)
timePeriodMap.set("01-min", 60000)
return timePeriodMap.get(timePeriod)
} catch (error) {
console.log("[WARN] Run -> readExecutionConfiguration -> getTimePeriod -> Error: ", error);
}
} else {
return undefined
}
}
function startRoot() {
console.log("[INFO] Run -> startRoot -> Entering function. ");
const ROOT_DIR = './';
const ROOT_MODULE = require(ROOT_DIR + 'Root');
let root = ROOT_MODULE.newRoot();
let UI_COMMANDS = {
beginDatetime: undefined,
endDatetime: undefined,
timePeriod: undefined,
startMode: undefined,
eventHandler: undefined
};
root.initialize(UI_COMMANDS, onInitialized);
function onInitialized() {
console.log("[INFO] Run -> startRoot -> onInitialized -> Entering function. ");
root.start(onExecutionFinish);
}
}