From dc9285d6a8918153b8dc264d4a165e47601524a8 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 20 Apr 2020 16:59:10 +0200 Subject: [PATCH] Move to Phase Event Implementation --- AppSchema.json | 65 +- .../Icons/style-01/move-to-phase-event.png | Bin 0 -> 27171 bytes .../FunctionLibraries/SessionFunctions.js | 2 +- .../FunctionLibraries/UiObjectsFromNodes.js | 4 + CanvasApp/Spaces/DesignSpace.js | 3 +- .../Plotters-Trading-Simulation/Conditions.js | 1037 ----------------- .../FinalResults.js | 348 ------ .../FinalResultsPanel.js | 360 ------ .../SimulationExecution.js | 799 ------------- .../SimulationExecutionPanel.js | 465 -------- .../Plotters-Trading-Simulation/Strategies.js | 700 ----------- .../Plotters-Trading-Simulation/Trades.js | 683 ----------- .../TradingSimulation.js | 869 -------------- .../TradingSimulationAssetBalancesPanel.js | 179 --- .../TradingSimulationCurrentPositionPanel.js | 178 --- .../TradingSimulationPartialResultsPanel.js | 177 --- .../this.plotter.config.json | 56 - .../Plotters-Trading-Simulation/Conditions.js | 91 ++ TaskServer/TradingSimulation.js | 206 ++++ 19 files changed, 367 insertions(+), 5855 deletions(-) create mode 100644 BackendServers/WebServer/Images/Icons/style-01/move-to-phase-event.png delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Conditions.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResults.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResultsPanel.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecution.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecutionPanel.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Strategies.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Trades.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulation.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationAssetBalancesPanel.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationCurrentPositionPanel.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationPartialResultsPanel.js delete mode 100644 Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/this.plotter.config.json diff --git a/AppSchema.json b/AppSchema.json index 3d716d31d..3350aa4c5 100644 --- a/AppSchema.json +++ b/AppSchema.json @@ -788,7 +788,7 @@ "addLeftIcons": true, "level": 0, "chainAttachesTo": { - "compatibleTypes": "->Take Position Event->Trigger On Event->Trigger Off Event->Next Phase Event->" + "compatibleTypes": "->Take Position Event->Trigger On Event->Trigger Off Event->Next Phase Event->Move to Phase Event->" }, "icon": "pyramid", "properties": [ @@ -4100,6 +4100,12 @@ "relatedUiObject": "Next Phase Event", "actionFunction": "payload.onMenuItemClick" }, + { + "action": "Add UI Object", + "label": "Add Move to Phase Event", + "relatedUiObject": "Move to Phase Event", + "actionFunction": "payload.onMenuItemClick" + }, { "action": "Add UI Object", "label": "Add Announcement", @@ -4135,6 +4141,11 @@ "type": "node", "childType": "Next Phase Event" }, + { + "name": "moveToPhaseEvents", + "type": "array", + "childType": "Move to Phase Event" + }, { "name": "announcements", "type": "array", @@ -4190,6 +4201,56 @@ ], "propertyNameAtParent": "nextPhaseEvent" }, + { + "type": "Move to Phase Event", + "docURL": "", + "menuItems": [ + { + "action": "Add UI Object", + "label": "Add Situation", + "relatedUiObject": "Situation", + "actionFunction": "payload.onMenuItemClick" + }, + { + "action": "Add UI Object", + "label": "Add Announcement", + "relatedUiObject": "Announcement", + "actionFunction": "payload.onMenuItemClick" + }, + { + "action": "Delete UI Object", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "label": "Delete This Event", + "iconPathOn": "delete", + "iconPathOff": "delete", + "actionFunction": "payload.onMenuItemClick" + } + ], + "addLeftIcons": true, + "level": 3, + "chainAttachesTo": { + "compatibleTypes": "->Phase->" + }, + "referenceAttachesTo": { + "compatibleTypes": "->Phase->" + }, + "icon": "move-to-phase-event", + "properties": [ + { + "name": "situations", + "type": "array", + "childType": "Situation", + "autoAdd": true + }, + { + "name": "announcements", + "type": "array", + "childType": "Announcement" + } + ], + "propertyNameAtParent": "moveToPhaseEvents" + }, { "type": "Take Profit", "docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#take-profit", @@ -4590,7 +4651,7 @@ "addLeftIcons": true, "level": 4, "chainAttachesTo": { - "compatibleTypes": "->Trigger On Event->Trigger Off Event->Take Position Event->Next Phase Event->Phase->Trigger Stage->Open Stage->Manage Stage->Close Stage->" + "compatibleTypes": "->Trigger On Event->Trigger Off Event->Take Position Event->Next Phase Event->Move to Phase Event->Phase->Trigger Stage->Open Stage->Manage Stage->Close Stage->" }, "properties": [ { diff --git a/BackendServers/WebServer/Images/Icons/style-01/move-to-phase-event.png b/BackendServers/WebServer/Images/Icons/style-01/move-to-phase-event.png new file mode 100644 index 0000000000000000000000000000000000000000..e149ee484b5292c7b03a2c7cd71bbf4be2af8e7e GIT binary patch literal 27171 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 literal 0 HcmV?d00001 diff --git a/CanvasApp/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js b/CanvasApp/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js index c29f97884..6d0b3d230 100644 --- a/CanvasApp/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js +++ b/CanvasApp/DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js @@ -43,7 +43,7 @@ function newSessionFunctions () { 'Initial Stop->Initial Take Profit->' + 'Manage Stage->' + 'Stop->Take Profit->' + - 'Phase->Formula->Next Phase Event->' + + 'Phase->Formula->Next Phase Event->Move to Phase Event->Phase->' + 'Situation->Condition->Javascript Code->' + 'Close Stage->Close Execution->' + 'Announcement->Formula->' diff --git a/CanvasApp/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js b/CanvasApp/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js index 41c809567..eadf4355e 100644 --- a/CanvasApp/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js +++ b/CanvasApp/DesignSpace/Workspace/FunctionLibraries/UiObjectsFromNodes.js @@ -252,6 +252,10 @@ function newUiObjectsFromNodes () { } break } + } else { + if (property.type === 'array') { + node[property.name] = [] + } } } } diff --git a/CanvasApp/Spaces/DesignSpace.js b/CanvasApp/Spaces/DesignSpace.js index cbf9fedb2..db26f42ca 100644 --- a/CanvasApp/Spaces/DesignSpace.js +++ b/CanvasApp/Spaces/DesignSpace.js @@ -284,7 +284,8 @@ function newDesignSpace () { 'arrangement-horizontal-bottom', 'arrangement-vertical-right', 'arrangement-vertical-left', - 'arrangement-concave' + 'arrangement-concave', + 'move-to-phase-event' ] for (let i = 0; i < iconsNames.length; i++) { diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Conditions.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Conditions.js deleted file mode 100644 index a4d62f3c9..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Conditions.js +++ /dev/null @@ -1,1037 +0,0 @@ -function newMastersPlottersTradingSimulationConditions() { - - const MODULE_NAME = "Conditions Plotter"; - const INFO_LOG = false; - const ERROR_LOG = true; - const INTENSIVE_LOG = false; - const logger = newWebDebugLog(); - logger.fileName = MODULE_NAME; - - let thisObject = { - - // Main functions and properties. - - initialize: initialize, - finalize: finalize, - container: undefined, - getContainer: getContainer, - setTimeFrame: setTimeFrame, - setDatetime: setDatetime, - draw: draw, - - /* Events declared outside the plotter. */ - - onDailyFileLoaded: onDailyFileLoaded, - - // Secondary functions and properties. - - currentRecord: undefined - }; - - /* this is part of the module template */ - - let container = newContainer(); // Do not touch this 3 lines, they are just needed. - container.initialize(); - thisObject.container = container; - - let coordinateSystem - - let timeFrame; // This will hold the current Time Frame the user is at. - let datetime; // This will hold the current Datetime the user is at. - - let marketFile; // This is the current Market File being plotted. - let fileCursor; // This is the current File Cursor being used to retrieve Daily Files. - - let marketFiles; // This object will provide the different Market Files at different Time Frames. - let dailyFiles; // This object will provide the different File Cursors at different Time Frames. - - /* these are module specific variables: */ - - let conditions = []; - let headers; - - let noDefinitionOnFocusErrorDisplayed = false - - let zoomChangedEventSubscriptionId - let offsetChangedEventSubscriptionId - let dragFinishedEventSubscriptionId - let dimmensionsChangedEventSubscriptionId - let marketFilesUpdatedEventSubscriptionId - let dailyFilesUpdatedEventSubscriptionId - let scaleChangedEventSubscriptionId - - let userPositionDate - return thisObject; - - function finalize() { - try { - - if (INFO_LOG === true) { logger.write("[INFO] finalize -> Entering function."); } - - /* Stop listening to the necesary events. */ - - canvas.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId); - canvas.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId); - canvas.eventHandler.stopListening(dragFinishedEventSubscriptionId); - thisObject.container.eventHandler.stopListening(dimmensionsChangedEventSubscriptionId) - marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId); - dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId); - - /* Destroyd References */ - - marketFiles = undefined; - dailyFiles = undefined; - - datetime = undefined; - timeFrame = undefined; - - marketFile = undefined; - fileCursor = undefined; - - finalizeCoordinateSystem() - coordinateSystem = undefined - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] finalize -> err = " + err.stack); } - } - } - - function initialize(pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] initialize -> Entering function."); } - - /* Store the information received. */ - - marketFiles = pStorage.marketFiles[0]; - dailyFiles = pStorage.dailyFiles[0]; - - datetime = pDatetime; - timeFrame = pTimeFrame; - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - - /* We need a Market File in order to calculate the Y scale, since this scale depends on actual data. */ - - marketFile = marketFiles.getFile(ONE_DAY_IN_MILISECONDS); // This file is the one processed faster. - - /* Now we set the right files according to current Period. */ - - marketFile = marketFiles.getFile(pTimeFrame); - fileCursor = dailyFiles.getFileCursor(pTimeFrame); - - /* Listen to the necesary events. */ - - zoomChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged); - offsetChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged); - dragFinishedEventSubscriptionId = canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished); - marketFilesUpdatedEventSubscriptionId = marketFiles.eventHandler.listenToEvent("Files Updated", onMarketFilesUpdated); - dailyFilesUpdatedEventSubscriptionId = dailyFiles.eventHandler.listenToEvent("Files Updated", onDailyFilesUpdated); - - /* Get ready for plotting. */ - - recalculate(); - - /* Ready for when dimmension changes. */ - - dimmensionsChangedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('Dimmensions Changed', function () { - recalculate(); - }) - - callBackFunction(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] initialize -> err = " + err.stack); } - } - } - - function initializeCoordinateSystem() { - scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) - } - - function finalizeCoordinateSystem() { - coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId) - } - - function onScaleChanged() { - recalculate(); - } - - function onMouseOver(event) { - let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem) - userPositionDate = userPosition.valueOf() - } - - function getContainer(point) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] getContainer -> Entering function."); } - - let container; - - /* First we check if this point is inside this space. */ - - if (this.container.frame.isThisPointHere(point) === true) { - - return this.container; - - } else { - - /* This point does not belong to this space. */ - - return undefined; - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] getContainer -> err = " + err.stack); } - } - } - - function onMarketFilesUpdated() { - try { - let newMarketFile = marketFiles.getFile(timeFrame); - if (newMarketFile !== undefined) { - marketFile = newMarketFile; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onMarketFilesUpdated -> err = " + err.stack); } - } - } - - function onDailyFilesUpdated() { - try { - let newFileCursor = dailyFiles.getFileCursor(timeFrame); - if (newFileCursor !== undefined) { - fileCursor = newFileCursor; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFilesUpdated -> err = " + err.stack); } - } - } - - function setTimeFrame(pTimeFrame) { - - try { - - if (timeFrame !== pTimeFrame) { - - timeFrame = pTimeFrame; - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - marketFile = marketFiles.getFile(pTimeFrame); - - recalculate(); - - } else { - - let newFileCursor = dailyFiles.getFileCursor(pTimeFrame); - - fileCursor = newFileCursor; // In this case, we explicitly want that if there is no valid cursor, we invalidate the data and show nothing. - recalculate(); - - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] setTimeFrame -> err = " + err.stack); } - } - } - - function setDatetime(pDatetime) { - - if (INFO_LOG === true) { logger.write("[INFO] setDatetime -> Entering function."); } - - datetime = pDatetime; - - } - - function setCoordinateSystem(pCoordinateSystem) { - finalizeCoordinateSystem() - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - } - - function onDailyFileLoaded(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onDailyFileLoaded -> Entering function."); } - - if (event.currentValue === event.totalValue) { - - /* This happens only when all of the files in the cursor have been loaded. */ - - recalculate(); - - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFileLoaded -> err = " + err.stack); } - } - } - - function draw() { - - try { - - if (INTENSIVE_LOG === true) { logger.write("[INFO] draw -> Entering function."); } - - this.container.frame.draw(); - - plotChart(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] draw -> err = " + err.stack); } - } - } - - function recalculate() { - - try { - - conditions = [] - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - recalculateUsingMarketFiles(); - - } else { - - recalculateUsingDailyFiles(); - - } - - thisObject.container.eventHandler.raiseEvent("Conditions Changed", conditions); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculate -> err = " + err.stack); } - } - } - - function recalculateUsingDailyFiles() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] recalculateUsingDailyFiles -> Entering function."); } - - if (fileCursor === undefined) { - conditions = []; - return; - } // We need to wait - - if (fileCursor.files.size === 0) { - conditions = []; - return; - } // We need to wait until there are files in the cursor - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - let farLeftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - let farRightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - let currentDate = new Date(farLeftDate.valueOf()); - - conditions = []; - - - - while (currentDate.valueOf() <= farRightDate.valueOf() + ONE_DAY_IN_MILISECONDS) { - - let stringDate = currentDate.getFullYear() + '-' + pad(currentDate.getMonth() + 1, 2) + '-' + pad(currentDate.getDate(), 2); - - let dailyFile = fileCursor.files.get(stringDate); - - if (dailyFile !== undefined) { - - headers = dailyFile[0]; - - for (let i = 0; i < dailyFile[1].length; i++) { - - let record = { - begin: undefined, - end: undefined, - conditions: undefined - }; - - record.begin = dailyFile[1][i][0]; - record.end = dailyFile[1][i][1]; - record.strategyNumber = dailyFile[1][i][2]; - record.strategyPhase = dailyFile[1][i][3]; - record.stopLossPhase = dailyFile[1][i][4]; - record.takeProfitPhase = dailyFile[1][i][5]; - record.conditions = dailyFile[1][i][6]; - record.formulaErrors = dailyFile[1][i][7]; - record.formulaValues = dailyFile[1][i][8]; - - if ( - (record.begin >= farLeftDate.valueOf() && record.end <= farRightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - conditions.push(record); - - if (datetime.valueOf() >= record.begin && datetime.valueOf() <= record.end) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Condition Changed", thisObject.currentRecord); - - } - } - } - } - - currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS); - } - - /* Lests check if all the visible screen is going to be covered by conditions. */ - - let lowerEnd = leftDate.valueOf(); - let upperEnd = rightDate.valueOf(); - - setTimeout(recalculate, 2000); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingDailyFiles -> err = " + err.stack); } - } - } - - function recalculateUsingMarketFiles() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] recalculateUsingMarketFiles -> Entering function."); } - - if (marketFile === undefined) { return; } // Initialization not complete yet. - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - leftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - rightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - conditions = []; - headers = marketFile[0]; - - for (let i = 0; i < marketFile[1].length; i++) { - - let record = { - begin: undefined, - end: undefined, - conditions: undefined - }; - - record.begin = marketFile[1][i][0]; - record.end = marketFile[1][i][1]; - record.strategyNumber = marketFile[1][i][2]; - record.strategyPhase = marketFile[1][i][3]; - record.stopLossPhase = marketFile[1][i][4]; - record.takeProfitPhase = marketFile[1][i][5]; - record.conditions = marketFile[1][i][6]; - record.formulaErrors = marketFile[1][i][7]; - record.formulaValues = marketFile[1][i][8]; - - if ( - (record.begin >= leftDate.valueOf() && record.end <= rightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - conditions.push(record); - - if (datetime.valueOf() >= record.begin && datetime.valueOf() <= record.end) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Condition Changed", thisObject.currentRecord); - - } - } - } - - //console.log("Olivia > recalculateUsingMarketFiles > total conditions generated : " + conditions.length); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingMarketFiles -> err = " + err.stack); } - } - } - - function plotChart() { - - try { - - thisObject.container.eventHandler.raiseEvent("Current Condition Record Changed", undefined); - - let conditionRecord; - - for (let i = 0; i < conditions.length; i++) { - - conditionRecord = conditions[i]; - - /* Send the current record to the panel */ - - if (userPositionDate >= conditionRecord.begin && userPositionDate <= conditionRecord.end) { - - let currentRecord = { - conditionsNames: headers, - strategyNumber: conditionRecord.strategyNumber, - strategyPhase: conditionRecord.strategyPhase, - stopLossPhase: conditionRecord.stopLossPhase, - takeProfitPhase: conditionRecord.takeProfitPhase, - conditionsValues: conditionRecord.conditions, - formulaErrors: conditionRecord.formulaErrors, - formulaValues: conditionRecord.formulaValues - }; - - sendRecordInfoToDesignerSpace(currentRecord) - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] plotChart -> err = " + err.stack); } - } - } - - function sendRecordInfoToDesignerSpace(currentRecord) { - - if (currentRecord === undefined) { return; } - if (currentRecord.conditionsNames === undefined) { return; } - if (canvas.designSpace.workspace === undefined) { return; } - - /* We will get now the designer trading system */ - let designerTradingSystem - let fileTradingSystem = currentRecord.conditionsNames; - - for (let i = 0; i < canvas.designSpace.workspace.workspaceNode.rootNodes.length; i++) { - let rootNode = canvas.designSpace.workspace.workspaceNode.rootNodes[i] - if (rootNode.type === 'Definition') { - if (rootNode.tradingSystem.id === fileTradingSystem.id) { - designerTradingSystem = rootNode.tradingSystem - } - } - } - - if (designerTradingSystem === undefined) { return; } - - try { - - browserCanvasContext.beginPath(); - - - let conditionIndex = 0; - let formulaErrorsIndex = 0; - let formulaValuesIndex = 0; - - designerTradingSystem.payload.uiObject.setErrorMessage(fileTradingSystem.error) - - if (fileTradingSystem.parameters !== undefined) { - designerTradingSystem.parameters.payload.uiObject.setErrorMessage(fileTradingSystem.parameters.error) - if (fileTradingSystem.parameters.baseAsset !== undefined) { - designerTradingSystem.parameters.baseAsset.payload.uiObject.setErrorMessage(fileTradingSystem.parameters.baseAsset.error) - } - if (fileTradingSystem.parameters.timeRange !== undefined) { - designerTradingSystem.parameters.timeRange.payload.uiObject.setErrorMessage(fileTradingSystem.parameters.timeRange.error) - } - if (fileTradingSystem.parameters.slippage !== undefined) { - designerTradingSystem.parameters.slippage.payload.uiObject.setErrorMessage(fileTradingSystem.parameters.slippage.error) - } - if (fileTradingSystem.parameters.feeStructure !== undefined) { - designerTradingSystem.parameters.feeStructure.payload.uiObject.setErrorMessage(fileTradingSystem.parameters.feeStructure.error) - } - } - - for (let j = 0; j < fileTradingSystem.strategies.length; j++) { - - let strategy = fileTradingSystem.strategies[j]; - designerTradingSystem.strategies[j].payload.uiObject.setErrorMessage(strategy.error) - - if (currentRecord.strategyNumber === j) { - designerTradingSystem.strategies[j].payload.uiObject.isExecuting = true - } else { - designerTradingSystem.strategies[j].payload.uiObject.isExecuting = false - } - - let triggerStage = strategy.triggerStage - - if (triggerStage !== undefined) { - designerTradingSystem.strategies[j].triggerStage.payload.uiObject.setErrorMessage(triggerStage.error) - - if (triggerStage.triggerOn !== undefined) { - designerTradingSystem.strategies[j].triggerStage.triggerOn.payload.uiObject.setErrorMessage(triggerStage.triggerOn.error) - - for (let k = 0; k < triggerStage.triggerOn.situations.length; k++) { - - let situation = triggerStage.triggerOn.situations[k]; - designerTradingSystem.strategies[j].triggerStage.triggerOn.situations[k].payload.uiObject.setErrorMessage(triggerStage.triggerOn.situations[k].error) - processSituation(situation, designerTradingSystem.strategies[j].triggerStage.triggerOn.situations[k]); - } - - for (let k = 0; k < triggerStage.triggerOn.announcements.length; k++) { - - let announcement = triggerStage.triggerOn.announcements[k]; - designerTradingSystem.strategies[j].triggerStage.triggerOn.announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].triggerStage.triggerOn.announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - } - - if (triggerStage.triggerOff !== undefined) { - - for (let k = 0; k < triggerStage.triggerOff.situations.length; k++) { - - let situation = triggerStage.triggerOff.situations[k]; - designerTradingSystem.strategies[j].triggerStage.triggerOff.situations[k].payload.uiObject.setErrorMessage(triggerStage.triggerOff.situations[k].error) - processSituation(situation, designerTradingSystem.strategies[j].triggerStage.triggerOff.situations[k]); - } - - for (let k = 0; k < triggerStage.triggerOff.announcements.length; k++) { - - let announcement = triggerStage.triggerOff.announcements[k]; - designerTradingSystem.strategies[j].triggerStage.triggerOff.announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].triggerStage.triggerOff.announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - } - - if (triggerStage.takePosition !== undefined) { - - for (let k = 0; k < triggerStage.takePosition.situations.length; k++) { - - let situation = triggerStage.takePosition.situations[k]; - designerTradingSystem.strategies[j].triggerStage.takePosition.situations[k].payload.uiObject.setErrorMessage(triggerStage.takePosition.situations[k].error) - processSituation(situation, designerTradingSystem.strategies[j].triggerStage.takePosition.situations[k]); - } - - for (let k = 0; k < triggerStage.takePosition.announcements.length; k++) { - - let announcement = triggerStage.takePosition.announcements[k]; - designerTradingSystem.strategies[j].triggerStage.takePosition.announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].triggerStage.takePosition.announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - } - } - - let openStage = strategy.openStage - - if (openStage !== undefined) { - designerTradingSystem.strategies[j].openStage.payload.uiObject.setErrorMessage(openStage.error) - - let initialDefinition = openStage.initialDefinition - - if (initialDefinition !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.payload.uiObject.setErrorMessage(openStage.initialDefinition.error) - - if (initialDefinition.stopLoss !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.payload.uiObject.setErrorMessage(openStage.initialDefinition.stopLoss.error) - - for (let p = 0; p < initialDefinition.stopLoss.phases.length; p++) { - - if (currentRecord.strategyNumber === j && currentRecord.stopLossPhase === p) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].payload.uiObject.isExecuting = true - } else { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].payload.uiObject.isExecuting = false - } - - let phase = initialDefinition.stopLoss.phases[p]; - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].payload.uiObject.setErrorMessage(openStage.initialDefinition.stopLoss.phases[p].error) - - if (phase.formula !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].formula.payload.uiObject.setErrorMessage(openStage.initialDefinition.stopLoss.phases[p].formula.error) - - if (currentRecord.formulaErrors[formulaErrorsIndex] !== "") { - if (currentRecord.strategyNumber === j && currentRecord.stopLossPhase === p) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].formula.payload.uiObject.setErrorMessage(currentRecord.formulaErrors[formulaErrorsIndex]) - } - } - formulaErrorsIndex++ - - if (currentRecord.strategyNumber === j && currentRecord.stopLossPhase === p) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].formula.payload.uiObject.setValue(currentRecord.formulaValues[formulaValuesIndex]) - } - formulaValuesIndex++ - } - - for (let k = 0; k < phase.announcements.length; k++) { - - let announcement = phase.announcements[k]; - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - - let nextPhaseEvent = phase.nextPhaseEvent; - if (nextPhaseEvent !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].nextPhaseEvent.payload.uiObject.setErrorMessage(openStage.initialDefinition.stopLoss.phases[p].nextPhaseEvent.error) - - for (let k = 0; k < nextPhaseEvent.situations.length; k++) { - - let situation = nextPhaseEvent.situations[k]; - - processSituation(situation, designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].nextPhaseEvent.situations[k]); - } - - for (let k = 0; k < nextPhaseEvent.announcements.length; k++) { - - let announcement = nextPhaseEvent.announcements[k]; - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].nextPhaseEvent.announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].nextPhaseEvent.announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - } - } - } - - if (initialDefinition.takeProfit !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.payload.uiObject.setErrorMessage(openStage.initialDefinition.takeProfit.error) - - for (let p = 0; p < initialDefinition.takeProfit.phases.length; p++) { - - if (currentRecord.strategyNumber === j && currentRecord.takeProfitPhase === p) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].payload.uiObject.isExecuting = true - } else { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].payload.uiObject.isExecuting = false - } - - let phase = initialDefinition.takeProfit.phases[p]; - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].payload.uiObject.setErrorMessage(openStage.initialDefinition.takeProfit.phases[p].error) - - if (phase.formula !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].formula.payload.uiObject.setErrorMessage(openStage.initialDefinition.takeProfit.phases[p].formula.error) - - if (currentRecord.formulaErrors[formulaErrorsIndex] !== "") { - if (currentRecord.strategyNumber === j && currentRecord.takeProfitPhase === p) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].formula.payload.uiObject.setErrorMessage(currentRecord.formulaErrors[formulaErrorsIndex]) - } - } - formulaErrorsIndex++ - - if (currentRecord.strategyNumber === j && currentRecord.takeProfitPhase === p) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].formula.payload.uiObject.setValue(currentRecord.formulaValues[formulaValuesIndex]) - } - formulaValuesIndex++ - } - - for (let k = 0; k < phase.announcements.length; k++) { - - let announcement = phase.announcements[k]; - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - - let nextPhaseEvent = phase.nextPhaseEvent; - if (nextPhaseEvent !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].nextPhaseEvent.payload.uiObject.setErrorMessage(openStage.initialDefinition.takeProfit.phases[p].nextPhaseEvent.error) - - for (let k = 0; k < nextPhaseEvent.situations.length; k++) { - - let situation = nextPhaseEvent.situations[k]; - - processSituation(situation, designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].nextPhaseEvent.situations[k]); - } - - for (let k = 0; k < nextPhaseEvent.announcements.length; k++) { - - let announcement = nextPhaseEvent.announcements[k]; - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].nextPhaseEvent.announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].nextPhaseEvent.announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - } - } - } - } - - let openExecution = openStage.openExecution - - if (openExecution !== undefined) { - designerTradingSystem.strategies[j].openStage.openExecution.payload.uiObject.setErrorMessage(openStage.openExecution.error) - } - } - - let manageStage = strategy.manageStage - - if (manageStage !== undefined) { - designerTradingSystem.strategies[j].manageStage.payload.uiObject.setErrorMessage(manageStage.error) - - if (manageStage.stopLoss !== undefined) { - designerTradingSystem.strategies[j].manageStage.stopLoss.payload.uiObject.setErrorMessage(manageStage.stopLoss.error) - - for (let p = 0; p < manageStage.stopLoss.phases.length; p++) { - - if (currentRecord.strategyNumber === j && currentRecord.stopLossPhase - 1 === p) { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].payload.uiObject.isExecuting = true - } else { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].payload.uiObject.isExecuting = false - } - - let phase = manageStage.stopLoss.phases[p]; - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].payload.uiObject.setErrorMessage(manageStage.stopLoss.phases[p].error) - - if (phase.formula !== undefined) { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].formula.payload.uiObject.setErrorMessage(manageStage.stopLoss.phases[p].formula.error) - - if (currentRecord.formulaErrors[formulaErrorsIndex] !== "") { - if (currentRecord.strategyNumber === j && currentRecord.stopLossPhase - 1 === p) { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].formula.payload.uiObject.setErrorMessage(currentRecord.formulaErrors[formulaErrorsIndex]) - } - } - formulaErrorsIndex++ - if (currentRecord.strategyNumber === j && currentRecord.stopLossPhase - 1 === p) { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].formula.payload.uiObject.setValue(currentRecord.formulaValues[formulaValuesIndex]) - } - formulaValuesIndex++ - } - - for (let k = 0; k < phase.announcements.length; k++) { - - let announcement = phase.announcements[k]; - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - - let nextPhaseEvent = phase.nextPhaseEvent; - if (nextPhaseEvent !== undefined) { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].nextPhaseEvent.payload.uiObject.setErrorMessage(manageStage.stopLoss.phases[p].nextPhaseEvent.error) - - for (let k = 0; k < nextPhaseEvent.situations.length; k++) { - - let situation = nextPhaseEvent.situations[k]; - - processSituation(situation, designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].nextPhaseEvent.situations[k]); - } - - for (let k = 0; k < nextPhaseEvent.announcements.length; k++) { - - let announcement = nextPhaseEvent.announcements[k]; - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].nextPhaseEvent.announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].nextPhaseEvent.announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - } - } - } - - if (manageStage.takeProfit !== undefined) { - designerTradingSystem.strategies[j].manageStage.takeProfit.payload.uiObject.setErrorMessage(manageStage.takeProfit.error) - - for (let p = 0; p < manageStage.takeProfit.phases.length; p++) { - - if (currentRecord.strategyNumber === j && currentRecord.takeProfitPhase - 1 === p) { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].payload.uiObject.isExecuting = true - } else { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].payload.uiObject.isExecuting = false - } - - let phase = manageStage.takeProfit.phases[p]; - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].payload.uiObject.setErrorMessage(manageStage.takeProfit.phases[p].error) - - if (phase.formula !== undefined) { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].formula.payload.uiObject.setErrorMessage(manageStage.takeProfit.phases[p].formula.error) - - if (currentRecord.formulaErrors[formulaErrorsIndex] !== "") { - if (currentRecord.strategyNumber === j && currentRecord.takeProfitPhase - 1 === p) { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].formula.payload.uiObject.setErrorMessage(currentRecord.formulaErrors[formulaErrorsIndex]) - } - } - formulaErrorsIndex++ - - if (currentRecord.strategyNumber === j && currentRecord.takeProfitPhase - 1 === p) { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].formula.payload.uiObject.setValue(currentRecord.formulaValues[formulaValuesIndex]) - } - formulaValuesIndex++ - } - - for (let k = 0; k < phase.announcements.length; k++) { - - let announcement = phase.announcements[k]; - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - - let nextPhaseEvent = phase.nextPhaseEvent; - if (nextPhaseEvent !== undefined) { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].nextPhaseEvent.payload.uiObject.setErrorMessage(manageStage.takeProfit.phases[p].nextPhaseEvent.error) - - for (let k = 0; k < nextPhaseEvent.situations.length; k++) { - - let situation = nextPhaseEvent.situations[k]; - - processSituation(situation, designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].nextPhaseEvent.situations[k]); - } - - for (let k = 0; k < nextPhaseEvent.announcements.length; k++) { - - let announcement = nextPhaseEvent.announcements[k]; - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].nextPhaseEvent.announcements[k].payload.uiObject.setErrorMessage(announcement.error) - if (announcement.formula !== undefined) { - designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].nextPhaseEvent.announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) - } - } - } - } - } - } - - - let closeStage = strategy.closeStage - - if (closeStage !== undefined) { - designerTradingSystem.strategies[j].closeStage.payload.uiObject.setErrorMessage(closeStage.error) - - let closeExecution = closeStage.closeExecution - - if (closeExecution !== undefined) { - designerTradingSystem.strategies[j].closeStage.closeExecution.payload.uiObject.setErrorMessage(closeStage.closeExecution.error) - } - } - } - - function processSituation(situation, node) { - - node.payload.uiObject.setErrorMessage(situation.error) - - let highlightSituation = true - - for (let m = 0; m < situation.conditions.length; m++) { - - let condition = node.conditions[m] - if (condition !== undefined) { - condition.payload.uiObject.setErrorMessage(situation.conditions[m].error) - - if (situation.conditions[m].code !== undefined) { - if (condition.code !== undefined) { - condition.code.payload.uiObject.setErrorMessage(situation.conditions[m].code.error) - } - } - - if (currentRecord.conditionsValues[conditionIndex] === 1) { - condition.payload.uiObject.highlight() - } else { - highlightSituation = false - } - conditionIndex++; - } - } - - if (highlightSituation === true) { - node.payload.uiObject.highlight() - } - } - - - browserCanvasContext.closePath(); - browserCanvasContext.fill(); - - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] sendRecordInfoToDesignerSpace -> err = " + err.stack); } - } - } - - - - function onViewportZoomChanged(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onViewportZoomChanged -> Entering function."); } - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportZoomChanged -> err = " + err.stack); } - } - } - - function onViewportPositionChanged(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onViewportPositionChanged -> Entering function."); } - - if (event !== undefined) { - if (event.recalculate === true) { - recalculate() - return - } - } - if (Math.random() * 100 > 95) { - recalculate() - }; - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportPositionChanged -> err = " + err.stack); } - } - } - - function onDragFinished() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onDragFinished -> Entering function."); } - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDragFinished -> err = " + err.stack); } - } - } -} - - - - - - - - - - - - - - - - - - - - - - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResults.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResults.js deleted file mode 100644 index dcc9ce8d2..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResults.js +++ /dev/null @@ -1,348 +0,0 @@ -function newAAMastersPlottersTradingSimulationFinalResults() { - - const MODULE_NAME = "Final Results Plotter"; - const ERROR_LOG = true; - const INTENSIVE_LOG = false; - const logger = newWebDebugLog(); - logger.fileName = MODULE_NAME; - - let thisObject = { - - // Main functions and properties. - - initialize: initialize, - finalize: finalize, - container: undefined, - getContainer: getContainer, - setTimePeriod: setTimePeriod, - setDatetime: setDatetime, - draw: draw, - recalculateScale: recalculateScale, - currentRecord: undefined - }; - - /* this is part of the module template */ - - let container = newContainer(); // Do not touch this 3 lines, they are just needed. - container.initialize(); - thisObject.container = container; - - let timeLineCoordinateSystem = newTimeLineCoordinateSystem(); // Needed to be able to plot on the timeline, otherwise not. - - let timePeriod; // This will hold the current Time Period the user is at. - let datetime; // This will hold the current Datetime the user is at. - - let dataFile; // This is the current Market File being plotted. - let fileCursor; // This is the current File Cursor being used to retrieve Daily Files. - - let singleFile; // This object will provide the different Market Files at different Time Periods. - - /* these are module specific variables: */ - - let records = []; // Here we keep the records to be ploted every time the Draw() function is called by the AAWebPlatform. - - let imageStopLossPhase; - let imageTakeProfitPhase; - let imageRecord; - - let zoomChangedEventSubscriptionId - let offsetChangedEventSubscriptionId - let filesUpdatedEventSubscriptionId - let dragFinishedEventSubscriptionId - let dimmensionsChangedEventSubscriptionId - - return thisObject; - - function finalize() { - try { - - /* Stop listening to the necesary events. */ - - viewPort.eventHandler.stopListening(zoomChangedEventSubscriptionId); - viewPort.eventHandler.stopListening(offsetChangedEventSubscriptionId); - singleFile.eventHandler.stopListening(filesUpdatedEventSubscriptionId); - canvas.eventHandler.stopListening(dragFinishedEventSubscriptionId); - thisObject.container.eventHandler.stopListening(dimmensionsChangedEventSubscriptionId) - - /* icons */ - - imageStopLossPhase = undefined; - imageTakeProfitPhase = undefined; - imageRecord = undefined; - - /* Destroy References */ - - singleFile = undefined; - - datetime = undefined; - timePeriod = undefined; - - dataFile = undefined; - fileCursor = undefined; - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] finalize -> err = " + err.stack); } - } - } - - function initialize(pStorage, pExchange, pMarket, pDatetime, pTimePeriod, callBackFunction) { - - try { - - /* Store the information received. */ - - singleFile = pStorage.singleFile; - - datetime = pDatetime; - timePeriod = pTimePeriod; - - dataFile = singleFile.getFile(timePeriod); - - /* Listen to the necesary events. */ - - zoomChangedEventSubscriptionId = viewPort.eventHandler.listenToEvent("Zoom Changed", onZoomChanged); - offsetChangedEventSubscriptionId = viewPort.eventHandler.listenToEvent("Offset Changed", onOffsetChanged); - filesUpdatedEventSubscriptionId = singleFile.eventHandler.listenToEvent("Files Updated", onFilesUpdated); - dragFinishedEventSubscriptionId = canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished); - - /* Get ready for plotting. */ - - recalculate(); - - /* Ready for when dimmension changes. */ - - dimmensionsChangedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('Dimmensions Changed', function () { - recalculate(); - }) - - callBackFunction(); - - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] initialize -> err = " + err.stack); } - } - } - - function getContainer(point) { - let container; - /* First we check if this point is inside this space. */ - if (this.container.frame.isThisPointHere(point) === true) { - return this.container; - } else { - /* This point does not belong to this space. */ - return undefined; - } - } - - function onFilesUpdated() { - try { - dataFile = singleFile.getFile(timePeriod); - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onFilesUpdated -> err = " + err.stack); } - } - } - - function setTimePeriod(pTimePeriod) { - try { - if (timePeriod !== pTimePeriod) { - timePeriod = pTimePeriod; - dataFile = singleFile.getFile(timePeriod); - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] setTimePeriod -> err = " + err.stack); } - } - } - - function setDatetime(pDatetime) { - datetime = pDatetime; - } - - function draw() { - try { - // Nothing to draw for now - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] draw -> err = " + err.stack); } - } - } - - function recalculate() { - - try { - - records = [] - - if (timePeriod >= _1_HOUR_IN_MILISECONDS) { - - recalculateUsingMarketFiles(); - - } else { - - recalculateUsingDailyFiles(); - - } - - thisObject.container.eventHandler.raiseEvent("Records Changed", records); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculate -> err = " + err.stack); } - } - } - - function recalculate() { - - try { - - if (dataFile === undefined) { return; } // Initialization not complete yet. - - records = []; - - for (let i = 0; i < dataFile.length; i++) { - - let record = {}; - - record.begin = dataFile[i][0]; - record.end = dataFile[i][1]; - record.type = dataFile[i][2]; - record.rate = dataFile[i][3]; - record.amount = dataFile[i][4]; - record.balanceA = dataFile[i][5]; - record.balanceB = dataFile[i][6]; - record.profit = dataFile[i][7]; - record.lastTradeProfitLoss = dataFile[i][8]; - record.stopLoss = dataFile[i][9]; - record.roundtrips = dataFile[i][10]; - record.hits = dataFile[i][11]; - record.fails = dataFile[i][12]; - record.hitRatio = dataFile[i][13]; - record.ROI = dataFile[i][14]; - record.periods = dataFile[i][15]; - record.days = dataFile[i][16]; - record.anualizedRateOfReturn = dataFile[i][17]; - record.sellRate = dataFile[i][18]; - record.lastTradeROI = dataFile[i][19]; - record.strategy = dataFile[i][20]; - record.strategyPhase = dataFile[i][21]; - record.takeProfit = dataFile[i][22]; - record.stopLossPhase = dataFile[i][23]; - record.takeProfitPhase = dataFile[i][24]; - record.positionSize = dataFile[i][26]; // 25 is the message for the executor - record.initialBalanceA = dataFile[i][27]; - record.minimunBalanceA = dataFile[i][28]; - record.maximunBalanceA = dataFile[i][29]; - record.initialBalanceB = dataFile[i][30]; - record.minimunBalanceB = dataFile[i][31]; - record.maximunBalanceB = dataFile[i][32]; - record.baseAsset = dataFile[i][33]; - record.positionPeriods = dataFile[i][34]; - record.positionDays = dataFile[i][35]; - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Record Changed", thisObject.currentRecord); - } - - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] recalculate -> err = " + err.stack); } - } - } - - function recalculateScale() { - try { - // No scale needed - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateScale -> err = " + err.stack); } - } - } - - function plotChart() { - try { - let userPosition = getUserPosition() - let userPositionDate = userPosition.point.x - - let record; - - /* Now we calculate and plot the records */ - for (let i = 0; i < records.length; i++) { // We do not start in 0 so as to be able to read the previous record i - 1 - - record = records[i]; - - /* Send the current record to the panel */ - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - - let eventRecords = { - currentRecord: record, - lastRecord: records[records.length - 1] - }; - thisObject.container.eventHandler.raiseEvent("Current Record Changed", eventRecords); - } - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] plotChart -> err = " + err.stack); } - } - } - - function onZoomChanged(event) { - try { - recalculate(); - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onZoomChanged -> err = " + err.stack); } - } - } - - function onOffsetChanged() { - try { - if (Math.random() * 100 > 95) { - recalculate() - }; - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onOffsetChanged -> err = " + err.stack); } - } - } - - function onDragFinished() { - try { - recalculate(); - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onDragFinished -> err = " + err.stack); } - } - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResultsPanel.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResultsPanel.js deleted file mode 100644 index 0907ae991..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/FinalResultsPanel.js +++ /dev/null @@ -1,360 +0,0 @@ - -function newAAMastersPlottersTradingSimulationTradingSimulationFinalResultsPanel() { - - let thisObject = { - fitFunction: undefined, - onEventRaised: onEventRaised, - container: undefined, - draw: draw, - getContainer: getContainer, - initialize: initialize, - finalize: finalize - }; - - let container = newContainer(); - container.initialize(); - thisObject.container = container; - - container.displacement.containerName = "Final Results"; - container.frame.containerName = "Final Results"; - - let currentRecord; - let lastRecord; - let panelTabButton - - - return thisObject; - - function initialize() { - - thisObject.container.frame.width = UI_PANEL.WIDTH.NORMAL * 2; - thisObject.container.frame.height = UI_PANEL.HEIGHT.NORMAL * 2.5; - - thisObject.container.frame.position.x = viewPort.visibleArea.topLeft.x + thisObject.container.frame.width * 1; - thisObject.container.frame.position.y = viewPort.visibleArea.topRight.y; - - panelTabButton = newPanelTabButton() - panelTabButton.parentContainer = thisObject.container - panelTabButton.container.frame.parentFrame = thisObject.container.frame - panelTabButton.fitFunction = thisObject.fitFunction - panelTabButton.initialize() - - } - - function finalize() { - - } - - function getContainer(point) { - - let container; - - container = panelTabButton.getContainer(point) - if (container !== undefined) { return container } - - if (thisObject.container.frame.isThisPointHere(point, true) === true) { - - let checkPoint = { - x: point.x, - y: point.y - } - - checkPoint = thisObject.fitFunction(checkPoint) - - if (point.x === checkPoint.x && point.y === checkPoint.y) { - return thisObject.container; - } - } - } - - - function onEventRaised(records) { - - currentRecord = records.currentRecord; - lastRecord = records.lastRecord - - } - - - function draw() { - - thisObject.container.frame.draw(false, false, true, thisObject.fitFunction); - - plotCurrentRecordInfo(); - - panelTabButton.draw() - } - - - function plotCurrentRecordInfo() { - - if (currentRecord === undefined) { return; } - if (lastRecord === undefined) { return; } - - const frameBodyHeight = thisObject.container.frame.getBodyHeight(); - const frameTitleHeight = thisObject.container.frame.height - frameBodyHeight; - - const X_AXIS = thisObject.container.frame.width / 2; - const Y_AXIS = frameTitleHeight + frameBodyHeight / 2; - - - /* put the labels with the records values */ - - browserCanvasContext.beginPath(); - - let y = 0; - let increment = 0.024; - - y = y + increment; - y = y + increment; - printLabel('Current Position', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1', 14); - - y = y + increment; - printLabel('Size', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.positionSize, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Rate', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.sellRate, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Stop', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.stopLoss, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Take Profit', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.takeProfit, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Periods', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((currentRecord.positionPeriods), X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Days', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((currentRecord.positionDays).toFixed(2), X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - y = y + increment; - printLabel('Latest Position', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1', 14); - - y = y + increment; - printLabel('Profit / Loss', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((currentRecord.lastTradeProfitLoss), X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('ROI', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((currentRecord.lastTradeROI).toFixed(2) + ' % ', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - - - let bifurcationLevel = y - y = y + increment; - y = y + increment; - printLabel('Partial Results', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1', 14); - - y = y + increment; - printLabel('Profit / Loss', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.profit, X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Trades', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.roundtrips, X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Hits', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.hits, X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Fails', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.fails, X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Hit Ratio', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((currentRecord.hitRatio * 100).toFixed(2) + ' %', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('ROI', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((currentRecord.ROI * 100).toFixed(2) + ' %', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Periods', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.periods, X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Days', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(currentRecord.days, X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Anualized Rate of Return', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((currentRecord.anualizedRateOfReturn * 100).toFixed(2) + ' %', X_AXIS - thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - - y = bifurcationLevel - - y = y + increment; - y = y + increment; - printLabel('Final Results', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1', 14); - - y = y + increment; - printLabel('Profit / Loss', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(lastRecord.profit, X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Trades', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(lastRecord.roundtrips, X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Hits', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(lastRecord.hits, X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Fails', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(lastRecord.fails, X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Hit Ratio', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((lastRecord.hitRatio * 100).toFixed(2) + ' %', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('ROI', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((lastRecord.ROI * 100).toFixed(2) + ' %', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Periods', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(lastRecord.periods, X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Days', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel(lastRecord.days, X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - y = y + increment; - printLabel('Anualized Rate of Return', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '0.60'); - y = y + increment; - printLabel((lastRecord.anualizedRateOfReturn * 100).toFixed(2) + ' %', X_AXIS + thisObject.container.frame.width / 4, frameTitleHeight + frameBodyHeight * y, '1.00', 14); - - - - function printLabel(labelToPrint, x, y, opacity, fontSize) { - - let labelPoint; - if (fontSize === undefined) { fontSize = 10 }; - - browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY; - - let label = '' + labelToPrint; - if (isNaN(label) === false) { - label = Number(label).toLocaleString(); - if ((label === "-0" || label === "0") && (labelToPrint !== 0) && (labelToPrint !== "0.00")) { - label = Number(labelToPrint).toFixed(6); - } - } - let xOffset = label.length / 2 * fontSize * FONT_ASPECT_RATIO; - - labelPoint = { - x: x - xOffset, - y: y - }; - - labelPoint = thisObject.container.frame.frameThisPoint(labelPoint); - labelPoint = thisObject.fitFunction(labelPoint) - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.DARK + ', ' + opacity + ')'; - browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y); - - } - - browserCanvasContext.closePath(); - browserCanvasContext.fill(); - - /* Parameters */ - let params - let paramsArray = [] - let positionTaken = false - - if (currentRecord.positionSize > 0) { - positionTaken = true - } - - params = {} - params.VALUE = currentRecord.balanceA; - params.INIT_VALUE = currentRecord.initialBalanceA - params.MIN_VALUE = currentRecord.minimunBalanceA - params.MAX_VALUE = currentRecord.maximunBalanceA - params.ASSET_LABEL = 'Asset A' - params.ASSET_NAME = DEFAULT_MARKET.assetB - params.LEFT_OFFSET = 100 - params.POSITION_TAKEN = positionTaken - params.BASE_ASSET = currentRecord.baseAsset - params.DECIMALS = 4 - - paramsArray.push(params) - - params = {} - params.VALUE = currentRecord.balanceB; - params.MIN_VALUE = currentRecord.minimunBalanceB - params.INIT_VALUE = currentRecord.initialBalanceB - params.MAX_VALUE = currentRecord.maximunBalanceB - params.ASSET_LABEL = 'Asset B' - params.ASSET_NAME = DEFAULT_MARKET.assetA - params.LEFT_OFFSET = 220 - params.POSITION_TAKEN = positionTaken - params.BASE_ASSET = currentRecord.baseAsset - params.DECIMALS = 2 - - paramsArray.push(params) - - canvas.cockpitSpace.assetBalances.setParamsArray(paramsArray) - } -} - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecution.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecution.js deleted file mode 100644 index f1a7eb78f..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecution.js +++ /dev/null @@ -1,799 +0,0 @@ -function newMastersPlottersTradingSimulationSimulationExecution() { - - const MODULE_NAME = "Simulation Execution Plotter"; - const INTENSIVE_LOG = false; - const ERROR_LOG = true; - const logger = newWebDebugLog(); - logger.fileName = MODULE_NAME; - - let thisObject = { - - // Main functions and properties. - - initialize: initialize, - finalize: finalize, - container: undefined, - fitFunction: undefined, - getContainer: getContainer, - setTimeFrame: setTimeFrame, - setDatetime: setDatetime, - setCoordinateSystem: setCoordinateSystem, - draw: draw - }; - - /* this is part of the module template */ - - let container = newContainer(); // Do not touch this 3 lines, they are just needed. - container.initialize(); - thisObject.container = container; - - let coordinateSystem - - let timeFrame; // This will hold the current Time Frame the user is at. - let datetime; // This will hold the current Datetime the user is at. - - /* these are module specific variables: */ - - let fileSequence; - let plotElements = []; // This is where the elements to be plotted are stored before plotting. - let plotLines = []; // Here we store the lines of open positions. - - let previousNotesSetKey; - - let onMouseOverEventSuscriptionId - let offsetChangedEventSubscriptionId - let filesUpdatedEventSubscriptionId - let dimmensionsChangedEventSubscriptionId - let scaleChangedEventSubscriptionId - - let userPositionDate - return thisObject; - - function finalize() { - try { - - /* Stop listening to the necesary events. */ - thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) - canvas.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId); - fileSequence.eventHandler.stopListening(filesUpdatedEventSubscriptionId); - thisObject.container.eventHandler.stopListening(dimmensionsChangedEventSubscriptionId) - - /* Destroyd References */ - - datetime = undefined; - timeFrame = undefined; - - fileSequence = undefined; - plotElements = undefined; - plotLines = undefined; - - thisObject.fitFunction = undefined - - finalizeCoordinateSystem() - coordinateSystem = undefined - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] ' + MODULE_NAME + ' -> finalize -> err = " + err.stack.stack); } - } - } - - function initialize(pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction) { - - try { - - datetime = pDatetime; - timeFrame = pTimeFrame; - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - - fileSequence = pStorage.fileSequences[0]; - - recalculate(); - - filesUpdatedEventSubscriptionId = fileSequence.eventHandler.listenToEvent("Files Updated", onFilesUpdated); // Only the first sequence is supported right now. - offsetChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged); - onMouseOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) - - /* Ready for when dimmension changes. */ - - dimmensionsChangedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('Dimmensions Changed', function () { - recalculate(); - }) - callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE); - - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] ' + MODULE_NAME + ' -> initialize -> err = " + err.stack); } - callBackFunction(GLOBAL.CUSTOM_FAIL_RESPONSE); - } - } - - function initializeCoordinateSystem() { - scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) - } - - function finalizeCoordinateSystem() { - coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId) - } - - function onScaleChanged() { - recalculate(); - } - - function onMouseOver(event) { - let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem) - userPositionDate = userPosition.valueOf() - } - - function getContainer(point) { - try { - let container; - /* First we check if this point is inside this space. */ - if (this.container.frame.isThisPointHere(point) === true) { - return this.container; - } else { - /* This point does not belong to this space. */ - return undefined; - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] ' + MODULE_NAME + ' -> initialize -> err = " + err.stack); } - } - } - - function onFilesUpdated() { - recalculate(); - } - - function setTimeFrame(pTimeFrame) { - timeFrame = pTimeFrame; - recalculate(); - } - - function setDatetime(pDatetime) { - datetime = pDatetime; - } - - function setCoordinateSystem(pCoordinateSystem) { - finalizeCoordinateSystem() - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - } - - function onViewportPositionChanged() { - if (Math.random() * 100 > 95) { - recalculate() - } - } - - function recalculate() { - try { - if (fileSequence === undefined) { return; } - /* - - We are going to filter the records depending on the Time Frame. We want that for a 1 min time peroid all the records appears on screen, - but for higher periods, we will filter out some records, so that they do not overlap ever. - - */ - plotElements = []; - plotLines = []; - - let lastSellRate; - let lastSellDate; - let sellExecRate; - - let lastBuyRate; - let lastBuyDate; - let buyExecRate; - - let maxSequence = fileSequence.getFilesLoaded(); - - for (let j = 0; j < maxSequence; j++) { - - let file = fileSequence.getFile(j); - - let history = []; - let lines = []; - - /* First the small balls */ - - const ONE_MIN_IN_MILISECONDS = 60 * 1000; - let step = timeFrame / ONE_MIN_IN_MILISECONDS; - step = 1; // For now we dont discard records depending on the zoom level. - - let i = 0; - let lastRecordPushed = 0; - - for (i = 0; i < file.length; i = i + step) { - - let newHistoryRecord = { - - date: Math.trunc(file[i][0] / 60000) * 60000 + 30000, - buyAvgRate: file[i][1], - sellAvgRate: file[i][2], - - lastSellRate: file[i][3], - sellExecRate: file[i][4], - lastBuyRate: file[i][5], - buyExecRate: file[i][6], - - marketRate: file[i][7], - newPositions: file[i][8], - newTrades: file[i][9], - movedPositions: file[i][10], - profitsAssetA: file[i][11], - profitsAssetB: file[i][12], - combinedProfitsA: file[i][13], - combinedProfitsB: file[i][14], - datetime: file[i][0] - }; - - /* Finally we add this History Record to the Array */ - - history.push(newHistoryRecord); - lastRecordPushed = i; - - /* Here we build the lines. */ - - //if (timeFrame <= 1 * 60 * 1000) { - - if (newHistoryRecord.lastSellRate > 0) { - lastSellRate = newHistoryRecord.lastSellRate; - lastSellDate = newHistoryRecord.date; - } - - if (newHistoryRecord.sellExecRate > 0) { - let newLine = { - type: "sell", - x1: lastSellDate, - y1: lastSellRate, - x2: newHistoryRecord.date, - y2: newHistoryRecord.sellExecRate - }; - lines.push(newLine); - } - - if (newHistoryRecord.lastBuyRate > 0) { - lastBuyRate = newHistoryRecord.lastBuyRate; - lastBuyDate = newHistoryRecord.date; - } - - if (newHistoryRecord.buyExecRate > 0) { - let newLine = { - type: "buy", - x1: lastBuyDate, - y1: lastBuyRate, - x2: newHistoryRecord.date, - y2: newHistoryRecord.buyExecRate - }; - lines.push(newLine); - } - //} - } - - /* We allways want to put the last record of the file on the filterd dataset, so as to allways show the latest advance of the bot. */ - - i = file.length - 1; - - if (lastRecordPushed !== i) { - - let newHistoryRecord = { - - date: Math.trunc(file[i][0] / 60000) * 60000 + 30000, - buyAvgRate: file[i][1], - sellAvgRate: file[i][2], - - lastSellRate: file[i][3], - sellExecRate: file[i][4], - lastBuyRate: file[i][5], - buyExecRate: file[i][6], - - marketRate: file[i][7], - newPositions: file[i][8], - newTrades: file[i][9], - movedPositions: file[i][10], - profitsAssetA: file[i][11], - profitsAssetB: file[i][12], - combinedProfitsA: file[i][13], - combinedProfitsB: file[i][14] - }; - - history.push(newHistoryRecord); - - } - - - for (let i = 0; i < file.length; i++) { - - let newHistoryRecord = { - - date: Math.trunc(file[i][0] / 60000) * 60000 + 30000, - buyAvgRate: file[i][1], - sellAvgRate: file[i][2], - - lastSellRate: file[i][3], - sellExecRate: file[i][4], - lastBuyRate: file[i][5], - buyExecRate: file[i][6], - - marketRate: file[i][7], - newPositions: file[i][8], - newTrades: file[i][9], - movedPositions: file[i][10], - profitsAssetA: file[i][11], - profitsAssetB: file[i][12], - combinedProfitsA: file[i][13], - combinedProfitsB: file[i][14] - }; - - } - plotElements.push(history); - plotLines.push(lines); - } - - thisObject.container.eventHandler.raiseEvent("History Changed", history); - - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] ' + MODULE_NAME + ' -> recalculate -> err = " + err.stack); } - } - } - - function draw() { - plotChart(); - } - - function plotChart() { - try { - - let currentRecord - - let point = { - x: 0, - y: 0 - }; - - let history; - - for (let j = 0; j < plotElements.length; j++) { - - let history = plotElements[j]; - - for (let i = 0; i < history.length; i++) { - - record = history[i]; - currentRecord = record - - let timestamp = record.date // Math.trunc(record.date / timeFrame) * timeFrame + timeFrame / 2; - - point = { - x: timestamp, - y: record.marketRate - }; - - point = coordinateSystem.transformThisPoint(point); - point = transformThisPoint(point, thisObject.container); - - if (point.x < canvas.chartingSpace.viewport.visibleArea.bottomLeft.x || point.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x) { continue; } - - point = canvas.chartingSpace.viewport.fitIntoVisibleArea(point); - point = thisObject.fitFunction(point); - - let isCurrentRecord = false; - - if (userPositionDate >= record.date - 30000 && userPositionDate <= record.date + 30000 - 1) { - isCurrentRecord = true; - } - - let opacity = '1'; - let currentRadius = 10 - - /* Draw a red inverted triangle on exec sell */ - if (record.sellExecRate > 0) { - - opacity = '1'; - - let normalSize = 5 - let extraSize = 0 - if (isCurrentRecord) { extraSize = 5 } - - let point1 = { - x: record.date, - y: record.sellExecRate - }; - - let point2 = { - x: record.date + timeFrame / 7 * (normalSize + extraSize), - y: record.sellExecRate - }; - - let point3 = { - x: record.date - timeFrame / 7 * (normalSize + extraSize), - y: record.sellExecRate - }; - - point1 = coordinateSystem.transformThisPoint(point1); - point1 = transformThisPoint(point1, thisObject.container); - point1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point1); - point1 = thisObject.fitFunction(point1); - - point2 = coordinateSystem.transformThisPoint(point2); - point2 = transformThisPoint(point2, thisObject.container); - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point2 = thisObject.fitFunction(point2); - - point3 = coordinateSystem.transformThisPoint(point3); - point3 = transformThisPoint(point3, thisObject.container); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y - diff; - point3.y = point3.y - diff; - - currentRecord.timeFrame = diff - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point2 = thisObject.fitFunction(point2); - point3 = thisObject.fitFunction(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')'; - - if (isCurrentRecord === false) { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')'; - } else { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.lineWidth = 0.25; - browserCanvasContext.stroke(); - - } - - /* Draw a green triangle on exec buy */ - if (record.buyExecRate > 0) { - - opacity = '1'; - - let normalSize = 5 - let extraSize = 0 - if (isCurrentRecord) { extraSize = 5 } - - let point1 = { - x: record.date, - y: record.buyExecRate - }; - - let point2 = { - x: record.date + timeFrame / 7 * (normalSize + extraSize), - y: record.buyExecRate - }; - - let point3 = { - x: record.date - timeFrame / 7 * (normalSize + extraSize), - y: record.buyExecRate - }; - - point1 = coordinateSystem.transformThisPoint(point1); - point1 = transformThisPoint(point1, thisObject.container); - point1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point1); - point1 = thisObject.fitFunction(point1); - - point2 = coordinateSystem.transformThisPoint(point2); - point2 = transformThisPoint(point2, thisObject.container); - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point2 = thisObject.fitFunction(point2); - - point3 = coordinateSystem.transformThisPoint(point3); - point3 = transformThisPoint(point3, thisObject.container); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y + diff; - point3.y = point3.y + diff; - - currentRecord.timeFrame = diff - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point2 = thisObject.fitFunction(point2); - point3 = thisObject.fitFunction(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', ' + opacity + ')'; - - if (isCurrentRecord === false) { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')'; - } else { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.lineWidth = 0.25; - browserCanvasContext.stroke(); - } - - /* Draw a red inverted triangle on sell */ - if (record.lastSellRate > 0) { - opacity = '1'; - - let normalSize = 5 - let extraSize = 0 - if (isCurrentRecord) { extraSize = 5 } - - let point1 = { - x: record.date, - y: record.lastSellRate - }; - - let point2 = { - x: record.date + timeFrame / 7 * (normalSize + extraSize), - y: record.lastSellRate - }; - - let point3 = { - x: record.date - timeFrame / 7 * (normalSize + extraSize), - y: record.lastSellRate - }; - - point1 = coordinateSystem.transformThisPoint(point1); - point1 = transformThisPoint(point1, thisObject.container); - point1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point1); - point1 = thisObject.fitFunction(point1); - - point2 = coordinateSystem.transformThisPoint(point2); - point2 = transformThisPoint(point2, thisObject.container); - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point2 = thisObject.fitFunction(point2); - - point3 = coordinateSystem.transformThisPoint(point3); - point3 = transformThisPoint(point3, thisObject.container); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y - diff; - point3.y = point3.y - diff; - - currentRecord.timeFrame = diff - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point2 = thisObject.fitFunction(point2); - point3 = thisObject.fitFunction(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - if (isCurrentRecord === false) { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + opacity + ')'; - } else { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')'; - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.lineWidth = 0.25; - browserCanvasContext.stroke(); - } - - /* Draw a green triangle on buy */ - if (record.lastBuyRate > 0) { - - opacity = '1'; - - let normalSize = 5 - let extraSize = 0 - if (isCurrentRecord) { extraSize = 5 } - - let point1 = { - x: record.date, - y: record.lastBuyRate - }; - - let point2 = { - x: record.date + timeFrame / 7 * (normalSize + extraSize), - y: record.lastBuyRate - }; - - let point3 = { - x: record.date - timeFrame / 7 * (normalSize + extraSize), - y: record.lastBuyRate - }; - - point1 = coordinateSystem.transformThisPoint(point1); - point1 = transformThisPoint(point1, thisObject.container); - point1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point1); - point1 = thisObject.fitFunction(point1); - - point2 = coordinateSystem.transformThisPoint(point2); - point2 = transformThisPoint(point2, thisObject.container); - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point2 = thisObject.fitFunction(point2); - - point3 = coordinateSystem.transformThisPoint(point3); - point3 = transformThisPoint(point3, thisObject.container); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y + diff; - point3.y = point3.y + diff; - - currentRecord.timeFrame = diff - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - point2 = thisObject.fitFunction(point2); - point3 = thisObject.fitFunction(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - if (isCurrentRecord === false) { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + opacity + ')'; - } else { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')'; - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.lineWidth = 0.25; - browserCanvasContext.stroke(); - } - - /* Send the current record to the panel */ - - if (userPositionDate >= record.date - 30000 && userPositionDate < record.date + 30000) { - thisObject.container.eventHandler.raiseEvent("Current Record Changed", currentRecord); - } - - /* Circles */ - - let radius = 2; - currentRadius = 10 - - /* Outer Circle */ - - if (isCurrentRecord === true) { - - browserCanvasContext.beginPath(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')'; - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - - browserCanvasContext.arc(point.x, point.y, currentRadius, 0, Math.PI * 2, true); - browserCanvasContext.closePath(); - - if (point.x < canvas.chartingSpace.viewport.visibleArea.topLeft.x + 50 || point.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x - 50) {/*we leave this history without fill. */ } else { - browserCanvasContext.fill(); - } - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.lineWidth = 0.25; - browserCanvasContext.stroke(); - } - - /* Inner Circle */ - - browserCanvasContext.beginPath(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')'; - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GOLDEN_ORANGE + ', ' + opacity + ')'; - - browserCanvasContext.arc(point.x, point.y, radius, 0, Math.PI * 2, true); - browserCanvasContext.closePath(); - - if (point.x < canvas.chartingSpace.viewport.visibleArea.topLeft.x + 50 || point.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x - 50) {/*we leave this history without fill. */ } else { - browserCanvasContext.fill(); - } - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.lineWidth = 0.25; - browserCanvasContext.stroke(); - - } - - /* Draw the lines connecting plot elements. */ - let lines = plotLines[j]; - - for (let i = 0; i < lines.length; i++) { - - let line = lines[i]; - - opacity = '1'; - - let point1 = { - x: line.x1, - y: line.y1 - }; - - let point2 = { - x: line.x2, - y: line.y2 - }; - - point1 = coordinateSystem.transformThisPoint(point1); - point1 = transformThisPoint(point1, thisObject.container); - point1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point1); - point1 = thisObject.fitFunction(point1); - - point2 = coordinateSystem.transformThisPoint(point2); - point2 = transformThisPoint(point2, thisObject.container); - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point2 = thisObject.fitFunction(point2); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - - browserCanvasContext.closePath(); - - if (line.type === "sell") { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')'; - } else { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')'; - } - - browserCanvasContext.setLineDash([4, 1]) - browserCanvasContext.lineWidth = 0.25; - browserCanvasContext.stroke(); - } - - - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] ' + MODULE_NAME + ' -> plotChart -> err = " + err.stack); } - } - } -} - - - - - - - - - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecutionPanel.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecutionPanel.js deleted file mode 100644 index 37a002b81..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/SimulationExecutionPanel.js +++ /dev/null @@ -1,465 +0,0 @@ - -function newMastersPlottersTradingSimulationSimulationExecutionSimulationExecutionPanel() { - - - let thisObject = { - fitFunction: undefined, - container: undefined, - isVisible: true, - onRecordChange: onRecordChange, - draw: draw, - getContainer: getContainer, - initialize: initialize, - finalize: finalize - }; - - let container = newContainer(); - container.initialize(); - thisObject.container = container; - - container.frame.containerName = "Trading Execution"; - - let currentRecord; - let upDownButton - - return thisObject; - - function finalize() { - thisObject.container.finalize() - thisObject.container = undefined - thisObject.fitFunction = undefined - thisObject.isVisible = undefined - - currentRecord = undefined - upDownButton.finalize() - upDownButton = undefined - } - - function initialize() { - - thisObject.container.frame.width = UI_PANEL.WIDTH.NORMAL; - thisObject.container.frame.height = UI_PANEL.HEIGHT.NORMAL * 2.5; - - thisObject.container.frame.position.x = canvas.chartingSpace.viewport.visibleArea.topLeft.x + thisObject.container.frame.width * 4; - thisObject.container.frame.position.y = canvas.chartingSpace.viewport.visibleArea.topRight.y; - - upDownButton = newUpDownButton() - upDownButton.parentContainer = thisObject.container - upDownButton.container.frame.parentFrame = thisObject.container.frame - upDownButton.fitFunction = thisObject.fitFunction - upDownButton.initialize() - } - - function getContainer(point) { - if (thisObject.isVisible !== true) { return } - let container; - - container = upDownButton.getContainer(point) - if (container !== undefined) { return container } - - if (thisObject.container.frame.isThisPointHere(point, true) === true) { - - let checkPoint = { - x: point.x, - y: point.y - } - - checkPoint = thisObject.fitFunction(checkPoint) - - if (point.x === checkPoint.x && point.y === checkPoint.y) { - return thisObject.container; - } - } - } - - - function onRecordChange(lastCurrentCandle) { - - currentRecord = lastCurrentCandle; - - } - - - function draw() { - if (thisObject.isVisible !== true) { return } - thisObject.container.frame.draw(false, false, true, thisObject.fitFunction); - - plot(); - - upDownButton.draw() - - } - - - function plot() { - - if (currentRecord === undefined) { return; } - - const frameBodyHeight = thisObject.container.frame.getBodyHeight(); - const frameTitleHeight = thisObject.container.frame.height - frameBodyHeight; - - const X_AXIS = thisObject.container.frame.width / 2; - const Y_AXIS = frameTitleHeight + frameBodyHeight / 2; - - record = currentRecord - - point = { - x: X_AXIS, - y: Y_AXIS - }; - - point = thisObject.container.frame.frameThisPoint(point); - point = thisObject.fitFunction(point); - - let isCurrentRecord = true; - - let radius = 2; - let currentRadius = 10 - let opacity = '1'; - - /* Draw a red inverted triangle on exec sell */ - if (record.sellExecRate > 0) { - - opacity = '1'; - - let point1 = { - x: X_AXIS, - y: Y_AXIS - }; - - let point2 = { - x: X_AXIS + record.timeFrame / 4, - y: Y_AXIS - }; - - let point3 = { - x: X_AXIS - record.timeFrame / 4, - y: Y_AXIS - }; - - point1 = thisObject.container.frame.frameThisPoint(point1); - point1 = thisObject.fitFunction(point1); - - point2 = thisObject.container.frame.frameThisPoint(point2); - point2 = thisObject.fitFunction(point2); - - point3 = thisObject.container.frame.frameThisPoint(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y - diff; - point3.y = point3.y - diff; - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')'; - - if (isCurrentRecord === false) { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')'; - } else { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.stroke(); - - } - - /* Draw a green triangle on exec buy */ - if (record.buyExecRate > 0) { - - opacity = '1'; - - let point1 = { - x: X_AXIS, - y: Y_AXIS - }; - - let point2 = { - x: X_AXIS + record.timeFrame / 4, - y: Y_AXIS - }; - - let point3 = { - x: X_AXIS - record.timeFrame / 4, - y: Y_AXIS - }; - - point1 = thisObject.container.frame.frameThisPoint(point1); - point1 = thisObject.fitFunction(point1); - - point2 = thisObject.container.frame.frameThisPoint(point2); - point2 = thisObject.fitFunction(point2); - - point3 = thisObject.container.frame.frameThisPoint(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y + diff; - point3.y = point3.y + diff; - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', ' + opacity + ')'; - - if (isCurrentRecord === false) { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')'; - } else { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.stroke(); - } - - /* Draw a red inverted triangle on sell */ - if (record.lastSellRate > 0) { - opacity = '1'; - - let point1 = { - x: X_AXIS, - y: Y_AXIS - }; - - let point2 = { - x: X_AXIS + record.timeFrame / 4, - y: Y_AXIS - }; - - let point3 = { - x: X_AXIS - record.timeFrame / 4, - y: Y_AXIS - }; - - point1 = thisObject.container.frame.frameThisPoint(point1); - point1 = thisObject.fitFunction(point1); - - point2 = thisObject.container.frame.frameThisPoint(point2); - point2 = thisObject.fitFunction(point2); - - point3 = thisObject.container.frame.frameThisPoint(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y - diff; - point3.y = point3.y - diff; - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - if (isCurrentRecord === false) { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + opacity + ')'; - } else { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')'; - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.stroke(); - } - - /* Draw a green triangle on buy */ - if (record.lastBuyRate > 0) { - - opacity = '1'; - - let point1 = { - x: X_AXIS, - y: Y_AXIS - }; - - let point2 = { - x: X_AXIS + record.timeFrame / 4, - y: Y_AXIS - }; - - let point3 = { - x: X_AXIS - record.timeFrame / 4, - y: Y_AXIS - }; - - point1 = thisObject.container.frame.frameThisPoint(point1); - point1 = thisObject.fitFunction(point1); - - point2 = thisObject.container.frame.frameThisPoint(point2); - point2 = thisObject.fitFunction(point2); - - point3 = thisObject.container.frame.frameThisPoint(point3); - point3 = thisObject.fitFunction(point3); - - let diff = point2.x - point3.x; - point2.y = point2.y + diff; - point3.y = point3.y + diff; - - point2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point2); - point3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(point3); - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - browserCanvasContext.lineTo(point3.x, point3.y); - browserCanvasContext.lineTo(point1.x, point1.y); - - browserCanvasContext.closePath(); - - if (isCurrentRecord === false) { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.WHITE + ', ' + opacity + ')'; - } else { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - } - - browserCanvasContext.fill(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')'; - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.stroke(); - } - - browserCanvasContext.lineWidth = 0.25; - - /* Outer Circle */ - - if (isCurrentRecord === true) { - - browserCanvasContext.beginPath(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')'; - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; /* highlight the current record */ - - browserCanvasContext.arc(point.x, point.y, currentRadius, 0, Math.PI * 2, true); - browserCanvasContext.closePath(); - - if (point.x < canvas.chartingSpace.viewport.visibleArea.topLeft.x + 50 || point.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x - 50) {/*we leave this history without fill. */ } else { - browserCanvasContext.fill(); - } - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.stroke(); - } - - /* Inner Circle */ - - browserCanvasContext.beginPath(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')'; - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GOLDEN_ORANGE + ', ' + opacity + ')'; - - browserCanvasContext.arc(point.x, point.y, radius, 0, Math.PI * 2, true); - browserCanvasContext.closePath(); - - if (point.x < canvas.chartingSpace.viewport.visibleArea.topLeft.x + 50 || point.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x - 50) {/*we leave this history without fill. */ } else { - browserCanvasContext.fill(); - } - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.stroke(); - - /* put the labels */ - - browserCanvasContext.beginPath(); - - let y; - let recordDate = new Date(currentRecord.datetime) - - printLabel('Market Rate', X_AXIS, frameTitleHeight + frameBodyHeight * 0.05 / 2, '1'); - printLabel(currentRecord.marketRate, X_AXIS, frameTitleHeight + frameBodyHeight * 0.10 / 2, '0.50'); - - printLabel('Sell Rate', X_AXIS, frameTitleHeight + frameBodyHeight * 0.15 / 2, '1'); - printLabel(currentRecord.lastSellRate, X_AXIS, frameTitleHeight + frameBodyHeight * 0.20 / 2, '0.50'); - - printLabel('Sell Executed Rate', X_AXIS, frameTitleHeight + frameBodyHeight * 0.25 / 2, '1'); - printLabel(currentRecord.sellExecRate, X_AXIS, frameTitleHeight + frameBodyHeight * 0.30 / 2, '0.50'); - - printLabel('Buy Rate', X_AXIS, frameTitleHeight + frameBodyHeight * 0.35 / 2, '1'); - printLabel(currentRecord.lastBuyRate, X_AXIS, frameTitleHeight + frameBodyHeight * 0.40 / 2, '0.40'); - - printLabel('Buy Executed Rate', X_AXIS, frameTitleHeight + frameBodyHeight * 0.45 / 2, '1'); - printLabel(currentRecord.buyExecRate, X_AXIS, frameTitleHeight + frameBodyHeight * 0.50 / 2, '0.50'); - - printLabel('ROI Asset A', X_AXIS, frameTitleHeight + frameBodyHeight * (1 - 0.25 / 2), '1'); - printLabel((currentRecord.combinedProfitsB).toFixed(2) + '%', X_AXIS, frameTitleHeight + frameBodyHeight * (1 - 0.30 / 2), '0.50'); - - printLabel('ROI Asset B', X_AXIS, frameTitleHeight + frameBodyHeight * (1 - 0.15 / 2), '1'); - printLabel((currentRecord.combinedProfitsA).toFixed(2) + '%', X_AXIS, frameTitleHeight + frameBodyHeight * (1 - 0.20 / 2), '0.50'); - - printLabel('Datetime', X_AXIS, frameTitleHeight + frameBodyHeight * (1 - 0.05 / 2), '1'); - printLabel(recordDate.toUTCString(), X_AXIS, frameTitleHeight + frameBodyHeight * (1 - 0.1 / 2), '0.50'); - - - function printLabel(labelToPrint, x, y, opacity) { - - let labelPoint; - let fontSize = 10; - - browserCanvasContext.font = fontSize + 'px ' + UI_FONT.SECONDARY + ' Saira'; - - let label = '' + labelToPrint; - if (isNaN(label) === false) { - label = Number(label).toLocaleString(); - } - let xOffset = label.length / 2 * fontSize * FONT_ASPECT_RATIO; - - labelPoint = { - x: x - xOffset, - y: y - }; - - labelPoint = thisObject.container.frame.frameThisPoint(labelPoint); - labelPoint = thisObject.fitFunction(labelPoint) - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.DARK + ', ' + opacity + ')'; - browserCanvasContext.fillText(label, labelPoint.x, labelPoint.y); - - } - - browserCanvasContext.closePath(); - browserCanvasContext.fill(); - - } - - -} - - - - - - - - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Strategies.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Strategies.js deleted file mode 100644 index 68ff6566d..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Strategies.js +++ /dev/null @@ -1,700 +0,0 @@ -function newMastersPlottersTradingSimulationStrategies() { - - const MODULE_NAME = "Strategies Plotter"; - const INFO_LOG = false; - const ERROR_LOG = true; - const INTENSIVE_LOG = false; - const logger = newWebDebugLog(); - logger.fileName = MODULE_NAME; - - let thisObject = { - - // Main functions and properties. - - initialize: initialize, - finalize: finalize, - container: undefined, - fitFunction: undefined, - getContainer: getContainer, - setTimeFrame: setTimeFrame, - setDatetime: setDatetime, - setCoordinateSystem: setCoordinateSystem, - draw: draw, - - /* Events declared outside the plotter. */ - - onDailyFileLoaded: onDailyFileLoaded, - - // Secondary functions and properties. - - currentRecord: undefined - }; - - /* this is part of the module template */ - - let container = newContainer(); // Do not touch this 3 lines, they are just needed. - container.initialize(); - thisObject.container = container; - - let coordinateSystem - - let timeFrame; // This will hold the current Time Frame the user is at. - let datetime; // This will hold the current Datetime the user is at. - - let marketFile; // This is the current Market File being plotted. - let fileCursor; // This is the current File Cursor being used to retrieve Daily Files. - - let marketFiles; // This object will provide the different Market Files at different Time Frames. - let dailyFiles; // This object will provide the different File Cursors at different Time Frames. - - /* these are module specific variables: */ - - let strategies = []; - let strategyImages = []; - - let onMouseOverEventSuscriptionId - let zoomChangedEventSubscriptionId - let offsetChangedEventSubscriptionId - let dragFinishedEventSubscriptionId - let dimmensionsChangedEventSubscriptionId - let marketFilesUpdatedEventSubscriptionId - let dailyFilesUpdatedEventSubscriptionId - let scaleChangedEventSubscriptionId - - let userPositionDate - return thisObject; - - function finalize() { - try { - - if (INFO_LOG === true) { logger.write("[INFO] finalize -> Entering function."); } - - /* Stop listening to the necesary events. */ - thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) - canvas.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId); - canvas.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId); - canvas.eventHandler.stopListening(dragFinishedEventSubscriptionId); - thisObject.container.eventHandler.stopListening(dimmensionsChangedEventSubscriptionId) - marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId); - dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId); - - /* Destroyd References */ - - marketFiles = undefined; - dailyFiles = undefined; - - datetime = undefined; - timeFrame = undefined; - - marketFile = undefined; - fileCursor = undefined; - - strategyImages = undefined; - - thisObject.fitFunction = undefined - - finalizeCoordinateSystem() - coordinateSystem = undefined - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] finalize -> err = " + err.stack); } - } - } - - function initialize(pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] initialize -> Entering function."); } - - /* Store the information received. */ - - marketFiles = pStorage.marketFiles[0]; - dailyFiles = pStorage.dailyFiles[0]; - - datetime = pDatetime; - timeFrame = pTimeFrame; - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - - /* We need a Market File in order to calculate the Y scale, since this scale depends on actual data. */ - - marketFile = marketFiles.getFile(ONE_DAY_IN_MILISECONDS); // This file is the one processed faster. - - /* Now we set the right files according to current Period. */ - - marketFile = marketFiles.getFile(pTimeFrame); - fileCursor = dailyFiles.getFileCursor(pTimeFrame); - - /* Listen to the necesary events. */ - - zoomChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged); - offsetChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged); - dragFinishedEventSubscriptionId = canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished); - marketFilesUpdatedEventSubscriptionId = marketFiles.eventHandler.listenToEvent("Files Updated", onMarketFilesUpdated); - dailyFilesUpdatedEventSubscriptionId = dailyFiles.eventHandler.listenToEvent("Files Updated", onDailyFilesUpdated); - onMouseOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) - - /* Get ready for plotting. */ - - recalculate(); - - /* Ready for when dimmension changes. */ - - dimmensionsChangedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('Dimmensions Changed', function () { - recalculate(); - }) - - for (let i = 1; i < 15; i++) { - let strategyImage = canvas.designSpace.iconByUiObjectType.get('Strategy'); - strategyImages.push(strategyImage); - } - - callBackFunction(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] initialize -> err = " + err.stack); } - } - } - - function initializeCoordinateSystem() { - scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) - } - - function finalizeCoordinateSystem() { - coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId) - } - - function onScaleChanged() { - recalculate(); - } - - function onMouseOver(event) { - let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem) - userPositionDate = userPosition.valueOf() - } - - function getContainer(point) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] getContainer -> Entering function."); } - - let container; - - /* First we check if this point is inside this space. */ - - if (this.container.frame.isThisPointHere(point) === true) { - - return this.container; - - } else { - - /* This point does not belong to this space. */ - - return undefined; - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] getContainer -> err = " + err.stack); } - } - } - - function onMarketFilesUpdated() { - try { - let newMarketFile = marketFiles.getFile(timeFrame); - if (newMarketFile !== undefined) { - marketFile = newMarketFile; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onMarketFilesUpdated -> err = " + err.stack); } - } - } - - function onDailyFilesUpdated() { - try { - let newFileCursor = dailyFiles.getFileCursor(timeFrame); - if (newFileCursor !== undefined) { - fileCursor = newFileCursor; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFilesUpdated -> err = " + err.stack); } - } - } - - function setTimeFrame(pTimeFrame) { - - try { - - if (timeFrame !== pTimeFrame) { - - timeFrame = pTimeFrame; - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - marketFile = marketFiles.getFile(pTimeFrame); - - recalculate(); - - } else { - - let newFileCursor = dailyFiles.getFileCursor(pTimeFrame); - - fileCursor = newFileCursor; // In this case, we explicitly want that if there is no valid cursor, we invalidate the data and show nothing. - recalculate(); - - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] setTimeFrame -> err = " + err.stack); } - } - } - - function setDatetime(pDatetime) { - datetime = pDatetime; - } - - function setCoordinateSystem(pCoordinateSystem) { - finalizeCoordinateSystem() - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - } - - function onDailyFileLoaded(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onDailyFileLoaded -> Entering function."); } - - if (event.currentValue === event.totalValue) { - - /* This happens only when all of the files in the cursor have been loaded. */ - - recalculate(); - - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFileLoaded -> err = " + err.stack); } - } - } - - function draw() { - - try { - - if (INTENSIVE_LOG === true) { logger.write("[INFO] draw -> Entering function."); } - - this.container.frame.draw(); - - plotChart(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] draw -> err = " + err.stack); } - } - } - - function recalculate() { - - try { - - strategies = [] - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - recalculateUsingMarketFiles(); - - } else { - - recalculateUsingDailyFiles(); - - } - - thisObject.container.eventHandler.raiseEvent("Strategies Changed", strategies); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculate -> err = " + err.stack); } - } - } - - function recalculateUsingDailyFiles() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] recalculateUsingDailyFiles -> Entering function."); } - - if (fileCursor === undefined) { - strategies = []; - return; - } // We need to wait - - if (fileCursor.files.size === 0) { - strategies = []; - return; - } // We need to wait until there are files in the cursor - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - let farLeftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - let farRightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - let currentDate = new Date(farLeftDate.valueOf()); - - strategies = []; - - - - while (currentDate.valueOf() <= farRightDate.valueOf() + ONE_DAY_IN_MILISECONDS) { - - let stringDate = currentDate.getFullYear() + '-' + pad(currentDate.getMonth() + 1, 2) + '-' + pad(currentDate.getDate(), 2); - - let dailyFile = fileCursor.files.get(stringDate); - - if (dailyFile !== undefined) { - - for (let i = 0; i < dailyFile.length; i++) { - - let record = { - begin: undefined, - end: undefined, - status: undefined, - number: undefined, - beginRate: undefined, - endRate: undefined - }; - - record.begin = dailyFile[i][0]; - record.end = dailyFile[i][1]; - record.status = dailyFile[i][2]; - record.number = dailyFile[i][3]; - record.beginRate = dailyFile[i][4]; - record.endRate = dailyFile[i][5]; - - if ( - (record.begin >= farLeftDate.valueOf() && record.end <= farRightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - strategies.push(record); - - if (datetime.valueOf() >= record.begin && datetime.valueOf() <= record.end) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Strategy Changed", thisObject.currentRecord); - - } - } - } - } - - currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS); - } - - /* Lests check if all the visible screen is going to be covered by strategies. */ - - let lowerEnd = leftDate.valueOf(); - let upperEnd = rightDate.valueOf(); - - setTimeout(recalculate, 2000); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingDailyFiles -> err = " + err.stack); } - } - } - - function recalculateUsingMarketFiles() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] recalculateUsingMarketFiles -> Entering function."); } - - if (marketFile === undefined) { return; } // Initialization not complete yet. - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - leftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - rightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - strategies = []; - - for (let i = 0; i < marketFile.length; i++) { - - let record = { - begin: undefined, - end: undefined, - status: undefined, - number: undefined, - beginRate: undefined, - endRate: undefined - }; - - record.begin = marketFile[i][0]; - record.end = marketFile[i][1]; - record.status = marketFile[i][2]; - record.number = marketFile[i][3]; - record.beginRate = marketFile[i][4]; - record.endRate = marketFile[i][5]; - - if (record.begin >= leftDate.valueOf() && record.end <= rightDate.valueOf()) { - - strategies.push(record); - - if ( - (record.begin >= leftDate.valueOf() && record.end <= rightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Strategy Changed", thisObject.currentRecord); - - } - } - } - - //console.log("Olivia > recalculateUsingMarketFiles > total strategies generated : " + strategies.length); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingMarketFiles -> err = " + err.stack); } - } - } - - function plotChart() { - - try { - - thisObject.container.eventHandler.raiseEvent("Current Strategy Record Changed", undefined); - - let record; - - for (let i = 0; i < strategies.length; i++) { - - record = strategies[i]; - - let recordPoint1 = { - x: record.begin, - y: record.beginRate - }; - - let recordPoint2 = { - x: record.end, - y: record.endRate - }; - - let recordPoint3 = { - x: record.begin, - y: record.beginRate - }; - - let recordPoint4 = { - x: record.end, - y: record.endRate - }; - - recordPoint1 = coordinateSystem.transformThisPoint(recordPoint1); - recordPoint2 = coordinateSystem.transformThisPoint(recordPoint2); - recordPoint3 = coordinateSystem.transformThisPoint(recordPoint3); - recordPoint4 = coordinateSystem.transformThisPoint(recordPoint4); - - recordPoint1 = transformThisPoint(recordPoint1, thisObject.container); - recordPoint2 = transformThisPoint(recordPoint2, thisObject.container); - recordPoint3 = transformThisPoint(recordPoint3, thisObject.container); - recordPoint4 = transformThisPoint(recordPoint4, thisObject.container); - - if (recordPoint2.x < canvas.chartingSpace.viewport.visibleArea.bottomLeft.x || recordPoint1.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x) { - continue; - } - - recordPoint3.y = recordPoint1.y + 2000; - recordPoint4.y = recordPoint1.y + 2000; - - recordPoint1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint1); - recordPoint2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint2); - recordPoint3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint3); - recordPoint4 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint4); - - recordPoint1 = thisObject.fitFunction(recordPoint1, undefined, 30); - recordPoint2 = thisObject.fitFunction(recordPoint2, undefined, 30); - recordPoint3 = thisObject.fitFunction(recordPoint3, undefined, 30); - recordPoint4 = thisObject.fitFunction(recordPoint4, undefined, 30); - - let imageSize = 20; - let imageToDraw = strategyImages[record.number]; - - - /* Draw the line that represents the duration of closed strategy */ - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(recordPoint3.x + imageSize / 2, recordPoint3.y); - browserCanvasContext.lineTo(recordPoint4.x - imageSize / 2, recordPoint4.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.MANGANESE_PURPLE + ', 1)'; - browserCanvasContext.lineWidth = 1 - - if (record.status === 1) { - browserCanvasContext.setLineDash([0, 0]) - } else { - browserCanvasContext.setLineDash([2, 4]) - } - browserCanvasContext.stroke() - - /* Draw the Area */ - /* - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(recordPoint1.x, recordPoint2.y); - browserCanvasContext.lineTo(recordPoint3.x, recordPoint3.y); - browserCanvasContext.lineTo(recordPoint4.x, recordPoint4.y); - browserCanvasContext.lineTo(recordPoint2.x, recordPoint2.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.LIGHT_GREY + ', ' + 0.5 + ')'; - browserCanvasContext.fill(); - */ - /* Draw the Sticks */ - - drawStick(recordPoint1, recordPoint3); - drawStick(recordPoint2, recordPoint4); - - if (imageToDraw.canDrawIcon === true) { - browserCanvasContext.drawImage(imageToDraw, recordPoint3.x - imageSize / 2, recordPoint3.y - imageSize / 2, imageSize, imageSize); - if (record.status === 1) { - browserCanvasContext.drawImage(imageToDraw, recordPoint4.x - imageSize / 2, recordPoint4.y - imageSize / 2, imageSize, imageSize); - } - } - - /* Send the current record to the panel */ - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - - let currentRecord = { - }; - thisObject.container.eventHandler.raiseEvent("Current Strategy Record Changed", currentRecord); - } - - function drawStick(point1, point2) { - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(point1.x, point1.y); - browserCanvasContext.lineTo(point2.x, point2.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.DARK + ', 0.25)'; - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - - /* highlight the current record */ - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current record accroding to time - } - - browserCanvasContext.setLineDash([4, 3]) - browserCanvasContext.lineWidth = 0.5 - browserCanvasContext.stroke() - browserCanvasContext.setLineDash([0, 0]) - - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] plotChart -> err = " + err.stack); } - } - } - - - function onViewportZoomChanged(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onViewportZoomChanged -> Entering function."); } - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportZoomChanged -> err = " + err.stack); } - } - } - - function onViewportPositionChanged(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onViewportPositionChanged -> Entering function."); } - - if (event !== undefined) { - if (event.recalculate === true) { - recalculate() - return - } - } - if (Math.random() * 100 > 95) { - recalculate() - }; - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportPositionChanged -> err = " + err.stack); } - } - } - - function onDragFinished() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onDragFinished -> Entering function."); } - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDragFinished -> err = " + err.stack); } - } - } -} - - - - - - - - - - - - - - - - - - - - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Trades.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Trades.js deleted file mode 100644 index 9c5e16f88..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/Trades.js +++ /dev/null @@ -1,683 +0,0 @@ -function newMastersPlottersTradingSimulationTrades() { - - const MODULE_NAME = "Trades Plotter"; - const INFO_LOG = false; - const ERROR_LOG = true; - const INTENSIVE_LOG = false; - const logger = newWebDebugLog(); - logger.fileName = MODULE_NAME; - - let thisObject = { - - // Main functions and properties. - - initialize: initialize, - finalize: finalize, - container: undefined, - fitFunction: undefined, - getContainer: getContainer, - setTimeFrame: setTimeFrame, - setDatetime: setDatetime, - setCoordinateSystem: setCoordinateSystem, - draw: draw, - - /* Events declared outside the plotter. */ - - onDailyFileLoaded: onDailyFileLoaded, - - // Secondary functions and properties. - - currentRecord: undefined - }; - - /* this is part of the module template */ - - let container = newContainer(); // Do not touch this 3 lines, they are just needed. - container.initialize(); - thisObject.container = container; - - let coordinateSystem - - let timeFrame; // This will hold the current Time Frame the user is at. - let datetime; // This will hold the current Datetime the user is at. - - let marketFile; // This is the current Market File being plotted. - let fileCursor; // This is the current File Cursor being used to retrieve Daily Files. - - let marketFiles; // This object will provide the different Market Files at different Time Frames. - let dailyFiles; // This object will provide the different File Cursors at different Time Frames. - - /* these are module specific variables: */ - - let trades = []; - let headers; - - let onMouseOverEventSuscriptionId - let zoomChangedEventSubscriptionId - let offsetChangedEventSubscriptionId - let dragFinishedEventSubscriptionId - let dimmensionsChangedEventSubscriptionId - let marketFilesUpdatedEventSubscriptionId - let dailyFilesUpdatedEventSubscriptionId - let scaleChangedEventSubscriptionId - - let userPositionDate - return thisObject; - - function finalize() { - try { - - if (INFO_LOG === true) { logger.write("[INFO] finalize -> Entering function."); } - - /* Stop listening to the necesary events. */ - thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) - canvas.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId); - canvas.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId); - canvas.eventHandler.stopListening(dragFinishedEventSubscriptionId); - thisObject.container.eventHandler.stopListening(dimmensionsChangedEventSubscriptionId) - marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId); - dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId); - - /* Destroyd References */ - - marketFiles = undefined; - dailyFiles = undefined; - - datetime = undefined; - timeFrame = undefined; - - marketFile = undefined; - fileCursor = undefined; - - thisObject.fitFunction = undefined - - finalizeCoordinateSystem() - coordinateSystem = undefined - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] finalize -> err = " + err.stack); } - } - } - - function initialize(pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] initialize -> Entering function."); } - - /* Store the information received. */ - - marketFiles = pStorage.marketFiles[0]; - dailyFiles = pStorage.dailyFiles[0]; - - datetime = pDatetime; - timeFrame = pTimeFrame; - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - - /* We need a Market File in order to calculate the Y scale, since this scale depends on actual data. */ - - marketFile = marketFiles.getFile(ONE_DAY_IN_MILISECONDS); // This file is the one processed faster. - - /* Now we set the right files according to current Period. */ - - marketFile = marketFiles.getFile(pTimeFrame); - fileCursor = dailyFiles.getFileCursor(pTimeFrame); - - /* Listen to the necesary events. */ - - zoomChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged); - offsetChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged); - dragFinishedEventSubscriptionId = canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished); - marketFilesUpdatedEventSubscriptionId = marketFiles.eventHandler.listenToEvent("Files Updated", onMarketFilesUpdated); - dailyFilesUpdatedEventSubscriptionId = dailyFiles.eventHandler.listenToEvent("Files Updated", onDailyFilesUpdated); - onMouseOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) - - /* Get ready for plotting. */ - - recalculate(); - - /* Ready for when dimmension changes. */ - - dimmensionsChangedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('Dimmensions Changed', function () { - recalculate(); - }) - - callBackFunction(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] initialize -> err = " + err.stack); } - } - } - - function initializeCoordinateSystem() { - scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) - } - - function finalizeCoordinateSystem() { - coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId) - } - - function onScaleChanged() { - recalculate(); - } - - function onMouseOver(event) { - let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem) - userPositionDate = userPosition.valueOf() - } - - function getContainer(point) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] getContainer -> Entering function."); } - - let container; - - /* First we check if this point is inside this space. */ - - if (this.container.frame.isThisPointHere(point) === true) { - - return this.container; - - } else { - - /* This point does not belong to this space. */ - - return undefined; - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] getContainer -> err = " + err.stack); } - } - } - - function onMarketFilesUpdated() { - try { - let newMarketFile = marketFiles.getFile(timeFrame); - if (newMarketFile !== undefined) { - marketFile = newMarketFile; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onMarketFilesUpdated -> err = " + err.stack); } - } - } - - function onDailyFilesUpdated() { - try { - let newFileCursor = dailyFiles.getFileCursor(timeFrame); - if (newFileCursor !== undefined) { - fileCursor = newFileCursor; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFilesUpdated -> err = " + err.stack); } - } - } - - function setTimeFrame(pTimeFrame) { - - try { - - if (timeFrame !== pTimeFrame) { - - timeFrame = pTimeFrame; - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - marketFile = marketFiles.getFile(pTimeFrame); - - recalculate(); - - } else { - - let newFileCursor = dailyFiles.getFileCursor(pTimeFrame); - - fileCursor = newFileCursor; // In this case, we explicitly want that if there is no valid cursor, we invalidate the data and show nothing. - recalculate(); - - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] setTimeFrame -> err = " + err.stack); } - } - } - - function setDatetime(pDatetime) { - datetime = pDatetime; - } - - function setCoordinateSystem(pCoordinateSystem) { - finalizeCoordinateSystem() - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - } - - function onDailyFileLoaded(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onDailyFileLoaded -> Entering function."); } - - if (event.currentValue === event.totalValue) { - - /* This happens only when all of the files in the cursor have been loaded. */ - - recalculate(); - - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFileLoaded -> err = " + err.stack); } - } - } - - function draw() { - - try { - - if (INTENSIVE_LOG === true) { logger.write("[INFO] draw -> Entering function."); } - - this.container.frame.draw(); - - plotChart(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] draw -> err = " + err.stack); } - } - } - - function recalculate() { - - try { - - trades = [] - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - recalculateUsingMarketFiles(); - - } else { - - recalculateUsingDailyFiles(); - - } - - thisObject.container.eventHandler.raiseEvent("Trades Changed", trades); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculate -> err = " + err.stack); } - } - } - - function recalculateUsingDailyFiles() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] recalculateUsingDailyFiles -> Entering function."); } - - if (fileCursor === undefined) { - trades = []; - return; - } // We need to wait - - if (fileCursor.files.size === 0) { - trades = []; - return; - } // We need to wait until there are files in the cursor - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - let farLeftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - let farRightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - let currentDate = new Date(farLeftDate.valueOf()); - - trades = []; - - - - while (currentDate.valueOf() <= farRightDate.valueOf() + ONE_DAY_IN_MILISECONDS) { - - let stringDate = currentDate.getFullYear() + '-' + pad(currentDate.getMonth() + 1, 2) + '-' + pad(currentDate.getDate(), 2); - - let dailyFile = fileCursor.files.get(stringDate); - - if (dailyFile !== undefined) { - - for (let i = 0; i < dailyFile.length; i++) { - - let record = {}; - - record.begin = dailyFile[i][0]; - record.end = dailyFile[i][1]; - record.status = dailyFile[i][2]; - record.lastTradeROI = dailyFile[i][3]; - record.beginRate = dailyFile[i][4]; - record.endRate = dailyFile[i][5]; - record.exitType = dailyFile[i][6]; - - if ( - (record.begin >= farLeftDate.valueOf() && record.end <= farRightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - trades.push(record); - - if (datetime.valueOf() >= record.begin && datetime.valueOf() <= record.end) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Trade Changed", thisObject.currentRecord); - - } - } - } - } - - currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS); - } - - /* Lests check if all the visible screen is going to be covered by trades. */ - - let lowerEnd = leftDate.valueOf(); - let upperEnd = rightDate.valueOf(); - - setTimeout(recalculate, 2000); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingDailyFiles -> err = " + err.stack); } - } - } - - function recalculateUsingMarketFiles() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] recalculateUsingMarketFiles -> Entering function."); } - - if (marketFile === undefined) { return; } // Initialization not complete yet. - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - leftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - rightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - trades = []; - - for (let i = 0; i < marketFile.length; i++) { - - let record = {}; - - record.begin = marketFile[i][0]; - record.end = marketFile[i][1]; - record.status = marketFile[i][2]; - record.lastTradeROI = marketFile[i][3]; - record.beginRate = marketFile[i][4]; - record.endRate = marketFile[i][5]; - record.exitType = marketFile[i][6]; - - if ( - (record.begin >= leftDate.valueOf() && record.end <= rightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - trades.push(record); - - if (datetime.valueOf() >= record.begin && datetime.valueOf() <= record.end) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Trade Changed", thisObject.currentRecord); - - } - } - } - - //console.log("Olivia > recalculateUsingMarketFiles > total trades generated : " + trades.length); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingMarketFiles -> err = " + err.stack); } - } - } - - function plotChart() { - - try { - - thisObject.container.eventHandler.raiseEvent("Current Trade Record Changed", undefined); - - let record; - - for (let i = 0; i < trades.length; i++) { - - record = trades[i]; - - /* Send the current record to the panel */ - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - - let currentRecord = { - }; - thisObject.container.eventHandler.raiseEvent("Current Trade Record Changed", currentRecord); - } - - let recordPoint1 = { - x: record.begin, - y: record.beginRate - }; - - let recordPoint2 = { - x: record.end, - y: record.beginRate - }; - - let recordPoint3 = { - x: record.end, - y: record.endRate - }; - - recordPoint1 = coordinateSystem.transformThisPoint(recordPoint1); - recordPoint2 = coordinateSystem.transformThisPoint(recordPoint2); - recordPoint3 = coordinateSystem.transformThisPoint(recordPoint3); - - recordPoint1 = transformThisPoint(recordPoint1, thisObject.container); - recordPoint2 = transformThisPoint(recordPoint2, thisObject.container); - recordPoint3 = transformThisPoint(recordPoint3, thisObject.container); - - if (recordPoint2.x < canvas.chartingSpace.viewport.visibleArea.bottomLeft.x || recordPoint1.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x) { - continue; - } - - recordPoint1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint1); - recordPoint2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint2); - recordPoint3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint3); - - recordPoint1 = thisObject.fitFunction(recordPoint1); - recordPoint2 = thisObject.fitFunction(recordPoint2); - recordPoint3 = thisObject.fitFunction(recordPoint3); - - let line1 = ''; - let line2 = ''; - - if (record.status === 1) { - switch (record.exitType) { - case 1: { - line1 = 'Stop Loss'; - break; - } - case 2: { - line1 = 'Take Profit'; - break; - } - } - } else { - line1 = 'Open Position'; - } - - if (record.lastTradeROI < 0) { - line2 = 'ROI:' + (record.lastTradeROI).toFixed(2) + ' %'; - } else { - line2 = 'ROI:' + (record.lastTradeROI).toFixed(2) + ' %'; - } - - /* Draw the triangle that represents the trade. */ - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(recordPoint1.x, recordPoint1.y); - browserCanvasContext.lineTo(recordPoint2.x, recordPoint2.y); - browserCanvasContext.lineTo(recordPoint3.x, recordPoint3.y); - - browserCanvasContext.closePath(); - - let opacity = '0.25'; - - if (record.lastTradeROI > 0) { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')'; - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', ' + opacity + ')'; - } else { - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')'; - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')'; - } - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', ' + opacity + ')'; - } - - browserCanvasContext.fill(); - - browserCanvasContext.lineWidth = 1; - browserCanvasContext.setLineDash([0, 0]) - browserCanvasContext.stroke(); - - let point = {} - - if (record.beginRate > record.endRate) { - point.x = recordPoint3.x - point.y = recordPoint3.y + 100 - } else { - point.x = recordPoint3.x - point.y = recordPoint3.y - 100 - } - - point = canvas.chartingSpace.viewport.fitIntoVisibleArea(point); - point = thisObject.fitFunction(point, undefined, 50); - - if ( - recordPoint3.x < canvas.chartingSpace.viewport.visibleArea.topLeft.x + 250 - || - recordPoint3.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x - 250 - || - recordPoint3.y > canvas.chartingSpace.viewport.visibleArea.bottomRight.y - 150 - || - recordPoint3.y < canvas.chartingSpace.viewport.visibleArea.topLeft.y + 150 - ) { - // we do not write any text - } else { - - - printLabel(line1, recordPoint2.x - (recordPoint2.x - recordPoint1.x) / 2 - line1.length * FONT_ASPECT_RATIO, point.y, '1', 12); - printLabel(line2, recordPoint2.x - (recordPoint2.x - recordPoint1.x) / 2 - line2.length * FONT_ASPECT_RATIO, point.y + 15, '1', 12); - - - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] plotChart -> err = " + err.stack); } - } - } - - - function onViewportZoomChanged(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onViewportZoomChanged -> Entering function."); } - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportZoomChanged -> err = " + err.stack); } - } - } - - function onViewportPositionChanged(event) { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onViewportPositionChanged -> Entering function."); } - - if (event !== undefined) { - if (event.recalculate === true) { - recalculate() - return - } - } - if (Math.random() * 100 > 95) { - recalculate() - }; - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportPositionChanged -> err = " + err.stack); } - } - } - - function onDragFinished() { - - try { - - if (INFO_LOG === true) { logger.write("[INFO] onDragFinished -> Entering function."); } - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDragFinished -> err = " + err.stack); } - } - } -} - - - - - - - - - - - - - - - - - - - - - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulation.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulation.js deleted file mode 100644 index 6222e1fae..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulation.js +++ /dev/null @@ -1,869 +0,0 @@ -function newMastersPlottersTradingSimulationTradingSimulation() { - - const MODULE_NAME = "Simulation Plotter"; - const ERROR_LOG = true; - const INTENSIVE_LOG = false; - const logger = newWebDebugLog(); - logger.fileName = MODULE_NAME; - - let thisObject = { - - // Main functions and properties. - - initialize: initialize, - finalize: finalize, - container: undefined, - fitFunction: undefined, - getContainer: getContainer, - setTimeFrame: setTimeFrame, - setDatetime: setDatetime, - setCoordinateSystem: setCoordinateSystem, - draw: draw, - - /* Events declared outside the plotter. */ - - onDailyFileLoaded: onDailyFileLoaded, - - // Secondary functions and properties. - - currentRecord: undefined - }; - - /* this is part of the module template */ - - let container = newContainer(); // Do not touch this 3 lines, they are just needed. - container.initialize(); - thisObject.container = container; - - let coordinateSystem - - let timeFrame; // This will hold the current Time Frame the user is at. - let datetime; // This will hold the current Datetime the user is at. - - let marketFile; // This is the current Market File being plotted. - let fileCursor; // This is the current File Cursor being used to retrieve Daily Files. - - let marketFiles; // This object will provide the different Market Files at different Time Frames. - let dailyFiles; // This object will provide the different File Cursors at different Time Frames. - - /* these are module specific variables: */ - - let records = []; // Here we keep the records to be ploted every time the Draw() function is called by the AAWebPlatform. - - let imageStopLossPhase; - let imageTakeProfitPhase; - let imageRecord; - - let onMouseOverEventSuscriptionId - let zoomChangedEventSubscriptionId - let offsetChangedEventSubscriptionId - let dragFinishedEventSubscriptionId - let dimmensionsChangedEventSubscriptionId - let marketFilesUpdatedEventSubscriptionId - let dailyFilesUpdatedEventSubscriptionId - let scaleChangedEventSubscriptionId - - let userPositionDate - return thisObject; - - function finalize() { - try { - - /* Stop listening to the necesary events. */ - thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId) - canvas.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId); - canvas.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId); - canvas.eventHandler.stopListening(dragFinishedEventSubscriptionId); - thisObject.container.eventHandler.stopListening(dimmensionsChangedEventSubscriptionId) - marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId); - dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId); - - /* icons */ - - imageStopLossPhase = undefined; - imageTakeProfitPhase = undefined; - imageRecord = undefined; - - /* Destroy References */ - - marketFiles = undefined; - dailyFiles = undefined; - - datetime = undefined; - timeFrame = undefined; - - marketFile = undefined; - fileCursor = undefined; - - thisObject.fitFunction = undefined - - finalizeCoordinateSystem() - coordinateSystem = undefined - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] finalize -> err = " + err.stack); } - } - } - - function initialize(pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction) { - - try { - - /* Store the information received. */ - - marketFiles = pStorage.marketFiles[0]; - dailyFiles = pStorage.dailyFiles[0]; - - datetime = pDatetime; - timeFrame = pTimeFrame; - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - - /* We need a Market File in order to calculate the Y scale, since this scale depends on actual data. */ - - marketFile = marketFiles.getFile(ONE_DAY_IN_MILISECONDS); // This file is the one processed faster. - - /* Now we set the right files according to current Period. */ - - marketFile = marketFiles.getFile(pTimeFrame); - fileCursor = dailyFiles.getFileCursor(pTimeFrame); - - /* Listen to the necesary events. */ - - zoomChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged); - offsetChangedEventSubscriptionId = canvas.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged); - dragFinishedEventSubscriptionId = canvas.eventHandler.listenToEvent("Drag Finished", onDragFinished); - marketFilesUpdatedEventSubscriptionId = marketFiles.eventHandler.listenToEvent("Files Updated", onMarketFilesUpdated); - dailyFilesUpdatedEventSubscriptionId = dailyFiles.eventHandler.listenToEvent("Files Updated", onDailyFilesUpdated); - onMouseOverEventSuscriptionId = thisObject.container.eventHandler.listenToEvent('onMouseOver', onMouseOver) - - /* Get ready for plotting. */ - - recalculate(); - - /* Ready for when dimmension changes. */ - - dimmensionsChangedEventSubscriptionId = thisObject.container.eventHandler.listenToEvent('Dimmensions Changed', function () { - recalculate(); - }) - - /* Loading a few icons */ - - imageStopLossPhase = canvas.designSpace.iconByUiObjectType.get('Stop'); - imageTakeProfitPhase = canvas.designSpace.iconByUiObjectType.get('Phase'); - imageRecord = canvas.designSpace.iconByUiObjectType.get('Trading System'); - - callBackFunction(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] initialize -> err = " + err.stack); } - } - } - - function initializeCoordinateSystem() { - scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged) - } - - function finalizeCoordinateSystem() { - coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId) - } - - function onScaleChanged() { - recalculate(); - } - - function onMouseOver(event) { - let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem) - userPositionDate = userPosition.valueOf() - } - - function getContainer(point) { - let container; - /* First we check if this point is inside this space. */ - if (this.container.frame.isThisPointHere(point) === true) { - return this.container; - } else { - /* This point does not belong to this space. */ - return undefined; - } - } - - function onMarketFilesUpdated() { - try { - let newMarketFile = marketFiles.getFile(timeFrame); - if (newMarketFile !== undefined) { - marketFile = newMarketFile; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onMarketFilesUpdated -> err = " + err.stack); } - } - } - - function onDailyFilesUpdated() { - try { - let newFileCursor = dailyFiles.getFileCursor(timeFrame); - if (newFileCursor !== undefined) { - fileCursor = newFileCursor; - recalculate(); - } - } catch (err) { - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFilesUpdated -> err = " + err.stack); } - } - } - - function setTimeFrame(pTimeFrame) { - - try { - - if (timeFrame !== pTimeFrame) { - - timeFrame = pTimeFrame; - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - marketFile = marketFiles.getFile(pTimeFrame); - - recalculate(); - - } else { - - let newFileCursor = dailyFiles.getFileCursor(pTimeFrame); - - fileCursor = newFileCursor; // In this case, we explicitly want that if there is no valid cursor, we invalidate the data and show nothing. - recalculate(); - - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] setTimeFrame -> err = " + err.stack); } - } - } - - function setDatetime(pDatetime) { - datetime = pDatetime; - } - - function setCoordinateSystem(pCoordinateSystem) { - finalizeCoordinateSystem() - coordinateSystem = pCoordinateSystem - initializeCoordinateSystem() - } - - function onDailyFileLoaded(event) { - - try { - - if (event.currentValue === event.totalValue) { - - /* This happens only when all of the files in the cursor have been loaded. */ - - recalculate(); - - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDailyFileLoaded -> err = " + err.stack); } - } - } - - function draw() { - - try { - - if (INTENSIVE_LOG === true) { logger.write("[INFO] draw -> Entering function."); } - - this.container.frame.draw(); - - plotChart(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] draw -> err = " + err.stack); } - } - } - - function recalculate() { - - try { - - records = [] - - if (timeFrame >= _1_HOUR_IN_MILISECONDS) { - - recalculateUsingMarketFiles(); - - } else { - - recalculateUsingDailyFiles(); - - } - - thisObject.container.eventHandler.raiseEvent("Records Changed", records); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculate -> err = " + err.stack); } - } - } - - function recalculateUsingDailyFiles() { - - try { - - if (fileCursor === undefined) { - records = []; - return; - } // We need to wait - - if (fileCursor.files.size === 0) { - records = []; - return; - } // We need to wait until there are files in the cursor - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - let farLeftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - let farRightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - let currentDate = new Date(farLeftDate.valueOf()); - - records = []; - - while (currentDate.valueOf() <= farRightDate.valueOf() + ONE_DAY_IN_MILISECONDS) { - - let stringDate = currentDate.getFullYear() + '-' + pad(currentDate.getMonth() + 1, 2) + '-' + pad(currentDate.getDate(), 2); - - let dailyFile = fileCursor.files.get(stringDate); - - if (dailyFile !== undefined) { - - for (let i = 0; i < dailyFile.length; i++) { - - let record = {}; - - record.begin = dailyFile[i][0]; - record.end = dailyFile[i][1]; - record.type = dailyFile[i][2]; - record.rate = dailyFile[i][3]; - record.amount = dailyFile[i][4]; - record.balanceA = dailyFile[i][5]; - record.balanceB = dailyFile[i][6]; - record.profit = dailyFile[i][7]; - record.lastTradeProfitLoss = dailyFile[i][8]; - record.stopLoss = dailyFile[i][9]; - record.roundtrips = dailyFile[i][10]; - record.hits = dailyFile[i][11]; - record.fails = dailyFile[i][12]; - record.hitRatio = dailyFile[i][13]; - record.ROI = dailyFile[i][14]; - record.periods = dailyFile[i][15]; - record.days = dailyFile[i][16]; - record.anualizedRateOfReturn = dailyFile[i][17]; - record.sellRate = dailyFile[i][18]; - record.lastTradeROI = dailyFile[i][19]; - record.strategy = dailyFile[i][20]; - record.strategyPhase = dailyFile[i][21]; - record.takeProfit = dailyFile[i][22]; - record.stopLossPhase = dailyFile[i][23]; - record.takeProfitPhase = dailyFile[i][24]; - record.positionSize = dailyFile[i][26]; // 25 is the message for the executor - record.initialBalanceA = dailyFile[i][27]; - record.minimunBalanceA = dailyFile[i][28]; - record.maximunBalanceA = dailyFile[i][29]; - record.initialBalanceB = dailyFile[i][30]; - record.minimunBalanceB = dailyFile[i][31]; - record.maximunBalanceB = dailyFile[i][32]; - record.baseAsset = dailyFile[i][33]; - record.quotedAsset = dailyFile[i][34]; - record.positionPeriods = dailyFile[i][35]; - record.positionDays = dailyFile[i][36]; - - if ( - (record.begin >= farLeftDate.valueOf() && record.end <= farRightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - records.push(record); - - if (datetime.valueOf() >= record.begin && datetime.valueOf() <= record.end) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Record Changed", thisObject.currentRecord); - - } - } - } - } - - currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS); - } - - /* Lests check if all the visible screen is going to be covered by records. */ - - let lowerEnd = leftDate.valueOf(); - let upperEnd = rightDate.valueOf(); - - setTimeout(recalculate, 2000); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingDailyFiles -> err = " + err.stack); } - } - } - - function recalculateUsingMarketFiles() { - - try { - - if (marketFile === undefined) { return; } // Initialization not complete yet. - - let daysOnSides = getSideDays(timeFrame); - - let leftDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topLeft, thisObject.container, coordinateSystem); - let rightDate = getDateFromPointAtBrowserCanvas(canvas.chartingSpace.viewport.visibleArea.topRight, thisObject.container, coordinateSystem); - - let dateDiff = rightDate.valueOf() - leftDate.valueOf(); - - leftDate = new Date(leftDate.valueOf() - dateDiff * 1.5); - rightDate = new Date(rightDate.valueOf() + dateDiff * 1.5); - - records = []; - - for (let i = 0; i < marketFile.length; i++) { - - let record = {}; - - record.begin = marketFile[i][0]; - record.end = marketFile[i][1]; - record.type = marketFile[i][2]; - record.rate = marketFile[i][3]; - record.amount = marketFile[i][4]; - record.balanceA = marketFile[i][5]; - record.balanceB = marketFile[i][6]; - record.profit = marketFile[i][7]; - record.lastTradeProfitLoss = marketFile[i][8]; - record.stopLoss = marketFile[i][9]; - record.roundtrips = marketFile[i][10]; - record.hits = marketFile[i][11]; - record.fails = marketFile[i][12]; - record.hitRatio = marketFile[i][13]; - record.ROI = marketFile[i][14]; - record.periods = marketFile[i][15]; - record.days = marketFile[i][16]; - record.anualizedRateOfReturn = marketFile[i][17]; - record.sellRate = marketFile[i][18]; - record.lastTradeROI = marketFile[i][19]; - record.strategy = marketFile[i][20]; - record.strategyPhase = marketFile[i][21]; - record.takeProfit = marketFile[i][22]; - record.stopLossPhase = marketFile[i][23]; - record.takeProfitPhase = marketFile[i][24]; - record.positionSize = marketFile[i][26]; // 25 is the message for the executor - record.initialBalanceA = marketFile[i][27]; - record.minimunBalanceA = marketFile[i][28]; - record.maximunBalanceA = marketFile[i][29]; - record.initialBalanceB = marketFile[i][30]; - record.minimunBalanceB = marketFile[i][31]; - record.maximunBalanceB = marketFile[i][32]; - record.baseAsset = marketFile[i][33]; - record.quotedAsset = marketFile[i][34]; - record.positionPeriods = marketFile[i][35]; - record.positionDays = marketFile[i][36]; - - if ( - (record.begin >= leftDate.valueOf() && record.end <= rightDate.valueOf()) && - (record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x) - ) { - - records.push(record); - - if (datetime.valueOf() >= record.begin && datetime.valueOf() <= record.end) { - - thisObject.currentRecord = record; - thisObject.container.eventHandler.raiseEvent("Current Record Changed", thisObject.currentRecord); - - } - } - } - - //console.log("Olivia > recalculateUsingMarketFiles > total records generated : " + records.length); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] recalculateUsingMarketFiles -> err = " + err.stack); } - } - } - - function plotChart() { - - try { - - let record; - - /* Now we calculate and plot the records */ - - for (let i = 0; i < records.length; i++) { // We do not start in 0 so as to be able to read the previous record i - 1 - - record = records[i]; - - /* Contributing to Auto-Scale*/ - if (record.stopLoss !== 0) { - coordinateSystem.reportYValue(record.stopLoss) - } - if (record.takeProfit !== 0) { - coordinateSystem.reportYValue(record.takeProfit) - } - - /* Send the current record to the panel */ - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - - let eventRecords = { - currentRecord: record - }; - thisObject.container.eventHandler.raiseEvent("Current Record Changed", eventRecords); - } - - let stopLossPhase = -1; - let takeProfitPhase = -1; - - if (i > 0) { - if (record.stopLossPhase !== records[i - 1].stopLossPhase) { - stopLossPhase = record.stopLossPhase; - } - - if (record.takeProfitPhase !== records[i - 1].takeProfitPhase) { - takeProfitPhase = record.takeProfitPhase; - } - } - - let recordPoint1 = { - x: record.begin + timeFrame / 7 * 1.5, - y: thisObject.container.frame.height - }; - - let recordPoint2 = { - x: record.end + timeFrame / 7 * 5.5, - y: thisObject.container.frame.height - }; - - let recordPoint3 = { - x: recordPoint1.x + (recordPoint2.x - recordPoint1.x) / 2, - y: 0 - }; - - let recordPoint4 = { - x: record.begin + timeFrame / 7 * 1.5, - y: thisObject.container.frame.height * 100 - }; - - let recordPoint5 = { - x: record.begin, - y: record.stopLoss - }; - - let recordPoint6 = { - x: record.end, - y: record.stopLoss - }; - - if (record.stopLoss === 0) { // Put these points out of range if stopLoss is zero. - - recordPoint5.x = 0; - recordPoint6.x = 0; - } - - let recordPoint7 = { - x: record.begin, - y: record.sellRate - }; - - let recordPoint8 = { - x: record.end, - y: record.sellRate - }; - - if (record.sellRate === 0) { // Put these points out of range if sellRate is zero. - - recordPoint7.x = 0; - recordPoint8.x = 0; - } - - let recordPoint9 = { - x: record.begin, - y: record.takeProfit - }; - - let recordPoint10 = { - x: record.end, - y: record.takeProfit - }; - - if (record.takeProfit === 0) { // Put these points out of range if takeProfit is zero. - - recordPoint9.x = 0; - recordPoint10.x = 0; - } - - recordPoint1 = coordinateSystem.transformThisPoint(recordPoint1); - recordPoint2 = coordinateSystem.transformThisPoint(recordPoint2); - recordPoint3 = coordinateSystem.transformThisPoint(recordPoint3); - recordPoint4 = coordinateSystem.transformThisPoint(recordPoint4); - recordPoint5 = coordinateSystem.transformThisPoint(recordPoint5); - recordPoint6 = coordinateSystem.transformThisPoint(recordPoint6); - recordPoint7 = coordinateSystem.transformThisPoint(recordPoint7); - recordPoint8 = coordinateSystem.transformThisPoint(recordPoint8); - recordPoint9 = coordinateSystem.transformThisPoint(recordPoint9); - recordPoint10 = coordinateSystem.transformThisPoint(recordPoint10); - - recordPoint1 = transformThisPoint(recordPoint1, thisObject.container); - recordPoint2 = transformThisPoint(recordPoint2, thisObject.container); - recordPoint3 = transformThisPoint(recordPoint3, thisObject.container); - recordPoint4 = transformThisPoint(recordPoint4, thisObject.container); - recordPoint5 = transformThisPoint(recordPoint5, thisObject.container); - recordPoint6 = transformThisPoint(recordPoint6, thisObject.container); - recordPoint7 = transformThisPoint(recordPoint7, thisObject.container); - recordPoint8 = transformThisPoint(recordPoint8, thisObject.container); - recordPoint9 = transformThisPoint(recordPoint9, thisObject.container); - recordPoint10 = transformThisPoint(recordPoint10, thisObject.container); - - recordPoint1 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint1); - recordPoint2 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint2); - recordPoint3 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint3); - recordPoint4 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint4); - recordPoint5 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint5); - recordPoint6 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint6); - recordPoint7 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint7); - recordPoint8 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint8); - recordPoint9 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint9); - recordPoint10 = canvas.chartingSpace.viewport.fitIntoVisibleArea(recordPoint10); - - recordPoint1 = thisObject.fitFunction(recordPoint1); - recordPoint2 = thisObject.fitFunction(recordPoint2); - recordPoint3 = thisObject.fitFunction(recordPoint3); - recordPoint4 = thisObject.fitFunction(recordPoint4); - recordPoint5 = thisObject.fitFunction(recordPoint5); - recordPoint6 = thisObject.fitFunction(recordPoint6); - recordPoint7 = thisObject.fitFunction(recordPoint7); - recordPoint8 = thisObject.fitFunction(recordPoint8); - recordPoint9 = thisObject.fitFunction(recordPoint9); - recordPoint10 = thisObject.fitFunction(recordPoint10); - - /* Image representing a Record */ - - let imageOffset = { - x: 0, - y: -30 - } - let imageSize = (recordPoint2.x - recordPoint1.x) / 2; - let recordLabel = record.periods.toLocaleString() - if (imageSize < 8) { - if (recordLabel[recordLabel.length - 1] !== '0' || imageSize < 4) - recordLabel = '' - } - let labelOffset = { - x: 0 - imageSize / 2 + 3 + imageOffset.x, - y: -2 - imageOffset.y - } - - let imagePosition = { - x: recordPoint4.x + imageOffset.x, - y: 0 - } - - imagePosition = canvas.chartingSpace.viewport.fitIntoVisibleArea(imagePosition) - imagePosition = thisObject.fitFunction(imagePosition, undefined, 0, 0, imageSize) - - if (imageRecord.canDrawIcon === true) { - browserCanvasContext.drawImage(imageRecord, imagePosition.x, imagePosition.y, imageSize, imageSize); - browserCanvasContext.save(); - browserCanvasContext.translate(recordPoint3.x + labelOffset.x, recordPoint3.y + labelOffset.y); - browserCanvasContext.rotate(-Math.PI / 2); - printLabel(recordLabel, 0, 0, '1', 8, undefined, undefined, undefined, undefined, true); - browserCanvasContext.restore(); - } - - if (recordPoint5.x < canvas.chartingSpace.viewport.visibleArea.bottomLeft.x || recordPoint5.x > canvas.chartingSpace.viewport.visibleArea.bottomRight.x) { - continue; - } - - /* Next we are drawing the position Rate */ - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(recordPoint7.x, recordPoint7.y); - browserCanvasContext.lineTo(recordPoint8.x, recordPoint8.y); - - browserCanvasContext.closePath(); - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.MANGANESE_PURPLE + ', 1)'; - browserCanvasContext.lineWidth = 1 - browserCanvasContext.setLineDash([1, 4]) - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - browserCanvasContext.lineWidth = 5 - browserCanvasContext.setLineDash([3, 4]) - - /* highlight the current record */ - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current record accroding to time - } - - browserCanvasContext.stroke() - browserCanvasContext.setLineDash([0, 0]) - - imageSize = 20; - let imageToDraw; - - /* Depending on what is on top, it is also the text and image of the take profit / stop loss */ - - let yOffset = 0 - if (record.takeProfit > record.stopLoss) { yOffset = imageSize * 2 } - - /* Next we are drawing the stopLoss floor / ceilling */ - - browserCanvasContext.beginPath(); - - - browserCanvasContext.moveTo(recordPoint5.x, recordPoint5.y); - browserCanvasContext.lineTo(recordPoint6.x, recordPoint6.y); - - - browserCanvasContext.closePath(); - - let opacity = 1 - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ''; - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - - /* highlight the current record */ - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current record accroding to time - } - - browserCanvasContext.lineWidth = 1 - browserCanvasContext.stroke() - - imagePosition = { - x: recordPoint6.x - imageSize, - y: recordPoint6.y - imageSize * 1.25 + yOffset - } - - imagePosition = canvas.chartingSpace.viewport.fitIntoVisibleArea(imagePosition) - imagePosition = thisObject.fitFunction(imagePosition, undefined, 0, 0, imageSize) - - let labelPosition = { - x: recordPoint6.x - imageSize / 2 - 3, - y: recordPoint6.y - imageSize * 1.5 + yOffset * 2 - } - labelPosition = canvas.chartingSpace.viewport.fitIntoVisibleArea(labelPosition) - labelPosition = thisObject.fitFunction(labelPosition, undefined, 30) - - if (imageStopLossPhase.canDrawIcon === true && stopLossPhase > -1) { - browserCanvasContext.drawImage(imageStopLossPhase, imagePosition.x, imagePosition.y, imageSize, imageSize); - printLabel(stopLossPhase, labelPosition.x, labelPosition.y, '1', 9); - } - - /* Next we are drawing the Take Profit */ - - browserCanvasContext.beginPath(); - - browserCanvasContext.moveTo(recordPoint9.x, recordPoint9.y); - browserCanvasContext.lineTo(recordPoint10.x, recordPoint10.y); - - browserCanvasContext.closePath(); - - opacity = 1 - - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.GREEN + ', ' + opacity + ''; - - if (userPositionDate >= record.begin && userPositionDate <= record.end) { - - /* highlight the current record */ - browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current record accroding to time - } - - browserCanvasContext.lineWidth = 1 - browserCanvasContext.stroke() - - imagePosition = { - x: recordPoint10.x - imageSize * 2 / 3, - y: recordPoint10.y + imageSize / 4 - yOffset - } - imagePosition = canvas.chartingSpace.viewport.fitIntoVisibleArea(imagePosition) - imagePosition = thisObject.fitFunction(imagePosition, undefined, 0, 0, imageSize) - - labelPosition = { - x: recordPoint10.x - imageSize * 1 / 3, - y: recordPoint10.y + imageSize * 1.9 - yOffset * 2 - } - labelPosition = canvas.chartingSpace.viewport.fitIntoVisibleArea(labelPosition) - labelPosition = thisObject.fitFunction(labelPosition, undefined, 30) - - if (imageTakeProfitPhase.canDrawIcon === true && takeProfitPhase > -1) { - browserCanvasContext.drawImage(imageTakeProfitPhase, imagePosition.x, imagePosition.y, imageSize, imageSize); - printLabel(takeProfitPhase, labelPosition.x, labelPosition.y, '1', 9); - } - } - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] plotChart -> err = " + err.stack); } - } - } - - - function onViewportZoomChanged(event) { - - try { - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportZoomChanged -> err = " + err.stack); } - } - } - - function onViewportPositionChanged(event) { - - try { - - if (event !== undefined) { - if (event.recalculate === true) { - recalculate() - return - } - } - if (Math.random() * 100 > 95) { - recalculate() - }; - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onViewportPositionChanged -> err = " + err.stack); } - } - } - - function onDragFinished() { - - try { - - recalculate(); - - } catch (err) { - - if (ERROR_LOG === true) { logger.write("[ERROR] onDragFinished -> err = " + err.stack); } - } - } -} - diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationAssetBalancesPanel.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationAssetBalancesPanel.js deleted file mode 100644 index 3ca0292ff..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationAssetBalancesPanel.js +++ /dev/null @@ -1,179 +0,0 @@ - -function newMastersPlottersTradingSimulationTradingSimulationTradingSimulationAssetBalancesPanel() { - - let thisObject = { - fitFunction: undefined, - onRecordChange: onRecordChange, - container: undefined, - session: undefined, - isVisible: true, - draw: draw, - getContainer: getContainer, - initialize: initialize, - finalize: finalize - }; - - let container = newContainer(); - container.initialize(); - thisObject.container = container; - - container.frame.containerName = "Simulation Asset Balances Panel"; - - let currentRecord; - let lastRecord; - let upDownButton - - const HEIGHT_FACTOR = 1.25 - - return thisObject; - - function initialize() { - - thisObject.container.frame.width = UI_PANEL.WIDTH.NORMAL * 1; - thisObject.container.frame.height = UI_PANEL.HEIGHT.NORMAL * HEIGHT_FACTOR; - - thisObject.container.frame.position.x = canvas.chartingSpace.viewport.visibleArea.topRight.x - thisObject.container.frame.width * 1; - thisObject.container.frame.position.y = canvas.chartingSpace.viewport.visibleArea.topRight.y; - - upDownButton = newUpDownButton() - upDownButton.parentContainer = thisObject.container - upDownButton.container.frame.parentFrame = thisObject.container.frame - upDownButton.fitFunction = thisObject.fitFunction - upDownButton.initialize() - - thisObject.assetBalances = newAssetalances() - thisObject.assetBalances.container.connectToParent(thisObject.container, true, true) - thisObject.assetBalances.initialize() - - } - - function finalize() { - thisObject.session = undefined - - thisObject.container.finalize() - thisObject.container = undefined - thisObject.fitFunction = undefined - thisObject.onRecordChange = undefined - thisObject.isVisible = undefined - - currentRecord = undefined - lastRecord = undefined - upDownButton = undefined - - thisObject.assetBalances.finalize() - thisObject.assetBalances = undefined - } - - function getContainer(point) { - if (thisObject.isVisible !== true) { return } - let container; - - container = upDownButton.getContainer(point) - if (container !== undefined) { return container } - - if (thisObject.container.frame.isThisPointHere(point, true) === true) { - - let checkPoint = { - x: point.x, - y: point.y - } - - checkPoint = thisObject.fitFunction(checkPoint) - - if (point.x === checkPoint.x && point.y === checkPoint.y) { - return thisObject.container; - } - } - } - - - function onRecordChange(records) { - - currentRecord = records.currentRecord; - lastRecord = records.lastRecord - - } - - - function draw() { - if (thisObject.isVisible !== true) { return } - thisObject.container.frame.draw(false, false, true, thisObject.fitFunction); - - plotCurrentRecordInfo(); - - upDownButton.draw() - - thisObject.assetBalances.draw() - - /* Define panel name */ - if (thisObject.session !== undefined) { - const MAX_LABEL_LENGTH = 25 - if (thisObject.session.name.length > MAX_LABEL_LENGTH) { - container.frame.containerName = thisObject.session.name.substring(0, MAX_LABEL_LENGTH) + '...' - } else { - container.frame.containerName = thisObject.session.name - } - } - } - - - function plotCurrentRecordInfo() { - - if (currentRecord === undefined) { return; } - - const frameBodyHeight = thisObject.container.frame.getBodyHeight(); - const frameTitleHeight = thisObject.container.frame.height - frameBodyHeight; - - const X_AXIS = thisObject.container.frame.width / 2; - const Y_AXIS = frameTitleHeight + frameBodyHeight / 2; - - /* put the labels with the records values */ - - let y = 0; - let increment = 0.024 / HEIGHT_FACTOR * 2.5; - - y = y + increment; - y = y + increment; - printLabel('Asset Balances', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - /* Parameters */ - let params - let paramsArray = [] - let positionTaken = false - - if (currentRecord.positionSize > 0) { - positionTaken = true - } - - params = {} - params.VALUE = currentRecord.balanceA; - params.INIT_VALUE = currentRecord.initialBalanceA - params.MIN_VALUE = currentRecord.minimunBalanceA - params.MAX_VALUE = currentRecord.maximunBalanceA - params.ASSET_LABEL = 'Asset A' - params.ASSET_NAME = currentRecord.baseAsset - params.LEFT_OFFSET = X_AXIS - params.POSITION_TAKEN = positionTaken - params.BASE_ASSET = currentRecord.baseAsset - params.DECIMALS = 4 - - paramsArray.push(params) - - params = {} - params.VALUE = currentRecord.balanceB; - params.MIN_VALUE = currentRecord.minimunBalanceB - params.INIT_VALUE = currentRecord.initialBalanceB - params.MAX_VALUE = currentRecord.maximunBalanceB - params.ASSET_LABEL = 'Asset B' - params.ASSET_NAME = currentRecord.quotedAsset - params.LEFT_OFFSET = X_AXIS - params.POSITION_TAKEN = positionTaken - params.BASE_ASSET = currentRecord.baseAsset - params.DECIMALS = 2 - - paramsArray.push(params) - - thisObject.assetBalances.setParamsArray(paramsArray) - - } -} diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationCurrentPositionPanel.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationCurrentPositionPanel.js deleted file mode 100644 index bf6190672..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationCurrentPositionPanel.js +++ /dev/null @@ -1,178 +0,0 @@ - - - -function newMastersPlottersTradingSimulationTradingSimulationTradingSimulationCurrentPositionPanel() { - - let thisObject = { - fitFunction: undefined, - onRecordChange: onRecordChange, - container: undefined, - session: undefined, - isVisible: true, - draw: draw, - getContainer: getContainer, - initialize: initialize, - finalize: finalize - }; - - let container = newContainer(); - container.initialize(); - thisObject.container = container; - - container.frame.containerName = "Simulation Current Position Panel"; - - let currentRecord; - let lastRecord; - let upDownButton - - const HEIGHT_FACTOR = 1.25 - - return thisObject; - - function initialize() { - - thisObject.container.frame.width = UI_PANEL.WIDTH.NORMAL * 1; - thisObject.container.frame.height = UI_PANEL.HEIGHT.NORMAL * HEIGHT_FACTOR; - - thisObject.container.frame.position.x = canvas.chartingSpace.viewport.visibleArea.topRight.x - thisObject.container.frame.width * 1; - thisObject.container.frame.position.y = canvas.chartingSpace.viewport.visibleArea.topRight.y; - - upDownButton = newUpDownButton() - upDownButton.parentContainer = thisObject.container - upDownButton.container.frame.parentFrame = thisObject.container.frame - upDownButton.fitFunction = thisObject.fitFunction - upDownButton.initialize() - - } - - function finalize() { - thisObject.session = undefined - - thisObject.container.finalize() - thisObject.container = undefined - thisObject.fitFunction = undefined - thisObject.onRecordChange = undefined - thisObject.isVisible = undefined - - currentRecord = undefined - lastRecord = undefined - upDownButton = undefined - } - - function getContainer(point) { - if (thisObject.isVisible !== true) { return } - let container; - - container = upDownButton.getContainer(point) - if (container !== undefined) { return container } - - if (thisObject.container.frame.isThisPointHere(point, true) === true) { - - let checkPoint = { - x: point.x, - y: point.y - } - - checkPoint = thisObject.fitFunction(checkPoint) - - if (point.x === checkPoint.x && point.y === checkPoint.y) { - return thisObject.container; - } - } - } - - - function onRecordChange(records) { - - currentRecord = records.currentRecord; - lastRecord = records.lastRecord - - } - - - function draw() { - if (thisObject.isVisible !== true) { return } - thisObject.container.frame.draw(false, false, true, thisObject.fitFunction); - - plotCurrentRecordInfo(); - - upDownButton.draw() - - /* Define panel name */ - if (thisObject.session !== undefined) { - const MAX_LABEL_LENGTH = 25 - if (thisObject.session.name.length > MAX_LABEL_LENGTH) { - container.frame.containerName = thisObject.session.name.substring(0, MAX_LABEL_LENGTH) + '...' - } else { - container.frame.containerName = thisObject.session.name - } - } - } - - - function plotCurrentRecordInfo() { - - if (currentRecord === undefined) { return; } - - const frameBodyHeight = thisObject.container.frame.getBodyHeight(); - const frameTitleHeight = thisObject.container.frame.height - frameBodyHeight; - - const X_AXIS = thisObject.container.frame.width / 2; - const Y_AXIS = frameTitleHeight + frameBodyHeight / 2; - - - /* put the labels with the records values */ - - let y = 0; - let increment = 0.024 / HEIGHT_FACTOR * 2.5; - - y = y + increment; - y = y + increment; - printLabel('Current Position', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Size', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.positionSize, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Rate', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.sellRate, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Stop', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.stopLoss, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Take Profit', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.takeProfit, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Periods', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel((currentRecord.positionPeriods), X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Days', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel((currentRecord.positionDays).toFixed(2), X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - y = y + increment; - printLabel('Latest Position', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Profit / Loss', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel((currentRecord.lastTradeProfitLoss), X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('ROI', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel((currentRecord.lastTradeROI).toFixed(2) + ' % ', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - } -} diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationPartialResultsPanel.js b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationPartialResultsPanel.js deleted file mode 100644 index d68ee4dd0..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/TradingSimulationPartialResultsPanel.js +++ /dev/null @@ -1,177 +0,0 @@ - -function newMastersPlottersTradingSimulationTradingSimulationTradingSimulationPartialResultsPanel() { - - let thisObject = { - fitFunction: undefined, - onRecordChange: onRecordChange, - container: undefined, - session: undefined, - isVisible: true, - draw: draw, - getContainer: getContainer, - initialize: initialize, - finalize: finalize - }; - - let container = newContainer(); - container.initialize(); - thisObject.container = container; - - container.frame.containerName = "Simulation Partial Results Panel"; - - let currentRecord; - let lastRecord; - let upDownButton - - const HEIGHT_FACTOR = 1.25 - - return thisObject; - - function initialize() { - - thisObject.container.frame.width = UI_PANEL.WIDTH.NORMAL * 1; - thisObject.container.frame.height = UI_PANEL.HEIGHT.NORMAL * HEIGHT_FACTOR; - - thisObject.container.frame.position.x = canvas.chartingSpace.viewport.visibleArea.topRight.x - thisObject.container.frame.width * 1; - thisObject.container.frame.position.y = canvas.chartingSpace.viewport.visibleArea.topRight.y; - - upDownButton = newUpDownButton() - upDownButton.parentContainer = thisObject.container - upDownButton.container.frame.parentFrame = thisObject.container.frame - upDownButton.fitFunction = thisObject.fitFunction - upDownButton.initialize() - - } - - function finalize() { - thisObject.session = undefined - - thisObject.container.finalize() - thisObject.container = undefined - thisObject.fitFunction = undefined - thisObject.onRecordChange = undefined - thisObject.isVisible = undefined - - currentRecord = undefined - lastRecord = undefined - upDownButton = undefined - } - - function getContainer(point) { - if (thisObject.isVisible !== true) { return } - let container; - - container = upDownButton.getContainer(point) - if (container !== undefined) { return container } - - if (thisObject.container.frame.isThisPointHere(point, true) === true) { - - let checkPoint = { - x: point.x, - y: point.y - } - - checkPoint = thisObject.fitFunction(checkPoint) - - if (point.x === checkPoint.x && point.y === checkPoint.y) { - return thisObject.container; - } - } - } - - - function onRecordChange(records) { - - currentRecord = records.currentRecord; - lastRecord = records.lastRecord - - } - - - function draw() { - if (thisObject.isVisible !== true) { return } - thisObject.container.frame.draw(false, false, true, thisObject.fitFunction); - - plotCurrentRecordInfo(); - - upDownButton.draw() - - /* Define panel name */ - if (thisObject.session !== undefined) { - const MAX_LABEL_LENGTH = 25 - if (thisObject.session.name.length > MAX_LABEL_LENGTH) { - container.frame.containerName = thisObject.session.name.substring(0, MAX_LABEL_LENGTH) + '...' - } else { - container.frame.containerName = thisObject.session.name - } - } - } - - - function plotCurrentRecordInfo() { - - if (currentRecord === undefined) { return; } - - const frameBodyHeight = thisObject.container.frame.getBodyHeight(); - const frameTitleHeight = thisObject.container.frame.height - frameBodyHeight; - - const X_AXIS = thisObject.container.frame.width / 2; - const Y_AXIS = frameTitleHeight + frameBodyHeight / 2; - - - /* put the labels with the records values */ - - let y = 0; - let increment = 0.024 / HEIGHT_FACTOR * 2.5; - - y = y + increment; - y = y + increment; - printLabel('Partial Results', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Profit / Loss', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.profit, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Trades', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.roundtrips, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Hits', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.hits, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Fails', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.fails, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Hit Ratio', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel((currentRecord.hitRatio * 100).toFixed(2) + ' %', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('ROI', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel((currentRecord.ROI * 100).toFixed(2) + ' %', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Periods', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.periods, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Days', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel(currentRecord.days, X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - y = y + increment; - printLabel('Anualized Rate of Return', X_AXIS, frameTitleHeight + frameBodyHeight * y, '0.60', undefined, undefined, true, thisObject.container, thisObject.fitFunction); - y = y + increment; - printLabel((currentRecord.anualizedRateOfReturn * 100).toFixed(2) + ' %', X_AXIS, frameTitleHeight + frameBodyHeight * y, '1.00', 14, undefined, true, thisObject.container, thisObject.fitFunction); - - } -} diff --git a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/this.plotter.config.json b/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/this.plotter.config.json deleted file mode 100644 index d5ff7028d..000000000 --- a/Legacy-Code/Masters/plotters/Plotters-Trading-Simulation/this.plotter.config.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "displayName": "Plotters Trading Simulation", - "codeName": "PlottersTradingSimulation", - "dataMine": "Masters", - "modules": [ - { - "codeName": "TradingSimulation", - "moduleName": "TradingSimulation", - "description": "Plots Bollinger Records.", - "profilePicture": "TradingSimulation.png", - "panels": [ - { - "codeName": "TradingSimulationPanel", - "moduleName": "TradingSimulationPanel", - "event": "Current Record Changed" - } - ] - }, - { - "codeName": "Conditions", - "moduleName": "Conditions", - "description": "Plots Simulation Conditions.", - "profilePicture": "Conditions.png", - "panels": [] - }, - { - "codeName": "Strategies", - "moduleName": "Strategies", - "description": "Plots Strategies.", - "profilePicture": "Strategies.png", - "panels": [ - ] - }, - { - "codeName": "Trades", - "moduleName": "Trades", - "description": "Plots Trades.", - "profilePicture": "Trades.png", - "panels": [ - ] - }, - { - "codeName": "SimulationExecution", - "moduleName": "SimulationExecution", - "description": "Plots Simulation Execution.", - "profilePicture": "SimulationExecution.png", - "panels": [ - { - "codeName": "SimulationExecutionPanel", - "moduleName": "SimulationExecutionPanel", - "event": "Current Record Changed" - } - ] - } - ] -} \ No newline at end of file diff --git a/Legacy-Code/TradingEngines/plotters/Plotters-Trading-Simulation/Conditions.js b/Legacy-Code/TradingEngines/plotters/Plotters-Trading-Simulation/Conditions.js index f65c5d9e6..a9eb8a1c8 100644 --- a/Legacy-Code/TradingEngines/plotters/Plotters-Trading-Simulation/Conditions.js +++ b/Legacy-Code/TradingEngines/plotters/Plotters-Trading-Simulation/Conditions.js @@ -707,6 +707,29 @@ } } } + + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].moveToPhaseEvents[n].payload.uiObject.setErrorMessage(openStage.initialDefinition.stopLoss.phases[p].moveToPhaseEvents[n].error) + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + processSituation(situation, designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].moveToPhaseEvents[n].situations[k]); + } + + for (let k = 0; k < moveToPhaseEvent.announcements.length; k++) { + + let announcement = moveToPhaseEvent.announcements[k]; + designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].moveToPhaseEvents[n].announcements[k].payload.uiObject.setErrorMessage(announcement.error) + if (announcement.formula !== undefined) { + designerTradingSystem.strategies[j].openStage.initialDefinition.stopLoss.phases[p].moveToPhaseEvents[n].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) + } + } + } + } } } @@ -769,6 +792,29 @@ } } } + + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].moveToPhaseEvents[n].payload.uiObject.setErrorMessage(openStage.initialDefinition.takeProfit.phases[p].moveToPhaseEvent[n].error) + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + processSituation(situation, designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].moveToPhaseEvents[n].situations[k]); + } + + for (let k = 0; k < moveToPhaseEvent.announcements.length; k++) { + + let announcement = moveToPhaseEvent.announcements[k]; + designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].moveToPhaseEvents[n].announcements[k].payload.uiObject.setErrorMessage(announcement.error) + if (announcement.formula !== undefined) { + designerTradingSystem.strategies[j].openStage.initialDefinition.takeProfit.phases[p].moveToPhaseEvents[n].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) + } + } + } + } } } } @@ -843,6 +889,29 @@ } } } + + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].moveToPhaseEvent[n].payload.uiObject.setErrorMessage(manageStage.stopLoss.phases[p].moveToPhaseEvent[n].error) + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + processSituation(situation, designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].moveToPhaseEvent[n].situations[k]); + } + + for (let k = 0; k < moveToPhaseEvent.announcements.length; k++) { + + let announcement = moveToPhaseEvent.announcements[k]; + designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].moveToPhaseEvent[n].announcements[k].payload.uiObject.setErrorMessage(announcement.error) + if (announcement.formula !== undefined) { + designerTradingSystem.strategies[j].manageStage.stopLoss.phases[p].moveToPhaseEvent[n].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) + } + } + } + } } } @@ -905,6 +974,28 @@ } } } + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].moveToPhaseEvents[n].payload.uiObject.setErrorMessage(manageStage.takeProfit.phases[p].moveToPhaseEvents[n].error) + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + processSituation(situation, designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].moveToPhaseEvents[n].situations[k]); + } + + for (let k = 0; k < moveToPhaseEvent.announcements.length; k++) { + + let announcement = moveToPhaseEvent.announcements[k]; + designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].moveToPhaseEvents[n].announcements[k].payload.uiObject.setErrorMessage(announcement.error) + if (announcement.formula !== undefined) { + designerTradingSystem.strategies[j].manageStage.takeProfit.phases[p].moveToPhaseEvents[n].announcements[k].formula.payload.uiObject.setErrorMessage(announcement.formula.error) + } + } + } + } } } } diff --git a/TaskServer/TradingSimulation.js b/TaskServer/TradingSimulation.js index 4f6ce4397..9fa497537 100644 --- a/TaskServer/TradingSimulation.js +++ b/TaskServer/TradingSimulation.js @@ -873,6 +873,28 @@ } } } + + /* move to phase events */ + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + for (let m = 0; m < situation.conditions.length; m++) { + + let condition = situation.conditions[m]; + let key = j + '-' + 'openStage' + '-' + 'initialDefinition' + '-' + 'stopLoss' + '-' + p + '-' + n + '-' + k + '-' + m; + + if (condition.javascriptCode !== undefined) { + newCondition(key, condition.javascriptCode, chart); + } + } + } + } + } } } @@ -939,6 +961,28 @@ } } } + + /* move to phase events */ + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + for (let m = 0; m < situation.conditions.length; m++) { + + let condition = situation.conditions[m]; + let key = j + '-' + 'openStage' + '-' + 'initialDefinition' + '-' + 'takeProfit' + '-' + p + '-' + n + '-' + k + '-' + m; + + if (condition.javascriptCode !== undefined) { + newCondition(key, condition.javascriptCode, chart); + } + } + } + } + } } } } @@ -1015,6 +1059,28 @@ } } } + + /* move to phase events */ + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + for (let m = 0; m < situation.conditions.length; m++) { + + let condition = situation.conditions[m]; + let key = j + '-' + 'manageStage' + '-' + 'stopLoss' + '-' + p + '-' + n + '-' + k + '-' + m; + + if (condition.javascriptCode !== undefined) { + newCondition(key, condition.javascriptCode, chart); + } + } + } + } + } } } @@ -1082,6 +1148,28 @@ } } } + + /* move to phase events */ + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + + for (let m = 0; m < situation.conditions.length; m++) { + + let condition = situation.conditions[m]; + let key = j + '-' + 'manageStage' + '-' + 'takeProfit' + '-' + p + '-' + n + '-' + k + '-' + m; + + if (condition.javascriptCode !== undefined) { + newCondition(key, condition.javascriptCode, chart); + } + } + } + } + } } } } @@ -1418,6 +1506,7 @@ if (parentNode !== undefined) { let phase = parentNode.stopLoss.phases[p]; + /* Check the next Phase Event. */ let nextPhaseEvent = phase.nextPhaseEvent; if (nextPhaseEvent !== undefined) { @@ -1461,6 +1550,64 @@ } } } + + /* Check the Move to Phase Events. */ + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + let passed = true; + + for (let m = 0; m < situation.conditions.length; m++) { + + let condition = situation.conditions[m]; + let key = j + '-' + stageKey + initialDefinitionKey + '-' + 'stopLoss' + '-' + p + '-' + n + '-' + k + '-' + m; + + let value = false + if (conditions.get(key) !== undefined) { + value = conditions.get(key).value; + } + + if (value === false) { passed = false; } + } + + if (passed) { + + let moveToPhase = moveToPhaseEvent.referenceParent + if (moveToPhase !== undefined) { + for (let q = 0; q < parentNode.stopLoss.phases.length; q++) { + if (parentNode.stopLoss.phases[q].id === moveToPhase.id) { + stopLossPhase = q + 1 + } + } + } else { + moveToPhaseEvent.error = "This Node needs to reference a Phase." + continue + } + + stopLossStage = 'Manage Stage' + if (takeProfitPhase > 0) { + strategyStage = 'Manage Stage' + checkAnnouncements(manageStage, 'Take Profit') + } + + if (processingDailyFiles) { + if (positionedAtYesterday) { + yesterday.stopLossPhase = stopLossPhase; + yesterday.stopLossStage = stopLossStage; + yesterday.strategyStage = strategyStage; + } + } + + checkAnnouncements(moveToPhaseEvent) + return; + } + } + } + } } } @@ -1553,6 +1700,7 @@ let phase = parentNode.takeProfit.phases[p]; if (phase === undefined) {return} // trying to jump to a phase that does not exists. + /* Check the next Phase Event. */ let nextPhaseEvent = phase.nextPhaseEvent; if (nextPhaseEvent !== undefined) { @@ -1596,6 +1744,64 @@ } } } + + /* Check the Move to Phase Events. */ + for (let n = 0; n < phase.moveToPhaseEvents.length; n++) { + let moveToPhaseEvent = phase.moveToPhaseEvents[n]; + if (moveToPhaseEvent !== undefined) { + + for (let k = 0; k < moveToPhaseEvent.situations.length; k++) { + + let situation = moveToPhaseEvent.situations[k]; + let passed = true; + + for (let m = 0; m < situation.conditions.length; m++) { + + let condition = situation.conditions[m]; + let key = j + '-' + stageKey + initialDefinitionKey + '-' + 'takeProfit' + '-' + p + '-' + n + '-' + k + '-' + m; + + let value = false + if (conditions.get(key) !== undefined) { + value = conditions.get(key).value; + } + + if (value === false) { passed = false; } + } + + if (passed) { + + let moveToPhase = moveToPhaseEvent.referenceParent + if (moveToPhase !== undefined) { + for (let q = 0; q < parentNode.takeProfit.phases.length; q++) { + if (parentNode.takeProfit.phases[q].id === moveToPhase.id) { + takeProfitPhase = q + 1 + } + } + } else { + moveToPhaseEvent.error = "This Node needs to reference a Phase." + continue + } + + takeProfitStage = 'Manage Stage' + if (stopLossPhase > 0) { + strategyStage = 'Manage Stage' + checkAnnouncements(manageStage, 'Stop') + } + + if (processingDailyFiles) { + if (positionedAtYesterday) { + yesterday.takeProfitPhase = takeProfitPhase; + yesterday.takeProfitStage = takeProfitStage; + yesterday.strategyStage = strategyStage; + } + } + + checkAnnouncements(moveToPhaseEvent) + return; + } + } + } + } } }