diff --git a/TaskServer/Session.js b/TaskServer/Session.js index 09e4aa90e..ff5464808 100644 --- a/TaskServer/Session.js +++ b/TaskServer/Session.js @@ -14,6 +14,8 @@ try { if (FULL_LOG === true) { parentLogger.write(MODULE_NAME, "[INFO] initialize -> Entering function."); } + let telegramAPI + /* Initialize this info so that everything is logged propeerly */ bot.SESSION = { @@ -45,57 +47,70 @@ return function runSession(message) { - if (bot.SESSION_STATUS === 'Idle' || bot.SESSION_STATUS === 'Running') { return } // This happens when the UI is reloaded, the session was running and tries to run it again. - /* We are going to run the Definition comming at the event. */ - bot.TRADING_SYSTEM = JSON.parse(message.event.tradingSystem) - bot.SESSION = JSON.parse(message.event.session) - - /* Set the folderName for logging, reports, context and data output */ - let code - if (bot.SESSION.code !== undefined) { - code = bot.SESSION.code - if (code.folderName === undefined) { - bot.SESSION.folderName = bot.SESSION.id + try { + if (bot.SESSION_STATUS === 'Idle' || bot.SESSION_STATUS === 'Running') { return } // This happens when the UI is reloaded, the session was running and tries to run it again. + + /* We are going to run the Definition comming at the event. */ + bot.TRADING_SYSTEM = JSON.parse(message.event.tradingSystem) + bot.SESSION = JSON.parse(message.event.session) + + /* Set the folderName for logging, reports, context and data output */ + let code + if (bot.SESSION.code !== undefined) { + code = bot.SESSION.code + if (code.folderName === undefined) { + bot.SESSION.folderName = bot.SESSION.id + } else { + bot.SESSION.folderName = code.folderName + "-" + bot.SESSION.id + } + } + + /* Extract values from different sources and consolidate them under one structure that is going to be used later on. */ + setValuesToUse(message) + + /* Set up Social Bots */ + initializeSocialBots() + + let allGood + switch (bot.SESSION.type) { + case 'Backtesting Session': { + allGood = startBackTesting(message) + break + } + case 'Live Trading Session': { + allGood = startLiveTrading(message) + break + } + case 'Fordward Testing Session': { + allGood = startFordwardTesting(message) + break + } + case 'Paper Trading Session': { + allGood = startPaperTrading(message) + break + } + } + if (allGood === true) { + bot.SESSION_STATUS = 'Idle' + bot.STOP_SESSION = false } else { - bot.SESSION.folderName = code.folderName + "-" + bot.SESSION.id + bot.STOP_SESSION = true } - } - - /* Set up Social Bots */ - setUpSocialBots() - - /* Extract values from different sources and consolidate them under one structure that is going to be used later on. */ - setValuesToUse(message) - let allGood - switch (bot.SESSION.type) { - case 'Backtesting Session': { - allGood = startBackTesting(message) - break - } - case 'Live Trading Session': { - allGood = startLiveTrading(message) - break - } - case 'Fordward Testing Session': { - allGood = startFordwardTesting(message) - break - } - case 'Paper Trading Session': { - allGood = startPaperTrading(message) - break - } - } - if (allGood === true) { - bot.SESSION_STATUS = 'Idle' - bot.STOP_SESSION = false - } else { - bot.STOP_SESSION = true + } catch (err) { + parentLogger.write(MODULE_NAME, "[ERROR] initialize -> runSession -> err = " + err.stack); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); } } function stopSession(message) { - bot.STOP_SESSION = true + try { + bot.STOP_SESSION = true + finalizeSocialBots() + } catch (err) { + parentLogger.write(MODULE_NAME, "[ERROR] initialize -> stopSession -> err = " + err.stack); + callBackFunction(global.DEFAULT_FAIL_RESPONSE); + } } function checkDatetimes() { @@ -378,7 +393,7 @@ } } - function setUpSocialBots() { + function initializeSocialBots() { if (bot.SESSION.socialBots !== undefined) { if (bot.SESSION.socialBots.bots !== undefined) { @@ -386,7 +401,7 @@ let socialBot = bot.SESSION.socialBots.bots[i] if (socialBot.type === "Telegram Bot") { let code = socialBot.code - socialBot.botInstance = setUpTelegramBot(code.botToken, code.chatId) + socialBot.botInstance = initializeTelegramBot(code.botToken, code.chatId) } } } @@ -400,14 +415,14 @@ if (socialBot.type === "Telegram Bot") { if (announcement.formulaValue !== undefined) { - socialBot.botInstance.telegramAPI.sendMessage(socialBot.botInstance.chatId, announcement.formulaValue).catch(err => parentLogger.write(MODULE_NAME, "[WARN] initialize -> setUpSocialBots -> announce -> Telegram API error -> err = " + err)) + socialBot.botInstance.telegramAPI.sendMessage(socialBot.botInstance.chatId, announcement.formulaValue).catch(err => parentLogger.write(MODULE_NAME, "[WARN] initialize -> initializeSocialBots -> announce -> Telegram API error -> err = " + err)) } else { - socialBot.botInstance.telegramAPI.sendMessage(socialBot.botInstance.chatId, code.text).catch(err => parentLogger.write(MODULE_NAME, "[WARN] initialize -> setUpSocialBots -> announce -> Telegram API error -> err = " + err)) + socialBot.botInstance.telegramAPI.sendMessage(socialBot.botInstance.chatId, code.text).catch(err => parentLogger.write(MODULE_NAME, "[WARN] initialize -> initializeSocialBots -> announce -> Telegram API error -> err = " + err)) } } } catch (err) { - parentLogger.write(MODULE_NAME, "[WARN] initialize -> setUpSocialBots -> announce -> err = " + err.stack); + parentLogger.write(MODULE_NAME, "[WARN] initialize -> initializeSocialBots -> announce -> err = " + err.stack); } } } @@ -417,22 +432,35 @@ } } - function setUpTelegramBot(botToken, chatId) { + function finalizeSocialBots() { + if (bot.SESSION.socialBots.bots !== undefined) { + for (let i = 0; i < bot.SESSION.socialBots.bots.length; i++) { + let socialBot = bot.SESSION.socialBots.bots[i] + if (socialBot.type === "Telegram Bot") { + let code = socialBot.code + socialBot.botInstance = finalizeTelegramBot(code.chatId) + } + } + } + } + + function initializeTelegramBot(botToken, chatId) { /* Telegram Bot Initialization */ try { const Telegraf = require('telegraf') let telegramBot telegramBot = new Telegraf(botToken) - telegramBot.start((ctx) => ctx.reply('Hi! I am a Telegram Bot powered by Superalgos')) - telegramBot.help((ctx) => ctx.reply('Send me a sticker')) - telegramBot.on('sticker', (ctx) => ctx.reply('??')) - telegramBot.hears('hi', (ctx) => ctx.reply('Hey there')) + telegramBot.start((ctx) => ctx.reply('Hi! I am the Telegram Bot that will tell you what happens with your trading session.')) + telegramBot.help((ctx) => ctx.reply('I can stop the session if you say STOP.')) + telegramBot.hears('STOP', (ctx) => stopSession()) telegramBot.launch() const Telegram = require('telegraf/telegram') - let telegramAPI + telegramAPI = new Telegram(botToken) - telegramAPI.sendMessage(chatId, bot.SESSION.type + " '" + bot.SESSION.name + "' was Started.").catch(err => parentLogger.write(MODULE_NAME, "[WARN] initialize -> setUpTelegramBot -> Telegram API error -> err = " + err)) + + const messge = bot.SESSION.type + " '" + bot.SESSION.name + "' was started with an initial balance of " + " " + bot.VALUES_TO_USE.initialBalanceA + " " + bot.VALUES_TO_USE.baseAsset + "." + telegramAPI.sendMessage(chatId, messge ).catch(err => parentLogger.write(MODULE_NAME, "[WARN] initialize -> initializeTelegramBot -> Telegram API error -> err = " + err)) let botInstance = { telegramBot: telegramBot, @@ -441,10 +469,15 @@ } return botInstance } catch (err) { - parentLogger.write(MODULE_NAME, "[WARN] initialize -> setUpTelegramBot -> err = " + err.stack); + parentLogger.write(MODULE_NAME, "[WARN] initialize -> initializeTelegramBot -> err = " + err.stack); } } + + function finalizeTelegramBot(chatId) { + const messge = bot.SESSION.type + " '" + bot.SESSION.name + "' was stopped." + telegramAPI.sendMessage(chatId, messge).catch(err => parentLogger.write(MODULE_NAME, "[WARN] initialize -> initializeTelegramBot -> Telegram API error -> err = " + err)) + } } catch (err) { parentLogger.write(MODULE_NAME, "[ERROR] initialize -> err = " + err.stack);