diff --git a/LowFrequencyTrading/TradingOrders.js b/LowFrequencyTrading/TradingOrders.js index bb82dde04..488ebc65c 100644 --- a/LowFrequencyTrading/TradingOrders.js +++ b/LowFrequencyTrading/TradingOrders.js @@ -243,20 +243,27 @@ exports.newTradingOrders = function newTradingOrders(bot, logger, tradingEngineM tradingEngineOrder.situationName.value = situationName function calculateOrderRate() { - /* By default this is the order rate and it is the rate that applies to Market Orders */ - tradingEngineOrder.rate.value = tradingEngine.current.episode.candle.close.value /* Optional Rate Definition */ - if (tradingSystemOrder.orderRate !== undefined) { - if (tradingSystemOrder.orderRate.formula !== undefined) { - tradingEngineOrder.rate.value = tradingSystem.formulas.get(tradingSystemOrder.orderRate.formula.id) + if (tradingSystemOrder.type === 'Limit Buy Order' || tradingSystemOrder.type === 'Limit Sell Order') { + if (tradingSystemOrder.orderRate === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.orderRate === undefined', tradingSystemOrder) } + if (tradingSystemOrder.orderRate.formula === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.orderRate.formula === undefined', tradingSystemOrder) } + + /* Extract the rate value from the user-defined formula */ + tradingEngineOrder.rate.value = tradingSystem.formulas.get(tradingSystemOrder.orderRate.formula.id) - if (tradingEngineOrder.rate.value === undefined) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value === undefined', tradingEngineOrder) } - if (isNaN(tradingEngineOrder.rate.value) === true) { badDefinitionUnhandledException(undefined, 'isNaN(tradingEngineOrder.rate.value) === true', tradingEngineOrder) } - if (tradingEngineOrder.rate.value <= 0) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value <= 0', tradingEngineOrder) } + /* Final rate validations */ + if (tradingEngineOrder.rate.value === undefined) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value === undefined', tradingSystemOrder) } + if (isNaN(tradingEngineOrder.rate.value) === true) { badDefinitionUnhandledException(undefined, 'isNaN(tradingEngineOrder.rate.value) === true', tradingSystemOrder) } + if (tradingEngineOrder.rate.value <= 0) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value <= 0', tradingSystemOrder) } - tradingEngineOrder.rate.value = global.PRECISE(tradingEngineOrder.rate.value, 10) - } + tradingEngineOrder.rate.value = global.PRECISE(tradingEngineOrder.rate.value, 10) + } else { + /* + For Market Orders, the rate is irrelevant, since it is not sent to the Exchange. + We store at this field the last know price as a reference. + */ + tradingEngineOrder.rate.value = tradingEngine.current.episode.candle.close.value } } diff --git a/LowFrequencyTrading/TradingProcess.js b/LowFrequencyTrading/TradingProcess.js index 68ee99d0c..971060a52 100644 --- a/LowFrequencyTrading/TradingProcess.js +++ b/LowFrequencyTrading/TradingProcess.js @@ -82,6 +82,11 @@ await processSingleFiles() await processMarketFiles() + /* + This is the Data Structure used at the Simulation with all indicator data. + We start creating it right here. + */ + let chart = {} /* Here we check if we need to get Daily Files or not. As an optimization, when we are running on a Time Frame of 1hs or above, we are not going to load @@ -89,11 +94,9 @@ we alreaady set a value to currentTimeFrame. We are also not going to loop through days if we are processing market files. */ - if (currentTimeFrame) { /* We are processing Market Files */ - let chart = {} buildCharts(chart) await generateOutput(chart) @@ -115,7 +118,6 @@ await processDailyFiles() - let chart = {} buildCharts(chart) await generateOutput(chart) @@ -407,6 +409,10 @@ dataFiles = new Map(); + /* + We will iterate through all dependencies, in order to load the + files that later will end up at the chart data structure. + */ for (let dependencyIndex = 0; dependencyIndex < dataDependenciesModule.nodeArray.length; dependencyIndex++) { let dependency = dataDependenciesModule.nodeArray[dependencyIndex]; let datasetModule = dataDependenciesModule.dataSetsModulesArray[dependencyIndex]; @@ -462,13 +468,6 @@ let mapKey = global.dailyFilePeriods[n][1]; multiPeriodDataFiles.set(mapKey, dataFiles) } - - if (currentTimeFrame !== undefined) { - buildCharts(advanceTime); - } else { - logger.write(MODULE_NAME, "[ERROR] start -> processDailyFiles -> Time Frame not Recognized. Can not continue."); - callBackFunction(global.DEFAULT_FAIL_RESPONSE); - } } function advanceTime() {