"Fixed Typos - Will add more in another PR"
This commit is contained in:
1 parent
04082339fc
commit
824843f70f
122 files changed
+395
-395
No files matched your search
+2
-2
@@ -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 = {}
|
||||
|
||||
@@ -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]) {
|
||||
|
||||
@@ -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.'
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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.')
|
||||
|
||||
@@ -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 () {
|
||||
|
||||
@@ -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
@@ -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--) {
|
||||
|
||||
@@ -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) }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
+1
-1
@@ -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. ')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -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": {
|
||||
|
||||
@@ -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()
|
||||
|
||||
+11
-11
@@ -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;
|
||||
|
||||
+2
-2
@@ -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;
|
||||
|
||||
+13
-13
@@ -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()
|
||||
|
||||
+18
-18
@@ -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) {
|
||||
/*
|
||||
|
||||
@@ -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('.', ' .')
|
||||
|
||||
+9
-9
@@ -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;
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
+7
-7
@@ -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();
|
||||
|
||||
|
||||
+1
-1
@@ -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
-1
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -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
-1
@@ -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": [
|
||||
|
||||
+2
-2
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+2
-2
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -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",
|
||||
|
||||
+1
-1
@@ -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",
|
||||
|
||||
+1
-1
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
+4
-4
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+1
-1
@@ -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": [
|
||||
|
||||
+1
-1
@@ -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": [
|
||||
|
||||
+1
-1
@@ -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": [
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+3
-3
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+1
-1
@@ -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": [
|
||||
|
||||
+1
-1
@@ -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": [
|
||||
|
||||
+1
-1
@@ -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": [
|
||||
|
||||
+1
-1
@@ -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": [
|
||||
|
||||
+1
-1
@@ -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",
|
||||
|
||||
+1
-1
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+5
-5
@@ -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",
|
||||
|
||||
+2
-2
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+5
-5
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+6
-6
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+5
-5
@@ -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",
|
||||
|
||||
+5
-5
@@ -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",
|
||||
|
||||
+5
-5
@@ -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",
|
||||
|
||||
+4
-4
@@ -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",
|
||||
|
||||
+4
-4
@@ -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
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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') {
|
||||
|
||||
@@ -4,7 +4,7 @@ function newFoundationsFunctionLibraryDependenciesFilter() {
|
||||
on, that is later used to filter out all the other indicators
|
||||
the Trading Bot depends on.
|
||||
|
||||
The function will scen a node branch, most likely a Trading System,
|
||||
The function will scan a node branch, most likely a Trading System,
|
||||
looking into the code property of each node. It will analyze it's
|
||||
content and try to make a list of all indicators mentioned at the code
|
||||
text and at which time frames they are mentioned.
|
||||
@@ -50,7 +50,7 @@ function newFoundationsFunctionLibraryDependenciesFilter() {
|
||||
let schemaDocument = getSchemaDocument(node)
|
||||
if (schemaDocument !== undefined) {
|
||||
if (schemaDocument.childrenNodesProperties !== undefined) {
|
||||
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
|
||||
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoid counting each property of those as individual children.
|
||||
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
|
||||
let property = schemaDocument.childrenNodesProperties[i]
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
|
||||
The chart space is where all the charts live. What this space contains is a type of object we call Time Machine. A Time Machine is a cointainer of
|
||||
charts objects. The idea is simple, all the chart objects are ploted according to the time of the Time Machine object. When the time of the Time Machine
|
||||
changes, then all charts in it are replotted with the corresponging data.
|
||||
The chart space is where all the charts live. What this space contains is a type of object we call Time Machine. A Time Machine is a container of
|
||||
charts objects. The idea is simple, all the chart objects are plotted according to the time of the Time Machine object. When the time of the Time Machine
|
||||
changes, then all charts in it are replotted with the corresponding data.
|
||||
|
||||
*/
|
||||
|
||||
@@ -108,7 +108,7 @@ function newFoundationsChartingSpace() {
|
||||
}
|
||||
|
||||
if (thisObject.payload === undefined) {
|
||||
// if (ERROR_LOG === true) { logger.write('[WARN] initialize -> There must exist a Charting Space at the Design Space in order to enable Charts. PLease create one and refreash your browser. ') }
|
||||
// if (ERROR_LOG === true) { logger.write('[WARN] initialize -> There must exist a Charting Space at the Design Space in order to enable Charts. PLease create one and refresh your browser. ') }
|
||||
return
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ function newFoundationsChartingSpace() {
|
||||
/*
|
||||
Now we see which is the inner most container that has it.
|
||||
In this case we will ask all the time machines even if one of them already returned a matching container.
|
||||
This will help the others know they are not on ofcus
|
||||
This will help the others know they are not on focus
|
||||
*/
|
||||
let containerFound
|
||||
for (let i = 0; i < thisObject.timeMachines.length; i++) {
|
||||
|
||||
@@ -327,11 +327,11 @@ function newCoordinateSystem() {
|
||||
function transformThisPoint(point) {
|
||||
/*
|
||||
|
||||
This is the straigh fordward transformation this object provides. The input is a point on the data set that wants to be plotted in a timeline.
|
||||
This is the straight forward transformation this object provides. The input is a point on the data set that wants to be plotted in a timeline.
|
||||
The x value of the point must be a datetime.valueOf() and is going to be transformed into an x value on the coordinate system of the timeline.
|
||||
The y value should be a value in the dataset at that moment in time. Depending on how this coordinate system was initialized then are the
|
||||
possible values y can have. For sure it must be in the range between the min and max y declared at initialization. The y value has a special
|
||||
treatment since the browser canvas object used, has a zero y value at the top, while the timeline we use has a zero y value at the botton,
|
||||
treatment since the browser canvas object used, has a zero y value at the top, while the timeline we use has a zero y value at the bottom,
|
||||
for that reason y is flipped.
|
||||
|
||||
Besides this, what we do is to multiply by the scale, which in turn is calculated at initialization time depending on the values provided.
|
||||
|
||||
@@ -12,7 +12,7 @@ function newAutoScaleButton() {
|
||||
finalize: finalize
|
||||
}
|
||||
|
||||
/* Cointainer stuff */
|
||||
/* Container stuff */
|
||||
thisObject.container = newContainer()
|
||||
thisObject.container.name = 'Auto Scale Button'
|
||||
thisObject.container.initialize()
|
||||
|
||||
@@ -396,7 +396,7 @@ function newCircularMenuItem() {
|
||||
setStatus(thisObject.workingLabel, UI_COLOR.GREY, undefined, STATUS_PRIMARY_ACTION_WORKING) // Status will not expire, will only change with a callback. Mouse Clicks will be ignored.
|
||||
}
|
||||
|
||||
/* Execute the action and wait for callbacks to update our statuus. */
|
||||
/* Execute the action and wait for callbacks to update our status. */
|
||||
let relatedNodeProject = thisObject.actionProject
|
||||
if (thisObject.relatedUiObjectProject !== undefined) {
|
||||
relatedNodeProject = thisObject.relatedUiObjectProject
|
||||
@@ -420,7 +420,7 @@ function newCircularMenuItem() {
|
||||
setStatus(thisObject.secondaryWorkingLabel, UI_COLOR.GREY, undefined, STATUS_SECONDARY_ACTION_WORKING) // Status will not expire, will only change with a callback. Mouse Clicks will be ignored.
|
||||
}
|
||||
|
||||
/* Execute the action and wait for callbacks to update our statuus. */
|
||||
/* Execute the action and wait for callbacks to update our status. */
|
||||
thisObject.actionFunction({ node: thisObject.payload.node, name: thisObject.secondaryAction, project: thisObject.actionProject, relatedNodeType: thisObject.relatedUiObject, callBackFunction: onSecondaryCallBack })
|
||||
return
|
||||
}
|
||||
@@ -477,7 +477,7 @@ function newCircularMenuItem() {
|
||||
labelToPrint = text
|
||||
backgroundColorToUse = backgroundColor
|
||||
temporaryStatus = newStatus
|
||||
temporaryStatusCounter = newStatus // This will often put this into negatives numbers, which will disable the counting back and automatic reseting.
|
||||
temporaryStatusCounter = newStatus // This will often put this into negatives numbers, which will disable the counting back and automatic resetting.
|
||||
if (waitingCycles !== undefined) { // This will override the often negative value with a positive one that will tend to zero onto the default state.
|
||||
temporaryStatusCounter = waitingCycles
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ function newFoundationsUtilitiesDownload() {
|
||||
|
||||
function downloadCanvas(filename, canvasToUse) {
|
||||
let data = canvasToUse.toDataURL('image/png', 1)
|
||||
/* Change MIME type to trick the browser to downlaod the file instead of displaying it */
|
||||
/* Change MIME type to trick the browser to download the file instead of displaying it */
|
||||
data = data.replace(/^data:image\/[^;]*/, 'data:application/octet-stream')
|
||||
|
||||
/* In addition to <a>'s "download" attribute, you can define HTTP-style headers */
|
||||
@@ -40,7 +40,7 @@ function newFoundationsUtilitiesDownload() {
|
||||
let FINAL_WIDTH = browserCanvas.width - INITIAL_WIDTH
|
||||
|
||||
if (ARE_WE_RECORDING_A_MARKET_PANORAMA === false) {
|
||||
/* We start recording the panorame. */
|
||||
/* We start recording the panorama. */
|
||||
ARE_WE_RECORDING_A_MARKET_PANORAMA = true
|
||||
marketPanoramaCanvas = document.createElement('canvas')
|
||||
marketPanoramaCanvas.width = INITIAL_WIDTH * 50
|
||||
|
||||
Loaded 100 of 122 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user