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 000000000..e149ee484 Binary files /dev/null and b/BackendServers/WebServer/Images/Icons/style-01/move-to-phase-event.png differ 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; + } + } + } + } } }