Merge branch 'develop' of https://github.com/Superalgos/Superalgos into develop

This commit is contained in:
Barrypair committed 2021-10-30 03:52:12 +02:00
commit e5412ae1f0
151 files changed
+40509 -36796

No files matched your search

+1
View File
@@ -3,6 +3,7 @@
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence, these will be requested for
# review when someone opens a pull request.
* @Superalgos/foundations-project
# Project Teams
+2 -2
View File
@@ -12,12 +12,12 @@ exports.newDesktopRoot = function newDesktopRoot() {
async function run() {
/*
The DK object is accesible everywhere at the Superalgos Desktop App.
The DK object is accessible everywhere at the Superalgos Desktop App.
It provides access to all modules built for this App.
*/
global.DK = {}
/*
The SA object is accesible everywhere at the Superalgos Desktop App.
The SA object is accessible everywhere at the Superalgos Desktop App.
It provides access to all modules built for Superalgos in general.
*/
global.SA = {}
+10 -10
View File
@@ -34,7 +34,7 @@
if (eventHandler === undefined) {
/*
We will only create event handlers which were not created before. Remember that someone trying to listen events
at an event handler that does not exist, will create that eventhandler, so it is possible that the emitter
at an event handler that does not exist, will create that event handler, so it is possible that the emitter
when trying to create the event handler in fact was late and the event handler is already there if the listener
arrived here first. An event handler created with this method is not destroyed if there are no listeners or they
all leave.
@@ -50,8 +50,8 @@
let eventHandler = eventHandlers.get(command.eventHandlerName)
if (eventHandler !== undefined) {
/*
We will only delete event handlers which have noone listening, allowing a listener to continue listening even
when the event emitter is gone, asuming that it could come back at some point in time and resume emitting.
We will only delete event handlers which have no one listening, allowing a listener to continue listening even
when the event emitter is gone, assuming that it could come back at some point in time and resume emitting.
*/
if (eventHandler.listeners.length === 0) {
eventHandlers.delete(command.eventHandlerName)
@@ -68,8 +68,8 @@
if (eventHandler === undefined) {
/*
We will create event handlers which were not created before if a listener tries to listen to a handler that does not
exist before the emitter comes and create it. This is to aviod syncronization problems and also problems with emitters life
cycles with higher frecuency that the ones of listeners. Created in this way, event handlers are marked for deletion if
exist before the emitter comes and create it. This is to avoid synchronization problems and also problems with emitters life
cycles with higher frequency that the ones of listeners. Created in this way, event handlers are marked for deletion if
all listeners stop listening at one point in time.
*/
eventHandler = newEventHandler()
@@ -104,7 +104,7 @@
if (eventHandler === undefined) {
/* If the event handler does not exist anymore, then there is no need to perform further actiions. */
/* If the event handler does not exist anymore, then there is no need to perform further actions. */
sendResponse(global.DEFAULT_OK_RESPONSE)
return
}
@@ -112,7 +112,7 @@
eventHandler.stopListening(command.eventHandlerName, command.eventType, command.callerId, command.eventSubscriptionId)
/*
We check here if there are no more listeners and the event handler original emmiter is also gone, then we need to delete
We check here if there are no more listeners and the event handler original emitter is also gone, then we need to delete
this event handlers since chances are that is not needed anymore.
*/
if (eventHandler.listeners.length === 0 && eventHandler.deleteWhenAllListenersAreGone === true) {
@@ -130,7 +130,7 @@
eventHandler = newEventHandler()
eventHandlers.set(command.eventHandlerName, eventHandler)
/* No matter if it is the listener or the emiter the one that acts first, if an event handler does not exist we just create it acan keep it there. */
/* No matter if it is the listener or the emitter the one that acts first, if an event handler does not exist we just create it and keep it there. */
}
//console.log("[INFO] Client -> Events Server -> Raising Event " + command.eventHandlerName + " " + command.eventType)
@@ -163,7 +163,7 @@
let thisObject = {
name: undefined, // This is for debugging purposes only.
deleteWhenAllListenersAreGone: false,
listeners: [], // Here we store all the functions we will call when an event is raiseed.
listeners: [], // Here we store all the functions we will call when an event is raised.
listenToEvent: listenToEvent,
stopListening: stopListening,
raiseEvent: raiseEvent,
@@ -181,7 +181,7 @@
/*
We can not allow to have the exact same listener more than once. In case that we find a listener trying to listen again, the first record will
be deleted and we are just going to consider the last one comming in.
be deleted and we are just going to consider the last one coming in.
*/
for (let i = 0; i < thisObject.listeners.length; i++) {
if (eventHandlerName === thisObject.listeners[i][0] && eventType === thisObject.listeners[i][1] && callerId === thisObject.listeners[i][2]) {
+6 -5
View File
@@ -316,7 +316,7 @@ exports.newGithubServer = function newGithubServer() {
owner: owner,
repo: repo,
issue_number: pullRequest.number,
body: 'This Pull Request was automatically merged by the Superalgos Governance System because it was detected that the Github User " ' + githubUsername + '" who submitted it, modified its own User Profile Plugin File and nothning else but that file. All validations were successfull.'
body: 'This Pull Request was automatically merged by the Superalgos Governance System because it was detected that the Github User " ' + githubUsername + '" who submitted it, modified its own User Profile Plugin File and nothing else but that file. All validations were successful.'
});
}
@@ -378,7 +378,7 @@ exports.newGithubServer = function newGithubServer() {
fileName = splittedFileName[0]
githubUsername = pullRequest.user.login
if (githubUsername !== fileName) {
if (githubUsername.toLowerCase() !== fileName.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #2 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the File Name. -> Github Username = ' + githubUsername + '-> fileName = ' + fileName)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -420,7 +420,7 @@ exports.newGithubServer = function newGithubServer() {
*/
let config = JSON.parse(userProfile.config)
let messageSigned = config.signature.message
if (messageSigned !== githubUsername) {
if (messageSigned.toLowerCase() !== githubUsername.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #4 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the Message Signed at the User Profile. -> Github Username = ' + githubUsername + '-> messageSigned = ' + messageSigned)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -480,7 +480,7 @@ exports.newGithubServer = function newGithubServer() {
/*
Validation #6: The name of the User Profile node is not the Github Username.
*/
if (userProfile.name !== githubUsername) {
if (userProfile.name.toLowerCase() !== githubUsername.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #6 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the User Profile node\'s name. -> Github Username = ' + githubUsername + '-> userProfile.name = ' + userProfile.name)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -628,7 +628,7 @@ exports.newGithubServer = function newGithubServer() {
*/
let messageSigned = config.signature.message
if (messageSigned !== githubUsername) {
if (messageSigned.toLowerCase() !== githubUsername.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #9 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Signing Account ' + signingAccount.name + ' has not signed the current Github User Account, but something else. -> messageSigned = ' + messageSigned + '-> githubUsername = ' + githubUsername)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -775,6 +775,7 @@ exports.newGithubServer = function newGithubServer() {
}
} catch (err) {
if (err === undefined) { return }
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> err.stack = ' + err.stack)
}
}
+1 -1
View File
@@ -723,7 +723,7 @@ exports.newHttpInterface = function newHttpInterface() {
console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> contributionsBranch = ' + contributionsBranch)
console.log('')
console.log('Torubleshooting Tips:')
console.log('Troubleshooting Tips:')
console.log('')
console.log('1. Make sure that you have set up your Github Username and Token at the APIs -> Github API node at the workspace.')
console.log('2. Make sure you are running the latest version of Git available for your OS.')
+2 -2
View File
@@ -149,12 +149,12 @@ function newAnimation() {
}
}
/* We request the next frame to be drawn, and stablishing a loop */
/* We request the next frame to be drawn, and establish a loop */
/* Use this code for full animation speed. */
animationLoopHandle = window.requestAnimationFrame(animationLoop)
/* Use this code for max 10 frames per second animation speed, if the app is consumming too much of your CPU. */
/* Use this code for max 10 frames per second animation speed, if the app is consuming too much of your CPU. */
/*
setTimeout(nextLoop, 100)
function nextLoop () {
+2 -2
View File
@@ -47,7 +47,7 @@ function loadSuperalgos() {
loadDebugModule()
if ((browser.name !== "Chrome" && browser.name!=="Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) {
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version)
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionality issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version)
}
function checkBrowserVersion () {
@@ -131,7 +131,7 @@ function loadSuperalgos() {
}
}
/* And Finally, we start loading all the scripts we will inmediatelly need. */
/* And Finally, we start loading all the scripts we will immediately need. */
function loadModules() {
let path = "AppLoader.js"
REQUIREJS([path], onRequired)
+12 -12
View File
@@ -172,7 +172,7 @@ function newCanvas() {
spaceDefinitionDrawMap.set(spaceDefinition.animationDrawIndex, spaceDefinition)
}
/* Build the maps that defines the secuence of execution of different events. */
/* Build the maps that defines the sequence of execution of different events. */
if (spaceDefinition.onMouseWheelIndex !== undefined) {
projectInstance.events.onMouseWheelMap.set(spaceDefinition.onMouseWheelIndex, spaceInstance)
}
@@ -373,7 +373,7 @@ function newCanvas() {
if (EDITOR_ON_FOCUS === true) {
/*
We will fordward the event to whoever is
We will forward the event to whoever is
controlling the editor.
*/
if (window.editorController !== undefined) {
@@ -650,7 +650,7 @@ function newCanvas() {
if ((event.ctrlKey === true || event.metaKey === true) && event.altKey === true) {
/* Shortcuts to nodes */
if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 65 && event.keyCode <= 90)) {
/* From here we prevent the default behaviour. Putting it earlier prevents imput box and text area to receive keystrokes */
/* From here we prevent the default behaviour. Putting it earlier prevents input box and text area to receive keystrokes */
event.preventDefault()
let nodeUsingThisKey = await UI.projects.foundations.spaces.designSpace.workspace.getNodeByShortcutKey(event.key)
@@ -771,11 +771,11 @@ function newCanvas() {
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
@@ -881,11 +881,11 @@ function newCanvas() {
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
@@ -992,18 +992,18 @@ function newCanvas() {
return
}
/* Then we check who is the current object underneeth the mounse. */
/* Then we check who is the current object underneath the mouse. */
let container
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
@@ -1063,11 +1063,11 @@ function newCanvas() {
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
+3 -3
View File
@@ -77,7 +77,7 @@ function newFileCloud () {
}
if (fileName === undefined) {
logger.write('[ERROR] getFile -> getFileRecursively -> Inconsistant data. Check the following: ')
logger.write('[ERROR] getFile -> getFileRecursively -> Inconsistent data. Check the following: ')
logger.write('[ERROR] getFile -> getFileRecursively -> pMine = ' + JSON.stringify(pMine))
logger.write('[ERROR] getFile -> getFileRecursively -> pBot = ' + JSON.stringify(pBot))
logger.write('[ERROR] getFile -> getFileRecursively -> pDataset = ' + JSON.stringify(pDataset))
@@ -85,7 +85,7 @@ function newFileCloud () {
logger.write('[ERROR] getFile -> getFileRecursively -> pMarket = ' + JSON.stringify(pMarket))
logger.write('[ERROR] getFile -> getFileRecursively -> ptimeFrameLabel = ' + JSON.stringify(ptimeFrameLabel))
throw ('Inconsistant data received.')
throw ('Inconsistent data received.')
}
if (pMarket !== undefined) {
@@ -152,7 +152,7 @@ function newFileCloud () {
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> filePath = ' + filePath) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> fileName = ' + fileName) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> Unexpected Error Ocurred.') }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> Unexpected Error Occurred.') }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> err = ' + err.stack) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> text = ' + text) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> response = ' + response) }
+2 -2
View File
@@ -195,7 +195,7 @@ function newFileCursor() {
/*
We are implementing here an algorithm designed to save bandwidth, memory and processing power at the browser.
We say there is a saving mode where the cursor is running at a minimum size. When the end user aproaches the time period the cursor
We say there is a saving mode where the cursor is running at a minimum size. When the end user approaches the time period the cursor
is set, then it should exit the saving mode and go to its actual size.
To do this we are going to measure the distance from the Time Frame received to the one the cursors was initialized with.
@@ -427,7 +427,7 @@ function newFileCursor() {
let targetDate = new Date(cursorDate)
targetDate.setUTCDate(targetDate.getUTCDate() + j)
/* Small algorith to allow load first the current date, then alternate between the most forwad and the most backwards ones. */
/* Small algorithm to allow load first the current date, then alternate between the most forward and the most backwards ones. */
if (j === 0) { j++ } else {
if (j < 0) {
j = -j
+2 -2
View File
@@ -45,7 +45,7 @@ function newFileStorage(host, port, scheme='http') {
url = folder + filePath
}
/* Scaping # since it breaks the URL */
/* Escaping # since it breaks the URL */
url = url.replaceAll('#', '_HASHTAG_')
httpRequest(undefined, url, (response, fileContent) => {
@@ -64,7 +64,7 @@ function newFileStorage(host, port, scheme='http') {
let err = { code: 'The specified key does not exist.' }
callBackFunction(err)
} else {
console.log('Error geting the file from the serever:', err)
console.log('Error getting the file from the server:', err)
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ function newEventHandler() {
finalize: finalize
}
let eventHandlers = [] // Here we store all the functions we will call when an event is raiseed.
let eventHandlers = [] // Here we store all the functions we will call when an event is raised.
return thisObject
+2 -2
View File
@@ -225,7 +225,7 @@ function newEventsServerClient(lanNetworkNode) {
port = config.webSocketsPort
extwsurl = config.webSocketsExternalURL
/* Check if we really have to stablish the connection. */
/* Check if we really have to establish the connection. */
if (config.autoConnect === false) { return }
} catch (err) {
lanNetworkNode.payload.uiObject.setErrorMessage(
@@ -285,7 +285,7 @@ function newEventsServerClient(lanNetworkNode) {
}
}
WEB_SOCKETS_CONNECTION.onmessage = e => {
// console.log('Websoked Message Received: ' + e.data)
// console.log('WEB_SOCKET Message Received: ' + e.data)
let message = JSON.parse(e.data)
+2 -1
View File
@@ -888,7 +888,8 @@
#governance-tab13:checked ~ .governance-search-result-content #content13,
#governance-tab14:checked ~ .governance-search-result-content #content14,
#governance-tab15:checked ~ .governance-search-result-content #content15,
#governance-tab16:checked ~ .governance-search-result-content #content16 {
#governance-tab16:checked ~ .governance-search-result-content #content16,
#governance-tab17:checked ~ .governance-search-result-content #content17 {
display: block;
}
@@ -228,7 +228,7 @@
logError('key.length:' + exchangeApiKey.config.codeName.length)
logError('secret.length:' + exchangeApiKey.config.secret.length)
logError('Double check that you copied the key at the codeName property and the secret at secret property without bringing any invisible caracter from the exchange web site, or leaving any character from the sample text. Also check that the keys are not disabled at the exchange ot that they are not restricted by IP.')
logError('As a remainder. Binance key and secret are 64 bytes in lenght each one. ')
logError('As a remainder. Binance key and secret are 64 bytes in length each one. ')
}
}
}
@@ -290,7 +290,7 @@
}
}
catch (err) {
/* An unhandled exception occured. in this case we return Fail and log the stack. */
/* An unhandled exception occurred. in this case we return Fail and log the stack. */
if (err.stack) {
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -307,7 +307,7 @@
return
}
/* Some other handled exception occured. We return Fail and move on. */
/* Some other handled exception occurred. We return Fail and move on. */
if (err.result !== TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -1 +1 @@
{"type":"Data Mine","name":"Alpha","config":"{ \n\"codeName\": \"Alpha\"\n}","project":"Foundations","sensorBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Average True Range (ATR)","config":"{\n\"codeName\": \"ATR\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates RSI.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market ATR - SMA","project":"Foundations","id":"5cdfa018-5ade-469b-90bf-cc523ef0a46e","savedPayload":{"position":{"x":14824.467185363952,"y":17153.56240800229},"targetPosition":{"x":15051.32778510527,"y":17433.553422503435},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2570d2c7-72e3-4131-97dc-a9f97f493e93"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market ATR - RMA","project":"Foundations","id":"e7e58e02-fef8-4400-9928-f29805a96f98","savedPayload":{"position":{"x":14995.21249473741,"y":17077.69824065427},"targetPosition":{"x":15051.32778510527,"y":17433.553422503435},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"67695466-be2d-43b4-9824-83baa7a08412"}}}],"outputDatasetFolders":[],"id":"b345304f-fbb3-4889-934a-8f9b4941ed29","savedPayload":{"position":{"x":15027.5645769923,"y":17379.910551027475},"targetPosition":{"x":15182.942695423619,"y":17728.650277388508},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\"mainUtility\": \"Market Ending Point\"}","project":"Foundations","id":"eb499527-0f18-45f9-99ab-a7bc7fabb3aa","savedPayload":{"position":{"x":15005.836154077664,"y":17146.468954298347},"targetPosition":{"x":15216.865516382564,"y":17407.20361136918},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Average True Range (ATR) Multi-Time-Frame-Market","config":"{\"mainUtility\": \"Self Reference\"}","project":"Foundations","id":"025a6f70-c187-4b4d-aa62-6f4ebfc116ba","savedPayload":{"position":{"x":15251.795115631983,"y":17073.59332967888},"targetPosition":{"x":15216.865516382564,"y":17407.20361136918},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"8a6c8b1e-950d-4819-88a9-9c45272a0799"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"f25ba171-3c78-4e4f-acb8-66446be1ce0a","savedPayload":{"position":{"x":15480.231901478768,"y":17193.677641293492},"targetPosition":{"x":15216.865516382564,"y":17407.20361136918},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"bf337039-bd28-4f50-89d1-5115e631e6cf","savedPayload":{"position":{"x":15223.760246305472,"y":17340.44129825625},"targetPosition":{"x":15182.942695423619,"y":17728.650277388508},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"8a6c8b1e-950d-4819-88a9-9c45272a0799","savedPayload":{"position":{"x":15405.437118264057,"y":17422.346390022496},"targetPosition":{"x":15182.942695423619,"y":17728.650277388508},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEventLine truncated
{"type":"Data Mine","name":"Alpha","config":"{ \n\"codeName\": \"Alpha\"\n}","project":"Foundations","sensorBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Average True Range (ATR)","config":"{\n\"codeName\": \"ATR\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates RSI.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market ATR - SMA","project":"Foundations","id":"5cdfa018-5ade-469b-90bf-cc523ef0a46e","savedPayload":{"position":{"x":14824.467185363952,"y":17153.56240800229},"targetPosition":{"x":15051.32778510527,"y":17433.553422503435},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2570d2c7-72e3-4131-97dc-a9f97f493e93"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market ATR - RMA","project":"Foundations","id":"e7e58e02-fef8-4400-9928-f29805a96f98","savedPayload":{"position":{"x":14995.21249473741,"y":17077.69824065427},"targetPosition":{"x":15051.32778510527,"y":17433.553422503435},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"67695466-be2d-43b4-9824-83baa7a08412"}}}],"outputDatasetFolders":[],"id":"b345304f-fbb3-4889-934a-8f9b4941ed29","savedPayload":{"position":{"x":15027.5645769923,"y":17379.910551027475},"targetPosition":{"x":15182.942695423619,"y":17728.650277388508},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\"mainUtility\": \"Market Ending Point\"}","project":"Foundations","id":"eb499527-0f18-45f9-99ab-a7bc7fabb3aa","savedPayload":{"position":{"x":15005.836154077664,"y":17146.468954298347},"targetPosition":{"x":15216.865516382564,"y":17407.20361136918},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Average True Range (ATR) Multi-Time-Frame-Market","config":"{\"mainUtility\": \"Self Reference\"}","project":"Foundations","id":"025a6f70-c187-4b4d-aa62-6f4ebfc116ba","savedPayload":{"position":{"x":15251.795115631983,"y":17073.59332967888},"targetPosition":{"x":15216.865516382564,"y":17407.20361136918},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"8a6c8b1e-950d-4819-88a9-9c45272a0799"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"f25ba171-3c78-4e4f-acb8-66446be1ce0a","savedPayload":{"position":{"x":15480.231901478768,"y":17193.677641293492},"targetPosition":{"x":15216.865516382564,"y":17407.20361136918},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"bf337039-bd28-4f50-89d1-5115e631e6cf","savedPayload":{"position":{"x":15223.760246305472,"y":17340.44129825625},"targetPosition":{"x":15182.942695423619,"y":17728.650277388508},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Foundations","id":"8a6c8b1e-950d-4819-88a9-9c45272a0799","savedPayload":{"position":{"x":15405.437118264057,"y":17422.346390022496},"targetPosition":{"x":15182.942695423619,"y":17728.650277388508},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"executionStartedEventLine truncated
@@ -7963,7 +7963,7 @@
"project": "Foundations",
"plotterModuleJavascriptCode": {
"type": "Plotter Module Javascript Code",
"code": "/* Definition of the points we are going to use while drawing */\nlet point1\nlet point2\nlet point3\nlet point4\n\npoint1 = {\n x: record.begin,\n y: record.firstMovingAverage - record.firstDeviation\n}\n\npoint2 = {\n x: record.end,\n y: record.lastMovingAverage - record.lastDeviation\n}\n\npoint3 = {\n x: record.end,\n y: record.lastMovingAverage + record.lastDeviation\n}\n\npoint4 = {\n x: record.begin,\n y: record.firstMovingAverage + record.firstDeviation\n}\n\n/* Contributing to Auto-Scale*/\ncoordinateSystem.reportYValue(record.firstMovingAverage - record.firstDeviation)\ncoordinateSystem.reportYValue(record.lastMovingAverage - record.lastDeviation)\ncoordinateSystem.reportYValue(record.lastMovingAverage + record.lastDeviation)\ncoordinateSystem.reportYValue(record.firstMovingAverage + record.firstDeviation)\n\n/*\nThe information we store in files is independent from the charing system and its coordinate systems.\nThat means that the first thing we allways need to do is to trasform these points to the coordinate system of the timeline.\n*/\npoint1 = coordinateSystem.transformThisPoint(point1)\npoint2 = coordinateSystem.transformThisPoint(point2)\npoint3 = coordinateSystem.transformThisPoint(point3)\npoint4 = coordinateSystem.transformThisPoint(point4)\n\n/*\nThe browser canvas object does not care about our timeline and its coordinate system. In order to draw on a html canvas we\nneed the points to be converted into the canvas coordinate system.\nNext we transform again to the screen coordinate system.\n*/\npoint1 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)\npoint2 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)\npoint3 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)\npoint4 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)\n\n/* We make sure the points do not fall outside the UI.projects.foundations.spaces.chartingSpace.viewport visible area. This step allways need to be done. */\npoint1 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point1)\npoint2 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point2)\npoint3 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point3)\npoint4 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point4)\n\npoint1 = thisObject.fitFunction(point1);\npoint2 = thisObject.fitFunction(point2);\npoint3 = thisObject.fitFunction(point3);\npoint4 = thisObject.fitFunction(point4);\n\n/*\nNow that we have our 4 points as coordinates of the actual screen (or html canvas object), we can actaully start drawing.\nFirst we are going to draw the shape backgound.\n*/\nbrowserCanvasContext.beginPath()\n\nbrowserCanvasContext.moveTo(point1.x, point1.y)\nbrowserCanvasContext.lineTo(point2.x, point2.y)\nbrowserCanvasContext.lineTo(point3.x, point3.y)\nbrowserCanvasContext.lineTo(point4.x, point4.y)\n\nbrowserCanvasContext.closePath()\n\nlet opacity = '0.25' // The backgound will be quite transparent. Possible values goes from 0..1\n\n/* Depending on the direction of the channel, we use a different color for the border lines. */\nif (record.direction === 'Side') { browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.DARK + ', ' + opacity + ')' }\nif (record.direction === 'Up') { browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')' }\nif (record.direction === 'Down') { browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')' }\n\nswitch (record.slope) {\n case 'Side': {\n opacity = '0.1';\n break;\n }\n case 'Gentle': {\n opacity = '0.1';\n break;\n }\n case 'Medium': {\n opacity = '0.15';\n break;\n }\n case 'Steep': {\n opacity = '0.2';\n break;\n }\n case 'Extreme': {\n opacity = '0.25';\n break;\n }\n}\n\n/* Depending on the direction of the channel, we use a different color for the background. */\nif (record.direction === 'Side' || record.slope === 'Side') { browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.LIGHT + ', ' + opacity + ')'; }\nif (record.direction === 'Up') { browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', ' + opacity + ')' }\nif (record.direction === 'Down') { browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')' }\n\n/* If the mouse is positioned in betwheen the begining and ending of our object, we can opt for changing the color of that specific object. */\nif (atMousePosition) {\n browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.1)'\n}\n\nbrowserCanvasContext.fill() // This is what actually apply the previous instrucLine truncated
"code": "/* Definition of the points we are going to use while drawing */\nlet point1\nlet point2\nlet point3\nlet point4\n\npoint1 = {\n x: record.begin,\n y: record.firstMovingAverage - record.firstDeviation\n}\n\npoint2 = {\n x: record.end,\n y: record.lastMovingAverage - record.lastDeviation\n}\n\npoint3 = {\n x: record.end,\n y: record.lastMovingAverage + record.lastDeviation\n}\n\npoint4 = {\n x: record.begin,\n y: record.firstMovingAverage + record.firstDeviation\n}\n\n/* Contributing to Auto-Scale*/\ncoordinateSystem.reportYValue(record.firstMovingAverage - record.firstDeviation)\ncoordinateSystem.reportYValue(record.lastMovingAverage - record.lastDeviation)\ncoordinateSystem.reportYValue(record.lastMovingAverage + record.lastDeviation)\ncoordinateSystem.reportYValue(record.firstMovingAverage + record.firstDeviation)\n\n/*\nThe information we store in files is independent from the sharing system and its coordinate systems.\nThat means that the first thing we always need to do is to trasform these points to the coordinate system of the timeline.\n*/\npoint1 = coordinateSystem.transformThisPoint(point1)\npoint2 = coordinateSystem.transformThisPoint(point2)\npoint3 = coordinateSystem.transformThisPoint(point3)\npoint4 = coordinateSystem.transformThisPoint(point4)\n\n/*\nThe browser canvas object does not care about our timeline and its coordinate system. In order to draw on a html canvas we\nneed the points to be converted into the canvas coordinate system.\nNext we transform again to the screen coordinate system.\n*/\npoint1 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point1, thisObject.container)\npoint2 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point2, thisObject.container)\npoint3 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point3, thisObject.container)\npoint4 = UI.projects.foundations.utilities.coordinateTransformations.transformThisPoint(point4, thisObject.container)\n\n/* We make sure the points do not fall outside the UI.projects.foundations.spaces.chartingSpace.viewport visible area. This step allways need to be done. */\npoint1 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point1)\npoint2 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point2)\npoint3 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point3)\npoint4 = UI.projects.foundations.spaces.chartingSpace.viewport.fitIntoVisibleArea(point4)\n\npoint1 = thisObject.fitFunction(point1);\npoint2 = thisObject.fitFunction(point2);\npoint3 = thisObject.fitFunction(point3);\npoint4 = thisObject.fitFunction(point4);\n\n/*\nNow that we have our 4 points as coordinates of the actual screen (or html canvas object), we can actually start drawing.\nFirst we are going to draw the shape background.\n*/\nbrowserCanvasContext.beginPath()\n\nbrowserCanvasContext.moveTo(point1.x, point1.y)\nbrowserCanvasContext.lineTo(point2.x, point2.y)\nbrowserCanvasContext.lineTo(point3.x, point3.y)\nbrowserCanvasContext.lineTo(point4.x, point4.y)\n\nbrowserCanvasContext.closePath()\n\nlet opacity = '0.25' // The backgound will be quite transparent. Possible values goes from 0..1\n\n/* Depending on the direction of the channel, we use a different color for the border lines. */\nif (record.direction === 'Side') { browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.DARK + ', ' + opacity + ')' }\nif (record.direction === 'Up') { browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.PATINATED_TURQUOISE + ', ' + opacity + ')' }\nif (record.direction === 'Down') { browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RED + ', ' + opacity + ')' }\n\nswitch (record.slope) {\n case 'Side': {\n opacity = '0.1';\n break;\n }\n case 'Gentle': {\n opacity = '0.1';\n break;\n }\n case 'Medium': {\n opacity = '0.15';\n break;\n }\n case 'Steep': {\n opacity = '0.2';\n break;\n }\n case 'Extreme': {\n opacity = '0.25';\n break;\n }\n}\n\n/* Depending on the direction of the channel, we use a different color for the background. */\nif (record.direction === 'Side' || record.slope === 'Side') { browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.LIGHT + ', ' + opacity + ')'; }\nif (record.direction === 'Up') { browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', ' + opacity + ')' }\nif (record.direction === 'Down') { browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + opacity + ')' }\n\n/* If the mouse is positioned in between the beginning and ending of our object, we can opt for changing the color of that specific object. */\nif (atMousePosition) {\n browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.1)'\n}\n\nbrowserCanvasContext.fill() // This is what actually apply the previous instrucLine truncated
"project": "Foundations",
"id": "63406674-a797-430a-96c7-e5bcacb286bc",
"savedPayload": {
@@ -1 +1 @@
{"type":"Data Mine","name":"Buddha","config":"{ \n\"codeName\": \"Buddha\"\n}","project":"Foundations","sensorBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Candle Patterns","config":"{\n\"codeName\": \"Candle-Patterns\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates Candles Patterns for Time Frames of 01-hs and above.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market Basic Candles","project":"Foundations","id":"3e933426-1c7b-45e1-845f-08a7d2684620","savedPayload":{"position":{"x":3129.041401383918,"y":17452.35686716615},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"07be5b9b-e8fd-49fc-ab77-20f89fdea10f"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market One-Candle Patterns","project":"Foundations","id":"201dc796-db42-49ce-8b9c-1b26c0f3a0ce","savedPayload":{"position":{"x":3169.134883158589,"y":17383.139478265486},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"144d8665-1ff0-4db3-9340-a33fd7d0d098"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market Two-Candles Patterns","project":"Foundations","id":"c20616cc-d93f-40fc-904a-025fc2799a75","savedPayload":{"position":{"x":3229.9770922491734,"y":17339.671801899964},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"8c35ce52-9dee-4d20-92e6-50ba7fd2882b"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market Three-Candles Patterns","project":"Foundations","id":"c8074ffc-f5ff-4cb5-8e83-0adcecc82a0c","savedPayload":{"position":{"x":3326.830605382722,"y":17343.877223597563},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"087fc67e-78f9-4204-ba5e-8b670566a716"}}}],"outputDatasetFolders":[],"id":"0dc09316-0987-4d22-b600-bd3868942026","savedPayload":{"position":{"x":3328.835973695903,"y":17542.236357748305},"targetPosition":{"x":3543.032821461693,"y":17856.18635281792},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candle Patterns Multi-Time-Frame-Market","config":"{\"mainUtility\": \"Self Reference\"}","project":"Foundations","id":"2d079388-93e4-4005-b392-c4a997904ccb","savedPayload":{"position":{"x":3351.5917081132684,"y":17243.24971495471},"targetPosition":{"x":3509.228632498114,"y":17403.518467361682},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"401fbf30-8faa-40e9-9707-fac2d35f6195"}}},{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{ \n\"mainUtility\": \"Market Starting Point\"\n}","project":"Foundations","id":"418e1725-b690-4a55-b5f7-a4a92465c162","savedPayload":{"position":{"x":3493.451892335186,"y":17189.127853558104},"targetPosition":{"x":3509.228632498114,"y":17403.518467361682},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"85c548fd-9ef7-4936-a86d-2a206cf90039","savedPayload":{"position":{"x":3649.480915739696,"yLine truncated
{"type":"Data Mine","name":"Buddha","config":"{ \n\"codeName\": \"Buddha\"\n}","project":"Foundations","sensorBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Candle Patterns","config":"{\n\"codeName\": \"Candle-Patterns\"\n}","project":"Foundations","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Calculates Candles Patterns for Time Frames of 01-hs and above.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Foundations","processOutput":{"type":"Process Output","name":"New Process Output","project":"Foundations","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market Basic Candles","project":"Foundations","id":"3e933426-1c7b-45e1-845f-08a7d2684620","savedPayload":{"position":{"x":3129.041401383918,"y":17452.35686716615},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"07be5b9b-e8fd-49fc-ab77-20f89fdea10f"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market One-Candle Patterns","project":"Foundations","id":"201dc796-db42-49ce-8b9c-1b26c0f3a0ce","savedPayload":{"position":{"x":3169.134883158589,"y":17383.139478265486},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"144d8665-1ff0-4db3-9340-a33fd7d0d098"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market Two-Candles Patterns","project":"Foundations","id":"c20616cc-d93f-40fc-904a-025fc2799a75","savedPayload":{"position":{"x":3229.9770922491734,"y":17339.671801899964},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"8c35ce52-9dee-4d20-92e6-50ba7fd2882b"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market Three-Candles Patterns","project":"Foundations","id":"c8074ffc-f5ff-4cb5-8e83-0adcecc82a0c","savedPayload":{"position":{"x":3326.830605382722,"y":17343.877223597563},"targetPosition":{"x":3328.835973695903,"y":17542.236357748305},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"087fc67e-78f9-4204-ba5e-8b670566a716"}}}],"outputDatasetFolders":[],"id":"0dc09316-0987-4d22-b600-bd3868942026","savedPayload":{"position":{"x":3328.835973695903,"y":17542.236357748305},"targetPosition":{"x":3543.032821461693,"y":17856.18635281792},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Foundations","statusDependencies":[{"type":"Status Dependency","name":"Candle Patterns Multi-Time-Frame-Market","config":"{\"mainUtility\": \"Self Reference\"}","project":"Foundations","id":"2d079388-93e4-4005-b392-c4a997904ccb","savedPayload":{"position":{"x":3351.5917081132684,"y":17243.24971495471},"targetPosition":{"x":3509.228632498114,"y":17403.518467361682},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"401fbf30-8faa-40e9-9707-fac2d35f6195"}}},{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{ \n\"mainUtility\": \"Market Starting Point\"\n}","project":"Foundations","id":"418e1725-b690-4a55-b5f7-a4a92465c162","savedPayload":{"position":{"x":3493.451892335186,"y":17189.127853558104},"targetPosition":{"x":3509.228632498114,"y":17403.518467361682},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Foundations","id":"85c548fd-9ef7-4936-a86d-2a206cf90039","savedPayload":{"position":{"x":3649.480915739696,"yLine truncated
@@ -13,7 +13,7 @@
{
"type": "Process Definition",
"name": "Historic-OHLCVs",
"config": "{\n \"codeName\": \"Historic-OHLCVs\",\n \"description\": \"Retrieves and saves historical maket data\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 60000,\n \"retryWaitTime\": 10000,\n \"botModule\": \"Exchange Raw Data Historic OHLCVs\"\n}",
"config": "{\n \"codeName\": \"Historic-OHLCVs\",\n \"description\": \"Retrieves and saves historical market data\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 60000,\n \"retryWaitTime\": 10000,\n \"botModule\": \"Exchange Raw Data Historic OHLCVs\"\n}",
"project": "Foundations",
"processOutput": {
"type": "Process Output",
@@ -1213,7 +1213,7 @@
"project": "Foundations",
"procedureJavascriptCode": {
"type": "Procedure Javascript Code",
"code": "/* Loop Code */\n\n/* \nCalculation method credit: https://www.macroption.com/rsi-calculation/\n*/\n\n/* Calculating Up Moves and Down Moves */\n\n//let candle = record.current // Our main dependencies are candles \n//let candlePrevious = record.previous\n\nif (record.previous !== undefined) {\n if (record.current.close > record.previous.close) {\n variable.last14U.push(record.current.close - record.previous.close) // Add win to last 14 array.\n } else {\n variable.last14U.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (record.current.close < record.previous.close) {\n variable.last14D.push(record.previous.close - record.current.close) // Add win to last 14 array.\n } else {\n variable.last14D.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n /* Calculating Averages of Up Moves and Down Moves */\n\n variable.avgU = calculateRMAU(14)\n variable.avgD = calculateRMAD(14)\n\n /* Keep track of average moves */\n variable.rma14U.push(variable.avgU)\n variable.rma14D.push(variable.avgD)\n \n if (variable.rma14U.length > 14) {\n variable.rma14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.rma14D.length > 14) {\n variable.rma14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n /* Calculating Relative Strength */\n \n if (variable.avgD > 0) {\n relativeStrength = variable.avgU / variable.avgD\n } else {\n relativeStrength = 0\n }\n\n /* Calculating RSI */\n\n relativeStrengthIndex = 100 - 100 / ( 1 + relativeStrength)\n\n if (relativeStrengthIndex !== undefined) {\n variable.value = relativeStrengthIndex.toFixed(2)\n } else {\n variable.value = 0\n }\n} else {\n variable.value = 0\n}\n\n// Statistics\n\nfunction calculateWMA(source, rmas, periods) { // Having a function avoids us to repeat code.\n /* We check we have enough values to make the calculation */\n if (source.length < periods) { return 0 } // If we dont, we define the value is zero.\n\n let alpha = 1 / periods\n let avg = source[source.length - 1] * alpha + rmas[rmas.length - 1] * (1 - alpha)\n return avg;\n}\n\nfunction calculateRMAU(periods) {\n return calculateWMA(variable.last14U, variable.rma14U, periods)\n}\n\nfunction calculateRMAD(periods) {\n return calculateWMA(variable.last14D, variable.rma14D, periods)\n}",
"code": "/* Loop Code */\n\n/* \nCalculation method credit: https://www.macroption.com/rsi-calculation/\n*/\n\n/* Calculating Up Moves and Down Moves */\n\n//let candle = record.current // Our main dependencies are candles \n//let candlePrevious = record.previous\n\nif (record.previous !== undefined) {\n if (record.current.close > record.previous.close) {\n variable.last14U.push(record.current.close - record.previous.close) // Add win to last 14 array.\n } else {\n variable.last14U.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (record.current.close < record.previous.close) {\n variable.last14D.push(record.previous.close - record.current.close) // Add win to last 14 array.\n } else {\n variable.last14D.push(0) // Add 0 to keep proper count of records in the last 14 array.\n }\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximum of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n /* Calculating Averages of Up Moves and Down Moves */\n\n variable.avgU = calculateRMAU(14)\n variable.avgD = calculateRMAD(14)\n\n /* Keep track of average moves */\n variable.rma14U.push(variable.avgU)\n variable.rma14D.push(variable.avgD)\n \n if (variable.rma14U.length > 14) {\n variable.rma14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.rma14D.length > 14) {\n variable.rma14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n /* Calculating Relative Strength */\n \n if (variable.avgD > 0) {\n relativeStrength = variable.avgU / variable.avgD\n } else {\n relativeStrength = 0\n }\n\n /* Calculating RSI */\n\n relativeStrengthIndex = 100 - 100 / ( 1 + relativeStrength)\n\n if (relativeStrengthIndex !== undefined) {\n variable.value = relativeStrengthIndex.toFixed(2)\n } else {\n variable.value = 0\n }\n} else {\n variable.value = 0\n}\n\n// Statistics\n\nfunction calculateWMA(source, rmas, periods) { // Having a function avoids us to repeat code.\n /* We check we have enough values to make the calculation */\n if (source.length < periods) { return 0 } // If we dont, we define the value is zero.\n\n let alpha = 1 / periods\n let avg = source[source.length - 1] * alpha + rmas[rmas.length - 1] * (1 - alpha)\n return avg;\n}\n\nfunction calculateRMAU(periods) {\n return calculateWMA(variable.last14U, variable.rma14U, periods)\n}\n\nfunction calculateRMAD(periods) {\n return calculateWMA(variable.last14D, variable.rma14D, periods)\n}",
"project": "Foundations",
"id": "91eb76f0-617c-4397-9135-beca294a6481",
"savedPayload": {
@@ -2734,7 +2734,7 @@
"procedureJavascriptCode": {
"type": "Procedure Javascript Code",
"name": "New Procedure Javascript Code",
"code": "/* Loop Code */\nlet candle = record.current // This is the primary dependency\nlet volume = getElement('volumes', candle) // Here I get the volume bar corresponding to the current candle\nlet totalVolume = volume.buy + volume.sell // Candles Volumes split the volume received from the exchange evenly betwen buy and sell because it does not know how much of it there is.\n\nlet hlc3 = (candle.max + candle.min + candle.close) / 3\nlet lastHlc3 = variable.lastHlc3\n\nif (record.previous !== undefined) {\n\n let change = hlc3 - variable.lastHlc3\n\n variable.last14U.push(totalVolume * (change <= 0 ? 0 : hlc3))\n variable.last14D.push(totalVolume * (change >= 0 ? 0 : hlc3))\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n let upper = variable.last14U.reduce(function(a, b){return a + b;}, 0);\n let lower = variable.last14D.reduce(function(a, b){return a + b;}, 0);\n\n let mfi\n\n if(lower == 0)\n mfi = 100\n else if(upper == 0)\n mfi = 0\n else // RSI\n mfi = 100 - (100 / (1 + upper / lower))\n\n if (mfi !== undefined) {\n variable.value = mfi.toFixed(2)\n } else {\n variable.value = 0\n }\n\n/*\n // Printing values to console to check\n console.log(\"HLC3: \", hlc3)\n console.log(\"Last HLC3: \", lastHlc3)\n console.log(\"Change: \", change)\n console.log(\"Upper: \", upper)\n console.log(\"Lower: \", lower)\n console.log(\"MFI: \", mfi)\n */\n\n} else {\n variable.value = 0\n}\n\nvariable.lastHlc3 = hlc3",
"code": "/* Loop Code */\nlet candle = record.current // This is the primary dependency\nlet volume = getElement('volumes', candle) // Here I get the volume bar corresponding to the current candle\nlet totalVolume = volume.buy + volume.sell // Candles Volumes split the volume received from the exchange evenly between buy and sell because it does not know how much of it there is.\n\nlet hlc3 = (candle.max + candle.min + candle.close) / 3\nlet lastHlc3 = variable.lastHlc3\n\nif (record.previous !== undefined) {\n\n let change = hlc3 - variable.lastHlc3\n\n variable.last14U.push(totalVolume * (change <= 0 ? 0 : hlc3))\n variable.last14D.push(totalVolume * (change >= 0 ? 0 : hlc3))\n \n if (variable.last14U.length > 14) {\n variable.last14U.splice(0, 1) // Remove the first element of the array to keep it at a maximum of 14 elements.\n }\n \n if (variable.last14D.length > 14) {\n variable.last14D.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements.\n }\n\n let upper = variable.last14U.reduce(function(a, b){return a + b;}, 0);\n let lower = variable.last14D.reduce(function(a, b){return a + b;}, 0);\n\n let mfi\n\n if(lower == 0)\n mfi = 100\n else if(upper == 0)\n mfi = 0\n else // RSI\n mfi = 100 - (100 / (1 + upper / lower))\n\n if (mfi !== undefined) {\n variable.value = mfi.toFixed(2)\n } else {\n variable.value = 0\n }\n\n/*\n // Printing values to console to check\n console.log(\"HLC3: \", hlc3)\n console.log(\"Last HLC3: \", lastHlc3)\n console.log(\"Change: \", change)\n console.log(\"Upper: \", upper)\n console.log(\"Lower: \", lower)\n console.log(\"MFI: \", mfi)\n */\n\n} else {\n variable.value = 0\n}\n\nvariable.lastHlc3 = hlc3",
"project": "Foundations",
"id": "086b666c-f4d1-4167-a103-76b9d3eddf5f",
"savedPayload": {
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -50,7 +50,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
if (statusDependencies.statusReports.get(reportKey).status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ")
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return;
}
@@ -193,7 +193,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
We will assume that each Dataset is built fetching data from a single endpointNode at the target API.
To get the endpointNode node, we will go through the references at the Record Definition.
We will check that all references are pointing to fields belonging to the same endpointNode node.
If they are not, we will consider the user did not define well the relationaships between nodes
If they are not, we will consider the user did not define well the relationships between nodes
and abort the process.
*/
for (let j = 0; j < productDefinition.record.properties.length; j++) {
@@ -204,7 +204,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
let endpointNodeFound = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(apiResponseField, 'API Endpoint')
/*
Every Record Property with an apiResponseFieldReference must be on the path
to a certain enpoint.
to a certain endpoint.
*/
if (endpointNodeFound === undefined) {
TS.projects.foundations.utilities.errorHandlingFunctions.throwHandledException(
@@ -223,11 +223,11 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
}
/*
Here we check all enpoints are actually the same endpoiht.
Here we check all endpoints are actually the same endpoint.
*/
if (endpointNodeFound.id !== endpointNode.id) {
/*
We can not reference fields from different enpoints.
We can not reference fields from different endpoints.
*/
TS.projects.foundations.utilities.errorHandlingFunctions.throwHandledException(
processIndex,
@@ -244,7 +244,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
if (endpointNode === undefined) {
/*
API Endpoint counld not be found. Check that the at least one Record Property
API Endpoint could not be found. Check that the at least one Record Property
has an API Response Field Reference child, and that this one is referencing an
API Response Field.
*/
@@ -263,10 +263,10 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
/*
Each record property references an API Response Field, which can be deep into the
data structure received from the API call. What we need to do, is to find for each
record proeprty the nodePath that will help us later retrieve the value of that
particular proeprty.
record property the nodePath that will help us later retrieve the value of that
particular property.
To do so, we will have to recursivelly climb the API Map until reaching the API Response
To do so, we will have to recursively climb the API Map until reaching the API Response
Schema node, which is the one from where we will get the root object of the response data
structure.
*/
@@ -606,7 +606,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
let errorCodeReceived
/*
At this point we have received the first http reponse from the API server,
At this point we have received the first http response from the API server,
and from it we can extract the status code, which is the html code of the
response of our request.
@@ -665,7 +665,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
response.text().then(body => {
apiResponseReceivedText = body
/*
If we received an errror code, we abort the processing at this point.
If we received an error code, we abort the processing at this point.
*/
if (errorCodeReceived === true) {
resolve('ERROR_CODE_RECEIVED')
@@ -719,7 +719,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
resolve('PAGE_FETCHED')
}
/*
If we received an errror code, we abort the processing at this point.
If we received an error code, we abort the processing at this point.
*/
if (errorCodeReceived === true) {
resolve('ERROR_CODE_RECEIVED')
@@ -829,7 +829,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
function appendToExistingDataset() {
/*
We are going to append the curernt apiResponseReceivedText to the existing file.
We are going to append the current apiResponseReceivedText to the existing file.
*/
let existingFileArray = JSON.parse(existingFileContent)
/*
@@ -929,7 +929,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
contextVariables.lastFile = file.date
/*
For One-Min type of datasets, since they are saved as Daily Files, there is no need
to read the already existing content to append to it. In this case is enought to
to read the already existing content to append to it. In this case is enough to
set the existing content to an empty array.
*/
existingFileContent = "[]"
@@ -938,7 +938,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
function appendToExistingDataset() {
/*
We are going to append the curernt apiResponseReceivedText to the existing file.
We are going to append the current apiResponseReceivedText to the existing file.
*/
let existingFileArray = JSON.parse(existingFileContent)
/*
@@ -1108,7 +1108,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
}
/*
When all Output Datasets have been succesfully written, we can go and write
When all Output Datasets have been successfully written, we can go and write
the Status Report.
*/
writeStatusReport()
@@ -58,7 +58,7 @@
/* We look first for Exchange Raw Data in order to get when the market starts. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Starting Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -67,7 +67,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -99,7 +99,7 @@
/* Second, we get the report from Exchange Raw Data, to know when the marted ends. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Ending Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -108,7 +108,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -132,7 +132,7 @@
/* Finally we get our own Status Report. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -141,7 +141,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because self dependecy Status Report is corrupt. Aborting Process.");
"[ERROR] start -> getContextVariables -> Can not continue because self dependency Status Report is corrupt. Aborting Process.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return;
}
@@ -152,7 +152,7 @@
beginingOfMarket = new Date(thisReport.beginingOfMarket);
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Begining of the Market
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Beginning of the Market
beginingOfMarket = new Date(
contextVariables.datetimeBeginingOfMarketFile.getUTCFullYear() + "-" +
@@ -192,7 +192,7 @@
} else {
/*
In the case when there is no status report, we take the date of the file with the first trades as the begining of the market. Then we will
In the case when there is no status report, we take the date of the file with the first trades as the beginning of the market. Then we will
go one day further in time, so that the previous day does fine a file at the begining of the market.
*/
contextVariables.lastBandFile = new Date(
@@ -237,7 +237,7 @@
try {
let n;
processDate = new Date(contextVariables.lastBandFile.valueOf() - SA.projects.foundations.globals.timeConstants.ONE_DAY_IN_MILISECONDS); // Go back one day to start well when we advance time at the begining of the loop.
processDate = new Date(contextVariables.lastBandFile.valueOf() - SA.projects.foundations.globals.timeConstants.ONE_DAY_IN_MILISECONDS); // Go back one day to start well when we advance time at the beginning of the loop.
let fromDate = new Date(processDate.valueOf())
let lastDate = TS.projects.foundations.utilities.dateTimeFunctions.removeTime(new Date())
@@ -293,7 +293,7 @@
try {
/*
We will iterate through all posible timeFrames
We will iterate through all possible timeFrames
*/
n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
loopBody();
@@ -520,7 +520,7 @@
let numberOfPreviousPeriods;
let currentPosition = pBArray.length;
if (currentPosition < numberOfPeriodsPB) { // Avoinding to get into negative array indexes
if (currentPosition < numberOfPeriodsPB) { // Avoiding to get into negative array indexes
numberOfPreviousPeriods = currentPosition;
} else {
numberOfPreviousPeriods = numberOfPeriodsPB;
@@ -42,7 +42,7 @@
function timeframesLoop() {
try {
/*
We will iterate through all posible time frames.
We will iterate through all possible time frames.
*/
n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
loopBody()
@@ -177,7 +177,7 @@
let numberOfPreviousPeriods;
let currentPosition = pBArray.length;
if (currentPosition < numberOfPeriodsPB) { // Avoinding to get into negative array indexes
if (currentPosition < numberOfPeriodsPB) { // Avoiding to get into negative array indexes
numberOfPreviousPeriods = currentPosition;
} else {
numberOfPreviousPeriods = numberOfPeriodsPB;
@@ -53,7 +53,7 @@
/* We look first for Exchange Raw Data in order to get when the market starts. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Starting Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -62,7 +62,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -94,7 +94,7 @@
/* Second, we get the report from Exchange Raw Data, to know when the marted ends. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Ending Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -103,7 +103,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
}
@@ -130,7 +130,7 @@
/* Finally we get our own Status Report. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
@@ -139,7 +139,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because self dependecy Status Report is corrupt. Aborting Process.")
"[ERROR] start -> getContextVariables -> Can not continue because self dependency Status Report is corrupt. Aborting Process.")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE)
return
}
@@ -148,7 +148,7 @@
if (thisReport.lastFile !== undefined) {
beginingOfMarket = new Date(thisReport.beginingOfMarket)
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Begining of the Market
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Beginning of the Market
beginingOfMarket = new Date(contextVariables.datetimeBeginingOfMarketFile.getUTCFullYear() + "-" + (contextVariables.datetimeBeginingOfMarketFile.getUTCMonth() + 1) + "-" + contextVariables.datetimeBeginingOfMarketFile.getUTCDate() + " " + "00:00" + SA.projects.foundations.globals.timeConstants.GMT_SECONDS);
contextVariables.datetimeLastProducedFile = new Date(
@@ -242,7 +242,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.newInternalLoop(currentDate, percentage);
}
/*
We prepere the arrays that will accumulate all the information for each output file.
We prepare the arrays that will accumulate all the information for each output file.
*/
outputCandles = []
outputVolumes = []
@@ -258,7 +258,7 @@
function timeframesLoop() {
/*
We will iterate through all posible time frames.
We will iterate through all possible time frames.
*/
let n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
loopBody();
@@ -305,7 +305,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack)
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return;
}
@@ -316,7 +316,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Dependency Not Ready -> err = " + err.stack)
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return
@@ -429,7 +429,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.")
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return
}
@@ -517,7 +517,7 @@
function writeFiles(candles, volumes, timeFrame, callBack) {
/*
Here we will write the contents of the Candles and Volumens files.
Here we will write the contents of the Candles and Volumes files.
*/
try {
writeCandles()
@@ -45,7 +45,7 @@
in-memory arrays. We will then append to this arrays the new information we will get from Exchange Raw Data.
2. We know from our status report which was the last DAY we processed from Exchange Raw Data,
but we must be carefull, because that day might not have been completed yet, if the
but we must be carefully, because that day might not have been completed yet, if the
last loop found the head of the market. That means that we have to be carefull not to append candles
that are already there. To simplify what we do is to discard all candles of the last processed day,
and then we can process that full day again adding all the candles.
@@ -71,7 +71,7 @@
/* We look first for Exchange Raw Data in order to get when the market starts. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Starting Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -80,7 +80,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
}
@@ -112,7 +112,7 @@
/* Second, we get the report from Exchange Raw Data, to know when the marted ends. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Ending Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -121,7 +121,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -148,7 +148,7 @@
/* Finally we get our own Status Report. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -157,7 +157,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because self dependecy Status Report is corrupt. Aborting Process.");
"[ERROR] start -> getContextVariables -> Can not continue because self dependency Status Report is corrupt. Aborting Process.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return
}
@@ -168,7 +168,7 @@
beginingOfMarket = new Date(thisReport.beginingOfMarket);
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Begining of the Market
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Beginning of the Market
beginingOfMarket = new Date(
contextVariables.datetimeBeginingOfMarketFile.getUTCFullYear() + "-" +
@@ -291,7 +291,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getCandles -> onFileReceived -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getCandles -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> findPreviousContent -> loopBody -> getCandles -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
}
} else {
@@ -337,7 +337,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getVolumes -> onFileReceived -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getVolumes -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> findPreviousContent -> loopBody -> getVolumes -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
}
} else {
@@ -373,7 +373,7 @@
let fromDate = new Date(contextVariables.datetimeLastProducedFile.valueOf())
let lastDate = TS.projects.foundations.utilities.dateTimeFunctions.removeTime(new Date())
/*
Firstly we prepere the arrays that will accumulate all the information for each output file.
Firstly we prepare the arrays that will accumulate all the information for each output file.
*/
let outputCandles = [];
let outputVolumes = [];
@@ -426,7 +426,7 @@
function timeframesLoop() {
/*
We will iterate through all posible time frames.
We will iterate through all possible time frames.
*/
let n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
@@ -539,7 +539,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
}
@@ -550,7 +550,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Dependency Not Ready -> err = " + JSON.stringify(err));
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
@@ -567,8 +567,8 @@
let totalOutputCandles = inputFilePeriod / outputPeriod; // this should be 2 in this case.
let beginingOutputTime = contextVariables.datetimeLastProducedFile.valueOf();
/*
The algorithm that follows is going to agregate candles of 1 min timeFrame read from Exchange Raw Data, into candles of each timeFrame
that Candles Volumes generates. For market files those timePediods goes from 1h to 24hs.
The algorithm that follows is going to aggregate candles of 1 min timeFrame read from Exchange Raw Data, into candles of each timeFrame
that Candles Volumes generates. For market files those time periods goes from 1h to 24hs.
*/
for (let i = 0; i < totalOutputCandles; i++) {
@@ -667,7 +667,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -753,7 +753,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> writeFiles -> Entering function.")
/*
Here we will write the contents of the Candles and Volumens files.
Here we will write the contents of the Candles and Volumes files.
*/
try {
writeCandles()
@@ -45,7 +45,7 @@ exports.newDataMiningBotModulesCheckWebhook = function (processIndex) {
if (statusDependencies.statusReports.get(reportKey).status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -111,7 +111,7 @@ exports.newDataMiningBotModulesCheckWebhook = function (processIndex) {
let messages = Buffer.concat(chunks).toString('utf8')
if (fileContent !== undefined) {
// we are going to append the curernt messages to the existing file.
// we are going to append the current messages to the existing file.
let fileContentArray = JSON.parse(fileContent)
let messagesArray = JSON.parse(messages)
@@ -1,7 +1,7 @@
{
"type": "Docs Space Style",
"definition": {
"text": "This node is currently a place holder that will eventually allow users to adjust the visual apperance of the docs space.",
"text": "This node is currently a place holder that will eventually allow users to adjust the visual appearance of the docs space.",
"updated": 1631589004055
},
"paragraphs": [
@@ -549,7 +549,7 @@ function newFoundationsDocsCommmandInterface() {
function afterSaving() {
/*
Since all the changes where saved, we need to remove the change flags at the different shcema documents.
Since all the changes where saved, we need to remove the change flags at the different schema documents.
We also need to remove from the arrays the deleted items.
*/
for (let j = 0; j < PROJECTS_SCHEMA.length; j++) {
@@ -311,7 +311,7 @@ function newFoundationsDocsContextMenu() {
return false
}
/*
Get the dimenssions of the current paragraph to help us to define the dimenssions of the text area.
Get the dimensions of the current paragraph to help us to define the dimensions of the text area.
*/
UI.projects.education.spaces.docsSpace.contextMenu.selectedParagraph = paragraphNode
selectedParagraphHeight = paragraphNode.getClientRects()[0].height
@@ -349,7 +349,7 @@ function newFoundationsDocsContextMenu() {
return true
}
/*
Remeber the Selected Paragraph Index
Remember the Selected Paragraph Index
*/
let splittedId = paragraphNode.id.split('-')
selectedParagraphIndex = splittedId[splittedId.length - 2]
@@ -153,7 +153,7 @@ function newEducationDocSpace() {
function setupUserLanguage() {
/*
Getting the used preferred languague
Getting the used preferred language
*/
let workspace = UI.projects.foundations.spaces.designSpace.workspace.workspaceNode
let docsLanguage = UI.projects.visualScripting.utilities.nodeConfig.loadConfigProperty(workspace.payload, 'docsLanguage')
@@ -347,8 +347,8 @@ function newFoundationsDocsDocumentPage() {
function generateTopicMultiPageIndex() {
/*
We will go through all the schema docuents array for the current project and pick
the documents that share the same key thatn the document we are rendering now.
We will go through all the schema documents array for the current project and pick
the documents that share the same key that the document we are rendering now.
With the info on those picked document we will build the index.
*/
let paragraph
@@ -393,7 +393,7 @@ function newFoundationsDocsDocumentPage() {
function generateTutorialMultiPageIndex() {
/*
We will go through all the schema docuents array for the current project and pick
We will go through all the schema documents array for the current project and pick
the documents that share the same key thatn the document we are rendering now.
With the info on those picked document we will build the index.
*/
@@ -438,8 +438,8 @@ function newFoundationsDocsDocumentPage() {
function generateReviewMultiPageIndex() {
/*
We will go through all the schema docuents array for the current project and pick
the documents that share the same key thatn the document we are rendering now.
We will go through all the schema documents array for the current project and pick
the documents that share the same key that the document we are rendering now.
With the info on those picked document we will build the index.
*/
let paragraph
@@ -628,7 +628,7 @@ function newFoundationsDocsDocumentPage() {
autoGeneratedParagraphIndex++
return
} else {
return 'Property ' + propertyName + ' not found at the placeholder object. This means that within the info recieved, this information is not available.'
return 'Property ' + propertyName + ' not found at the placeholder object. This means that within the info received, this information is not available.'
}
}
}
@@ -772,7 +772,7 @@ function newFoundationsDocsDocumentPage() {
}
} else {
if (imageItem.icon === undefined) {
/* This is the default behavious */
/* This is the default behaviours */
imageElement = UI.projects.foundations.spaces.designSpace.getIconByProjectAndType(imageItem.project, imageItem.type)
if (imageElement === undefined) {
console.log('[WARN] Image for project (' + imageItem.project + ') with name (' + imageItem.type + ') not found. As a consequence, the Docs Page will be rendered without the icon. ')
@@ -1179,7 +1179,7 @@ function newFoundationsDocsDocumentPage() {
autoGeneratedParagraphIndex++
paragraph = {
style: "Text",
text: "The following are the Node Referencing Rules that determine which nodes " + appSchemaDocument.type + " may stablish a reference to:"
text: "The following are the Node Referencing Rules that determine which nodes " + appSchemaDocument.type + " may establish a reference to:"
}
renderParagraph(paragraph, key)
autoGeneratedParagraphIndex++
@@ -1887,7 +1887,7 @@ function newFoundationsDocsDocumentPage() {
function putTheLines() {
/*
Now we will scan the Matrix to put the lines of the hirierchy.
Now we will scan the Matrix to put the lines of the hierarchy.
*/
for (let i = 0; i < contentMatrix.length; i++) {
let matrixRow = contentMatrix[i]
@@ -1904,7 +1904,7 @@ function newFoundationsDocsDocumentPage() {
function addImageContainers() {
/*
Add Image Conatiners
Add Image Containers
*/
for (let i = 0; i < contentMatrix.length; i++) {
let matrixRow = contentMatrix[i]
@@ -1990,7 +1990,7 @@ function newFoundationsDocsDocumentPage() {
if (UI.projects.education.spaces.docsSpace.contextMenu.getSelection() === false) {
/*
The click was in a place where we can not recognize an editable piece.
We will not open the menu in this circunstances.
We will not open the menu in this circumstances.
*/
return
}
@@ -2051,7 +2051,7 @@ function newFoundationsDocsDocumentPage() {
/*
We will detect if the user has created new paragraphs while editing.
For that we will inspect the value of the text area looking for a char
code representing carriedge return.
code representing carriage return.
*/
let paragraphs = []
let paragraph = ''
@@ -2078,7 +2078,7 @@ function newFoundationsDocsDocumentPage() {
UI.projects.education.utilities.docs.setTextBasedOnLanguage(docSchemaParagraph, paragraphs[0])
} else {
/*
Deleting paragarphs is only possible in the default language.
Deleting paragraphs is only possible in the default language.
*/
if (UI.projects.education.spaces.docsSpace.language === UI.projects.education.globals.docs.DEFAULT_LANGUAGE) {
UI.projects.education.spaces.docsSpace.documentPage.docsSchemaDocument.updated = true
@@ -2094,7 +2094,7 @@ function newFoundationsDocsDocumentPage() {
}
} else {
/*
Adding paragarphs is only possible in the default language.
Adding paragraphs is only possible in the default language.
*/
if (UI.projects.education.spaces.docsSpace.language === UI.projects.education.globals.docs.DEFAULT_LANGUAGE) {
/*
+4 -4
View File
@@ -120,7 +120,7 @@ function newEducationUtilitiesDocs() {
if (UI.projects.education.spaces.docsSpace.language === UI.projects.education.globals.docs.DEFAULT_LANGUAGE) {
if (paragraph.text !== text) {
/* This will make the Client to save this in a file overwritting the previous version*/
/* This will make the Client to save this in a file overwriting the previous version*/
UI.projects.education.spaces.docsSpace.documentPage.docsSchemaDocument.updated = true
paragraph.text = text
@@ -145,7 +145,7 @@ function newEducationUtilitiesDocs() {
if (translation.language === UI.projects.education.spaces.docsSpace.language) {
if (translation.text !== text) {
/* This will make the Client to save this in a file overwritting the previous version*/
/* This will make the Client to save this in a file overwriting the previous version*/
UI.projects.education.spaces.docsSpace.documentPage.docsSchemaDocument.updated = true
translation.text = text
@@ -161,7 +161,7 @@ function newEducationUtilitiesDocs() {
}
paragraph.translations.push(translation)
/* This will make the Client to save this in a file overwritting the previous version*/
/* This will make the Client to save this in a file overwriting the previous version*/
UI.projects.education.spaces.docsSpace.documentPage.docsSchemaDocument.updated = true
return
}
@@ -613,7 +613,7 @@ function newEducationUtilitiesDocs() {
function tagDefinedTypes(text, excludedType) {
const MAX_NUMBER_OF_WORDS = 10
text = text.trim()
let cleanText = text.replace(/'/g, ' AMPERSAND ') // scaping ampersands, separating them from other words
let cleanText = text.replace(/'/g, ' AMPERSAND ') // escaping ampersands, separating them from other words
.replaceAll(':', ' :')
.replaceAll(',', ' ,')
.replaceAll('.', ' .')
@@ -48,7 +48,7 @@
/* these are module specific variables: */
let bands = []; // Here we keep the bands to be ploted every time the Draw() function is called by the AAWebPlatform.
let bands = []; // Here we keep the bands to be plotted every time the Draw() function is called by the AAWebPlatform.
let onMouseOverEventSuscriptionId
let zoomChangedEventSubscriptionId
@@ -65,7 +65,7 @@
function finalize() {
try {
/* Stop listening to the necesary events. */
/* Stop listening to the necessary events. */
thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId)
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId);
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId);
@@ -74,7 +74,7 @@
marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId);
dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId);
/* Destroyd References */
/* Destroyed References */
marketFiles = undefined;
dailyFiles = undefined;
@@ -119,7 +119,7 @@
marketFile = marketFiles.getFile(pTimeFrame);
fileCursor = dailyFiles.getFileCursor(pTimeFrame);
/* Listen to the necesary events. */
/* Listen to the necessary events. */
zoomChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged);
offsetChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged);
@@ -385,7 +385,7 @@
currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS);
}
/* Lests check if all the visible screen is going to be covered by bands. */
/* Lets check if all the visible screen is going to be covered by bands. */
let lowerEnd = leftDate.valueOf();
let upperEnd = rightDate.valueOf();
@@ -587,7 +587,7 @@
if (userPositionDate >= band.begin && userPositionDate <= band.end) {
/* highlight the current band */
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.05)'; // Current band accroding to time
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.05)'; // Current band according to time
}
if (
@@ -603,7 +603,7 @@
/* Next we are drawing the outter bands lines */
/* Next we are drawing the outer bands lines */
browserCanvasContext.beginPath();
@@ -620,7 +620,7 @@
/* highlight the current band */
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band accroding to time
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band according to time
let currentBand = {
bodyWidth: bandPoint3.x - bandPoint2.x,
@@ -658,7 +658,7 @@
if (userPositionDate >= band.begin && userPositionDate <= band.end) {
/* highlight the current band */
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band accroding to time
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band according to time
}
browserCanvasContext.lineWidth = 0.2;
@@ -118,7 +118,7 @@ function newBollingerPlottersBollingerBandsBollingerBandsBollingerBandsPanel() {
y: Y_AXIS - currentBand.rightBodyHeight / 2 + currentBand.bottomDelta / 4
};
/* Extra bounderies due to constrained space */
/* Extra boundaries due to constrained space */
const upperLimit = frameTitleHeight + frameBodyHeight * 0.25;
const downLimit = frameTitleHeight + frameBodyHeight * 0.75;
@@ -141,7 +141,7 @@ function newCandlesPlottersCandlesVolumesCandlesCandlePanel() {
};
/* Extra bounderies due to constrained space */
/* Extra boundaries due to constrained space */
const upperLimit = frameTitleHeight + frameBodyHeight * 0.15;
const downLimit = frameTitleHeight + frameBodyHeight * 0.85;
@@ -38,7 +38,7 @@
/* these are module specific variables: */
let candles = []; // Here we keep the candles to be ploted every time the Draw() function is called by the AAWebPlatform.
let candles = []; // Here we keep the candles to be plotted every time the Draw() function is called by the AAWebPlatform.
let onMouseOverEventSuscriptionId
let zoomChangedEventSubscriptionId
@@ -55,7 +55,7 @@
function finalize() {
try {
/* Stop listening to the necesary events. */
/* Stop listening to the necessary events. */
thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId)
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId);
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId);
@@ -64,7 +64,7 @@
marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId);
dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId);
/* Destroyd References */
/* Destroyed References */
marketFiles = undefined;
dailyFiles = undefined;
@@ -108,7 +108,7 @@
marketFile = marketFiles.getFile(pTimeFrame);
fileCursor = dailyFiles.getFileCursor(pTimeFrame);
/* Listen to the necesary events. */
/* Listen to the necessary events. */
zoomChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged);
offsetChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged);
@@ -376,7 +376,7 @@
currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS);
}
/* Lests check if all the visible screen is going to be covered by candles. */
/* Lets check if all the visible screen is going to be covered by candles. */
let lowerEnd = leftDate.valueOf();
let upperEnd = rightDate.valueOf();
@@ -719,7 +719,7 @@
}
/* Draw mouse candel and Raise Event. */
/* Draw mouse candle and Raise Event. */
if (mouseCandle) {
/* highlight the current candle */
@@ -735,7 +735,7 @@
browserCanvasContext.closePath();
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current candle accroding to time
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current candle according to time
browserCanvasContext.fill();
@@ -141,7 +141,7 @@ function newCandlesPlottersCandlesVolumesCandlesCandlePanel() {
};
/* Extra bounderies due to constrained space */
/* Extra boundaries due to constrained space */
const upperLimit = frameTitleHeight + frameBodyHeight * 0.15;
const downLimit = frameTitleHeight + frameBodyHeight * 0.85;
@@ -1,7 +1,7 @@
{
"type": "API Server",
"definition": {
"text": "It is a server (usually running at the Internet) that provides programatic access to it;s resources. This enables algorithms to access those resources. When those resources are data, then it allow anyone to fetch that data by executing predefined queries to the API Server.",
"text": "It is a server (usually running at the Internet) that provides programmatic access to it;s resources. This enables algorithms to access those resources. When those resources are data, then it allow anyone to fetch that data by executing predefined queries to the API Server.",
"updated": 1621955731261
},
"paragraphs": [
@@ -1,7 +1,7 @@
{
"type": "Action",
"definition": {
"text": "An Action is somthing that users of the system can triggeer via the UI, usually by clicking on a Menu Item of a Node. Actions can also be triggered by other actions enabling a resulable set of functionality to be available to users of the Design Space. Once triggered the action executes pre-defined code.",
"text": "An Action is something that users of the system can trigger via the UI, usually by clicking on a Menu Item of a Node. Actions can also be triggered by other actions enabling a reusable set of functionality to be available to users of the Design Space. Once triggered the action executes pre-defined code.",
"updated": 1614784762410
},
"paragraphs": [
@@ -7,7 +7,7 @@
"paragraphs": [
{
"style": "Text",
"text": "The App Schema file is an array of objects, each objec defines a certain node type.",
"text": "The App Schema file is an array of objects, each object defines a certain node type.",
"updated": 1614785082978
},
{
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "It is an integer from 0 to 5, representing the importance of this type of node. 0 is the most important. The more important the node type, the bigger is rendered at the Design Space. The difference between level is barely noticable.",
"text": "It is an integer from 0 to 5, representing the importance of this type of node. 0 is the most important. The more important the node type, the bigger is rendered at the Design Space. The difference between level is barely noticeable.",
"updated": 1614785595122
},
{
@@ -94,7 +94,7 @@
},
{
"style": "List",
"text": "autoAdd: optional, menas if one instance of this children will be automatically created when this Node type is created."
"text": "autoAdd: optional, means if one instance of this children will be automatically created when this Node type is created."
},
{
"style": "Text",
@@ -115,7 +115,7 @@
},
{
"style": "Text",
"text": "This property defines to which nodes the current one being defined can attach to, considering those nodes as possible parents. The values are expresed in a string with a list of Node Types like in the following example:"
"text": "This property defines to which nodes the current one being defined can attach to, considering those nodes as possible parents. The values are expressed in a string with a list of Node Types like in the following example:"
},
{
"style": "Json",
@@ -133,7 +133,7 @@
},
{
"style": "Text",
"text": "This property defines to which nodes the current one being defined can reference to, considering those nodes as possible reference parents. The values are expresed in a string with a list of Node Types like in the following example:",
"text": "This property defines to which nodes the current one being defined can reference to, considering those nodes as possible reference parents. The values are expressed in a string with a list of Node Types like in the following example:",
"updated": 1614786699311
},
{
@@ -161,7 +161,7 @@
},
{
"style": "Text",
"text": "Although you are free to add any menu item you like, there are a few that have already become standarized. These standard Menu Items are also placed at a certain position within the menu for consistency.",
"text": "Although you are free to add any menu item you like, there are a few that have already become standardized. These standard Menu Items are also placed at a certain position within the menu for consistency.",
"updated": 1614787035329
},
{
@@ -1,7 +1,7 @@
{
"type": "CCXT",
"definition": {
"text": "CCXT is a popular open source library that aims to standarize crypto exchanges APIs so as to make it easier for trading bots developers to access crypto exchanges. ",
"text": "CCXT is a popular open source library that aims to standardize crypto exchanges APIs so as to make it easier for trading bots developers to access crypto exchanges. ",
"updated": 1621694347383,
"translations": [
{
@@ -1,7 +1,7 @@
{
"type": "Dataset",
"definition": {
"text": "In Superalgos, a Dataset is a colection of JSON / text files organized in a certain way. ",
"text": "In Superalgos, a Dataset is a collection of JSON / text files organized in a certain way. ",
"updated": 1621695840891
},
"paragraphs": [
@@ -1,7 +1,7 @@
{
"type": "Default Market",
"definition": {
"text": "The Default Market is the one referenced by the Market Data Tasks, Market Trading Tasks, Market Learning Tasks nodes of which a certain Task decends from. The Trading Bot running inside that Task will considered that reference market to be it's Default Market.",
"text": "The Default Market is the one referenced by the Market Data Tasks, Market Trading Tasks, Market Learning Tasks nodes of which a certain Task descends from. The Trading Bot running inside that Task will considered that reference market to be it's Default Market.",
"updated": 1612352846165
},
"paragraphs": [
@@ -12,7 +12,7 @@
},
{
"style": "Text",
"text": "Read the docs of the API you are trying to map, and indentify which endpoints they support. From there you can choose which endpoint holds the information you are interested in and begin to map it. For a detailed description of how to do this, please read the following description. In addtion please see the API Map page as well as the Data Mining topic for other important concepts surrounding setting up an api map. ",
"text": "Read the docs of the API you are trying to map, and identify which endpoints they support. From there you can choose which endpoint holds the information you are interested in and begin to map it. For a detailed description of how to do this, please read the following description. In addition please see the API Map page as well as the Data Mining topic for other important concepts surrounding setting up an api map. ",
"updated": 1622855071509
},
{
@@ -26,7 +26,7 @@
},
{
"style": "Important",
"text": "Becareful to write the exact string specified in the API documentation. Extra spaces, or capital letters will break the URL and cause it to return an error.",
"text": "Be careful to write the exact string specified in the API documentation. Extra spaces, or capital letters will break the URL and cause it to return an error.",
"updated": 1622773133088
},
{
@@ -7,7 +7,7 @@
"paragraphs": [
{
"style": "Success",
"text": "Even if you are not using every query parameter offered for an endpoint. For the sake of completness, it is a good idea to add it to the map and delete the value property.",
"text": "Even if you are not using every query parameter offered for an endpoint. For the sake of completeness, it is a good idea to add it to the map and delete the value property.",
"updated": 1622765045028
},
{
@@ -1,7 +1,7 @@
{
"type": "API Query Responses",
"definition": {
"text": "API calls produce responses. Under this node you can define how your map will interpret different responces from the API.",
"text": "API calls produce responses. Under this node you can define how your map will interpret different responses from the API.",
"updated": 1622862463288
},
"paragraphs": [
@@ -33,12 +33,12 @@
},
{
"style": "Text",
"text": "In order to extract individual values for each Record Property, the API Data Fetcher Bot needs to dynamically discover the nodePath for each Record Propety at the response data structure and can do it as long as the API Response Field referenced is under the Data Root. To autodiscover the nodePath it uses the API Response Schema nodePath to locate the Data Root, and then it follows the reference from the API Response Field Reference node to the API Response Field and climbs upwards until it reach the API Response Schema. While climbing upwards it discovers the nodePath that it needs to grab the value from the response data structure. That is how it works.",
"text": "In order to extract individual values for each Record Property, the API Data Fetcher Bot needs to dynamically discover the nodePath for each Record Property at the response data structure and can do it as long as the API Response Field referenced is under the Data Root. To auto discover the nodePath it uses the API Response Schema nodePath to locate the Data Root, and then it follows the reference from the API Response Field Reference node to the API Response Field and climbs upwards until it reach the API Response Schema. While climbing upwards it discovers the nodePath that it needs to grab the value from the response data structure. That is how it works.",
"updated": 1622372741883
},
{
"style": "Text",
"text": "When the referenced API Response Field is outside the scope of the Data Root, the process is not able to auto dicover this path and need users to manually define the nodePath (from the API Response Schema to the API Response Field that holds the value) and set it in this proeprty. That happens for instance when the API Response Field is part of the header of the API Server response.",
"text": "When the referenced API Response Field is outside the scope of the Data Root, the process is not able to auto discover this path and need users to manually define the nodePath (from the API Response Schema to the API Response Field that holds the value) and set it in this property. That happens for instance when the API Response Field is part of the header of the API Server response.",
"updated": 1621972505639
},
{
@@ -1,7 +1,7 @@
{
"type": "API Response Schema",
"definition": {
"text": "This node represents the map for the API response. APIs send ther data using a JSON object. The children of this node will map this JSON object so that the API Fetcher Bot knows how to extract the data you want.",
"text": "This node represents the map for the API response. APIs send their data using a JSON object. The children of this node will map this JSON object so that the API Fetcher Bot knows how to extract the data you want.",
"updated": 1622863829380
},
"paragraphs": [
@@ -50,7 +50,7 @@
},
{
"style": "Text",
"text": "In many cases it will be necessary to make several queries to the API Server in order to fetch all the data (think of pagination). Each page of data arrives at a certain location within the reponse data structure. That location is what we considered the Data Root.",
"text": "In many cases it will be necessary to make several queries to the API Server in order to fetch all the data (think of pagination). Each page of data arrives at a certain location within the response data structure. That location is what we considered the Data Root.",
"updated": 1622864086051
},
{
@@ -28,7 +28,7 @@
},
{
"style": "List",
"text": "codeName is the name of the dataset as used within the code. 'Single-File'is a special value. Use it for datasets that do not depend on Time Frames and that have a timestamp Record Property instead of the regular Begin and End. When this type of datasets are a dependency of Market or Daily datasets, they need the codeName'Single-File'in order to be found on disk.",
"text": "codeName is the name of the dataset as used within the code. 'Single-File' is a special value. Use it for datasets that do not depend on Time Frames and that have a timestamp Record Property instead of the regular Begin and End. When this type of datasets are a dependency of Market or Daily datasets, they need the codeName 'Single-File' in order to be found on disk.",
"updated": 1621100190528
},
{
@@ -10,7 +10,7 @@
},
{
"style": "Text",
"text": "Both entry and exit target sizes may be defined either denominated in the base asset or the quoted asset. Nevertheless, the sytem keeps track of target sizes in both assets. If the target is defined denominated in the base asset, then the target for the quoted asset is calculated using the current rate, and viceversa."
"text": "Both entry and exit target sizes may be defined either denominated in the base asset or the quoted asset. Nevertheless, the system keeps track of target sizes in both assets. If the target is defined denominated in the base asset, then the target for the quoted asset is calculated using the current rate, and vice versa."
},
{
"style": "Text",
@@ -12,7 +12,7 @@
},
{
"style": "Text",
"text": "Although, an opportunity to improve troubleshooting errors exists (e.g. providing more on-screen user feedback). A couple of errors occured for me during the getting started tutorials, which made my learning experience a little frustrating."
"text": "Although, an opportunity to improve troubleshooting errors exists (e.g. providing more on-screen user feedback). A couple of errors occurred for me during the getting started tutorials, which made my learning experience a little frustrating."
},
{
"style": "Text",
@@ -69,7 +69,7 @@
},
{
"style": "Text",
"text": "Same example as above but with RMA (Exponatial Moving Average) as the smoothing function."
"text": "Same example as above but with RMA (Exponential Moving Average) as the smoothing function."
}
]
}
@@ -32,7 +32,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the Client:"
"text": "The following is the Error Message of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -44,7 +44,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the Client:"
"text": "The following is the Error Stack of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -56,7 +56,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the Client:"
"text": "The following is the Error Code of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -69,7 +69,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the Client:",
"text": "The following are all the Error details of the Exception that occurred at the Client:",
"updated": 1611154675224
},
{
@@ -58,7 +58,7 @@
},
{
"style": "Error",
"text": "Github Crendentials are Missing. The property token is missing or empty. Please create it following the guide below and try again.",
"text": "Github Credentials are Missing. The property token is missing or empty. Please create it following the guide below and try again.",
"updated": 1610559900470
},
{
@@ -32,7 +32,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the Client:",
"text": "The following is the Error Message of the Exception that occurred at the Client:",
"updated": 1611151299633
},
{
@@ -45,7 +45,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the Client:",
"text": "The following is the Error Stack of the Exception that occurred at the Client:",
"updated": 1611151427220
},
{
@@ -58,7 +58,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the Client:",
"text": "The following is the Error Code of the Exception that occurred at the Client:",
"updated": 1611151443562
},
{
@@ -71,7 +71,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the Client:"
"text": "The following are all the Error details of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": "1",
"type": "Bollinger by @luis_fernando_molina",
"definition": {
"text": "The Bollinger Data Mine features the Bollinger Bands (BB), Percentage Bandwisth (%B), Bollinger Channels, and Bollinger Subchannels indicators.",
"text": "The Bollinger Data Mine features the Bollinger Bands (BB), Percentage Bandwidth (%B), Bollinger Channels, and Bollinger Subchannels indicators.",
"updated": 1622481705188
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": "2",
"type": "Bollinger Bands (BB - %B) - Bollinger Indicator",
"definition": {
"text": "The indicator produces the Bollinger Bands (BB) and Percentage Bandwith (%B), both in standard settings.",
"text": "The indicator produces the Bollinger Bands (BB) and Percentage Bandwidth (%B), both in standard settings.",
"updated": 1610387450406
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": "3",
"type": "Switching Branches - Contributions Branch Changed",
"definition": {
"text": "Your Contributions Branch was succesfully changed. This will only have an impact the next time you run the App Contribute Command. This branch is going to receive the Pull Request with all your changes.",
"text": "Your Contributions Branch was successfully changed. This will only have an impact the next time you run the App Contribute Command. This branch is going to receive the Pull Request with all your changes.",
"updated": 1620591770153
},
"paragraphs": [
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the Client:"
"text": "The following is the Error Message of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the Client:"
"text": "The following is the Error Stack of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the Client:"
"text": "The following is the Error Code of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the Client:"
"text": "The following are all the Error details of the Exception that occurred at the Client:"
},
{
"style": "Placeholder",
@@ -37,7 +37,7 @@
},
{
"style": "Text",
"text": "Use the following key combiantions for the same purpose:",
"text": "Use the following key combinations for the same purpose:",
"updated": 1610040210636
},
{
@@ -128,7 +128,7 @@
},
{
"style": "Text",
"text": "There are also keyboard shortcuts to acomplish node snapping. See Keyboard Shortcut Quick Guide page for more details.",
"text": "There are also keyboard shortcuts to accomplish node snapping. See Keyboard Shortcut Quick Guide page for more details.",
"updated": 1634915239339
},
{
@@ -137,7 +137,7 @@
},
{
"style": "Text",
"text": "Superalgos also offers a range of keyboard shortcuts to help make working with the platfom easier. You can find a list of all current shortcuts at the Keyboard Shortcut Quick Guide page.",
"text": "Superalgos also offers a range of keyboard shortcuts to help make working with the platform easier. You can find a list of all current shortcuts at the Keyboard Shortcut Quick Guide page.",
"updated": 1634915308602
},
{
@@ -3,7 +3,7 @@
"pageNumber": "3",
"type": "Value Not A Number",
"definition": {
"text": "At runtime some nodes might aquire a value, and when it is expected that the value is a number, this type of error will pop up. To avoid this to happen Make sure that at nodes that should have only numeric values, that they don't get by any means a non numeric one.",
"text": "At runtime some nodes might acquire a value, and when it is expected that the value is a number, this type of error will pop up. To avoid this to happen Make sure that at nodes that should have only numeric values, that they don't get by any means a non numeric one.",
"updated": 1611652261727
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": "4",
"type": "Value Undefined",
"definition": {
"text": "Some nodes might aquire a value at runtime. This type of error will pop up when such a node is expected to have some value but it has none. Undefined means no value at all of any type.",
"text": "Some nodes might acquire a value at runtime. This type of error will pop up when such a node is expected to have some value but it has none. Undefined means no value at all of any type.",
"updated": 1611652326745
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": "5",
"type": "Value Zero",
"definition": {
"text": "At runtime some nodes might aquire a value, and when it is expected not to be zero this type of error will pop up. To avoid this type of error, Make sure that the Node where the error poped up never get a zero value.",
"text": "At runtime some nodes might acquire a value, and when it is expected not to be zero this type of error will pop up. To avoid this type of error, Make sure that the Node where the error popped up never get a zero value.",
"updated": 1611652416098
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": "6",
"type": "Value Zero Or Negative",
"definition": {
"text": "At runtime some nodes might aquire a value, and when it is expected not to be zero or negative this type of error will pop up. To avoid this type of error, Make sure that the Node where the error poped up never get a zero or negative value.",
"text": "At runtime some nodes might acquire a value, and when it is expected not to be zero or negative this type of error will pop up. To avoid this type of error, Make sure that the Node where the error popped up never get a zero or negative value.",
"updated": 1611652451957
},
"paragraphs": [
@@ -35,7 +35,7 @@
},
{
"style": "Text",
"text": "The way in which a level is visualized on screen depends on the number of rejections that have occured at the particular level since is was first established:"
"text": "The way in which a level is visualized on screen depends on the number of rejections that have occurred at the particular level since is was first established:"
},
{
"style": "Table",
@@ -19,7 +19,7 @@
},
{
"style": "List",
"text": "Date at: date the last all time high occured.",
"text": "Date at: date the last all time high occurred.",
"updated": 1623068385383
},
{
@@ -3,7 +3,7 @@
"pageNumber": "2",
"type": "TS API Data Fetcher Bot Error - Reference Parent Missing",
"definition": {
"text": "The node where this error occured needs to have a Reference Parent. Establish a reference from this node and this error will not happen again.",
"text": "The node where this error occurred needs to have a Reference Parent. Establish a reference from this node and this error will not happen again.",
"updated": 1621860822884
},
"paragraphs": [
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": 2,
"type": "TS LF Trading Bot Error - Evaluating Formula Error",
"definition": {
"text": "An error occured while evaluatiing a user-defined Formula at the Trading System.",
"text": "An error occurred while evaluatiing a user-defined Formula at the Trading System.",
"updated": 1611926309593
},
"paragraphs": [
@@ -36,7 +36,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:",
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569424352
},
{
@@ -49,7 +49,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:",
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569434043
},
{
@@ -62,7 +62,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:",
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569440715
},
{
@@ -75,7 +75,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:",
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569446711
},
{
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": 51,
"type": "TS LF Trading Bot Error - Snapshot Instruction Evaluation Error",
"definition": {
"text": "This error occured while evaluating an instruction as part of the process of generating a Snapshot. This did not prevent the Snapshot from being created, but the value for the particular instruction was set to zero.",
"text": "This error occurred while evaluating an instruction as part of the process of generating a Snapshot. This did not prevent the Snapshot from being created, but the value for the particular instruction was set to zero.",
"updated": 1611949667634
},
"paragraphs": [
@@ -30,7 +30,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -42,7 +42,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -54,7 +54,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -66,7 +66,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -103,7 +103,7 @@
},
{
"style": "Text",
"text": "The following is the context information preserved when the error occured:",
"text": "The following is the context information preserved when the error occurred:",
"updated": 1611681225358
},
{
@@ -34,7 +34,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -46,7 +46,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -58,7 +58,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -70,7 +70,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -35,7 +35,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -47,7 +47,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -59,7 +59,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -71,7 +71,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -63,7 +63,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -75,7 +75,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -87,7 +87,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -99,7 +99,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -149,7 +149,7 @@
},
{
"style": "Text",
"text": "The following is the context information preserved when the error occured:"
"text": "The following is the context information preserved when the error occurred:"
},
{
"style": "Placeholder",
@@ -61,7 +61,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -73,7 +73,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -85,7 +85,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -97,7 +97,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -146,7 +146,7 @@
},
{
"style": "Text",
"text": "The following is the context information preserved when the error occured:"
"text": "The following is the context information preserved when the error occurred:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": 60,
"type": "TS LF Trading Bot Error - Execution Unexpected Error",
"definition": {
"text": "An Unexpected Error occured while procesing the execution of orders. The LF Trading Bot continued running after reporting this error.",
"text": "An Unexpected Error occurred while procesing the execution of orders. The LF Trading Bot continued running after reporting this error.",
"updated": 1611953087876
},
"paragraphs": [
@@ -36,7 +36,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -48,7 +48,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -60,7 +60,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -72,7 +72,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -36,7 +36,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the TS:"
"text": "The following is the Error Message of the Exception that occurred at the TS:"
},
{
"style": "Placeholder",
@@ -48,7 +48,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the TS:"
"text": "The following is the Error Stack of the Exception that occurred at the TS:"
},
{
"style": "Placeholder",
@@ -60,7 +60,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the TS:"
"text": "The following is the Error Code of the Exception that occurred at the TS:"
},
{
"style": "Placeholder",
@@ -72,7 +72,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the TS:"
"text": "The following are all the Error details of the Exception that occurred at the TS:"
},
{
"style": "Placeholder",
@@ -33,7 +33,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the TS:",
"text": "The following is the Error Message of the Exception that occurred at the TS:",
"updated": 1610971326601
},
{
@@ -48,7 +48,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the TS:",
"text": "The following is the Error Stack of the Exception that occurred at the TS:",
"updated": 1610968631281
},
{
@@ -62,7 +62,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the TS:"
"text": "The following is the Error Code of the Exception that occurred at the TS:"
},
{
"style": "Placeholder",
@@ -74,7 +74,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the TS:",
"text": "The following are all the Error details of the Exception that occurred at the TS:",
"updated": 1611257840235
},
{
@@ -0,0 +1,49 @@
{
"topic": "Tested Exchanges",
"pageNumber": 4,
"type": "Ascendex Test Status",
"definition": {
"text": "Passed Fetch OHLVCs and Backtesting test. Live trading will soon be tested.",
"updated": 1635446898934
},
"paragraphs": [
{
"style": "Title",
"text": "Properties",
"updated": 1615143100216
},
{
"style": "List",
"text": "1-min OHLCVs Capability: Yes. The ability to fetch historic data for backtesting purposes has been verified.",
"updated": 1616003666832
},
{
"style": "List",
"text": "Market History: 2020-01-01",
"updated": 1615204614502
},
{
"style": "List",
"text": "Trading Capability: Unknown. The ability to run strategies in live-trading mode has not been verified.",
"updated": 1616003699055
},
{
"style": "List",
"text": "Comments: Raw Data mining can be slow due to exchange restrictions on their API that limit the number of data it can be requested via Rest API",
"updated": 1615205045729
},
{
"style": "Title",
"text": "Configuration"
},
{
"style": "Json",
"text": "{\n \"codeName\": \"ascendex\",\n \"rateLimit\": 500,\n \"sandBox\": \"false\"\n}",
"updated": 1635446820958
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,49 @@
{
"topic": "Tested Exchanges",
"pageNumber": 4,
"type": "Ascendex Test Status",
"definition": {
"text": "Passed Fetch OHLVCs and Backtesting. Live trading will soon be tested.",
"updated": 1616003850379
},
"paragraphs": [
{
"style": "Title",
"text": "Properties",
"updated": 1615143100216
},
{
"style": "List",
"text": "1-min OHLCVs Capability: Yes. The ability to fetch historic data for backtesting purposes has been verified.",
"updated": 1616003666832
},
{
"style": "List",
"text": "Market History: 2020-01-01",
"updated": 1615204614502
},
{
"style": "List",
"text": "Trading Capability: Unknown. The ability to run strategies in live-trading mode has not been verified.",
"updated": 1616003699055
},
{
"style": "List",
"text": "Comments: Raw Data mining can be slow due to exchange restrictions on their API that limit the number of data it can be requested via Rest API",
"updated": 1615205045729
},
{
"style": "Title",
"text": "Configuration"
},
{
"style": "Json",
"text": "{\n \"codeName\": \"ascendex\"\n}",
"updated": 1615204693035
},
{
"style": "Text",
"text": ""
}
]
}
@@ -72,7 +72,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] Your strategy depends on the dataset " + dependency.name + '.')
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] The reason that it depends on this dataset is becuase in one of your condition's Javascript Code node, you have written an expression that references this dataset. If you don't want to depend on this dataset, just locate that code and remove the mention.")
"[ERROR] The reason that it depends on this dataset is because in one of your condition's Javascript Code node, you have written an expression that references this dataset. If you don't want to depend on this dataset, just locate that code and remove the mention.")
return false
}
@@ -116,7 +116,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
for (let m = 0; m < marketList.length; m++) {
let currentMarket = marketList[m]
/*
We will iterate through all posible timeFrames.
We will iterate through all possible timeFrames.
*/
for (let n = 0; n < TS.projects.foundations.globals.timeFrames.marketTimeFramesArray().length; n++) {
const timeFrame = TS.projects.foundations.globals.timeFrames.marketTimeFramesArray()[n][0]
@@ -173,7 +173,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] Your strategy depends on the dataset " + dependency.name + '.')
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] The reason that it depends on this dataset is becuase in one of your condition's Javascript Code node, you have written an expression that references this dataset. If you don't want to depend on this dataset, just locate that code and remove the mention.")
"[ERROR] The reason that it depends on this dataset is because in one of your condition's Javascript Code node, you have written an expression that references this dataset. If you don't want to depend on this dataset, just locate that code and remove the mention.")
return false
}
@@ -188,7 +188,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
function trimDataFile(dataFile, recordDefinition) {
/*
Here we will discard all the records in a file that are outside of the current time range.
We will include the las element previous to the begining of the time range. This is needed
We will include the las element previous to the beginning of the time range. This is needed
because during the simulation, the current Time Frame is not the open one, but the previous to
the open, and if we do not include the previous to the initial datetime there will be no
current objects at the begining of the simulation for many time frames.
@@ -255,7 +255,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
for (let m = 0; m < marketList.length; m++) {
let currentMarket = marketList[m]
/*
We will iterate through all posible timeFrames.
We will iterate through all possible timeFrames.
*/
for (let n = 0; n < TS.projects.foundations.globals.timeFrames.dailyTimeFramesArray().length; n++) {
const timeFrameLabel = TS.projects.foundations.globals.timeFrames.dailyTimeFramesArray()[n][1]
@@ -340,7 +340,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] Your strategy depends on the dataset " + dependency.name + '.')
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] The reason that it depends on this dataset is becuase in one of your condition's Javascript Code node, you have written an expression that references this dataset. If you don't want to depend on this dataset, just locate that code and remove the mention.")
"[ERROR] The reason that it depends on this dataset is because in one of your condition's Javascript Code node, you have written an expression that references this dataset. If you don't want to depend on this dataset, just locate that code and remove the mention.")
return false
}
if (response.err.result !== TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
@@ -369,7 +369,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
exchange,
callBackFunction
) {
/* Fisrt Phase: Validations */
/* First Phase: Validations */
let mainDependency = {}
/*
THe first thing we do is to build an array of all the
@@ -392,7 +392,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
Next we will build an array of output datasets of this process.
We are not going to use it right now, but later down the line,
we do it just to be able to validate that all nodes and config
are ok before letting this provess run too far.
are ok before letting this process run too far.
*/
let outputDatasets = TS.projects.visualScripting.utilities.nodeFunctions.nodeBranchToArray(TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processOutput, 'Output Dataset')
/*
@@ -400,7 +400,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () {
*/
if (TS.projects.foundations.functionLibraries.singleMarketFunctions.validateOutputDatasets(processIndex, outputDatasets, callBackFunction) !== true) { return }
/* Second Phase: Bilding the chart data structure */
/* Second Phase: Building the chart data structure */
/*
This phase is about transforming the inputs into a format,
@@ -1,19 +1,19 @@
exports.newFoundationsProcessModulesDataDependencies = function (processIndex) {
/*
This module mantains a curated array of Data Dependency nodes,
This module maintains a curated array of Data Dependency nodes,
which is not exactly the ones listed at the Process Dependencies,
but a smaller subset based on the circunstances found at the user's
but a smaller subset based on the circumstances found at the user's
workspace. For example:
1. Dependencies without a Reference Parent are filtered out.
2. Dependencies which don't have a Data Set are filtered out.
It also mantains an array of Data Set Modules, which are the
It also maintains an array of Data Set Modules, which are the
one's that ultimately know how to load a file based on the
network configuration found at the workspace at the moment this
Task was launched.
Finally it mantains a Filter map, that allows the users of this module
Finally it maintains a Filter map, that allows the users of this module
to filter out data dependencies based on the code written by users
at the Javascript Code and Formula nodes.
*/
@@ -45,7 +45,7 @@
function initialize(callBackFunction) {
try {
/* Basic Valdidations */
/* Basic Validations */
if (TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.processDependencies !== undefined) {
/*
First we will get all the data dependencies of the bot, as defined at the Trading Mine.
@@ -127,12 +127,12 @@
let alreadyCalledBack = false
/*
The current curatedDependencyNodeArray that we have includes all the dependencies daclared in the Data Mine | Trading Mine | Learning Mine
The current curatedDependencyNodeArray that we have includes all the dependencies declared in the Data Mine | Trading Mine | Learning Mine
process dependencies, minus the ones without reference parent, meaning that references Data Mines that are
not present at the workspace. From all the remaining dependencies there will be others that we need to
filter out, and they are the ones which the user does not have a data product anywhere on the network where
this task is running, that is storing the data associated to this dependency. The way we use to filter this
out is by analizyng the response of the initialization call to the DataSet module. If it did not fail but
out is by analyzing the response of the initialization call to the DataSet module. If it did not fail but
it was not initialized, then we will assume this happened because the data could not be located and we will
assume the user did this on purpose and we will filter out this dependency by not putting it on this new array.
*/
@@ -181,7 +181,7 @@
if (receivedDependencyFilters !== undefined) {
/*
If we received a Dependency Filter from the UI, we will make these excta checks
If we received a Dependency Filter from the UI, we will make these exact checks
before instantiating a Data Set Module.
*/
if (dataDependency.referenceParent === undefined) {
@@ -1,6 +1,6 @@
exports.newFoundationsProcessModulesDataset = function (processIndex) {
/*
This module represents a Dataset at a certain localtion on the
This module represents a Dataset at a certain location on the
network, and it is able to load a file from that dataset or
write one into it.
*/
@@ -38,7 +38,7 @@ exports.newFoundationsProcessModulesDataset = function (processIndex) {
}
if (thisObject.node.config.codeName === undefined) {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Dataset witn no codeName defined -> Product Dataset = " + JSON.stringify(thisObject.node));
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Dataset with no codeName defined -> Product Dataset = " + JSON.stringify(thisObject.node));
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return
}
@@ -50,7 +50,7 @@ exports.newFoundationsProcessModulesDataset = function (processIndex) {
}
if (thisObject.node.parentNode.config.codeName === undefined) {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Product Definition witn no codeName defined -> Product Definition = " + JSON.stringify(thisObject.node.parentNode));
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Product Definition with no codeName defined -> Product Definition = " + JSON.stringify(thisObject.node.parentNode));
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return
}
@@ -62,7 +62,7 @@ exports.newFoundationsProcessModulesDataset = function (processIndex) {
}
if (thisObject.node.parentNode.parentNode.config.codeName === undefined) {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Bot witn no codeName defined. Bot = " + JSON.stringify(thisObject.node.parentNode.parentNode));
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Bot with no codeName defined. Bot = " + JSON.stringify(thisObject.node.parentNode.parentNode));
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return
}
@@ -74,7 +74,7 @@ exports.newFoundationsProcessModulesDataset = function (processIndex) {
}
if (thisObject.node.parentNode.parentNode.parentNode.config.codeName === undefined) {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Data Mine witn no codeName defined. Data Mine = " + JSON.stringify(thisObject.node.parentNode.parentNode.parentNode));
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] initialize -> Data Mine with no codeName defined. Data Mine = " + JSON.stringify(thisObject.node.parentNode.parentNode.parentNode));
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return
}
@@ -228,7 +228,7 @@ exports.newFoundationsProcessModulesDataset = function (processIndex) {
if (startingNode.id === productDefinition.id) {
/*
We reached the point that we found a path to the Product Definition.
Now we know that the last netwrokNode is the node that has the correct
Now we know that the last network Node is the node that has the correct
path.
*/
found = true
@@ -237,8 +237,8 @@ exports.newFoundationsProcessModulesDataset = function (processIndex) {
if (startingNode.type === 'LAN Network Node') {
/*
We will store the Network Node here so that if we find the rignt path
we can know from which Netwrok Node it going through.
We will store the Network Node here so that if we find the right path
we can know from which Network Node it going through.
*/
lanNetworkNode = startingNode
}
@@ -113,7 +113,7 @@ exports.newFoundationsTaskModulesDebugLog = function (processIndex) {
writeLog();
/* This is the implementation of the mechanism to auto-mantain logs. */
/* This is the implementation of the mechanism to auto-maintain logs. */
if (contentToPersist.indexOf('[ERROR]') < 0 && contentToPersist.indexOf('[PERSIST]') < 0 && contentToPersist.indexOf('[IMPORTANT]') < 0) {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).LOGS_TO_DELETE_QUEUE.push(filePath + '/' + fileName)
}
@@ -103,7 +103,7 @@
}
function finalize() {
/* Before disconnecting we will forze all eventListeners to stop listening. */
/* Before disconnecting we will force all eventListeners to stop listening. */
const eventListenersArray = [...eventListeners.values()]
for (let i = 0; i < eventListenersArray.length; i++) {
let handler = eventListenersArray[i]
@@ -48,11 +48,11 @@ exports.newFoundationsUtilitiesErrorHandlingFunctions = function () {
err.docs = docs
err.node = node
/*
Users will not always be watching the console when an execption happens, for that
Users will not always be watching the console when an exception happens, for that
reason we will send it also to the Debug Logs.
*/
let errorDetails = err.errorDetails
if (errorDetails === undefined) { errorDetails = "No error details availabe."}
if (errorDetails === undefined) { errorDetails = "No error details available."}
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] " + errorDetails)
@@ -281,7 +281,7 @@ function newFoundationsFunctionLibraryChartingSpaceFunctions() {
let timelineChart = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(timeMachine, 'Timeline Chart')
/*
The Mine Product Node might be collapesd and since its creation it never
The Mine Product Node might be collapsed and since its creation it never
received the physics call, so we will do the call so that it properly
sets its own name, which we are going to reuse here.
*/
@@ -275,7 +275,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
dataTasks = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(lanNetworkNode, 'Data Tasks')
}
/*
We will make ourserves sure that the Project Data Tasks nodes are there.
We will make ourselves sure that the Project Data Tasks nodes are there.
*/
dataTasks.payload.uiObject.menu.internalClick('Add Missing Project Data Tasks')
dataTasks.payload.uiObject.menu.internalClick('Add Missing Project Data Tasks')
@@ -308,7 +308,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
learningTasks = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(lanNetworkNode, 'Learning Tasks')
}
/*
We will make ourserves sure that the Project Learning Tasks nodes are there.
We will make ourselves sure that the Project Learning Tasks nodes are there.
*/
learningTasks.payload.uiObject.menu.internalClick('Add Missing Project Learning Tasks')
learningTasks.payload.uiObject.menu.internalClick('Add Missing Project Learning Tasks')
@@ -355,14 +355,14 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
function installEnvironment(environmentType) {
/*
Now we install the environmnet at the current Network Node
Now we install the environment at the current Network Node
*/
let tradingTasks = UI.projects.visualScripting.utilities.branches.findInBranch(lanNetworkNode, environmentType, node, true)
if (tradingTasks === undefined) {
tradingTasks = UI.projects.visualScripting.functionLibraries.uiObjectsFromNodes.addUIObject(lanNetworkNode, environmentType)
}
/*
We will make ourserves sure that the Project Trading Tasks nodes are there.
We will make ourselves sure that the Project Trading Tasks nodes are there.
*/
tradingTasks.payload.uiObject.menu.internalClick('Add Missing Project Trading Tasks')
tradingTasks.payload.uiObject.menu.internalClick('Add Missing Project Trading Tasks')
@@ -414,7 +414,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
dataMinesData.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_90
/*
We will make ourserves sure that the Project Data Products nodes are there.
We will make ourselves sure that the Project Data Products nodes are there.
*/
dataMinesData.payload.uiObject.menu.internalClick('Add Missing Project Data Products')
dataMinesData.payload.uiObject.menu.internalClick('Add Missing Project Data Products')
@@ -453,7 +453,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
learningMinesData.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_90
/*
We will make ourserves sure that the Project Learning Products nodes are there.
We will make ourselves sure that the Project Learning Products nodes are there.
*/
learningMinesData.payload.uiObject.menu.internalClick('Add Missing Project Learning Products')
learningMinesData.payload.uiObject.menu.internalClick('Add Missing Project Learning Products')
@@ -508,7 +508,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
tradingMinesData.payload.floatingObject.angleToParent = ANGLE_TO_PARENT.RANGE_90
/*
We will make ourserves sure that the Project Trading Products nodes are there.
We will make ourselves sure that the Project Trading Products nodes are there.
*/
tradingMinesData.payload.uiObject.menu.internalClick('Add Missing Project Trading Products')
tradingMinesData.payload.uiObject.menu.internalClick('Add Missing Project Trading Products')
@@ -553,7 +553,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
function installInChartingSpace(chartingSpace) {
/*
We will make ourserves sure that the Project Data Tasks nodes are there.
We will make ourselves sure that the Project Data Tasks nodes are there.
*/
chartingSpace.payload.uiObject.menu.internalClick('Add Missing Project Dashboards')
chartingSpace.payload.uiObject.menu.internalClick('Add Missing Project Dashboards')
@@ -579,7 +579,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
/*
We delete all the existing Time Machines related to the market we are currently installing.
For that, we make a new array with the existing Time Machines so that the deleting
of each node does not affect the proccessing of the whole set.
of each node does not affect the processing of the whole set.
*/
let timeMachines = []
for (let i = 0; i < dashboard.timeMachines.length; i++) {
@@ -591,7 +591,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
let session = timeMachine.payload.referenceParent
if (session === undefined || session.cleaned === true) {
/*
This is what usually happens, that the intall process make these
This is what usually happens, that the install process make these
time machines to lose their reference parent since the install
process deletes them.
*/
@@ -638,7 +638,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
function uninstallInChartingSpace(chartingSpace) {
/* Delete all time machines which are referencing sessions inside the market being unistalled. */
/* Delete all time machines which are referencing sessions inside the market being uninstalled. */
let timeMachines = UI.projects.visualScripting.utilities.branches.nodeBranchToArray(chartingSpace, 'Time Machine')
for (let i = 0; i < timeMachines.length; i++) {
let timeMachine = timeMachines[i]
@@ -675,7 +675,7 @@ function newFoundationsFunctionLibraryCryptoEcosystemFunctions() {
}
}
/* Scan Networks for the market being unistalled to delete it. */
/* Scan Networks for the market being uninstalled to delete it. */
for (let i = 0; i < rootNodes.length; i++) {
let rootNode = rootNodes[i]
if (rootNode.type === 'LAN Network') {
Loaded 100 of 151 files, more files were not shown because too many files have changed in this diff. Show more