diff --git a/.vs/AACloudPlatform/v15/.suo b/.vs/AACloudPlatform/v15/.suo index aac30a4db..262877a6a 100644 Binary files a/.vs/AACloudPlatform/v15/.suo and b/.vs/AACloudPlatform/v15/.suo differ diff --git a/AACloudPlatform.njsproj b/AACloudPlatform.njsproj index 0099752c7..df7231810 100644 --- a/AACloudPlatform.njsproj +++ b/AACloudPlatform.njsproj @@ -38,7 +38,7 @@ - + Code diff --git a/Azure File Storage.js b/Azure File Storage.js index 88838ed24..518cf0080 100644 --- a/Azure File Storage.js +++ b/Azure File Storage.js @@ -252,6 +252,23 @@ exports.newAzureFileStorage = function newAzureFileStorage(BOT) { } } + if (err.code = "ParentNotFound") { + + /* This is how Azure tell us the folder where the file was supposed to be does not exist. We map this to our own response. */ + + let customResponse = { + result: global.DEFAULT_FAIL_RESPONSE.result, + message: "Folder does not exist." + }; + + logger.write("[ERROR] getTextFile -> onFileReceived -> Custom Response -> message = " + customResponse.message); + + callBackFunction(customResponse); + return; + + } + + logger.write("[ERROR] getTextFile -> onFileReceived -> Dont know what to do here. Cancelling operation. "); callBackFunction(global.DEFAULT_FAIL_RESPONSE); diff --git a/Context.js b/Context.js index a861fb5f5..e395b8231 100644 --- a/Context.js +++ b/Context.js @@ -139,15 +139,22 @@ if (FULL_LOG === true) { logger.write("[INFO] initialize -> getStatusReport -> Entering function."); } - /* If the process run and was interrupted, there should be a status report that allows us to resume execution. */ - let fileName = "Status.Report.json" - let filePath = EXCHANGE_NAME + "/" + bot.codeName + "/" + bot.dataSetVersion + "/Processes/" + bot.process; + let filePath = bot.devTeam + "/" + bot.codeName + "/" + bot.version + "/" + bot.dataSetVersion + "/Processes/" + bot.process + "/" + EXCHANGE_NAME; cloudStorage.getTextFile(filePath, fileName, onFileReceived); function onFileReceived(err, text) { + if (err.result === global.DEFAULT_FAIL_RESPONSE.result && err.message === 'Folder does not exist.') { + logger.write("[INFO] initialize -> getStatusReport -> onFileReceived -> err = " + err.message); + + /* In this case we can assume that this is the first execution ever of this bot.*/ + + createConext(callBack); + return; + } + if (err.result !== global.DEFAULT_OK_RESPONSE.result) { logger.write("[ERROR] initialize -> getStatusReport -> onFileReceived -> err = " + err.message); callBack(err); @@ -161,25 +168,17 @@ try { thisObject.statusReport = JSON.parse(text); - - if (thisObject.statusReport.lastExecution === undefined) { - createConext(callBack); - } else { - getExecutionHistory(callBack); - } + getExecutionHistory(callBack); } catch (err) { /* - - It might happen that the file content is corrupt or it does not exist. The bot can not run without an Execution Context, - since it is risky to ignore its own context, so even for first time execution, a file with the right format - is needed. - + It might happen that the file content is corrupt. We will consider this as a temporary situation, since sometimes the file + is being updated at the moment of the read. The bot can not run without a valid Status Report but we can request the platform to retry later. */ - logger.write("[ERROR] initialize -> getStatusReport -> onFileReceived -> Bot cannot execute without the Status report. -> Err = " + err.message); - callBack(global.DEFAULT_FAIL_RESPONSE); + logger.write("[ERROR] initialize -> getStatusReport -> onFileReceived -> Bot cannot execute without a valid Status report. -> Err = " + err.message); + callBack(global.DEFAULT_RETRY_RESPONSE); } } @@ -195,7 +194,7 @@ if (FULL_LOG === true) { logger.write("[INFO] initialize -> getExecutionHistory -> Entering function."); } let fileName = "Execution.History.json" - let filePath = EXCHANGE_NAME + "/" + bot.codeName + "/" + bot.dataSetVersion + "/Output/" + bot.process; + let filePath = bot.devTeam + "/" + bot.codeName + "/" + bot.version + "/" + bot.dataSetVersion + "/Output/" + bot.process + "/" + EXCHANGE_NAME; cloudStorage.getTextFile(filePath, fileName, onFileReceived); @@ -246,7 +245,7 @@ let fileName = "Execution.Context.json" let dateForPath = date.getUTCFullYear() + '/' + utilities.pad(date.getUTCMonth() + 1, 2) + '/' + utilities.pad(date.getUTCDate(), 2) + '/' + utilities.pad(date.getUTCHours(), 2) + '/' + utilities.pad(date.getUTCMinutes(), 2); - let filePath = EXCHANGE_NAME + "/" + bot.codeName + "/" + bot.dataSetVersion + "/Output/" + bot.process + "/" + dateForPath; + let filePath = bot.devTeam + "/" + bot.codeName + "/" + bot.version + "/" + bot.dataSetVersion + "/Output/" + bot.process + "/" + EXCHANGE_NAME + "/" + dateForPath; cloudStorage.getTextFile(filePath, fileName, onFileReceived); @@ -374,7 +373,7 @@ let fileName = "Execution.Context.json" let dateForPath = processDatetime.getUTCFullYear() + '/' + utilities.pad(processDatetime.getUTCMonth() + 1, 2) + '/' + utilities.pad(processDatetime.getUTCDate(), 2) + '/' + utilities.pad(processDatetime.getUTCHours(), 2) + '/' + utilities.pad(processDatetime.getUTCMinutes(), 2); - let filePath = EXCHANGE_NAME + "/" + bot.codeName + "/" + bot.dataSetVersion + "/Output/" + bot.process + "/" + dateForPath; + let filePath = bot.devTeam + "/" + bot.codeName + "/" + bot.version + "/" + bot.dataSetVersion + "/Output/" + bot.process + "/" + EXCHANGE_NAME + "/" + dateForPath; utilities.createFolderIfNeeded(filePath, cloudStorage, onFolderCreated); @@ -429,7 +428,7 @@ try { let fileName = "Execution.History.json" - let filePath = EXCHANGE_NAME + "/" + bot.codeName + "/" + bot.dataSetVersion + "/Output/" + bot.process; + let filePath = bot.devTeam + "/" + bot.codeName + "/" + bot.version + "/" + bot.dataSetVersion + "/Output/" + bot.process + "/" + EXCHANGE_NAME; utilities.createFolderIfNeeded(filePath, cloudStorage, onFolderCreated); @@ -494,7 +493,7 @@ try { let fileName = "Status.Report.json" - let filePath = EXCHANGE_NAME + "/" + bot.codeName + "/" + bot.dataSetVersion + "/Processes/" + bot.process; + let filePath = bot.devTeam + "/" + bot.codeName + "/" + bot.version + "/" + bot.dataSetVersion + "/Processes/" + bot.process + "/" + EXCHANGE_NAME; utilities.createFolderIfNeeded(filePath, cloudStorage, onFolderCreated); diff --git a/Datasource.js b/Datasource.js index 4190d36cd..40f23674a 100644 --- a/Datasource.js +++ b/Datasource.js @@ -68,7 +68,7 @@ function initializeOliviaStorage() { - oliviaAzureFileStorage.initialize("Olivia", onInizialized); + oliviaAzureFileStorage.initialize("AAOlivia", onInizialized); function onInizialized(err) { if (err.result === global.DEFAULT_OK_RESPONSE.result) { @@ -82,7 +82,7 @@ function initializeTomStorage() { - tomAzureFileStorage.initialize("Tom", onInizialized); + tomAzureFileStorage.initialize("AATom", onInizialized); function onInizialized(err) { if (err.result === global.DEFAULT_OK_RESPONSE.result) { diff --git a/Debug Log.js b/Debug Log.js index 788099f3d..2abaf5cdd 100644 --- a/Debug Log.js +++ b/Debug Log.js @@ -24,23 +24,27 @@ try { - folderPath = thisObject.bot.devTeam; + folderPath = '../../Logs'; createFolderSync(folderPath); - folderPath = thisObject.bot.devTeam + "/" + thisObject.bot.type; + folderPath = '../../Logs/' + thisObject.bot.devTeam; createFolderSync(folderPath); - folderPath = thisObject.bot.devTeam + "/" + thisObject.bot.type + "/" + thisObject.bot.codeName; + folderPath = '../../Logs/' + thisObject.bot.devTeam + "/" + thisObject.bot.type; createFolderSync(folderPath); - folderPath = thisObject.bot.devTeam + "/" + thisObject.bot.type + "/" + thisObject.bot.codeName + "/" + thisObject.bot.version; + folderPath = '../../Logs/' + thisObject.bot.devTeam + "/" + thisObject.bot.type + "/" + thisObject.bot.codeName; createFolderSync(folderPath); - folderPath = thisObject.bot.devTeam + "/" + thisObject.bot.type + "/" + thisObject.bot.codeName + "/" + thisObject.bot.version + "/" + thisObject.bot.process; + folderPath = '../../Logs/' + thisObject.bot.devTeam + "/" + thisObject.bot.type + "/" + thisObject.bot.codeName + "/" + thisObject.bot.version; + + createFolderSync(folderPath); + + folderPath = '../../Logs/' + thisObject.bot.devTeam + "/" + thisObject.bot.type + "/" + thisObject.bot.codeName + "/" + thisObject.bot.version + "/" + thisObject.bot.process; createFolderSync(folderPath); diff --git a/Run.js b/Run.js index 62ec40e08..d596fb612 100644 --- a/Run.js +++ b/Run.js @@ -87,7 +87,7 @@ const START_ALL_MONTHS = false; const START_ONE_MONTH = true; const INTERVAL_EXECUTOR_MODULE = require('./Interval Executor'); -const TRADING_BOT_MODULE = require('./TradingBot'); +const TRADING_BOT_MAIN_LOOP_MODULE = require('./Trading Bot Main Loop'); /* Now we will see which are the script Arguments. We expect the name of the process to run, since that is what it should be defined at the Task Scheduller. */ @@ -194,14 +194,14 @@ function runTradingBot(pProcessConfig) { try { if (FULL_LOG === true) { logger.write("[INFO] runTradingBot -> Entering function."); } - let tradingBot = TRADING_BOT_MODULE.newTradingBot(botConfig); - tradingBot.initialize(vmConfig.bot.path, pProcessConfig, onInitializeReady); + let tradingBotMainLoop = TRADING_BOT_MAIN_LOOP_MODULE.newTradingBotMainLoop(botConfig); + tradingBotMainLoop.initialize(vmConfig.bot.path, pProcessConfig, onInitializeReady); function onInitializeReady(err) { if (err.result === global.DEFAULT_OK_RESPONSE.result) { - tradingBot.run(whenRunFinishes); + tradingBotMainLoop.run(whenRunFinishes); function whenRunFinishes(err) { diff --git a/TradingBot.js b/Trading Bot Main Loop.js similarity index 90% rename from TradingBot.js rename to Trading Bot Main Loop.js index cd85d020c..1fe7316b4 100644 --- a/TradingBot.js +++ b/Trading Bot Main Loop.js @@ -1,4 +1,4 @@ -exports.newTradingBot = function newTradingBot(BOT) { +exports.newTradingBotMainLoop = function newTradingBotMainLoop(BOT) { let bot = BOT; const ROOT_DIR = './'; @@ -80,6 +80,8 @@ function initializeContext() { + if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> initializeContext -> Entering function."); } + context = CONTEXT.newContext(bot, DEBUG_MODULE, AZURE_FILE_STORAGE); context.initialize(processDatetime, onInizialized); @@ -96,6 +98,8 @@ function initializeDatasource() { + if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> initializeDatasource -> Entering function."); } + datasource = DATASOURCE.newDatasource(bot, DEBUG_MODULE, AZURE_FILE_STORAGE); datasource.initialize(onInizialized); @@ -112,6 +116,8 @@ function initializeExchangeAPI() { + if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> initializeExchangeAPI -> Entering function."); } + exchangeAPI = EXCHANGE_API.newExchangeAPI(bot, DEBUG_MODULE, POLONIEX_CLIENT_MODULE); exchangeAPI.initialize(onInizialized); @@ -128,6 +134,8 @@ function initializeAssistant() { + if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> initializeAssistant -> Entering function."); } + assistant = ASSISTANT.newAssistant(bot, DEBUG_MODULE); assistant.initialize(processDatetime, context, exchangeAPI, onInizialized); @@ -144,6 +152,8 @@ function initializeUserBot() { + if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> initializeUserBot -> Entering function."); } + usertBot = USER_BOT_MODULE.newUserBot(bot, DEBUG_MODULE); let platform = { @@ -168,6 +178,8 @@ function startUserBot() { + if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> startUserBot -> Entering function."); } + usertBot.run(platform, onFinished); function onFinished(err) { @@ -197,6 +209,8 @@ function saveContext() { + if (FULL_LOG === true) { logger.write("[INFO] run -> loop -> saveContext -> Entering function."); } + context.saveThemAll(onFinished); function onFinished(err) { @@ -218,6 +232,8 @@ function loopControl(nextWaitTime) { + if (FULL_LOG === true) { logger.write("[INFO] run -> loopControl -> nextWaitTime = " + nextWaitTime); } + /* Trading bots are going to be executed after a configured period of time after the last execution ended. This is to avoid overlapping executions. */ switch (nextWaitTime) { diff --git a/logs/Dummy File.txt b/logs/Dummy File.txt deleted file mode 100644 index e69de29bb..000000000