From 0631cbd16d3735c7e62a19e4500bc0311bb11dbd Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 22 May 2020 14:08:31 +0200 Subject: [PATCH] Resume working --- FileStorage.js | 80 ++++++++++++++++++++++---------------------- MultiPeriod.js | 9 ++--- StatusReport.js | 28 ++++++++-------- TradingSimulation.js | 5 ++- 4 files changed, 61 insertions(+), 61 deletions(-) diff --git a/FileStorage.js b/FileStorage.js index 22966c706..bec9ef69a 100644 --- a/FileStorage.js +++ b/FileStorage.js @@ -22,11 +22,11 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { deleteTextFile: deleteTextFile } - return thisObject + return thisObject function getTextFile(filePath, callBackFunction, noRetry, canUsePrevious) { - let currentRetryGetTextFile = 0 + let currentRetryGetTextFile = 0 recursiveGetTextFile(filePath, callBackFunction, noRetry, canUsePrevious) @@ -77,7 +77,7 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { } callBackFunction(customResponse) return - } + } fileDoesNotExist = true logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> onFileRead -> File does not exist. Retrying. ') @@ -106,7 +106,7 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { if (mustBeJason === false) { /* In this case there is nothing else to check. */ callBackFunction(global.DEFAULT_OK_RESPONSE, text.toString()) - return + return } /* @@ -117,7 +117,7 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { /* The file was correctly read and could be parsed. */ callBackFunction(global.DEFAULT_OK_RESPONSE, text.toString()) - return + return } catch (err) { @@ -140,11 +140,11 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> onFileRead -> canUsePrevious -> err = ' + err.stack) callBackFunction(global.DEFAULT_FAIL_RESPONSE) return - } + } /* Returning the previous file */ callBackFunction(global.DEFAULT_OK_RESPONSE, text.toString()) - return + return } } else { logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> onFileRead -> Could read the file, but could not parse it as it is not a valid JSON.') @@ -153,12 +153,12 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { setTimeout(retry, retryTimeToUse) return } - } + } } } catch (err) { - logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> Error writing file -> file = ' + fileLocation) - logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> Error writing file -> err = ' + err.stack) + logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> Error reading file -> file = ' + fileLocation) + logger.write(MODULE_NAME, '[WARN] FileStorage -> getTextFile -> Error reading file -> err = ' + err.stack) retry() } @@ -252,7 +252,7 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> Error deleting file -> err = ' + err.stack) setTimeout(retry, retryTimeToUse) return - } + } /* Rename de Original into Previous */ fs.rename(fileLocation, fileLocation + '.Previous.json', onOriginalRenamed) @@ -266,7 +266,7 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> onOriginalRenamed -> Error renaming original file -> file = ' + fileLocation) logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> onOriginalRenamed -> Error renaming original file -> err = ' + err.stack) setTimeout(retry, retryTimeToUse) - return + return } /* Rename de Temp into Original */ @@ -282,13 +282,13 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { callBackFunction(global.DEFAULT_OK_RESPONSE) } - } + } } } } else { /* In this case, there is no need to keep a copy of the file being replaced, so we just delete and that's it. */ - fs.unlink(fileLocation , onUnlinked) + fs.unlink(fileLocation, onUnlinked) function onUnlinked(err) { let code = '' @@ -296,11 +296,11 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { code = err.code } if (code !== '' && code !== 'ENOENT') { - logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> Error deleting file -> file = ' + fileLocation ) + logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> Error deleting file -> file = ' + fileLocation) logger.write(MODULE_NAME, '[WARN] FileStorage -> createTextFile -> onFileWriten -> onUnlinked -> Error deleting file -> err = ' + err.stack) setTimeout(retry, retryTimeToUse) return - } + } /* Rename de Temp into Original */ fs.rename(fileLocation + '.tmp', fileLocation, onTempRenamed) @@ -406,33 +406,33 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { /* Function to create folders of missing folders at any path. */ function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) { - const sep = '/'; - const initDir = path.isAbsolute(targetDir) ? sep : ''; - const baseDir = isRelativeToScript ? __dirname : '.'; + const sep = '/'; + const initDir = path.isAbsolute(targetDir) ? sep : ''; + const baseDir = isRelativeToScript ? __dirname : '.'; - return targetDir.split(sep).reduce((parentDir, childDir) => { - const curDir = path.resolve(baseDir, parentDir, childDir); - try { - const fs = require('fs') - fs.mkdirSync(curDir); - } catch (err) { - if (err.code === 'EEXIST') { // curDir already exists! - return curDir; - } + return targetDir.split(sep).reduce((parentDir, childDir) => { + const curDir = path.resolve(baseDir, parentDir, childDir); + try { + const fs = require('fs') + fs.mkdirSync(curDir); + } catch (err) { + if (err.code === 'EEXIST') { // curDir already exists! + return curDir; + } - // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows. - if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure. - throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`); - } + // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows. + if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure. + throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`); + } - const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1; - if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) { - throw err; // Throw if it's just the last created dir. - } - } + const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1; + if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) { + throw err; // Throw if it's just the last created dir. + } + } - return curDir; - }, initDir); + return curDir; + }, initDir); } function getFileViaHTTP(filePath, callback, callBackFunction) { @@ -455,7 +455,7 @@ exports.newFileStorage = function newFileStorage(logger, host, port) { logger.write(MODULE_NAME, "[ERROR] getFileViaHTTP -> onError -> err = " + err.stack); logger.write(MODULE_NAME, "[ERROR] getFileViaHTTP -> onError -> Failed to fetch file via HTTP. Will retry later. "); callBackFunction(global.DEFAULT_RETRY_RESPONSE); - }) + }) function onResponse(response) { diff --git a/MultiPeriod.js b/MultiPeriod.js index 984e45e26..219357a95 100644 --- a/MultiPeriod.js +++ b/MultiPeriod.js @@ -86,7 +86,7 @@ let previousDay; // Holds the date of the previous day relative to the processing date. - let variable = {} + let variable getContextVariables(); @@ -163,19 +163,17 @@ } thisReport = statusReport.file; + variable = thisReport.variable; + if (variable === undefined) { variable = {} } // This should happen only when there is no status report if (thisReport.lastFile !== undefined) { - if (bot.hasTheBotJustStarted === true && bot.resumeExecution === false) { if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] start -> getContextVariables -> Starting from the begining because bot has just started and resume execution was true."); } startFromBegining(); return; } - contextVariables.lastFile = new Date(thisReport.lastFile); - variable = thisReport.variable; - processSingleFiles(); return; @@ -195,7 +193,6 @@ contextVariables.lastFile = new Date(contextVariables.dateBeginOfMarket.getUTCFullYear() + "-" + (contextVariables.dateBeginOfMarket.getUTCMonth() + 1) + "-" + contextVariables.dateBeginOfMarket.getUTCDate() + " " + "00:00" + GMT_SECONDS); if (FULL_LOG === true) { logger.write(MODULE_NAME, "[INFO] start -> getContextVariables -> startFromBegining -> contextVariables.lastFile = " + contextVariables.lastFile); } - processSingleFiles(); } diff --git a/StatusReport.js b/StatusReport.js index 0ae6bc288..65609aa40 100644 --- a/StatusReport.js +++ b/StatusReport.js @@ -23,7 +23,7 @@ status: undefined }; - let statusDependencyNode; + let statusDependencyNode; /* Utilities needed. */ @@ -32,7 +32,7 @@ /* Storage account to be used here. */ const FILE_STORAGE = require('./FileStorage.js'); - let fileStorage + let fileStorage let sessionPath = '' @@ -119,13 +119,13 @@ for (let i = 0; i < network.networkNodes.length; i++) { let networkNode = network.networkNodes[i] - + if (checkThisBranch(networkNode.dataMining) === true) { return } - if (checkThisBranch(networkNode.testingEnvironment) === true) {return} + if (checkThisBranch(networkNode.testingEnvironment) === true) { return } if (checkThisBranch(networkNode.productionEnvironment) === true) { return } function checkThisBranch(branch) { - if (branch === undefined) {return} + if (branch === undefined) { return } for (let j = 0; j < branch.exchangeTasks.length; j++) { let exchangeTasks = branch.exchangeTasks[j] for (let k = 0; k < exchangeTasks.taskManagers.length; k++) { @@ -183,7 +183,7 @@ callBackFunction(global.DEFAULT_FAIL_RESPONSE); } catch (err) { - logger.write(MODULE_NAME, "[ERROR] initialize -> err = "+ err.stack); + logger.write(MODULE_NAME, "[ERROR] initialize -> err = " + err.stack); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } @@ -211,9 +211,9 @@ let rootPath = bot.exchange + "/" + bot.market.baseAsset + "-" + bot.market.quotedAsset + "/" + statusDependencyNode.dataMine + "/" + statusDependencyNode.bot - filePath = rootPath + "/Reports/" + sessionPath + statusDependencyNode.process ; + filePath = rootPath + "/Reports/" + sessionPath + statusDependencyNode.process; } else { - filePath = bot.filePathRoot + "/Reports/" + sessionPath + statusDependencyNode.process ; + filePath = bot.filePathRoot + "/Reports/" + sessionPath + statusDependencyNode.process; } filePath += '/' + fileName @@ -236,10 +236,10 @@ function onFileReceived(err, text) { - if ( err.result === global.CUSTOM_FAIL_RESPONSE.result && (err.message === 'Folder does not exist.' || err.message === 'File does not exist.') + if (err.result === global.CUSTOM_FAIL_RESPONSE.result && (err.message === 'Folder does not exist.' || err.message === 'File does not exist.') || err.code === "The specified key does not exist.") { - logger.write(MODULE_NAME, "[INFO] load -> onFileReceived -> err = "+ err.stack); + logger.write(MODULE_NAME, "[INFO] load -> onFileReceived -> err = " + err.message); /* In this case we can assume that this is the first execution ever of this bot.*/ @@ -255,7 +255,7 @@ } if (err.result !== global.DEFAULT_OK_RESPONSE.result) { - logger.write(MODULE_NAME, "[ERROR] load -> onFileReceived -> err = "+ err.stack); + logger.write(MODULE_NAME, "[ERROR] load -> onFileReceived -> err = " + err.message); callBackFunction(err); return; } @@ -290,7 +290,7 @@ } } catch (err) { - logger.write(MODULE_NAME, "[ERROR] load -> err = "+ err.stack); + logger.write(MODULE_NAME, "[ERROR] load -> err = " + err.stack); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } @@ -328,7 +328,7 @@ if (global.LOG_CONTROL[MODULE_NAME].logInfo === true) { logger.write(MODULE_NAME, "[INFO] save -> onFileCreated -> Entering function."); } if (err.result !== global.DEFAULT_OK_RESPONSE.result) { - logger.write(MODULE_NAME, "[ERROR] save -> onFileCreated -> err = "+ err.stack); + logger.write(MODULE_NAME, "[ERROR] save -> onFileCreated -> err = " + err.stack); callBackFunction(err); return; } @@ -348,7 +348,7 @@ } catch (err) { - logger.write(MODULE_NAME, "[ERROR] save -> err = "+ err.stack); + logger.write(MODULE_NAME, "[ERROR] save -> err = " + err.stack); callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } diff --git a/TradingSimulation.js b/TradingSimulation.js index 621fdf38a..5014e1f1a 100644 --- a/TradingSimulation.js +++ b/TradingSimulation.js @@ -2112,7 +2112,10 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT addPositionRecord() /* We will remmember the last candle processed, so that if it is the last one of this run we can use it to continue from there next time. */ - variable.last.candle = candle + variable.last.candle = { + begin: candle.begin, + end: candle.end + } /* After everything at the simulation level was done, we will do the annoucements that are pending. */ makeAnnoucements()