From f3dc04a9a00d512555aa8107febc199ec44ef6d7 Mon Sep 17 00:00:00 2001 From: Brett Taylor Date: Mon, 11 Oct 2021 10:28:28 -0400 Subject: [PATCH 1/4] initial addition of enter-exit option for announcements --- .../Low-Frequency-Trading/TradingOrders.js | 2 +- .../Low-Frequency-Trading/TradingStages.js | 33 ++++++++----------- .../Announcements/Announcements.js | 27 +++++++++++++-- 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js index a821d7440..a8804de88 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingOrders.js @@ -1262,7 +1262,7 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) { tradingSystem.highlights.push(executionAlgorithm.id) tradingSystem.highlights.push(executionNode.id) - announcementsModuleObject.makeAnnoucements(event) + announcementsModuleObject.makeAnnouncements(event) return situation.name // if the event is triggered, we return the name of the situation that passed } } diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js index a1e1a0de1..6041a8085 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js @@ -147,9 +147,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { /* Initialize this */ tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.triggerOn.value = 1 - announcementsModuleObject.makeAnnoucements(triggerStage.triggerOn) - announcementsModuleObject.makeAnnoucements(triggerStage) - if (TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.type === 'Backtesting Session') { if (sessionParameters.snapshots !== undefined) { if (sessionParameters.snapshots.config.strategy === true) { @@ -159,6 +156,8 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } changeStageStatus('Trigger Stage', 'Open') + announcementsModuleObject.makeAnnouncements(triggerStage.triggerOn) + announcementsModuleObject.makeAnnouncements(triggerStage) } } } @@ -194,8 +193,9 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingSystem.highlights.push(triggerStage.id) tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.triggerOff.value = 1 - announcementsModuleObject.makeAnnoucements(triggerStage.triggerOff) + announcementsModuleObject.makeAnnouncements(triggerStage.triggerOff) changeStageStatus('Trigger Stage', 'Closed', 'Trigger Off Event') + announcementsModuleObject.makeAnnouncements(triggerStage, 'Closed') tradingStrategyModuleObject.closeStrategy('Trigger Off') } } @@ -233,9 +233,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.openPosition(situation.name) - announcementsModuleObject.makeAnnoucements(triggerStage.takePosition) - announcementsModuleObject.makeAnnoucements(strategy.openStage) - if (TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.type === 'Backtesting Session') { if (sessionParameters.snapshots !== undefined) { if (sessionParameters.snapshots.config.position === true) { @@ -245,6 +242,8 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } changeStageStatus('Trigger Stage', 'Closed', 'Position Taken') + announcementsModuleObject.makeAnnouncements(triggerStage.takePosition) + announcementsModuleObject.makeAnnouncements(triggerStage, 'Closed') changeStageStatus('Open Stage', 'Opening') changeStageStatus('Manage Stage', 'Opening') } else { @@ -436,7 +435,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { /* Now we switch to the Open status. */ changeStageStatus('Manage Stage', 'Open') - announcementsModuleObject.makeAnnoucements(manageStage) } } @@ -487,7 +485,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.applyStopLossFormula(tradingSystem.formulas, phase.formula.id) if (tradingEngine.tradingCurrent.position.stopLoss.value !== previousValue) { - announcementsModuleObject.makeAnnoucements(phase) + announcementsModuleObject.makeAnnouncements(phase) } } } @@ -510,7 +508,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.applyTakeProfitFormula(tradingSystem.formulas, phase.formula.id) if (tradingEngine.tradingCurrent.position.takeProfit.value !== previousValue) { - announcementsModuleObject.makeAnnoucements(phase) + announcementsModuleObject.makeAnnouncements(phase) } } } @@ -591,7 +589,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.updateStopLoss(tradingEngine.tradingCurrent.position.stopLoss.stopLossPhase.value + 1) - announcementsModuleObject.makeAnnoucements(nextPhaseEvent) + announcementsModuleObject.makeAnnouncements(nextPhaseEvent) /* Reset this counter */ tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.nextPhase.value = 1 @@ -642,7 +640,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { continue } - announcementsModuleObject.makeAnnoucements(moveToPhaseEvent) + announcementsModuleObject.makeAnnouncements(moveToPhaseEvent) /* Reset this counter */ tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.moveToPhase.value = 1 @@ -698,7 +696,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.updateTakeProfit(tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value + 1) - announcementsModuleObject.makeAnnoucements(nextPhaseEvent) + announcementsModuleObject.makeAnnouncements(nextPhaseEvent) /* Reset this counter */ tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.nextPhase.value = 1 @@ -749,7 +747,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { continue } - announcementsModuleObject.makeAnnoucements(moveToPhaseEvent) + announcementsModuleObject.makeAnnouncements(moveToPhaseEvent) /* Reset this counter */ tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.moveToPhase.value = 1 @@ -785,7 +783,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.closingPosition('Stop Loss') changeStageStatus('Close Stage', 'Opening') changeStageStatus('Manage Stage', 'Closed', 'Stop Loss Hit') - announcementsModuleObject.makeAnnoucements(strategy.closeStage) return } @@ -805,7 +802,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.closingPosition('Take Profit') changeStageStatus('Close Stage', 'Opening') changeStageStatus('Manage Stage', 'Closed', 'Take Profit Hit') - announcementsModuleObject.makeAnnoucements(strategy.closeStage) return } return @@ -1114,7 +1110,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingSystem.highlights.push(closeStageEvent.id) tradingSystem.highlights.push(stage.id) - announcementsModuleObject.makeAnnoucements(closeStageEvent) + announcementsModuleObject.makeAnnouncements(closeStageEvent) return true } } @@ -1186,7 +1182,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { if (stageName === 'Close Stage') { if (tradingEngine.tradingCurrent.position.status.value === 'Open') { tradingPositionModuleObject.closingPosition('Close Stage Closed') - /* NOTE:TODO: Announcement May need added Here */ } } } @@ -1321,4 +1316,4 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } } } -} \ No newline at end of file +} diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Announcements/Announcements.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Announcements/Announcements.js index d0e5821a3..11825e27c 100644 --- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Announcements/Announcements.js +++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Announcements/Announcements.js @@ -3,7 +3,7 @@ exports.newFoundationsBotModulesAnnouncements = function (processIndex) { const MODULE_NAME = 'Announcements' let thisObject = { - makeAnnoucements: makeAnnoucements, + makeAnnouncements: makeAnnouncements, initialize: initialize, finalize: finalize } @@ -20,7 +20,7 @@ exports.newFoundationsBotModulesAnnouncements = function (processIndex) { tradingEngine = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine sessionParameters = TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.tradingParameters - let taskParameters = { + taskParameters = { exchange: TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name, market: TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + '/' + @@ -36,13 +36,34 @@ exports.newFoundationsBotModulesAnnouncements = function (processIndex) { TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.messagesSent = undefined } - function makeAnnoucements(node) { + function makeAnnouncements(node, status='Open') { if (node === undefined) { return } if (node.announcements === undefined) { return } for (let i = 0; i < node.announcements.length; i++) { let announcement = node.announcements[i] let canAnnounce = true + + // Check configuration to see if Announcement should be run at Enter or Exit of Node + console.log('[DEBUG] announcement.config:') + console.log(announcement.config) + + // protect against empty configurations or missing values + onEnter = true + onExit = false + if (announcement.config.onEnter !== undefined) { + onEnter = announcement.config.onEnter + } + if (announcement.config.onExit !== undefined) { + onExit = announcement.config.onExit + } + + if ((status === 'Open' && onEnter) || (status === 'Closed' && onExit)) { + canAnnounce = true + } else { + canAnnounce = false + } + if (announcement.announcementCondition !== undefined) { let conditionValue try { From b619a9210d4f84726052db1fc3e50294eec289a4 Mon Sep 17 00:00:00 2001 From: Brett Taylor Date: Mon, 11 Oct 2021 13:11:12 -0400 Subject: [PATCH 2/4] enter and exit announcements working --- .../Low-Frequency-Trading/TradingStages.js | 143 ++++++++++-------- .../TS/Bot-Modules/Announcements.js | 5 +- 2 files changed, 80 insertions(+), 68 deletions(-) diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js index 897a44a9f..a5d8c523d 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js @@ -760,52 +760,50 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } function checkStopLossOrTakeProfitWasHit() { - { - let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value] - /* - Checking what happened since the last execution. We need to know if the Stop Loss - or our Take Profit were hit. - */ + let strategy = tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value] + /* + Checking what happened since the last execution. We need to know if the Stop Loss + or our Take Profit were hit. + */ - /* Stop Loss condition: Here we verify if the Stop Loss was hit or not. */ - if ( - ( - tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Above' && - tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >= tradingEngine.tradingCurrent.position.stopLoss.value - ) || - ( - tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Below' && - tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <= tradingEngine.tradingCurrent.position.stopLoss.value - ) - ) { - TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Stop Loss was hit.') + /* Stop Loss condition: Here we verify if the Stop Loss was hit or not. */ + if ( + ( + tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Above' && + tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >= tradingEngine.tradingCurrent.position.stopLoss.value + ) || + ( + tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Below' && + tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <= tradingEngine.tradingCurrent.position.stopLoss.value + ) + ) { + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Stop Loss was hit.') - tradingPositionModuleObject.closingPosition('Stop Loss') - changeStageStatus('Close Stage', 'Opening') - changeStageStatus('Manage Stage', 'Closed', 'Stop Loss Hit') - return - } - - /* Take Profit condition: Here we verify if the Take Profit was hit or not. */ - if ( - ( - tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Below' && - tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <= tradingEngine.tradingCurrent.position.takeProfit.value - ) || - ( - tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Above' && - tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >= tradingEngine.tradingCurrent.position.takeProfit.value - ) - ) { - TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Take Profit was hit.') - - tradingPositionModuleObject.closingPosition('Take Profit') - changeStageStatus('Close Stage', 'Opening') - changeStageStatus('Manage Stage', 'Closed', 'Take Profit Hit') - return - } + tradingPositionModuleObject.closingPosition('Stop Loss') + changeStageStatus('Close Stage', 'Opening') + changeStageStatus('Manage Stage', 'Closed', 'Stop Loss Hit') return } + + /* Take Profit condition: Here we verify if the Take Profit was hit or not. */ + if ( + ( + tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Below' && + tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <= tradingEngine.tradingCurrent.position.takeProfit.value + ) || + ( + tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Above' && + tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >= tradingEngine.tradingCurrent.position.takeProfit.value + ) + ) { + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Take Profit was hit.') + + tradingPositionModuleObject.closingPosition('Take Profit') + changeStageStatus('Close Stage', 'Opening') + changeStageStatus('Manage Stage', 'Closed', 'Take Profit Hit') + return + } + return } } } @@ -1144,9 +1142,11 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { if (stage.status.value === 'Open') { openStage(stage) checkUserDefinedCode(stageName, 'Open') + checkAnnounce(stageName, 'Open') } if (stage.status.value === 'Closed') { checkUserDefinedCode(stageName, 'Closed') + checkAnnounce(stageName, 'Closed') closeStage(stage, stageName) } @@ -1266,33 +1266,48 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { /* checkUserDefinedCode(): Checks if User Defined Code exists and processes if applicable. */ function checkUserDefinedCode(stage, status, when) { - let tradingSystemStage = getTradingSystemStage(stage); + let tradingSystemStage = getTradingSystemStage(stage); - if (tradingSystemStage !== undefined && - tradingSystemStage.userDefinedCode !== undefined) { - if (status === 'Running' && when !== tradingSystemStage.userDefinedCode.config.whileAtStageWhenToRun) { return; } + if (tradingSystemStage !== undefined && + tradingSystemStage.userDefinedCode !== undefined) { + if (status === 'Running' && when !== tradingSystemStage.userDefinedCode.config.whileAtStageWhenToRun) { return; } + switch(status) { + case 'Open' : { + if (tradingSystemStage.userDefinedCode.config.runWhenEnteringStage) { + tradingSystem.evalUserCode(tradingSystemStage, 'User Defined Code'); + } + break; + } + case 'Running' : { + if (tradingSystemStage.userDefinedCode.config.runWhileAtStage) { + tradingSystem.evalUserCode(tradingSystemStage, 'User Defined Code'); + } + break; + } + case 'Closed' : { + if (tradingSystemStage.userDefinedCode.config.runWhenExitingStage) { + tradingSystem.evalUserCode(tradingSystemStage, 'User Defined Code'); + } + break; + } + } + } + } + + // checkAnnounce(): Check if announcement should be made + function checkAnnounce(stage, status) { + let tradingSystemStage = getTradingSystemStage(stage); switch(status) { - case 'Open' : { - if (tradingSystemStage.userDefinedCode.config.runWhenEnteringStage) { - tradingSystem.evalUserCode(tradingSystemStage, 'User Defined Code'); + case 'Open' : { + announcementsModuleObject.makeAnnouncements(tradingSystemStage, 'Open') + break; + } + case 'Closed' : { + announcementsModuleObject.makeAnnouncements(tradingSystemStage, 'Closed') + break; } - break; - } - case 'Running' : { - if (tradingSystemStage.userDefinedCode.config.runWhileAtStage) { - tradingSystem.evalUserCode(tradingSystemStage, 'User Defined Code'); - } - break; - } - case 'Closed' : { - if (tradingSystemStage.userDefinedCode.config.runWhenExitingStage) { - tradingSystem.evalUserCode(tradingSystemStage, 'User Defined Code'); - } - break; - } } - } } /* getTradingSystemStage(): takes stage name returns stage object. */ diff --git a/Projects/Social-Bots/TS/Bot-Modules/Announcements.js b/Projects/Social-Bots/TS/Bot-Modules/Announcements.js index 1befe6ab9..adae89f55 100644 --- a/Projects/Social-Bots/TS/Bot-Modules/Announcements.js +++ b/Projects/Social-Bots/TS/Bot-Modules/Announcements.js @@ -45,9 +45,6 @@ exports.newSocialBotsBotModulesAnnouncements = function (processIndex) { let canAnnounce = true // Check configuration to see if Announcement should be run at Enter or Exit of Node - console.log('[DEBUG] announcement.config:') - console.log(announcement.config) - // protect against empty configurations or missing values onEnter = true onExit = false @@ -55,7 +52,7 @@ exports.newSocialBotsBotModulesAnnouncements = function (processIndex) { onEnter = announcement.config.onEnter } if (announcement.config.onExit !== undefined) { - onExit = announcement.config.onExit + onExit = announcement.config.onExit } if ((status === 'Open' && onEnter) || (status === 'Closed' && onExit)) { From 67babe081987ec1cc634845539d28e3b78ffea53 Mon Sep 17 00:00:00 2001 From: Brett Taylor Date: Mon, 11 Oct 2021 18:02:27 -0400 Subject: [PATCH 3/4] update announcements --- .../Low-Frequency-Trading/TradingStages.js | 18 ++++-------------- .../TS/Bot-Modules/Announcements.js | 10 ++++++---- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js index a5d8c523d..ca541c3b4 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js @@ -157,7 +157,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { changeStageStatus('Trigger Stage', 'Open') announcementsModuleObject.makeAnnouncements(triggerStage.triggerOn) - announcementsModuleObject.makeAnnouncements(triggerStage) } } } @@ -195,7 +194,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.triggerOff.value = 1 announcementsModuleObject.makeAnnouncements(triggerStage.triggerOff) changeStageStatus('Trigger Stage', 'Closed', 'Trigger Off Event') - announcementsModuleObject.makeAnnouncements(triggerStage, 'Closed') tradingStrategyModuleObject.closeStrategy('Trigger Off') } } @@ -241,9 +239,8 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } } - changeStageStatus('Trigger Stage', 'Closed', 'Position Taken') announcementsModuleObject.makeAnnouncements(triggerStage.takePosition) - announcementsModuleObject.makeAnnouncements(triggerStage, 'Closed') + changeStageStatus('Trigger Stage', 'Closed', 'Position Taken') changeStageStatus('Open Stage', 'Opening') changeStageStatus('Manage Stage', 'Opening') } else { @@ -1295,18 +1292,11 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } } - // checkAnnounce(): Check if announcement should be made + // checkAnnounce(): Check if stage announcement should be made function checkAnnounce(stage, status) { let tradingSystemStage = getTradingSystemStage(stage); - switch(status) { - case 'Open' : { - announcementsModuleObject.makeAnnouncements(tradingSystemStage, 'Open') - break; - } - case 'Closed' : { - announcementsModuleObject.makeAnnouncements(tradingSystemStage, 'Closed') - break; - } + if (status === 'Open' || status === 'Closed') { + announcementsModuleObject.makeAnnouncements(tradingSystemStage, status) } } diff --git a/Projects/Social-Bots/TS/Bot-Modules/Announcements.js b/Projects/Social-Bots/TS/Bot-Modules/Announcements.js index adae89f55..85bf7b502 100644 --- a/Projects/Social-Bots/TS/Bot-Modules/Announcements.js +++ b/Projects/Social-Bots/TS/Bot-Modules/Announcements.js @@ -45,16 +45,18 @@ exports.newSocialBotsBotModulesAnnouncements = function (processIndex) { let canAnnounce = true // Check configuration to see if Announcement should be run at Enter or Exit of Node - // protect against empty configurations or missing values - onEnter = true - onExit = false + // set defaults, protect against empty configurations or missing values + let onEnter = true + let onExit = false if (announcement.config.onEnter !== undefined) { onEnter = announcement.config.onEnter } if (announcement.config.onExit !== undefined) { onExit = announcement.config.onExit + if (announcement.config.onEnter === undefined) { + onEnter = false + } } - if ((status === 'Open' && onEnter) || (status === 'Closed' && onExit)) { canAnnounce = true } else { From 55516b32caa2d14c00dade71bf499c51635e7921 Mon Sep 17 00:00:00 2001 From: Brett Taylor Date: Mon, 11 Oct 2021 18:09:08 -0400 Subject: [PATCH 4/4] reorg --- .../Trading-Bot/Low-Frequency-Trading/TradingStages.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js index ca541c3b4..9298f4de6 100644 --- a/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js +++ b/Projects/Algorithmic-Trading/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js @@ -147,6 +147,8 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { /* Initialize this */ tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.triggerOn.value = 1 + announcementsModuleObject.makeAnnouncements(triggerStage.triggerOn) + if (TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.type === 'Backtesting Session') { if (sessionParameters.snapshots !== undefined) { if (sessionParameters.snapshots.config.strategy === true) { @@ -156,7 +158,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } changeStageStatus('Trigger Stage', 'Open') - announcementsModuleObject.makeAnnouncements(triggerStage.triggerOn) + } } } @@ -231,6 +233,8 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { tradingPositionModuleObject.openPosition(situation.name) + announcementsModuleObject.makeAnnouncements(triggerStage.takePosition) + if (TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.type === 'Backtesting Session') { if (sessionParameters.snapshots !== undefined) { if (sessionParameters.snapshots.config.position === true) { @@ -239,7 +243,6 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) { } } - announcementsModuleObject.makeAnnouncements(triggerStage.takePosition) changeStageStatus('Trigger Stage', 'Closed', 'Position Taken') changeStageStatus('Open Stage', 'Opening') changeStageStatus('Manage Stage', 'Opening')