From f4583230c6b39359bc41cfb169b3f8dc028304be Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 7 Aug 2020 09:21:30 +0200 Subject: [PATCH] Current Episode --- LowFrequencyTrading/Snapshots.js | 2 +- LowFrequencyTrading/TradingEngine.js | 4 +- LowFrequencyTrading/TradingExecution.js | 4 +- LowFrequencyTrading/TradingPosition.js | 16 ++-- LowFrequencyTrading/TradingRecords.js | 27 ++++-- LowFrequencyTrading/TradingStages.js | 104 ++++++++++++------------ LowFrequencyTrading/TradingStrategy.js | 2 +- 7 files changed, 86 insertions(+), 73 deletions(-) diff --git a/LowFrequencyTrading/Snapshots.js b/LowFrequencyTrading/Snapshots.js index 4c085855a..11b3e6eae 100644 --- a/LowFrequencyTrading/Snapshots.js +++ b/LowFrequencyTrading/Snapshots.js @@ -253,7 +253,7 @@ exports.newSnapshots = function newSnapshots(bot, logger) { let closeHeaders = ['Trade Number', 'Open Datetime', 'Close Datetime', 'Strategy Name', 'Trigger On Situation', 'Take Position Situation', 'Result In Base Asset', 'Result In Quoted Asset', 'ROI in Base Asset', 'ROI in Quoted Asset', 'Exit Type'] closeValues = [ - tradingEngine.episode.episodeCounters.positions.value, // Position Number + tradingEngine.current.episode.episodeCounters.positions.value, // Position Number (new Date(openDatetime)).toISOString(), // Open Datetime (new Date(closeDatetime)).toISOString(), // Open Datetime tradingEngine.current.strategy.strategyName.value, // Strategy Name diff --git a/LowFrequencyTrading/TradingEngine.js b/LowFrequencyTrading/TradingEngine.js index e10bfe927..502be24ad 100644 --- a/LowFrequencyTrading/TradingEngine.js +++ b/LowFrequencyTrading/TradingEngine.js @@ -142,8 +142,8 @@ exports.newTradingEngine = function newTradingEngine(bot, logger) { } function updateEpisodeCountersAndStatistics() { - tradingEngine.episode.episodeCounters.periods.value++ - tradingEngine.episode.episodeStatistics.days.value = tradingEngine.episode.episodeCounters.periods.value * sessionParameters.timeFrame.config.value / global.ONE_DAY_IN_MILISECONDS + tradingEngine.current.episode.episodeCounters.periods.value++ + tradingEngine.current.episode.episodeStatistics.days.value = tradingEngine.current.episode.episodeCounters.periods.value * sessionParameters.timeFrame.config.value / global.ONE_DAY_IN_MILISECONDS } function updateDistanceToEventsCounters() { diff --git a/LowFrequencyTrading/TradingExecution.js b/LowFrequencyTrading/TradingExecution.js index 9ae658ce5..ec2bada64 100644 --- a/LowFrequencyTrading/TradingExecution.js +++ b/LowFrequencyTrading/TradingExecution.js @@ -188,7 +188,7 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE tradingEngineStage.stageQuotedAsset.sizePlaced.value = global.PRECISE(tradingEngineStage.stageQuotedAsset.sizePlaced.value, 10) /* Updating Episode Counters */ - tradingEngine.episode.episodeCounters.orders.value++ + tradingEngine.current.episode.episodeCounters.orders.value++ /* Initialize this */ tradingEngine.current.distanceToEvent.createOrder.value = 1 @@ -198,7 +198,7 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE tradingEngineOrder.identifier.value = global.UNIQUE_ID() tradingEngineOrder.begin.value = tradingEngine.current.candle.begin.value tradingEngineOrder.end.value = tradingEngine.current.candle.end.value - tradingEngineOrder.serialNumber.value = tradingEngine.episode.episodeCounters.orders.value + tradingEngineOrder.serialNumber.value = tradingEngine.current.episode.episodeCounters.orders.value tradingEngineOrder.orderName.value = tradingSystemOrder.name tradingEngineOrder.algorithmName.value = executionAlgorithm.name tradingEngineOrder.situationName.value = situationName diff --git a/LowFrequencyTrading/TradingPosition.js b/LowFrequencyTrading/TradingPosition.js index 436b0786f..b725758b9 100644 --- a/LowFrequencyTrading/TradingPosition.js +++ b/LowFrequencyTrading/TradingPosition.js @@ -42,7 +42,7 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng /* Recording the opening at the Trading Engine Data Structure */ tradingEngine.current.position.status.value = 'Open' - tradingEngine.current.position.serialNumber.value = tradingEngine.episode.episodeCounters.positions.value + tradingEngine.current.position.serialNumber.value = tradingEngine.current.episode.episodeCounters.positions.value tradingEngine.current.position.identifier.value = global.UNIQUE_ID() tradingEngine.current.position.begin.value = tradingEngine.current.candle.begin.value tradingEngine.current.position.beginRate.value = tradingEngine.current.candle.close.value @@ -56,7 +56,7 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng tradingEngine.current.position.takeProfit.takeProfitPhase.value = 0 /* Updating Episode Counters */ - tradingEngine.episode.episodeCounters.positions.value++ + tradingEngine.current.episode.episodeCounters.positions.value++ /* Inicializing this counter */ tradingEngine.current.distanceToEvent.takePosition.value = 1 @@ -268,9 +268,9 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng /* Hit Fail Calculation */ if (tradingEngine.current.position.positionStatistics.ROI.value > 0) { - tradingEngine.current.position.positionStatistics.hitFail.value = 'HIT' + tradingEngine.current.position.positionStatistics.hitFail.value = 'Hit' } else { - tradingEngine.current.position.positionStatistics.hitFail.value = 'FAIL' + tradingEngine.current.position.positionStatistics.hitFail.value = 'Fail' } /* Days Calculation */ @@ -308,14 +308,14 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng /* Hit Fail Calculation */ if (tradingEngine.current.position.positionBaseAsset.ROI.value > 0) { - tradingEngine.current.position.positionBaseAsset.hitFail.value = 'HIT' + tradingEngine.current.position.positionBaseAsset.hitFail.value = 'Hit' } else { - tradingEngine.current.position.positionBaseAsset.hitFail.value = 'FAIL' + tradingEngine.current.position.positionBaseAsset.hitFail.value = 'Fail' } if (tradingEngine.current.position.positionQuotedAsset.ROI.value > 0) { - tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'HIT' + tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'Hit' } else { - tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'FAIL' + tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'Fail' } } diff --git a/LowFrequencyTrading/TradingRecords.js b/LowFrequencyTrading/TradingRecords.js index c1646ef0c..5402bea7f 100644 --- a/LowFrequencyTrading/TradingRecords.js +++ b/LowFrequencyTrading/TradingRecords.js @@ -71,7 +71,12 @@ exports.newTradingRecords = function newTradingRecords(bot, logger) { /* The product root can be a node or a node property of type array. */ - let productRoot = eval(product.config.nodePath) + let productRoot + try { + productRoot = eval(product.config.nodePath) + } catch (err) { + badDefinitionUnhandledException(err, 'Cannot get productRoot -> nodePath = ' + product.config.nodePath, product, undefined) + } if (product.config.nodePathType === 'array') { /* @@ -122,7 +127,7 @@ exports.newTradingRecords = function newTradingRecords(bot, logger) { try { propertyRootNode = eval(recordProperty.config.nodePath) } catch (err) { - badDefinitionUnhandledException(err, 'Error Evaluation Record Property nodePath.', product, recordProperty) + badDefinitionUnhandledException(err, 'Error Evaluation Record Property nodePath -> nodePath = ' + recordProperty.config.nodePath, product, recordProperty) } } /* @@ -330,11 +335,19 @@ exports.newTradingRecords = function newTradingRecords(bot, logger) { } function badDefinitionUnhandledException(err, message, product, recordProperty) { - logger.write(MODULE_NAME, "[ERROR] appendRecords -> scanRecordDefinition -> Error at Record Property Definition -> " + message); - logger.write(MODULE_NAME, "[ERROR] appendRecords -> scanRecordDefinition -> Error at Record Property Definition -> product.name = " + product.name); - logger.write(MODULE_NAME, "[ERROR] appendRecords -> scanRecordDefinition -> Error at Record Property Definition -> recordProperty.name = " + recordProperty.name); - logger.write(MODULE_NAME, "[ERROR] appendRecords -> scanRecordDefinition -> Error at Record Property Definition -> recordProperty.config.codeName = " + recordProperty.config.codeName); - logger.write(MODULE_NAME, "[ERROR] appendRecords -> scanRecordDefinition -> Error at Record Property Definition -> err.stack = " + err.stack); + logger.write(MODULE_NAME, "[ERROR] appendRecords -> " + message); + logger.write(MODULE_NAME, "[ERROR] appendRecords -> product.name = " + product.name); + logger.write(MODULE_NAME, "[ERROR] appendRecords -> product.config = " + JSON.stringify(product.config)); + + if (recordProperty) { + logger.write(MODULE_NAME, "[ERROR] appendRecords -> recordProperty.name = " + recordProperty.name); + logger.write(MODULE_NAME, "[ERROR] appendRecords -> recordProperty.config.codeName = " + recordProperty.config.codeName); + logger.write(MODULE_NAME, "[ERROR] appendRecords -> recordProperty.config = " + JSON.stringify(recordProperty.config)); + } + + if (err) { + logger.write(MODULE_NAME, "[ERROR] appendRecords -> err.stack = " + err.stack); + } throw 'Can not continue with a Definition Error like this.' } } \ No newline at end of file diff --git a/LowFrequencyTrading/TradingStages.js b/LowFrequencyTrading/TradingStages.js index 6483f86ab..2e1550282 100644 --- a/LowFrequencyTrading/TradingStages.js +++ b/LowFrequencyTrading/TradingStages.js @@ -203,7 +203,7 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM tradingStrategyModule.openStrategy(j, situation.name, strategy.name) /* Updating Episode Counters */ - tradingEngine.episode.episodeCounters.strategies.value++ + tradingEngine.current.episode.episodeCounters.strategies.value++ /* Initialize this */ tradingEngine.current.distanceToEvent.triggerOn.value = 1 @@ -1027,112 +1027,112 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM /* Updating Hits & Fails */ if (tradingEngine.current.position.positionBaseAsset.profitLoss.value > 0) { - tradingEngine.episode.episodeBaseAsset.hits.value++ + tradingEngine.current.episode.episodeBaseAsset.hits.value++ } else { - tradingEngine.episode.episodeBaseAsset.fails.value++ + tradingEngine.current.episode.episodeBaseAsset.fails.value++ } if (tradingEngine.current.position.positionQuotedAsset.profitLoss.value > 0) { - tradingEngine.episode.episodeQuotedAsset.hits.value++ + tradingEngine.current.episode.episodeQuotedAsset.hits.value++ } else { - tradingEngine.episode.episodeQuotedAsset.fails.value++ + tradingEngine.current.episode.episodeQuotedAsset.fails.value++ } /* Updating Profit Loss */ - tradingEngine.episode.episodeBaseAsset.profitLoss.value = + tradingEngine.current.episode.episodeBaseAsset.profitLoss.value = tradingEngine.current.balance.baseAsset.value - sessionParameters.sessionBaseAsset.config.initialBalance - tradingEngine.episode.episodeQuotedAsset.profitLoss.value = + tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value = tradingEngine.current.balance.quotedAsset.value - sessionParameters.sessionQuotedAsset.config.initialBalance - tradingEngine.episode.episodeBaseAsset.profitLoss.value = global.PRECISE(tradingEngine.episode.episodeBaseAsset.profitLoss.value, 10) - tradingEngine.episode.episodeQuotedAsset.profitLoss.value = global.PRECISE(tradingEngine.episode.episodeQuotedAsset.profitLoss.value, 10) + tradingEngine.current.episode.episodeBaseAsset.profitLoss.value = global.PRECISE(tradingEngine.current.episode.episodeBaseAsset.profitLoss.value, 10) + tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value = global.PRECISE(tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value, 10) /* Updating ROI */ - tradingEngine.episode.episodeBaseAsset.ROI.value = - (sessionParameters.sessionBaseAsset.config.initialBalance + tradingEngine.episode.episodeBaseAsset.profitLoss.value) / + tradingEngine.current.episode.episodeBaseAsset.ROI.value = + (sessionParameters.sessionBaseAsset.config.initialBalance + tradingEngine.current.episode.episodeBaseAsset.profitLoss.value) / sessionParameters.sessionBaseAsset.config.initialBalance - 1 - tradingEngine.episode.episodeQuotedAsset.ROI.value = - (sessionParameters.sessionQuotedAsset.config.initialBalance + tradingEngine.episode.episodeQuotedAsset.profitLoss.value) / + tradingEngine.current.episode.episodeQuotedAsset.ROI.value = + (sessionParameters.sessionQuotedAsset.config.initialBalance + tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value) / sessionParameters.sessionQuotedAsset.config.initialBalance - 1 - tradingEngine.episode.episodeBaseAsset.ROI.value = global.PRECISE(tradingEngine.episode.episodeBaseAsset.ROI.value, 10) - tradingEngine.episode.episodeQuotedAsset.ROI.value = global.PRECISE(tradingEngine.episode.episodeQuotedAsset.ROI.value, 10) + tradingEngine.current.episode.episodeBaseAsset.ROI.value = global.PRECISE(tradingEngine.current.episode.episodeBaseAsset.ROI.value, 10) + tradingEngine.current.episode.episodeQuotedAsset.ROI.value = global.PRECISE(tradingEngine.current.episode.episodeQuotedAsset.ROI.value, 10) /* Updating Hit Ratio */ - tradingEngine.episode.episodeBaseAsset.hitRatio.value = - tradingEngine.episode.episodeBaseAsset.hits.value / - tradingEngine.episode.episodeCounters.positions.value + tradingEngine.current.episode.episodeBaseAsset.hitRatio.value = + tradingEngine.current.episode.episodeBaseAsset.hits.value / + tradingEngine.current.episode.episodeCounters.positions.value - tradingEngine.episode.episodeQuotedAsset.hitRatio.value = - tradingEngine.episode.episodeQuotedAsset.hits.value / - tradingEngine.episode.episodeCounters.positions.value + tradingEngine.current.episode.episodeQuotedAsset.hitRatio.value = + tradingEngine.current.episode.episodeQuotedAsset.hits.value / + tradingEngine.current.episode.episodeCounters.positions.value - tradingEngine.episode.episodeBaseAsset.hitRatio.value = global.PRECISE(tradingEngine.episode.episodeBaseAsset.hitRatio.value, 10) - tradingEngine.episode.episodeQuotedAsset.hitRatio.value = global.PRECISE(tradingEngine.episode.episodeQuotedAsset.hitRatio.value, 10) + tradingEngine.current.episode.episodeBaseAsset.hitRatio.value = global.PRECISE(tradingEngine.current.episode.episodeBaseAsset.hitRatio.value, 10) + tradingEngine.current.episode.episodeQuotedAsset.hitRatio.value = global.PRECISE(tradingEngine.current.episode.episodeQuotedAsset.hitRatio.value, 10) /* Updating Anualized Rate Of Return */ - tradingEngine.episode.episodeBaseAsset.anualizedRateOfReturn.value = - tradingEngine.episode.episodeBaseAsset.ROI.value / - tradingEngine.episode.episodeStatistics.days.value * 365 + tradingEngine.current.episode.episodeBaseAsset.anualizedRateOfReturn.value = + tradingEngine.current.episode.episodeBaseAsset.ROI.value / + tradingEngine.current.episode.episodeStatistics.days.value * 365 - tradingEngine.episode.episodeQuotedAsset.anualizedRateOfReturn.value = - tradingEngine.episode.episodeQuotedAsset.ROI.value / - tradingEngine.episode.episodeStatistics.days.value * 365 + tradingEngine.current.episode.episodeQuotedAsset.anualizedRateOfReturn.value = + tradingEngine.current.episode.episodeQuotedAsset.ROI.value / + tradingEngine.current.episode.episodeStatistics.days.value * 365 - tradingEngine.episode.episodeBaseAsset.anualizedRateOfReturn.value = global.PRECISE(tradingEngine.episode.episodeBaseAsset.anualizedRateOfReturn.value, 10) - tradingEngine.episode.episodeQuotedAsset.anualizedRateOfReturn.value = global.PRECISE(tradingEngine.episode.episodeQuotedAsset.anualizedRateOfReturn.value, 10) + tradingEngine.current.episode.episodeBaseAsset.anualizedRateOfReturn.value = global.PRECISE(tradingEngine.current.episode.episodeBaseAsset.anualizedRateOfReturn.value, 10) + tradingEngine.current.episode.episodeQuotedAsset.anualizedRateOfReturn.value = global.PRECISE(tradingEngine.current.episode.episodeQuotedAsset.anualizedRateOfReturn.value, 10) /* Updating Hit or Fail */ - if (tradingEngine.episode.episodeBaseAsset.profitLoss.value > 0) { - tradingEngine.episode.episodeBaseAsset.hitFail.value = 'Hit' + if (tradingEngine.current.episode.episodeBaseAsset.profitLoss.value > 0) { + tradingEngine.current.episode.episodeBaseAsset.hitFail.value = 'Hit' } else { - tradingEngine.episode.episodeBaseAsset.hitFail.value = 'Fail' + tradingEngine.current.episode.episodeBaseAsset.hitFail.value = 'Fail' } - if (tradingEngine.episode.episodeQuotedAsset.profitLoss.value > 0) { - tradingEngine.episode.episodeQuotedAsset.hitFail.value = 'Hit' + if (tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value > 0) { + tradingEngine.current.episode.episodeQuotedAsset.hitFail.value = 'Hit' } else { - tradingEngine.episode.episodeQuotedAsset.hitFail.value = 'Fail' + tradingEngine.current.episode.episodeQuotedAsset.hitFail.value = 'Fail' } } function updatingEpisodeStatistics() { /* Updating Profit Loss */ - tradingEngine.episode.episodeStatistics.profitLoss.value = - tradingEngine.episode.episodeBaseAsset.profitLoss.value * tradingEngine.current.candle.close.value + - tradingEngine.episode.episodeQuotedAsset.profitLoss.value + tradingEngine.current.episode.episodeStatistics.profitLoss.value = + tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * tradingEngine.current.candle.close.value + + tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value - tradingEngine.episode.episodeStatistics.profitLoss.value = global.PRECISE(tradingEngine.episode.episodeStatistics.profitLoss.value, 10) + tradingEngine.current.episode.episodeStatistics.profitLoss.value = global.PRECISE(tradingEngine.current.episode.episodeStatistics.profitLoss.value, 10) /* Updating ROI */ - tradingEngine.episode.episodeStatistics.ROI.value = + tradingEngine.current.episode.episodeStatistics.ROI.value = ( sessionParameters.sessionBaseAsset.config.initialBalance * tradingEngine.current.candle.close.value + - tradingEngine.episode.episodeBaseAsset.profitLoss.value * tradingEngine.current.candle.close.value + + tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * tradingEngine.current.candle.close.value + sessionParameters.sessionQuotedAsset.config.initialBalance + - tradingEngine.episode.episodeQuotedAsset.profitLoss.value + tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value ) / ( sessionParameters.sessionBaseAsset.config.initialBalance * tradingEngine.current.candle.close.value + sessionParameters.sessionQuotedAsset.config.initialBalance ) - 1 - tradingEngine.episode.episodeStatistics.ROI.value = global.PRECISE(tradingEngine.episode.episodeStatistics.ROI.value, 10) + tradingEngine.current.episode.episodeStatistics.ROI.value = global.PRECISE(tradingEngine.current.episode.episodeStatistics.ROI.value, 10) /* Updating Anualized Rate Of Return */ - tradingEngine.episode.episodeStatistics.anualizedRateOfReturn.value = - tradingEngine.episode.episodeStatistics.ROI.value / - tradingEngine.episode.episodeStatistics.days.value * 365 + tradingEngine.current.episode.episodeStatistics.anualizedRateOfReturn.value = + tradingEngine.current.episode.episodeStatistics.ROI.value / + tradingEngine.current.episode.episodeStatistics.days.value * 365 - tradingEngine.episode.episodeStatistics.anualizedRateOfReturn.value = global.PRECISE(tradingEngine.episode.episodeStatistics.anualizedRateOfReturn.value, 10) + tradingEngine.current.episode.episodeStatistics.anualizedRateOfReturn.value = global.PRECISE(tradingEngine.current.episode.episodeStatistics.anualizedRateOfReturn.value, 10) /* Updating Hit or Fail */ - if (tradingEngine.episode.episodeStatistics.profitLoss.value > 0) { - tradingEngine.episode.episodeStatistics.hitFail.value = 'Hit' + if (tradingEngine.current.episode.episodeStatistics.profitLoss.value > 0) { + tradingEngine.current.episode.episodeStatistics.hitFail.value = 'Hit' } else { - tradingEngine.episode.episodeStatistics.hitFail.value = 'Fail' + tradingEngine.current.episode.episodeStatistics.hitFail.value = 'Fail' } } } diff --git a/LowFrequencyTrading/TradingStrategy.js b/LowFrequencyTrading/TradingStrategy.js index 0728c2b0c..5006e3eb6 100644 --- a/LowFrequencyTrading/TradingStrategy.js +++ b/LowFrequencyTrading/TradingStrategy.js @@ -28,7 +28,7 @@ exports.newTradingStrategy = function newTradingStrategy(bot, logger, tradingEng function openStrategy(index, situationName, strategyName) { tradingEngine.current.strategy.status.value = 'Open' - tradingEngine.current.strategy.serialNumber.value = tradingEngine.episode.episodeCounters.strategies.value + tradingEngine.current.strategy.serialNumber.value = tradingEngine.current.episode.episodeCounters.strategies.value tradingEngine.current.strategy.identifier.value = global.UNIQUE_ID() tradingEngine.current.strategy.begin.value = tradingEngine.current.candle.begin.value tradingEngine.current.strategy.end.value = tradingEngine.current.candle.end.value