diff --git a/.vs/AAWebPlatform/v15/.suo b/.vs/AAWebPlatform/v15/.suo index e3036f402..c4514eca9 100644 Binary files a/.vs/AAWebPlatform/v15/.suo and b/.vs/AAWebPlatform/v15/.suo differ diff --git a/AAWebPlatform.njsproj b/AAWebPlatform.njsproj index 815beb72a..5c896906c 100644 --- a/AAWebPlatform.njsproj +++ b/AAWebPlatform.njsproj @@ -113,6 +113,9 @@ Code + + Code + Code diff --git a/File.js b/File.js index c42a92278..290a28a1b 100644 --- a/File.js +++ b/File.js @@ -1,5 +1,5 @@  -function newFile() { +function newFile() { let fileObject = { getFile: getFile, @@ -11,38 +11,22 @@ function newFile() { return fileObject; - function initialize(pTeamCodeName, pBotCodeName, pProductCodeName, pSetCodeName, pExchange, pMarket, callBackFunction) { + function initialize(pDevTeam, pBot, pProduct, pSet, pExchange, pMarket, callBackFunction) { - let product = ecosystem.getProduct(ecosystem.getBot(ecosystem.getTeam(pTeamCodeName), pBotCodeName), pProductCodeName); - - if (product === undefined) { - - throw "Product not found at this bot of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName; - - } - - let exchange = ecosystem.getExchange(product, pExchange); + let exchange = ecosystem.getExchange(pProduct, pExchange); if (exchange === undefined) { - throw "Exchange not supoorted by this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pExchange = " + pExchange; - - } - - let productSet = ecosystem.getSet(product, pSetCodeName); - - if (productSet === undefined) { - - throw "Set not found at this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pSetCodeName = " + pSetCodeName; + throw "Exchange not supoorted by this pProduct of the ecosystem! - pDevTeam.codeName = " + pDevTeam.codeName + ", pBot.codeName = " + pBot.codeName + ", pProduct.codeName = " + pProduct.codeName + ", pExchange = " + pExchange; } fileCloud = newFileCloud(); - fileCloud.initialize(pTeamCodeName, pBotCodeName); + fileCloud.initialize(pBot); /* Now we will get the file */ - fileCloud.getFile(productSet, exchange, pMarket, undefined, undefined, onFileReceived); + fileCloud.getFile(pSet, exchange, pMarket, undefined, undefined, onFileReceived); function onFileReceived(pFile) { diff --git a/FileCache.js b/FileCache.js index ee06603eb..164523cf1 100644 --- a/FileCache.js +++ b/FileCache.js @@ -3,9 +3,13 @@ function newFileCache() { let fileCache = { getFile: getFile, + getExpectedFiles: getExpectedFiles, + getFilesLoaded: getFilesLoaded, initialize: initialize } + let filesLoaded = 0; + let fileCloud; let files = new Map; @@ -14,34 +18,18 @@ function newFileCache() { return fileCache; - function initialize(pTeamCodeName, pBotCodeName, pProductCodeName, pSetCodeName, pExchange, pMarket, callBackFunction) { + function initialize(pDevTeam, pBot, pProduct, pSet, pExchange, pMarket, callBackFunction) { - let product = ecosystem.getProduct(ecosystem.getBot(ecosystem.getTeam(pTeamCodeName), pBotCodeName), pProductCodeName); - - if (product === undefined) { - - throw "Product not found at this bot of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName; - - } - - let exchange = ecosystem.getExchange(product, pExchange); + let exchange = ecosystem.getExchange(pProduct, pExchange); if (exchange === undefined) { - throw "Exchange not supoorted by this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pExchange = " + pExchange; - - } - - let productSet = ecosystem.getSet(product, pSetCodeName); - - if (productSet === undefined) { - - throw "Set not found at this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pSetCodeName = " + pSetCodeName; + throw "Exchange not supoorted by this pProduct of the ecosystem! - pDevTeam.codeName = " + pDevTeam.codeName + ", pBot.codeName = " + pBot.codeName + ", pProduct.codeName = " + pProduct.codeName + ", pExchange = " + pExchange; } fileCloud = newFileCloud(); - fileCloud.initialize(pTeamCodeName, pBotCodeName); + fileCloud.initialize(pBot); /* Now we will get the market files */ @@ -50,15 +38,17 @@ function newFileCache() { let periodTime = marketFilesPeriods[i][0]; let periodName = marketFilesPeriods[i][1]; - if (productSet.validPeriods.includes(periodName) === true) { + if (pSet.validPeriods.includes(periodName) === true) { - fileCloud.getFile(productSet, exchange, pMarket, periodName, undefined, onFileReceived); + fileCloud.getFile(pSet, exchange, pMarket, periodName, undefined, onFileReceived); function onFileReceived(file) { files.set(periodTime, file); - callBackFunction(); // Note that the call back is called for every file loaded. + filesLoaded++; + + callBackFunction(); // Note that the callback is called for every file loaded. } } @@ -71,4 +61,16 @@ function newFileCache() { } + function getExpectedFiles() { + + return marketFilesPeriods.length; + + } + + function getFilesLoaded() { + + return filesLoaded; + + } + } \ No newline at end of file diff --git a/FileCloud.js b/FileCloud.js index 92eea0eaf..0a548ff8f 100644 --- a/FileCloud.js +++ b/FileCloud.js @@ -10,11 +10,9 @@ function newFileCloud() { return fileCloud; - function initialize(pTeamCodeName, pBotCodeName) { + function initialize(pBot) { - let bot = ecosystem.getBot(ecosystem.getTeam(pTeamCodeName), pBotCodeName); - - fileService = AzureStorage.createFileServiceWithSas(bot.storage.fileUri, bot.storage.sas).withFilter(new AzureStorage.ExponentialRetryPolicyFilter()); + fileService = AzureStorage.createFileServiceWithSas(pBot.storage.fileUri, pBot.storage.sas).withFilter(new AzureStorage.ExponentialRetryPolicyFilter()); } @@ -79,10 +77,4 @@ function newFileCloud() { } } - - -} - - - - +} \ No newline at end of file diff --git a/FileCursor.js b/FileCursor.js index f25961627..537832bdd 100644 --- a/FileCursor.js +++ b/FileCursor.js @@ -8,6 +8,7 @@ function newFileCursor() { setDatetime: setDatetime, setTimePeriod: setTimePeriod, files: undefined, + getExpectedFiles: getExpectedFiles, initialize: initialize } @@ -19,18 +20,18 @@ function newFileCursor() { let market; let exchange; let fileCloud; - let productSet; + let thisSet; let periodName; let timePeriod; return fileCursor; - function initialize(pFileCloud, pProductSet, pExchange, pMarket, pPeriodName, pTimePeriod, pCursorDate, pCurrentTimePeriod, callBackFunction) { + function initialize(pFileCloud, pSet, pExchange, pMarket, pPeriodName, pTimePeriod, pCursorDate, pCurrentTimePeriod, callBackFunction) { market = pMarket; exchange = pExchange; fileCloud = pFileCloud; - productSet = pProductSet; + thisSet = pSet; periodName = pPeriodName; cursorDate = pCursorDate; timePeriod = pTimePeriod; @@ -289,7 +290,7 @@ function newFileCursor() { if (fileCursor.files.get(dateString) === undefined) { // We dont reload files we already have. - fileCloud.getFile(productSet, exchange, market, periodName, targetDate, onFileReceived); + fileCloud.getFile(thisSet, exchange, market, periodName, targetDate, onFileReceived); } else { @@ -349,4 +350,10 @@ function newFileCursor() { } + function getExpectedFiles() { + + return minCursorSize; + + } + } \ No newline at end of file diff --git a/FileCursorCache.js b/FileCursorCache.js index 3abeb88a6..626616eef 100644 --- a/FileCursorCache.js +++ b/FileCursorCache.js @@ -5,9 +5,14 @@ function newFileCursorCache() { getFileCursor: getFileCursor, setDatetime: setDatetime, setTimePeriod: setTimePeriod, + getExpectedFiles: getExpectedFiles, + getFilesLoaded: getFilesLoaded, initialize: initialize } + let filesLoaded = 0; + let expectedFiles = 0; + let fileCloud; let marketFiles = new Map; @@ -15,34 +20,18 @@ function newFileCursorCache() { return fileCursorCache; - function initialize(pTeamCodeName, pBotCodeName, pProductCodeName, pSetCodeName, pExchange, pMarket, pDatetime, pTimePeriod, callBackFunction) { + function initialize(pDevTeam, pBot, pProduct, pSet, pExchange, pMarket, pDatetime, pTimePeriod, callBackFunction) { - let product = ecosystem.getProduct(ecosystem.getBot(ecosystem.getTeam(pTeamCodeName), pBotCodeName), pProductCodeName); - - if (product === undefined) { - - throw "Product not found at this bot of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName; - - } - - let exchange = ecosystem.getExchange(product, pExchange); + let exchange = ecosystem.getExchange(pProduct, pExchange); if (exchange === undefined) { - throw "Exchange not supoorted by this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pExchange = " + pExchange; - - } - - let productSet = ecosystem.getSet(product, pSetCodeName); - - if (productSet === undefined) { - - throw "Set not found at this product of the ecosystem! - pTeamCodeName = " + pTeamCodeName + ", pBotCodeName = " + pBotCodeName + ", pProductCodeName = " + pProductCodeName + ", pSetCodeName = " + pSetCodeName; + throw "Exchange not supoorted by this product of the ecosystem! - pDevTeam.codeName = " + pDevTeam.codeName + ", pBot.codeName = " + pBot.codeName + ", pProduct.codeName = " + pProduct.codeName + ", pExchange = " + pExchange; } fileCloud = newFileCloud(); - fileCloud.initialize(pTeamCodeName, pBotCodeName); + fileCloud.initialize(pBot); /* Now we will get the daily files */ @@ -51,15 +40,18 @@ function newFileCursorCache() { let periodTime = dailyFilePeriods[i][0]; let periodName = dailyFilePeriods[i][1]; - if (productSet.validPeriods.includes(periodName) === true) { + if (pSet.validPeriods.includes(periodName) === true) { let fileCursor = newFileCursor(); - fileCursor.initialize(fileCloud, productSet, exchange, pMarket, periodName, periodTime, pDatetime, pTimePeriod, onFileReceived); + fileCursor.initialize(fileCloud, pSet, exchange, pMarket, periodName, periodTime, pDatetime, pTimePeriod, onFileReceived); fileCursors.set(periodTime, fileCursor); + expectedFiles = expectedFiles + fileCursor.getExpectedFiles(); + function onFileReceived() { + filesLoaded++; callBackFunction(); // Note that the call back is called for every file loaded at each cursor. } @@ -94,4 +86,16 @@ function newFileCursorCache() { } } + + function getExpectedFiles() { + + return expectedFiles; + + } + + function getFilesLoaded() { + + return filesLoaded; + + } } \ No newline at end of file diff --git a/Storage.js b/Storage.js new file mode 100644 index 000000000..7ea0fef91 --- /dev/null +++ b/Storage.js @@ -0,0 +1,133 @@ + +function newStorage() { + + /* + + This object will initialize children objects that will end up loading the data of each set defined at each product of the bot received at initialization. + Once all the underlaying objects are fully initialized it will callback. + + At the same time it will raise an event for each underlaying file being loaded, so that the UI can reflect the progress to the end user. + + */ + + thisObject = { + + fileCache: undefined, + fileCursorCache: undefined, + file: undefined, + + eventHandler: undefined, + initialize: initialize + + } + + thisObject.eventHandler = newEventHandler(); + + return thisObject; + +} + +function initialize(pDevTeam, pBot, pProduct, pExchange, pMarket, pDatetime, pTimePeriod, callBackFunction) { + + /* We name the event Handler to easy debugging. */ + + thisObject.eventHandler.name = "Storage" + pDevTeam.codeName + "-" + pBot.codeName + "-" + pProduct.codeName + + let dataSetsToLoad = 0; + let dataSetsLoaded = 0; + + for (i = 0; i < pProduct.sets.length; i++) { + + let thisSet = pProduct.sets[i]; + + switch (thisSet.type) { + case 'Market Files': { + + thisObject.fileCache = newFileCache(); + thisObject.fileCache.initialize(pDevTeam, pBot, pProduct, thisSet, pExchange, pMarket, onCacheFileReady); + dataSetsToLoad++; + + } + break; + + case 'Daily Files': { + + thisObject.fileCursorCache = newFileCursorCache(); + thisObject.fileCursorCache.initialize(pDevTeam, pBot, pProduct, thisSet, pExchange, pMarket, pDatetime, pTimePeriod, onFileCursorReady); + dataSetsToLoad++; + + } + break; + + case 'Single File': { + + thisObject.file = newFile(); + thisObject.file.initialize(pDevTeam, pBot, pProduct, thisSet, pExchange, pMarket, onSingleFileReady); + dataSetsToLoad++; + + } + break; + + } + } + + function onCacheFileReady() { + + let event = { + totalValue: thisObject.fileCache.getExpectedFiles(), + currentValue: thisObject.fileCache.getFilesLoaded() + } + + thisObject.eventHandler.raiseEvent('Storage File Ready', event); + + if (event.currentValue === event.totalValue) { + + dataSetsLoaded++; + + checkInitializeComplete(); + } + } + + function onFileCursorReady() { + + let event = { + totalValue: thisObject.fileCursorCache.getExpectedFiles(), + currentValue: thisObject.fileCursorCache.getFilesLoaded() + } + + thisObject.eventHandler.raiseEvent('Storage File Ready', event); + + if (event.currentValue === event.totalValue) { + + dataSetsLoaded++; + + checkInitializeComplete(); + } + } + + function onSingleFileReady() { + + let event = { + totalValue: 1, + currentValue: 1 + } + + thisObject.eventHandler.raiseEvent('Storage File Ready', event); + + if (event.currentValue === event.totalValue) { + + dataSetsLoaded++; + + checkInitializeComplete(); + } + } + + function checkInitializeComplete() { + + if (dataSetsLoaded === dataSetsToLoad) { + + callBackFunction(); + + } + } +} \ No newline at end of file diff --git a/ecosystem.json b/ecosystem.json index fd412ed53..850ecb930 100644 --- a/ecosystem.json +++ b/ecosystem.json @@ -37,13 +37,13 @@ "storageAccount": "aaolivia", "sets": [ { - "codeName": "Market Files", + "type": "Market Files", "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ], "filePath": "@Exchange/Output/Candles/Multi-Period-Market/@Period", "fileName": "@AssetA_@AssetB.json" }, { - "codeName": "Daily Files", + "type": "Daily Files", "validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], "filePath": "@Exchange/Output/Candles/Multi-Period-Daily/@Period/@Year/@Month/@Day", "fileName": "@AssetA_@AssetB.json" @@ -68,13 +68,13 @@ "storageAccount": "aaolivia", "sets": [ { - "codeName": "Market Files", + "type": "Market Files", "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ], "filePath": "@Exchange/Output/Volumes/Multi-Period-Market/@Period", "fileName": "@AssetA_@AssetB.json" }, { - "codeName": "Daily Files", + "type": "Daily Files", "validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], "filePath": "@Exchange/Output/Volumes/Multi-Period-Daily/@Period/@Year/@Month/@Day", "fileName": "@AssetA_@AssetB.json" @@ -113,13 +113,13 @@ "storageAccount": "aatom", "sets": [ { - "codeName": "Market Files", + "type": "Market Files", "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ], "filePath": "@Exchange/Tom/dataSet.V1/Output/Candle-Stairs/Multi-Period-Market/@Period", "fileName": "@AssetA_@AssetB.json" }, { - "codeName": "Daily Files", + "type": "Daily Files", "validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], "filePath": "@Exchange/Tom/dataSet.V1/Output/Candle-Stairs/Multi-Period-Daily/@Period/@Year/@Month/@Day", "fileName": "@AssetA_@AssetB.json" @@ -143,13 +143,13 @@ "storageAccount": "aatom", "sets": [ { - "codeName": "Market Files", + "type": "Market Files", "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs" ], "filePath": "@Exchange/Tom/dataSet.V1/Output/Volume-Stairs/Multi-Period-Market/@Period", "fileName": "@AssetA_@AssetB.json" }, { - "codeName": "Daily Files", + "type": "Daily Files", "validPeriods": [ "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], "filePath": "@Exchange/Tom/dataSet.V1/Output/Volume-Stairs/Multi-Period-Daily/@Period/@Year/@Month/@Day", "fileName": "@AssetA_@AssetB.json" @@ -188,7 +188,7 @@ "storageAccount": "aamariam", "sets": [ { - "codeName": "Trading History File", + "type": "Single File", "validPeriods": [ "24-hs", "12-hs", "08-hs", "06-hs", "04-hs", "03-hs", "02-hs", "01-hs", "45-min", "40-min", "30-min", "20-min", "15-min", "10-min", "05-min", "04-min", "03-min", "02-min", "01-min" ], "filePath": "@Exchange/Mariam/dataSet.V1/Output/Trading-Process", "fileName": "Execution.History.json"