diff --git a/LowFrequencyTrading/TradingStrategy.js b/LowFrequencyTrading/TradingStrategy.js new file mode 100644 index 000000000..a2693244a --- /dev/null +++ b/LowFrequencyTrading/TradingStrategy.js @@ -0,0 +1,70 @@ +exports.newTradingStrategy = function newTradingStrategy(bot, logger) { + /* + This module packages all functions related to Strategies. + */ + const MODULE_NAME = 'Trading Strategy' + let thisObject = { + openStrategy: openStrategy, + closeStrategy: closeStrategy, + updateStageType: updateStageType, + resetStrategy: resetStrategy, + updateStatus: updateStatus, + updateCounters: updateCounters, + initialize: initialize, + finalize: finalize + } + + let tradingEngine + + return thisObject + + function initialize() { + tradingEngine = bot.simulationState.tradingEngine + } + + function finalize() { + tradingEngine = undefined + } + + function openStrategy(stageType, index, situationName, strategyName) { + tradingEngine.current.strategy.status.value = 'Open' + tradingEngine.current.strategy.begin.value = tradingEngine.current.candle.begin.value + tradingEngine.current.strategy.end.value = tradingEngine.current.candle.end.value // TODO: overrride with the node Formula + tradingEngine.current.strategy.beginRate.value = tradingEngine.current.candle.min.value + tradingEngine.current.strategy.endRate.value = tradingEngine.current.candle.min.value // TODO: overrride with the node Formula + + tradingEngine.current.strategy.stageType.value = stageType + tradingEngine.current.strategy.index.value = index + tradingEngine.current.strategy.situationName.value = situationName + tradingEngine.current.strategy.strategyName.value = strategyName + } + + function closeStrategy() { + tradingEngine.current.strategy.status.value = 'Closed' + tradingEngine.current.strategy.end.value = tradingEngine.current.candle.end.value + tradingEngine.current.strategy.endRate.value = tradingEngine.current.candle.min.value + } + + function resetStrategy() { + tradingEngine.current.strategy.status.value = tradingEngine.current.strategy.status.config.initialValue + tradingEngine.current.strategy.stageType.value = tradingEngine.current.strategy.stageType.config.initialValue + tradingEngine.current.strategy.index.value = tradingEngine.current.strategy.index.config.initialValue + tradingEngine.current.strategy.strategyCounters.periods.value = tradingEngine.current.strategy.strategyCounters.periods.config.initialValue + } + + function updateStageType(stageType) { + tradingEngine.current.strategy.stageType.value = stageType + } + + function updateStatus() { + if (tradingEngine.current.strategy.status.value === 'Closed') { + resetStrategy() + } + } + + function updateCounters() { + if (tradingEngine.current.strategy.status.value === 'Open') { + tradingEngine.current.strategy.strategyCounters.periods.value++ + } + } +} \ No newline at end of file diff --git a/LowFrequencyTrading/TradingSystem.js b/LowFrequencyTrading/TradingSystem.js index 6087d3a91..e0e9ef9c9 100644 --- a/LowFrequencyTrading/TradingSystem.js +++ b/LowFrequencyTrading/TradingSystem.js @@ -38,15 +38,23 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { let conditions = new Map() let formulas = new Map() + const TRADING_STRATEGY_MODULE = require('./TradingStrategy.js') + let tradingStrategyModule = TRADING_STRATEGY_MODULE.newTradingStrategy(bot, logger) + return thisObject function initialize() { tradingSystem = bot.simulationState.tradingSystem tradingEngine = bot.simulationState.tradingEngine sessionParameters = bot.SESSION.parameters + + tradingStrategyModule.initialize() } function finalize() { + tradingStrategyModule.finalize() + tradingStrategyModule = undefined + chart = undefined conditions = undefined @@ -75,9 +83,8 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { } function mantainStrategies() { - if (tradingEngine.current.strategy.status.value === 'Closed') { - resetStrategy() - } + tradingStrategyModule.updateStatus() + tradingStrategyModule.updateCounters() } function mantainPositions() { @@ -275,11 +282,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingSystem.highlights.push(triggerStage.triggerOn.id) tradingSystem.highlights.push(triggerStage.id) - tradingEngine.current.strategy.stageType.value = 'Trigger Stage' - openStrategy() - tradingEngine.current.strategy.index.value = j - tradingEngine.current.strategy.situationName.value = situation.name - tradingEngine.current.strategy.strategyName.value = strategy.name + tradingStrategyModule.openStrategy('Trigger Stage', j, situation.name, strategy.name) tradingEngine.current.distanceToEvent.triggerOn.value = 1 @@ -329,9 +332,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingSystem.highlights.push(triggerStage.triggerOff.id) tradingSystem.highlights.push(triggerStage.id) - closeTrateggy() - tradingEngine.current.strategy.stageType.value = 'No Stage' - tradingEngine.current.strategy.index.value = tradingEngine.current.strategy.index.config.initialValue + tradingStrategyModule.closeStrategy() tradingEngine.current.distanceToEvent.triggerOff.value = 1 @@ -380,7 +381,8 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingSystem.highlights.push(triggerStage.takePosition.id) tradingSystem.highlights.push(triggerStage.id) - tradingEngine.current.strategy.stageType.value = 'Open Stage' + tradingStrategyModule.updateStageType('Open Stage') + tradingEngine.current.position.stopLoss.stopLossStage.value = 'Open Stage' tradingEngine.current.position.takeProfit.takeProfitStage.value = 'Open Stage' tradingEngine.current.position.stopLoss.stopLossPhase.value = 0 @@ -470,7 +472,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingEngine.current.position.stopLoss.stopLossPhase.value++ tradingEngine.current.position.stopLoss.stopLossStage.value = 'Manage Stage' if (tradingEngine.current.position.takeProfit.takeProfitPhase.value > 0) { - tradingEngine.current.strategy.stageType.value = 'Manage Stage' + tradingStrategyModule.updateStageType('Manage Stage') /* TODO ANNOUNCEMENT checkAnnouncements(manageStage, 'Take Profit') */ @@ -528,7 +530,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingEngine.current.position.stopLoss.stopLossStage.value = 'Manage Stage' if (tradingEngine.current.position.takeProfit.takeProfitPhase.value > 0) { - tradingEngine.current.strategy.stageType.value = 'Manage Stage' + tradingStrategyModule.updateStageType('Manage Stage') /* TODO ANNOUNCEMENT checkAnnouncements(manageStage, 'Take Profit') */ @@ -648,7 +650,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingEngine.current.position.takeProfit.takeProfitPhase.value++ tradingEngine.current.position.takeProfit.takeProfitStage.value = 'Manage Stage' if (tradingEngine.current.position.stopLoss.stopLossPhase.value > 0) { - tradingEngine.current.strategy.stageType.value = 'Manage Stage' + tradingStrategyModule.updateStageType('Manage Stage') /* TODO ANNOUNCEMENT checkAnnouncements(manageStage, 'Stop') */ @@ -705,7 +707,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingEngine.current.position.takeProfit.takeProfitStage.value = 'Manage Stage' if (tradingEngine.current.position.stopLoss.stopLossPhase.value > 0) { - tradingEngine.current.strategy.stageType.value = 'Manage Stage' + tradingStrategyModule.updateStageType('Manage Stage') /* TODO ANNOUNCEMENT checkAnnouncements(manageStage, 'Stop') */ @@ -802,7 +804,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingEngine.current.position.endRate.value = slippedStopLoss - tradingEngine.current.strategy.stageType.value = 'Close Stage' + tradingStrategyModule.updateStageType('Close Stage') /* TODO ANNOUNCEMENT checkAnnouncements(strategy.closeStage, 'Stop') */ @@ -849,7 +851,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { tradingEngine.current.position.endRate.value = slippedTakeProfit - tradingEngine.current.strategy.stageType.value = 'Close Stage' + tradingStrategyModule.updateStageType('Close Stage') /* TODO ANNOUNCEMENT checkAnnouncements(strategy.closeStage, 'Take Profit') */ @@ -987,11 +989,7 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { function exitStrategyAfterPosition() { if (tradingEngine.current.strategy.stageType.value === 'Close Stage') { - - closeTrateggy() - tradingEngine.current.strategy.index.value = tradingEngine.current.strategy.index.config.initialValue - tradingEngine.current.strategy.stageType.value = 'No Stage' - + tradingStrategyModule.closeStrategy() tradingEngine.current.distanceToEvent.triggerOff.value = 1 } } @@ -1041,23 +1039,5 @@ exports.newTradingSystem = function newTradingSystem(bot, logger) { return false } } - - function closeTrateggy() { - tradingEngine.current.strategy.status.value = 'Closed' - tradingEngine.current.strategy.end.value = tradingEngine.current.candle.end.value - tradingEngine.current.strategy.endRate.value = tradingEngine.current.candle.min.value - } - - function openStrategy() { - tradingEngine.current.strategy.status.value = 'Open' - tradingEngine.current.strategy.begin.value = tradingEngine.current.candle.begin.value - tradingEngine.current.strategy.end.value = tradingEngine.current.candle.end.value // TODO: overrride with the node Formula - tradingEngine.current.strategy.beginRate.value = tradingEngine.current.candle.min.value - tradingEngine.current.strategy.endRate.value = tradingEngine.current.candle.min.value // TODO: overrride with the node Formula - } - - function resetStrategy() { - tradingEngine.current.strategy.status.value = tradingEngine.current.strategy.status.config.initialValue - } }