diff --git a/AABrowserAPI/UserAuthentication.js b/AABrowserAPI/UserAuthentication.js index 49bd93ad9..e24b1d2da 100644 --- a/AABrowserAPI/UserAuthentication.js +++ b/AABrowserAPI/UserAuthentication.js @@ -89,7 +89,7 @@ let container = "aaplatform"; let readPermission = storageAccessManager.getPermission(container, "READ", MAX_STORAGE_PERMISSION_DAYS); userProfile.storagePermissions.push(["AAPlatform" + "." + "READ", readPermission]); - + callBackFunction(global.DEFAULT_OK_RESPONSE, userProfile); } diff --git a/BottomSpace/DeleteTradingHistory.js b/BottomSpace/DeleteTradingHistory.js new file mode 100644 index 000000000..b7b06cbdc --- /dev/null +++ b/BottomSpace/DeleteTradingHistory.js @@ -0,0 +1,241 @@ + +function newDeleteTradingHistory() { + + var thisObject = { + container: undefined, + draw: draw, + getContainer: getContainer, // returns the inner most container that holds the point received by parameter. + initialize: initialize + }; + + var container = newContainer(); + container.initialize(); + thisObject.container = container; + + thisObject.container.frame.width = 150; + thisObject.container.frame.height = BOTTOM_SPACE_HEIGHT; + + container.frame.position.x = 0; + container.frame.position.y = 0; + + container.isDraggeable = false; + container.isClickeable = true; + + let icon; + let canDrawIcon = false; + + return thisObject; + + function initialize() { + + icon = new Image(); + + icon.onload = onImageLoad; + + function onImageLoad() { + canDrawIcon = true; + } + + icon.src = "Images/trash.png"; + + thisObject.container.eventHandler.listenToEvent("onMouseClick", onClick); + + } + + function onClick() { + + /* + + To delete the trading history we will follow these steps: + + 1. Get the status report of that bot. + 2. Iterate through all the entries for the startMode received by parameters. + 3. For each entry, get the execution history file belonging to that entry. + 4. Iterate on each entry of each execution history file to get the date of each execution that we will use to locate the + execution context file. + 6. Delete every execution context file found. + 7. Delete the execution history file after finishing the interation. + 8. Delete the Sequence file belonging to the received Start Mode. + 9. Save the Status Report without the records of this Start Mode. + + */ + + let storage = AzureStorage.Blob; + + let readOnlyBlobService; + let writeOnlyBlobService; + + let readConnectionString = window.USER_PROFILE.storagePermissions.get(window.DEV_TEAM + "." + "READ"); + + if (readConnectionString !== undefined) { + readOnlyBlobService = storage.createBlobService(readConnectionString); + } + + let writeConnectionString = window.USER_PROFILE.storagePermissions.get(window.DEV_TEAM + "." + "WRITE"); + + if (writeConnectionString !== undefined) { + writeOnlyBlobService = storage.createBlobService(writeConnectionString); + } + + let containerName = window.DEV_TEAM.toLowerCase(); + + let filePath = window.DEV_TEAM + "/" + window.CURRENT_BOT_CODE_NAME + "/" + "AACloud.1.1" + "/" + "Ploniex" + "/" + "dataSet.V1" + "/" + "Reports" + "/" + "Trading-Process"; + let fileName = "Status.Report.USDT_BTC.json"; + + readOnlyBlobService.getBlobToText(containerName, filePath + "/" + fileName, onStatusReport); + + function onStatusReport(err, text, response) { + + let statusReport = JSON.parse(text); + let runs; + + switch (window.CURRENT_START_MODE) { + + case "Live": { + runs = statusReport.liveRuns; + break; + } + + case "Backtest": { + runs = statusReport.backtestRuns; + break; + } + + case "Competition": { + runs = statusReport.competitionRuns; + break; + } + + } + + for (let i = 0; i < runs.lenght; i++) { + + /* For each record, we will get the execution history file. */ + + let filePath = window.DEV_TEAM + "/" + window.CURRENT_BOT_CODE_NAME + "/" + "AACloud.1.1" + "/" + "Ploniex" + "/" + "dataSet.V1" + "/" + "Output" + "/" + "Trading-Process"; + let fileName = "Execution.History." + window.CURRENT_START_MODE + "." + i + ".json"; + + readOnlyBlobService.getBlobToText(containerName, filePath + "/" + fileName, onExecutionHistory); + + function onExecutionHistory(err, text, response) { + + let executionHistory = JSON.parse(text); + + for (let i = 0; i < executionHistory.lenght; i++) { + + let executionDate = new Date(executionHistory[i]); + + let datePath = dateTime.getUTCFullYear() + "/" + pad(dateTime.getUTCMonth() + 1, 2) + "/" + pad(dateTime.getUTCDate(), 2) + "/" + pad(dateTime.getUTCHours(), 2) + "/" + pad(dateTime.getUTCMinutes(), 2); + + let filePath = window.DEV_TEAM + "/" + window.CURRENT_BOT_CODE_NAME + "/" + "AACloud.1.1" + "/" + "Ploniex" + "/" + "dataSet.V1" + "/" + "Output" + "/" + "Trading-Process" + "/" + datePath; + let fileName = "Execution.Context." + window.CURRENT_START_MODE + "." + i + ".json"; + + readOnlyBlobService.deleteBlob(containerName, filePath + "/" + fileName, onDeleted); + + function onDeleted(err, text, response) { + + console.log(filePath + "/" + fileName + " deleted."); + + } + } + + /* Now we delete the execution history file. */ + + readOnlyBlobService.deleteBlob(containerName, filePath + "/" + fileName, onDeleted); + + function onDeleted(err, text, response) { + + console.log(filePath + "/" + fileName + " deleted."); + + } + } + } + + switch (window.CURRENT_START_MODE) { + + case "Live": { + statusReport.liveRuns = []; + break; + } + + case "Backtest": { + statusReport.backtestRuns= []; + break; + } + + case "Competition": { + statusReport.competitionRuns = []; + break; + } + } + + /* Here is where we update the current Status Report file with the new version without records for the current Start Mode. */ + + let fileContent = JSON.stringify(statusReport); + + writeOnlyBlobService.createBlockBlobFromText(containerName, filePath + "/" + fileName, fileContent, onStatusReportUpdated); + + function onStatusReportUpdated() (err, text, response) { + + console.log(filePath + "/" + fileName + " updated."); + + } + + /* Finally we delete the sequence file. */ + + let filePath = window.DEV_TEAM + "/" + window.CURRENT_BOT_CODE_NAME + "/" + "AACloud.1.1" + "/" + "Ploniex" + "/" + "dataSet.V1" + "/" + "Output" + "/" + "Trading-Process"; + let fileName = "Execution.History." + window.CURRENT_START_MODE + "." + "Sequence" + ".json"; + + readOnlyBlobService.deleteBlob(containerName, filePath + "/" + fileName, onDeleted); + + function onDeleted(err, text, response) { + + console.log(filePath + "/" + fileName + " deleted."); + + } + } + + function pad(str, max) { + str = str.toString(); + return str.length < max ? pad("0" + str, max) : str; + } + } + + function getContainer(point) { + + let container; + + /* First we check if this point is inside this object UI. */ + + if (thisObject.container.frame.isThisPointHere(point, true) === true) { + + return this.container; + + } else { + + /* This point does not belong to this space. */ + + return undefined; + } + + } + + function draw() { + + thisObject.container.frame.draw(false, false); + + if (canDrawIcon === false) { return; } + + let imageHeight = 45; + let imageWidth = 45; + + let imagePoint = { + x: 10, + y: thisObject.container.frame.height / 2 - imageHeight / 2 + }; + + imagePoint = thisObject.container.frame.frameThisPoint(imagePoint); + + browserCanvasContext.drawImage(icon, imagePoint.x, imagePoint.y, imageWidth, imageHeight); + } +} \ No newline at end of file diff --git a/Project.njsproj b/Project.njsproj index e2fd0014f..ff40bb8b2 100644 --- a/Project.njsproj +++ b/Project.njsproj @@ -37,6 +37,9 @@ + + Code + Code diff --git a/Spaces/BottomSpace.js b/Spaces/BottomSpace.js index a5fee795d..0dcff73e4 100644 --- a/Spaces/BottomSpace.js +++ b/Spaces/BottomSpace.js @@ -2,6 +2,7 @@ function newBottomSpace() { var thisObject = { + deleteTradingHistory: undefined, container: undefined, draw: draw, getContainer: getContainer, // returns the inner most container that holds the point received by parameter. @@ -24,7 +25,8 @@ function newBottomSpace() { function initialize() { - + thisObject.deleteTradingHistory = newDeleteTradingHistory(); + thisObject.deleteTradingHistory.initialize(); } @@ -32,7 +34,8 @@ function newBottomSpace() { let container; - + container = thisObject.deleteTradingHistory.getContainer(point); + if (container !== undefined) { return container; } /* The point does not belong to any inner container, so we return the current container. */ @@ -45,6 +48,7 @@ function newBottomSpace() { thisObject.container.frame.draw(false, false); drawBackground(); + thisObject.deleteTradingHistory.draw(); } diff --git a/TopSpace/CurrentBot.js b/TopSpace/CurrentBot.js index 0c425c2fa..d43661848 100644 --- a/TopSpace/CurrentBot.js +++ b/TopSpace/CurrentBot.js @@ -32,15 +32,17 @@ function newCurrentBot() { sharedStatus = pSharedStatus; if (window.USER_PROFILE.devTeams.length === 0) { - window.CURRENT_BOT = NOT_FOUND; + window.CURRENT_BOT_DISPLAY_NAME = NOT_FOUND; } else { if (window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots.length === 0) { - window.CURRENT_BOT = NOT_FOUND; + window.CURRENT_BOT_DISPLAY_NAME = NOT_FOUND; window.CURRENT_BOT_REPO = "NO REPO"; + window.CURRENT_BOT_CODE_NAME = ""; } else { - window.CURRENT_BOT = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; + window.CURRENT_BOT_DISPLAY_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; window.CURRENT_BOT_REPO = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].repo; + window.CURRENT_BOT_CODE_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].codeName; } } @@ -53,13 +55,15 @@ function newCurrentBot() { if (window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots.length > 0) { sharedStatus.currentUserBotIndex = 0; - window.CURRENT_BOT = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; + window.CURRENT_BOT_DISPLAY_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; window.CURRENT_BOT_REPO = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].repo; + window.CURRENT_BOT_CODE_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].codeName; + sharedStatus.eventHandler.raiseEvent("userBot Changed"); } else { - window.CURRENT_BOT = NOT_FOUND; + window.CURRENT_BOT_DISPLAY_NAME = NOT_FOUND; } } @@ -69,8 +73,10 @@ function newCurrentBot() { if (sharedStatus.currentUserBotIndex + 1 === window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots.length) { sharedStatus.currentUserBotIndex = 0; - window.CURRENT_BOT = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; + window.CURRENT_BOT_DISPLAY_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; window.CURRENT_BOT_REPO = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].repo; + window.CURRENT_BOT_CODE_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].codeName; + sharedStatus.eventHandler.raiseEvent("userBot Changed"); return; } @@ -78,8 +84,10 @@ function newCurrentBot() { if (sharedStatus.currentUserBotIndex + 1 < window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots.length) { sharedStatus.currentUserBotIndex++; - window.CURRENT_BOT = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; + window.CURRENT_BOT_DISPLAY_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].displayName; window.CURRENT_BOT_REPO = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].repo; + window.CURRENT_BOT_CODE_NAME = window.USER_PROFILE.devTeams[sharedStatus.currentDevTeamIndex].userBots[sharedStatus.currentUserBotIndex].codeName; + sharedStatus.eventHandler.raiseEvent("userBot Changed"); return; } @@ -109,7 +117,7 @@ function newCurrentBot() { thisObject.container.frame.draw(false, false); let fontSize = 12; - let label = window.CURRENT_BOT; + let label = window.CURRENT_BOT_DISPLAY_NAME; let point = { x: thisObject.container.frame.width * 1 / 3, diff --git a/TopSpace/CurrentStartMode.js b/TopSpace/CurrentStartMode.js index 798b72511..5fe469d03 100644 --- a/TopSpace/CurrentStartMode.js +++ b/TopSpace/CurrentStartMode.js @@ -36,7 +36,7 @@ function newCurrentStartMode() { function onClick() { - if (window.CURRENT_BOT === "") { return; } + if (window.CURRENT_BOT_DISPLAY_NAME === "") { return; } switch (window.CURRENT_START_MODE) { @@ -76,7 +76,7 @@ function newCurrentStartMode() { function draw() { - if (window.CURRENT_BOT === "") { return;} + if (window.CURRENT_BOT_DISPLAY_NAME === "") { return;} thisObject.container.frame.draw(false, false); diff --git a/TopSpace/PlayStopButton.js b/TopSpace/PlayStopButton.js index fff39a34a..0721c0812 100644 --- a/TopSpace/PlayStopButton.js +++ b/TopSpace/PlayStopButton.js @@ -59,7 +59,7 @@ function newPlayStopButton() { function onClick() { - if (window.CURRENT_BOT === "") { return; } + if (window.CURRENT_BOT_DISPLAY_NAME === "") { return; } switch (showing) { @@ -122,7 +122,7 @@ function newPlayStopButton() { function draw() { - if (window.CURRENT_BOT === "") { return; } + if (window.CURRENT_BOT_DISPLAY_NAME === "") { return; } thisObject.container.frame.draw(false, false);