From 6f7727164c209a79e7bd6223fdb7361fd4f92f58 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 8 Aug 2020 09:40:59 +0200 Subject: [PATCH] episode balance --- LowFrequencyTrading/TradingEngine.js | 7 +++-- LowFrequencyTrading/TradingEpisode.js | 34 ++++++++++++++++------ LowFrequencyTrading/TradingExecution.js | 36 ++++++++++++------------ LowFrequencyTrading/TradingPosition.js | 8 +++--- LowFrequencyTrading/TradingSimulation.js | 8 +++--- LowFrequencyTrading/TradingStages.js | 12 ++------ LowFrequencyTrading/TradingStrategy.js | 10 +++++-- 7 files changed, 66 insertions(+), 49 deletions(-) diff --git a/LowFrequencyTrading/TradingEngine.js b/LowFrequencyTrading/TradingEngine.js index 981f71183..435a53619 100644 --- a/LowFrequencyTrading/TradingEngine.js +++ b/LowFrequencyTrading/TradingEngine.js @@ -20,15 +20,16 @@ exports.newTradingEngine = function newTradingEngine(bot, logger) { return thisObject function initialize() { - /* Here we will go through all the nodes in the Trading Engine hiriarchy and apply the initial value to the value property when needed */ tradingEngine = bot.simulationState.tradingEngine sessionParameters = bot.SESSION.parameters if (bot.FIRST_EXECUTION === true) { + /* + Here we will go through all the nodes in the Trading Engine hiriarchy and + apply the initial value to the value property when needed + */ initializeNode(tradingEngine) - tradingEngine.current.balance.baseAsset.value = sessionParameters.sessionBaseAsset.config.initialBalance - tradingEngine.current.balance.quotedAsset.value = sessionParameters.sessionQuotedAsset.config.initialBalance } } diff --git a/LowFrequencyTrading/TradingEpisode.js b/LowFrequencyTrading/TradingEpisode.js index 850d7acda..061b4dafe 100644 --- a/LowFrequencyTrading/TradingEpisode.js +++ b/LowFrequencyTrading/TradingEpisode.js @@ -36,13 +36,27 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) { } function openEpisode() { + /* + This function is called each time the simulation starts. That does not mean the Episode + must be opened there, since it might happen that it is looping at the end of the market + or the task / session was restarted. + */ + if (bot.FIRST_EXECUTION === true) { + /* Getting the begin Balance from the session configuration */ + tradingEngine.current.episode.beginBalance.baseAsset.value = sessionParameters.sessionBaseAsset.config.initialBalance + tradingEngine.current.episode.beginBalance.quotedAsset.value = sessionParameters.sessionQuotedAsset.config.initialBalance - /* Recording the opening at the Trading Engine Data Structure */ - tradingEngine.current.episode.status.value = 'Open' - tradingEngine.current.episode.serialNumber.value = 1 - tradingEngine.current.episode.identifier.value = global.UNIQUE_ID() - tradingEngine.current.episode.begin.value = tradingEngine.current.candle.begin.value - tradingEngine.current.episode.beginRate.value = tradingEngine.current.candle.close.value + /* The current balance is also the begin balance, that is how this starts. */ + tradingEngine.current.episode.balance.baseAsset.value = sessionParameters.sessionBaseAsset.config.initialBalance + tradingEngine.current.episode.balance.quotedAsset.value = sessionParameters.sessionQuotedAsset.config.initialBalance + + /* Recording the opening at the Trading Engine Data Structure */ + tradingEngine.current.episode.status.value = 'Open' + tradingEngine.current.episode.serialNumber.value = 1 + tradingEngine.current.episode.identifier.value = global.UNIQUE_ID() + tradingEngine.current.episode.begin.value = tradingEngine.current.candle.begin.value + tradingEngine.current.episode.beginRate.value = tradingEngine.current.candle.close.value + } } function updateExitType(exitType) { @@ -53,6 +67,8 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) { tradingEngine.current.episode.status.value = 'Closed' tradingEngine.current.episode.end.value = tradingEngine.current.candle.end.value tradingEngine.current.episode.endRate.value = tradingEngine.current.candle.close.value + tradingEngine.current.episode.endBalance.baseAsset.value = tradingEngine.current.episode.balance.baseAsset.value + tradingEngine.current.episode.endBalance.quotedAsset.value = tradingEngine.current.episode.balance.quotedAsset.value } function resetEpisode() { @@ -63,6 +79,8 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) { if (tradingEngine.current.episode.status.value === 'Open') { tradingEngine.current.episode.end.value = tradingEngine.current.candle.end.value tradingEngine.current.episode.endRate.value = tradingEngine.current.candle.close.value + tradingEngine.current.episode.endBalance.baseAsset.value = tradingEngine.current.episode.balance.baseAsset.value + tradingEngine.current.episode.endBalance.quotedAsset.value = tradingEngine.current.episode.balance.quotedAsset.value } } @@ -141,11 +159,11 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) { /* Updating Profit Loss */ tradingEngine.current.episode.episodeBaseAsset.profitLoss.value = - tradingEngine.current.balance.baseAsset.value - + tradingEngine.current.episode.balance.baseAsset.value - sessionParameters.sessionBaseAsset.config.initialBalance tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value = - tradingEngine.current.balance.quotedAsset.value - + tradingEngine.current.episode.balance.quotedAsset.value - sessionParameters.sessionQuotedAsset.config.initialBalance tradingEngine.current.episode.episodeBaseAsset.profitLoss.value = global.PRECISE(tradingEngine.current.episode.episodeBaseAsset.profitLoss.value, 10) diff --git a/LowFrequencyTrading/TradingExecution.js b/LowFrequencyTrading/TradingExecution.js index ec2bada64..173c818cc 100644 --- a/LowFrequencyTrading/TradingExecution.js +++ b/LowFrequencyTrading/TradingExecution.js @@ -657,24 +657,24 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': { /* Balance Base Asset: Undo the previous accounting */ - tradingEngine.current.balance.baseAsset.value = - tradingEngine.current.balance.baseAsset.value - + tradingEngine.current.episode.balance.baseAsset.value = + tradingEngine.current.episode.balance.baseAsset.value - previousBaseAssetSizeFilled /* Balance Base Asset: Account the current filling and fees */ - tradingEngine.current.balance.baseAsset.value = - tradingEngine.current.balance.baseAsset.value + + tradingEngine.current.episode.balance.baseAsset.value = + tradingEngine.current.episode.balance.baseAsset.value + tradingEngineOrder.orderBaseAsset.sizeFilled.value /* Balance Quoted Asset: Undo the previous accounting */ - tradingEngine.current.balance.quotedAsset.value = - tradingEngine.current.balance.quotedAsset.value + + tradingEngine.current.episode.balance.quotedAsset.value = + tradingEngine.current.episode.balance.quotedAsset.value + previousQuotedAssetSizeFilled + previousQuotedAssetFeesPaid /* Balance Quoted Asset: Account the current filling and fees */ - tradingEngine.current.balance.quotedAsset.value = - tradingEngine.current.balance.quotedAsset.value - + tradingEngine.current.episode.balance.quotedAsset.value = + tradingEngine.current.episode.balance.quotedAsset.value - tradingEngineOrder.orderQuotedAsset.sizeFilled.value - tradingEngineOrder.orderQuotedAsset.feesPaid.value break @@ -682,31 +682,31 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': { /* Balance Base Asset: Undo the previous accounting */ - tradingEngine.current.balance.baseAsset.value = - tradingEngine.current.balance.baseAsset.value + + tradingEngine.current.episode.balance.baseAsset.value = + tradingEngine.current.episode.balance.baseAsset.value + previousBaseAssetSizeFilled + previousBaseAssetFeesPaid /* Balance Base Asset: Account the current filling and fees */ - tradingEngine.current.balance.baseAsset.value = - tradingEngine.current.balance.baseAsset.value - + tradingEngine.current.episode.balance.baseAsset.value = + tradingEngine.current.episode.balance.baseAsset.value - tradingEngineOrder.orderBaseAsset.sizeFilled.value - tradingEngineOrder.orderBaseAsset.feesPaid.value /* Balance Quoted Asset: Undo the previous accounting */ - tradingEngine.current.balance.quotedAsset.value = - tradingEngine.current.balance.quotedAsset.value - + tradingEngine.current.episode.balance.quotedAsset.value = + tradingEngine.current.episode.balance.quotedAsset.value - previousQuotedAssetSizeFilled /* Balance Quoted Asset: Account the current filling and fees */ - tradingEngine.current.balance.quotedAsset.value = - tradingEngine.current.balance.quotedAsset.value + + tradingEngine.current.episode.balance.quotedAsset.value = + tradingEngine.current.episode.balance.quotedAsset.value + tradingEngineOrder.orderQuotedAsset.sizeFilled.value break } } - tradingEngine.current.balance.baseAsset.value = global.PRECISE(tradingEngine.current.balance.baseAsset.value, 10) - tradingEngine.current.balance.quotedAsset.value = global.PRECISE(tradingEngine.current.balance.quotedAsset.value, 10) + tradingEngine.current.episode.balance.baseAsset.value = global.PRECISE(tradingEngine.current.episode.balance.baseAsset.value, 10) + tradingEngine.current.episode.balance.quotedAsset.value = global.PRECISE(tradingEngine.current.episode.balance.quotedAsset.value, 10) } } diff --git a/LowFrequencyTrading/TradingPosition.js b/LowFrequencyTrading/TradingPosition.js index 7a5b2ede1..2c80908b1 100644 --- a/LowFrequencyTrading/TradingPosition.js +++ b/LowFrequencyTrading/TradingPosition.js @@ -240,8 +240,8 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng /* Profit Loss Calculation */ tradingEngine.current.position.positionStatistics.profitLoss.value = ( - tradingEngine.current.balance.baseAsset.value * tradingEngine.current.position.endRate.value + - tradingEngine.current.balance.quotedAsset.value + tradingEngine.current.episode.balance.baseAsset.value * tradingEngine.current.position.endRate.value + + tradingEngine.current.episode.balance.quotedAsset.value ) - ( tradingEngine.previous.balance.baseAsset.value * tradingEngine.current.position.beginRate.value + @@ -279,11 +279,11 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng function updateResults() { /* Profit Loss Calculation */ tradingEngine.current.position.positionBaseAsset.profitLoss.value = - tradingEngine.current.balance.baseAsset.value - + tradingEngine.current.episode.balance.baseAsset.value - tradingEngine.previous.balance.baseAsset.value tradingEngine.current.position.positionQuotedAsset.profitLoss.value = - tradingEngine.current.balance.quotedAsset.value - + tradingEngine.current.episode.balance.quotedAsset.value - tradingEngine.previous.balance.quotedAsset.value tradingEngine.current.position.positionBaseAsset.profitLoss.value = global.PRECISE(tradingEngine.current.position.positionBaseAsset.profitLoss.value, 10) diff --git a/LowFrequencyTrading/TradingSimulation.js b/LowFrequencyTrading/TradingSimulation.js index 1ae53ff62..092c77b90 100644 --- a/LowFrequencyTrading/TradingSimulation.js +++ b/LowFrequencyTrading/TradingSimulation.js @@ -390,7 +390,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT let stopRunningDate = (new Date(tradingEngine.current.candle.begin.value)).toLocaleString() if (sessionParameters.sessionBaseAsset.config.minimumBalance !== undefined) { - if (tradingEngine.current.balance.baseAsset.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) { + if (tradingEngine.current.episode.balance.baseAsset.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) { const errorMessage = 'Min Balance reached @ ' + stopRunningDate tradingSystem.errors.push([tradingSystem.id, errorMessage]) if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) } @@ -399,7 +399,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT } if (sessionParameters.sessionBaseAsset.config.maximumBalance !== undefined) { - if (tradingEngine.current.balance.baseAsset.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) { + if (tradingEngine.current.episode.balance.baseAsset.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) { const errorMessage = 'Max Balance reached @ ' + stopRunningDate tradingSystem.errors.push([tradingSystem.id, errorMessage]) if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) } @@ -408,7 +408,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT } if (sessionParameters.sessionQuotedAsset.config.minimumBalance !== undefined) { - if (tradingEngine.current.balance.quotedAsset.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) { + if (tradingEngine.current.episode.balance.quotedAsset.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) { const errorMessage = 'Min Balance reached @ ' + stopRunningDate tradingSystem.errors.push([tradingSystem.id, errorMessage]) if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) } @@ -417,7 +417,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT } if (sessionParameters.sessionQuotedAsset.config.maximumBalance !== undefined) { - if (tradingEngine.current.balance.quotedAsset.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) { + if (tradingEngine.current.episode.balance.quotedAsset.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) { const errorMessage = 'Max Balance reached @ ' + stopRunningDate tradingSystem.errors.push([tradingSystem.id, errorMessage]) if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) } diff --git a/LowFrequencyTrading/TradingStages.js b/LowFrequencyTrading/TradingStages.js index 790c33339..350865b9d 100644 --- a/LowFrequencyTrading/TradingStages.js +++ b/LowFrequencyTrading/TradingStages.js @@ -85,16 +85,10 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM function mantain() { mantainPositions() - mantainStrategies() + tradingStrategyModule.mantain() mantainStages() mantainOrders() - function mantainStrategies() { - tradingStrategyModule.resetTradingEngineDataStructure() - tradingStrategyModule.updateCounters() - tradingStrategyModule.updateEnds() - } - function mantainStages() { resetTradingEngineDataStructure() updateCounters() @@ -342,8 +336,8 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM tradingSystem.evalFormulas(stageNode, 'Initial Definition') /* Remember the balance we had before taking the position to later calculate profit or loss */ - tradingEngine.previous.balance.baseAsset.value = tradingEngine.current.balance.baseAsset.value - tradingEngine.previous.balance.quotedAsset.value = tradingEngine.current.balance.quotedAsset.value + tradingEngine.previous.balance.baseAsset.value = tradingEngine.current.episode.balance.baseAsset.value + tradingEngine.previous.balance.quotedAsset.value = tradingEngine.current.episode.balance.quotedAsset.value /* Entry Position size and rate */ tradingSystem.evalFormulas(stageNode, 'Initial Targets') diff --git a/LowFrequencyTrading/TradingStrategy.js b/LowFrequencyTrading/TradingStrategy.js index 81e7d03b9..4f48686b3 100644 --- a/LowFrequencyTrading/TradingStrategy.js +++ b/LowFrequencyTrading/TradingStrategy.js @@ -4,11 +4,9 @@ exports.newTradingStrategy = function newTradingStrategy(bot, logger, tradingEng */ const MODULE_NAME = 'Trading Strategy' let thisObject = { + mantain: mantain, openStrategy: openStrategy, closeStrategy: closeStrategy, - updateEnds: updateEnds, - resetTradingEngineDataStructure: resetTradingEngineDataStructure, - updateCounters: updateCounters, initialize: initialize, finalize: finalize } @@ -25,6 +23,12 @@ exports.newTradingStrategy = function newTradingStrategy(bot, logger, tradingEng tradingEngine = undefined } + function mantain() { + resetTradingEngineDataStructure() + updateCounters() + updateEnds() + } + function openStrategy(index, situationName, strategyName) { tradingEngine.current.strategy.status.value = 'Open' tradingEngine.current.strategy.serialNumber.value = tradingEngine.current.episode.episodeCounters.strategies.value