Current Episode

This commit is contained in:
Luis Fernando Molina committed 2020-08-07 09:21:30 +02:00
1 parent 2348a2bacb
commit f4583230c6
7 files changed
+86 -73

No files matched your search

+1 -1
View File
@@ -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
+2 -2
View File
@@ -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() {
+2 -2
View File
@@ -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
+8 -8
View File
@@ -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'
}
}
+20 -7
View File
@@ -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.'
}
}
+52 -52
View File
@@ -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'
}
}
}
+1 -1
View File
@@ -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