From 5280777a6ca4f39864cb3b075f1f05bbc26baaa9 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 4 Dec 2020 10:43:55 +0100 Subject: [PATCH] Manage and Close Stages now Optional --- .../Low-Frequency-Trading/TradingStages.js | 85 ++++++++++++------- .../Low-Frequency-Trading/TradingSystem.js | 3 + 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js index c7bc5e960..d7c473af5 100644 --- a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js +++ b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingStages.js @@ -12,6 +12,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex, tradingEn runOpenStage: runOpenStage, runManageStage: runManageStage, runCloseStage: runCloseStage, + exitPositionValidation: exitPositionValidation, updateEnds: updateEnds, resetTradingEngineDataStructure: resetTradingEngineDataStructure, updateCounters: updateCounters, @@ -388,6 +389,16 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex, tradingEn runWhenStatusIsOpen() function runWhenStatusIsOpening() { + /* + The system allows the user not to define a Manage Stage, because the Manage Stage is optional. + Here we are goint to see if that is the case and if it is, we will inmidiatelly consider + the Manage Stage as closed. + */ + if (tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].manageStage === undefined) { + changeStageStatus('Manage Stage', 'Closed', 'Manage Stage Undefined') + changeStageStatus('Close Stage', 'Opening') + return + } /* Opening Status Procedure */ if (tradingEngine.current.strategyManageStage.status.value === 'Opening') { @@ -754,6 +765,15 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex, tradingEn await runWhenStatusIsOpen() function runWhenStatusIsOpening() { + /* + The system allows the user not to define a close stage, because the close stage is optional. + Here we are goint to see if that is the case and if it is, we will inmidiatelly consider + the close stage as closed. + */ + if (tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].closeStage === undefined) { + changeStageStatus('Close Stage', 'Closed', 'Close Stage Undefined') + return + } /* Opening Status Procedure */ if (tradingEngine.current.strategyCloseStage.status.value === 'Opening') { /* @@ -780,7 +800,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex, tradingEn tradingEngine.current.strategyCloseStage.status.value === 'Open' && ( tradingEngine.current.strategyOpenStage.status.value === 'Closed' || - tradingEngine.current.strategyOpenStage.status.value == tradingEngine.current.strategyOpenStage.status.config.initialValue + tradingEngine.current.strategyOpenStage.status.value === tradingEngine.current.strategyOpenStage.status.config.initialValue ) ) { /* @@ -800,36 +820,6 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex, tradingEn checkIfStageNeedsToBeClosed(tradingEngineStage, tradingSystemStage, 'Close Stage') } - - /* - Exit Position Validation: we need al the previous stages to be either closed - or at their initial default value. The last is becasue after Closed objects are - initialized to their defualts. - */ - if ( - ( - tradingEngine.current.strategyTriggerStage.status.value === 'Closed' || - tradingEngine.current.strategyTriggerStage.status.value === tradingEngine.current.strategyTriggerStage.status.config.initialValue - ) - && - ( - tradingEngine.current.strategyOpenStage.status.value === 'Closed' || - tradingEngine.current.strategyOpenStage.status.value === tradingEngine.current.strategyOpenStage.status.config.initialValue - ) - && - ( - tradingEngine.current.strategyManageStage.status.value === 'Closed' || - tradingEngine.current.strategyManageStage.status.value === tradingEngine.current.strategyManageStage.status.config.initialValue - ) - && - ( - tradingEngine.current.strategyCloseStage.status.value === 'Closed' - ) - ) { - - /* Closing Everything now. */ - closePositionAndStrategy() - } } function initializeStageTargetSize() { @@ -875,6 +865,39 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex, tradingEn } } + function exitPositionValidation() { + /* + Exit Position Validation: we need al the previous stages to be either closed + or at their initial default value. The last is becasue after Closed objects are + initialized to their defualts. + */ + if (tradingEngine.current.position.status.value !== 'Open') { return } + if ( + ( + tradingEngine.current.strategyTriggerStage.status.value === 'Closed' || + tradingEngine.current.strategyTriggerStage.status.value === tradingEngine.current.strategyTriggerStage.status.config.initialValue + ) + && + ( + tradingEngine.current.strategyOpenStage.status.value === 'Closed' || + tradingEngine.current.strategyOpenStage.status.value === tradingEngine.current.strategyOpenStage.status.config.initialValue + ) + && + ( + tradingEngine.current.strategyManageStage.status.value === 'Closed' || + tradingEngine.current.strategyManageStage.status.value === tradingEngine.current.strategyManageStage.status.config.initialValue + ) + && + ( + tradingEngine.current.strategyCloseStage.status.value === 'Closed' + ) + ) { + + /* Closing Everything now. */ + closePositionAndStrategy() + } + } + function checkIfStageNeedsToBeClosed(tradingEngineStage, tradingSystemStage, stageName) { /* The Stage is closed when the fillSize + feesPaid reaches the targetSize. diff --git a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js index ac8af85a3..ddd30df2e 100644 --- a/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js +++ b/Projects/Superalgos/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSystem.js @@ -153,6 +153,9 @@ exports.newSuperalgosBotModulesTradingSystem = function (processIndex, tradingEn /* Run the Close Stage */ await tradingStagesModuleObject.runCloseStage() + /* Validation if we need to exit the position */ + tradingStagesModuleObject.exitPositionValidation() + tradingStagesModuleObject.cycleBasedStatistics() } catch (err) {