Pulling in Superalgos-upstream/develop into Portfolio-Management

This commit is contained in:
Philip Love committed 2021-11-02 01:11:07 -04:00
commit c895d6ba80
363 files changed
+129927 -59764

No files matched your search

+2 -1
View File
@@ -3,7 +3,8 @@
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence, these will be requested for
# review when someone opens a pull request.
* @Superalgos/core-devs
* @Superalgos/foundations-project
# Project Teams
/Projects/Algorithmic-Trading @Superalgos/algorithmic-trading-project
+2 -2
View File
@@ -12,12 +12,12 @@ exports.newDesktopRoot = function newDesktopRoot() {
async function run() {
/*
The DK object is accesible everywhere at the Superalgos Desktop App.
The DK object is accessible everywhere at the Superalgos Desktop App.
It provides access to all modules built for this App.
*/
global.DK = {}
/*
The SA object is accesible everywhere at the Superalgos Desktop App.
The SA object is accessible everywhere at the Superalgos Desktop App.
It provides access to all modules built for Superalgos in general.
*/
global.SA = {}
+1 -1
View File
@@ -4,7 +4,7 @@ COPY . .
RUN apk add --no-cache --virtual .build-deps make g++ \
&& apk add --no-cache python3 \
&& if [ "$(uname -m)" = "x86_64" ]; then node setup noShortcuts tensorflow; else node setup noShortcuts; fi \
&& mkdir -p Data-Storage Log-Files My-Workspaces \
&& mkdir -p ./Platform/My-Data-Storage ./Platform/My-Log-Files ./Platform/My-Workspaces \
&& addgroup superalgos \
&& adduser --disabled-password --no-create-home --ingroup superalgos superalgos \
&& chown -R superalgos:superalgos /app \
+9 -9
View File
@@ -111,9 +111,9 @@ docker run \
--user $(id -u):$(id -g) \
-p 18041:18041 \
-p 34248:34248 \
-v $(pwd)/Data-Storage:/app/Data-Storage \
-v $(pwd)/Log-Files:/app/Log-Files \
-v $(pwd)/My-Workspaces:/app/My-Workspaces \
-v $(pwd)/Data-Storage:/app/Platform/Data-Storage \
-v $(pwd)/Log-Files:/app/Platform/Log-Files \
-v $(pwd)/My-Workspaces:/app/Platform/My-Workspaces \
ghcr.io/superalgos/superalgos:latest
```
@@ -135,9 +135,9 @@ docker run \
--user $(id -u):$(id -g) \
-p 18041:18041 \
-p 34248:34248 \
-v $(pwd)/Data-Storage:/app/Data-Storage \
-v $(pwd)/Log-Files:/app/Log-Files \
-v $(pwd)/My-Workspaces:/app/My-Workspaces \
-v $(pwd)/Data-Storage:/app/Platform/Data-Storage \
-v $(pwd)/Log-Files:/app/Platform/Log-Files \
-v $(pwd)/My-Workspaces:/app/Platform/My-Workspaces \
ghcr.io/superalgos/superalgos:latest
```
@@ -169,9 +169,9 @@ services:
- '34248:34248'
- '18041:18041'
volumes:
- ./Data-Storage:/app/Data-Storage
- ./Log-Files:/app/Log-Files
- ./My-Workspaces:/app/My-Workspaces
- ./Data-Storage:/app/Platform/Data-Storage
- ./Log-Files:/app/Platform/Log-Files
- ./My-Workspaces:/app/Platform/My-Workspaces
restart: on-failure
```
+2 -2
View File
@@ -12,12 +12,12 @@ exports.newNetworkRoot = function newNetworkRoot() {
async function run() {
/*
The NT object is accesible everywhere at the Superalgos Network.
The NT object is accessible everywhere at the Superalgos Network.
It provides access to all modules built for this Network.
*/
global.NT = {}
/*
The SA object is accesible everywhere at the Superalgos Network.
The SA object is accessible everywhere at the Superalgos Network.
It provides access to all modules built for Superalgos in general.
*/
global.SA = {}
+10 -10
View File
@@ -34,7 +34,7 @@
if (eventHandler === undefined) {
/*
We will only create event handlers which were not created before. Remember that someone trying to listen events
at an event handler that does not exist, will create that eventhandler, so it is possible that the emitter
at an event handler that does not exist, will create that event handler, so it is possible that the emitter
when trying to create the event handler in fact was late and the event handler is already there if the listener
arrived here first. An event handler created with this method is not destroyed if there are no listeners or they
all leave.
@@ -50,8 +50,8 @@
let eventHandler = eventHandlers.get(command.eventHandlerName)
if (eventHandler !== undefined) {
/*
We will only delete event handlers which have noone listening, allowing a listener to continue listening even
when the event emitter is gone, asuming that it could come back at some point in time and resume emitting.
We will only delete event handlers which have no one listening, allowing a listener to continue listening even
when the event emitter is gone, assuming that it could come back at some point in time and resume emitting.
*/
if (eventHandler.listeners.length === 0) {
eventHandlers.delete(command.eventHandlerName)
@@ -68,8 +68,8 @@
if (eventHandler === undefined) {
/*
We will create event handlers which were not created before if a listener tries to listen to a handler that does not
exist before the emitter comes and create it. This is to aviod syncronization problems and also problems with emitters life
cycles with higher frecuency that the ones of listeners. Created in this way, event handlers are marked for deletion if
exist before the emitter comes and create it. This is to avoid synchronization problems and also problems with emitters life
cycles with higher frequency that the ones of listeners. Created in this way, event handlers are marked for deletion if
all listeners stop listening at one point in time.
*/
eventHandler = newEventHandler()
@@ -104,7 +104,7 @@
if (eventHandler === undefined) {
/* If the event handler does not exist anymore, then there is no need to perform further actiions. */
/* If the event handler does not exist anymore, then there is no need to perform further actions. */
sendResponse(global.DEFAULT_OK_RESPONSE)
return
}
@@ -112,7 +112,7 @@
eventHandler.stopListening(command.eventHandlerName, command.eventType, command.callerId, command.eventSubscriptionId)
/*
We check here if there are no more listeners and the event handler original emmiter is also gone, then we need to delete
We check here if there are no more listeners and the event handler original emitter is also gone, then we need to delete
this event handlers since chances are that is not needed anymore.
*/
if (eventHandler.listeners.length === 0 && eventHandler.deleteWhenAllListenersAreGone === true) {
@@ -130,7 +130,7 @@
eventHandler = newEventHandler()
eventHandlers.set(command.eventHandlerName, eventHandler)
/* No matter if it is the listener or the emiter the one that acts first, if an event handler does not exist we just create it acan keep it there. */
/* No matter if it is the listener or the emitter the one that acts first, if an event handler does not exist we just create it and keep it there. */
}
//console.log("[INFO] Client -> Events Server -> Raising Event " + command.eventHandlerName + " " + command.eventType)
@@ -163,7 +163,7 @@
let thisObject = {
name: undefined, // This is for debugging purposes only.
deleteWhenAllListenersAreGone: false,
listeners: [], // Here we store all the functions we will call when an event is raiseed.
listeners: [], // Here we store all the functions we will call when an event is raised.
listenToEvent: listenToEvent,
stopListening: stopListening,
raiseEvent: raiseEvent,
@@ -181,7 +181,7 @@
/*
We can not allow to have the exact same listener more than once. In case that we find a listener trying to listen again, the first record will
be deleted and we are just going to consider the last one comming in.
be deleted and we are just going to consider the last one coming in.
*/
for (let i = 0; i < thisObject.listeners.length; i++) {
if (eventHandlerName === thisObject.listeners[i][0] && eventType === thisObject.listeners[i][1] && callerId === thisObject.listeners[i][2]) {
+9 -8
View File
@@ -295,7 +295,7 @@ exports.newGithubServer = function newGithubServer() {
let fileContent // File content of the only file at the PR
let userProfile // User Profile Object
let githubUsername // The Github user name of who is submitting the Pull Request
let mergeResponse // The response received from the call to Gihub to merge the Pull Request
let mergeResponse // The response received from the call to Github to merge the Pull Request
if (await validatePrHasMoreThanOneFile() === false) { continue }
if (await validateFileNameEqualsGithubUsername() === false) { continue }
@@ -310,13 +310,13 @@ exports.newGithubServer = function newGithubServer() {
if (await mergePullRequest() === false) {
console.log('[WARN] Github Server -> mergeGithubPullRequests -> Merge Failed -> Pull Request "' + pullRequest.title + '" not merged because Github could not merge it. -> mergeResponse.message = ' + mergeResponse.data.message)
} else {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Merge Succed -> Pull Request "' + pullRequest.title + '" successfully merged. -> mergeResponse.message = ' + mergeResponse.data.message)
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Merge Succeed -> Pull Request "' + pullRequest.title + '" successfully merged. -> mergeResponse.message = ' + mergeResponse.data.message)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
await octokit.rest.issues.createComment({
owner: owner,
repo: repo,
issue_number: pullRequest.number,
body: 'This Pull Request was automatically merged by the Superalgos Governance System because it was detected that the Github User " ' + githubUsername + '" who submitted it, modified its own User Profile Plugin File and nothning else but that file. All validations were successfull.'
body: 'This Pull Request was automatically merged by the Superalgos Governance System because it was detected that the Github User " ' + githubUsername + '" who submitted it, modified its own User Profile Plugin File and nothing else but that file. All validations were successful.'
});
}
@@ -378,7 +378,7 @@ exports.newGithubServer = function newGithubServer() {
fileName = splittedFileName[0]
githubUsername = pullRequest.user.login
if (githubUsername !== fileName) {
if (githubUsername.toLowerCase() !== fileName.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #2 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the File Name. -> Github Username = ' + githubUsername + '-> fileName = ' + fileName)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -420,7 +420,7 @@ exports.newGithubServer = function newGithubServer() {
*/
let config = JSON.parse(userProfile.config)
let messageSigned = config.signature.message
if (messageSigned !== githubUsername) {
if (messageSigned.toLowerCase() !== githubUsername.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #4 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the Message Signed at the User Profile. -> Github Username = ' + githubUsername + '-> messageSigned = ' + messageSigned)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -480,7 +480,7 @@ exports.newGithubServer = function newGithubServer() {
/*
Validation #6: The name of the User Profile node is not the Github Username.
*/
if (userProfile.name !== githubUsername) {
if (userProfile.name.toLowerCase() !== githubUsername.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #6 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Github Username is not equal to the User Profile node\'s name. -> Github Username = ' + githubUsername + '-> userProfile.name = ' + userProfile.name)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -628,7 +628,7 @@ exports.newGithubServer = function newGithubServer() {
*/
let messageSigned = config.signature.message
if (messageSigned !== githubUsername) {
if (messageSigned.toLowerCase() !== githubUsername.toLowerCase()) {
console.log('[INFO] Github Server -> mergeGithubPullRequests -> Validation #9 Failed -> Pull Request "' + pullRequest.title + '" not merged because the Signing Account ' + signingAccount.name + ' has not signed the current Github User Account, but something else. -> messageSigned = ' + messageSigned + '-> githubUsername = ' + githubUsername)
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -743,7 +743,7 @@ exports.newGithubServer = function newGithubServer() {
owner: owner,
repo: repo,
issue_number: pullRequest.number,
body: 'Hi, this is the Superalgos Governance System taking notice that you have submitted a pull request directly to the master branch.\n\nThanks for submitting a PR to the Superalgos Project. We value every contribution and everyone is welcome to send PRs. Unfortunatelly we are not merging pull requests directly into the master branch. Consider resubmitting to the develop branch intstead. For your convinienve, you can swithch branches from within the app, at the footer of the Docs tab. \n\n I will close this pull request now and look forward for your next contribution either to the develop branch or any other branch available for this purpose.'
body: 'Hi, this is the Superalgos Governance System taking notice that you have submitted a pull request directly to the master branch.\n\nThanks for submitting a PR to the Superalgos Project. We value every contribution and everyone is welcome to send PRs. Unfortunately we are not merging pull requests directly into the master branch. Consider resubmitting to the develop branch instead. For your convenience, you can switch branches from within the app, at the footer of the Docs tab. \n\n I will close this pull request now and look forward for your next contribution either to the develop branch or any other branch available for this purpose.'
});
await PL.projects.foundations.utilities.asyncFunctions.sleep(GITHUB_API_WAITING_TIME)
@@ -775,6 +775,7 @@ exports.newGithubServer = function newGithubServer() {
}
} catch (err) {
if (err === undefined) { return }
console.log('[ERROR] Github Server -> mergeGithubPullRequests -> doGithub -> err.stack = ' + err.stack)
}
}
+202 -173
View File
@@ -1,3 +1,4 @@
const {graphql} = require("@octokit/graphql");
exports.newHttpInterface = function newHttpInterface() {
/*
@@ -252,7 +253,7 @@ exports.newHttpInterface = function newHttpInterface() {
}
console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Exchange-Market = ' + exchange + '-' + market)
console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Messeges Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
console.log('[INFO] httpInterface -> Webhook -> Fetch-Messages -> Messages Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(webhookMessages), httpResponse)
webhookMessages = []
@@ -300,7 +301,7 @@ exports.newHttpInterface = function newHttpInterface() {
console.log('[INFO] httpInterface -> Webhook -> New-Message -> Exchange-Market = ' + exchange + '-' + market)
console.log('[INFO] httpInterface -> Webhook -> New-Message -> messageReceived = ' + messageReceived)
console.log('[INFO] httpInterface -> Webhook -> New-Message -> Messeges waiting to be Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
console.log('[INFO] httpInterface -> Webhook -> New-Message -> Messages waiting to be Fetched by Webhooks Sensor Bot = ' + webhookMessages.length)
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
}
break
@@ -723,7 +724,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.')
@@ -862,172 +863,6 @@ exports.newHttpInterface = function newHttpInterface() {
break
}
case 'UserUpdate': {
try {
let commitMessage = unescape(requestPath[3])
const username = unescape(requestPath[4])
const token = unescape(requestPath[5])
const currentBranch = unescape(requestPath[6])
const contributionsBranch = unescape(requestPath[7])
let error
/* Unsaving # */
for (let i = 0; i < 10; i++) {
commitMessage = commitMessage.replace('_SLASH_', '/')
commitMessage = commitMessage.replace('_HASHTAG_', '#')
}
updateUser()
async function updateUser() {
await doGithub()
if (error !== undefined) {
let docs = {
project: 'Foundations',
category: 'Topic',
type: 'App Error - Contribution Not Sent',
anchor: undefined,
placeholder: {}
}
console.log('respond with docs ')
respondWithDocsObject(docs, error)
return
}
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
}
async function doGithub() {
const { Octokit } = SA.nodeModules.octokit
const octokit = new Octokit({
auth: token,
userAgent: 'Superalgos Beta 12'
})
const repo = 'Superalgos'
const owner = 'Superalgos'
const head = username + ':' + contributionsBranch
const base = currentBranch
const title = 'Contribution: ' + commitMessage
const path = 'Projects/Governance/Plugins/User-Profiles/' + username + '.json' ;
const sha = await getSHA(path, octokit);
let file = await SA.projects.communityPlugins.utilities.plugins.getPluginFileContent(
'Governance',
'User-Profiles',
username + '.json'
)
let buff = new Buffer.from(file, 'utf-8');
let encodedFile = buff.toString('base64');
try {
await octokit.repos.createOrUpdateFileContents({
owner: username,
repo: "Superalgos",
path,
message: title,
content: encodedFile,
sha,
branch: base
});
} catch (err) {
if (err.stack.indexOf('Error User Commit') >= 0) {
return
} else {
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> Method call produced an error.')
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> commitMessage = ' + commitMessage)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> username = ' + username)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> contributionsBranch = ' + contributionsBranch)
error = err
}
}
try {
await octokit.pulls.create({
owner,
repo,
title,
head,
base,
});
} catch (err) {
if (err.stack.indexOf('A pull request already exists') >= 0) {
return
} else {
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> Method call produced an error.')
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> commitMessage = ' + commitMessage)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> username = ' + username)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> contributionsBranch = ' + contributionsBranch)
error = err
}
}
}
async function getSHA(path, octokit) {
let sha = ''
try{
const result = await octokit.repos.getContent({
owner: username,
repo: "Superalgos",
path,
ref: currentBranch
});
sha = result.data.sha
return sha
} catch (err) {
if (err.message === 'Not Found') {
console.log("[User Not Found] -> Creating new user")
return sha
} else {
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> Method call produced an error.')
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> commitMessage = ' + commitMessage)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> username = ' + username)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGithub -> contributionsBranch = ' + contributionsBranch)
return sha
}
}
}
} catch (err) {
console.log('[ERROR] httpInterface -> App -> Contribute -> Method call produced an error.')
console.log('[ERROR] httpInterface -> App -> Contribute -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> App -> Contribute -> commitMessage = ' + commitMessage)
console.log('[ERROR] httpInterface -> App -> Contribute -> username = ' + username)
console.log('[ERROR] httpInterface -> App -> Contribute -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> App -> Contribute -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> App -> Contribute -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> App -> Contribute -> contributionsBranch = ' + contributionsBranch)
let error = {
result: 'Fail Because',
message: err.message,
stack: err.stack
}
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
}
break
}
case 'Checkout': {
try {
const currentBranch = unescape(requestPath[3])
@@ -1046,7 +881,7 @@ exports.newHttpInterface = function newHttpInterface() {
if (error === undefined) {
// Run node setup to prepare instance for branch change
await runNodeSetup()
// Return to UI that Branch is suggessfully changed
// Return to UI that Branch is successfully changed
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
} else {
let docs = {
@@ -1193,7 +1028,7 @@ exports.newHttpInterface = function newHttpInterface() {
case 'FixAppSchema': {
/*
We will use this process when we have moved APP SCHEMA files from one project to another, and we need to fixt the
We will use this process when we have moved APP SCHEMA files from one project to another, and we need to fix the
actions where this node was referenced, so that it points to the new project where the node has moved to.
*/
let customResponse = {
@@ -1294,7 +1129,7 @@ exports.newHttpInterface = function newHttpInterface() {
let fileProject = allAppSchemasFileProjects[i]
//console.log(fileProject, project)
if (fileProject === project) {
/* If the projec of the file is the same as the project found, then we consider this a match*/
/* If the project of the file is the same as the project found, then we consider this a match*/
hits = 1
continue
}
@@ -1439,6 +1274,200 @@ exports.newHttpInterface = function newHttpInterface() {
return
}
case 'UserProfile': {
try {
let mess = unescape(params.commitMessage)
const username = unescape(params.username)
const token = unescape(params.token)
const currentBranch = unescape(params.currentBranch)
const contributionsBranch = unescape(params.contributionsBranch)
let error
await updateUser()
async function updateUser() {
await doGithubUser()
if (error !== undefined) {
let docs = {
project: 'Governance',
category: 'Topic',
type: 'Gov Error - Contribution Not Sent',
anchor: undefined,
placeholder: {}
}
console.log('respond with docs ')
respondWithDocsObject(docs, error)
return
}
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
}
async function doGithubUser() {
const { Octokit } = SA.nodeModules.octokit
const octokit = new Octokit({
auth: token,
userAgent: 'Superalgos Beta 12'
})
const repo = 'Superalgos'
const owner = 'Superalgos'
const head = username + ':' + contributionsBranch
const base = currentBranch
const title = 'Contribution: ' + mess
const path = 'Projects/Governance/Plugins/User-Profiles/' + username + '.json' ;
const sha = await getSHA(path);
if (sha === undefined){
console.log('***** Abort GOV.USERPROFILE *****')
return
}
let file = await SA.projects.communityPlugins.utilities.plugins.getPluginFileContent(
'Governance',
'User-Profiles',
username + '.json'
)
let buff = new Buffer.from(file, 'utf-8');
let encodedFile = buff.toString('base64');
try {
await octokit.repos.createOrUpdateFileContents({
owner: username,
repo: "Superalgos",
path,
message: title,
content: encodedFile,
sha,
branch: base
});
} catch (err) {
if (err.stack.indexOf('Error User Commit') >= 0) {
return
} else {
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> commitMessage = ' + mess)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> contributionsBranch = ' + contributionsBranch)
error = err
}
}
try {
await octokit.pulls.create({
owner,
repo,
title,
head,
base,
});
} catch (err) {
if (err.stack.indexOf('A pull request already exists') >= 0) {
return
} else {
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> commitMessage = ' + mess)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> contributionsBranch = ' + contributionsBranch)
error = err
}
}
}
async function getSHA(path) {
let sha = ''
const { graphql } = SA.nodeModules.graphql
try{
const { repository } = await graphql(
'{ ' +
' repository(name: "SuperAlgos", owner: "' + username + '") {' +
' object(expression: "develop:' + path +'") {' +
' ... on Blob {' +
' oid' +
' }' +
' }' +
' name' +
' }' +
'}',
{
headers: {
authorization: 'token ' + token
},
}
)
if (repository.name === undefined){
console.log('***** Token permission needed : User:READ *****')
sha = undefined
error = '***** Token permission needed : User:READ *****'
return sha
}
if(repository.object === null ){
console.log("[User Not Found] -> Creating new user")
return sha
}
sha = repository.object.oid
return sha
} catch (err) {
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> commitMessage = ' + mess)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> doGithub -> contributionsBranch = ' + contributionsBranch)
return sha
}
}
} catch (err) {
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> Method call produced an error.')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> commitMessage = ' + mess)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> username = ' + username)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> token starts with = ' + token.substring(0, 10) + '...')
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> token ends with = ' + '...' + token.substring(token.length - 10))
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> Gov -> contributeUserProfile -> contributionsBranch = ' + contributionsBranch)
let error = {
result: 'Fail Because',
message: err.message,
stack: err.stack
}
SA.projects.foundations.utilities.httpResponses.respondWithContent(JSON.stringify(error), httpResponse)
}
break
}
case 'payContributors': {
console.log('----------------------------------------------------------------------------------------------')
console.log('DISTRIBUTION PROCESS STARTED')
@@ -1783,7 +1812,7 @@ exports.newHttpInterface = function newHttpInterface() {
let folder = unescape(requestPath[3])
let fileName = unescape(requestPath[4])
/*Beta 12 Refactoring Code: Remove this before realeasing beta 12.*/
/*Beta 12 Refactoring Code: Remove this before releasing beta 12.*/
if (fileName === 'Superalgos-CL.json') {
fileName = 'Superalgos-PL.json'
}
+4 -2
View File
@@ -290,7 +290,7 @@ exports.newWeb3Server = function newWeb3Server() {
console.log('----------------------------------------------------------------------------------------------')
for (let i = 0; i < paymentsArray.length; i++) {
await PL.projects.foundations.utilities.asyncFunctions.sleep(10000)
await PL.projects.foundations.utilities.asyncFunctions.sleep(15000)
let payment = paymentsArray[i]
await sendTokens(
i + 1,
@@ -360,7 +360,9 @@ exports.newWeb3Server = function newWeb3Server() {
transaction.sign(privateKeyBuffer)
console.log('Transaction:', rawTransaction)
const result = await web3.eth.sendSignedTransaction('0x' + transaction.serialize().toString('hex'))
let result
result = await web3.eth.sendSignedTransaction('0x' + transaction.serialize().toString('hex'))
.catch(err => {
console.log('[ERROR] sendSignedTransaction -> err =' + JSON.stringify(err))
})
+2 -2
View File
@@ -149,12 +149,12 @@ function newAnimation() {
}
}
/* We request the next frame to be drawn, and stablishing a loop */
/* We request the next frame to be drawn, and establish a loop */
/* Use this code for full animation speed. */
animationLoopHandle = window.requestAnimationFrame(animationLoop)
/* Use this code for max 10 frames per second animation speed, if the app is consumming too much of your CPU. */
/* Use this code for max 10 frames per second animation speed, if the app is consuming too much of your CPU. */
/*
setTimeout(nextLoop, 100)
function nextLoop () {
+2 -2
View File
@@ -47,7 +47,7 @@ function loadSuperalgos() {
loadDebugModule()
if ((browser.name !== "Chrome" && browser.name!=="Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) {
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version)
alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionality issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version)
}
function checkBrowserVersion () {
@@ -131,7 +131,7 @@ function loadSuperalgos() {
}
}
/* And Finally, we start loading all the scripts we will inmediatelly need. */
/* And Finally, we start loading all the scripts we will immediately need. */
function loadModules() {
let path = "AppLoader.js"
REQUIREJS([path], onRequired)
+12 -12
View File
@@ -172,7 +172,7 @@ function newCanvas() {
spaceDefinitionDrawMap.set(spaceDefinition.animationDrawIndex, spaceDefinition)
}
/* Build the maps that defines the secuence of execution of different events. */
/* Build the maps that defines the sequence of execution of different events. */
if (spaceDefinition.onMouseWheelIndex !== undefined) {
projectInstance.events.onMouseWheelMap.set(spaceDefinition.onMouseWheelIndex, spaceInstance)
}
@@ -373,7 +373,7 @@ function newCanvas() {
if (EDITOR_ON_FOCUS === true) {
/*
We will fordward the event to whoever is
We will forward the event to whoever is
controlling the editor.
*/
if (window.editorController !== undefined) {
@@ -650,7 +650,7 @@ function newCanvas() {
if ((event.ctrlKey === true || event.metaKey === true) && event.altKey === true) {
/* Shortcuts to nodes */
if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 65 && event.keyCode <= 90)) {
/* From here we prevent the default behaviour. Putting it earlier prevents imput box and text area to receive keystrokes */
/* From here we prevent the default behaviour. Putting it earlier prevents input box and text area to receive keystrokes */
event.preventDefault()
let nodeUsingThisKey = await UI.projects.foundations.spaces.designSpace.workspace.getNodeByShortcutKey(event.key)
@@ -771,11 +771,11 @@ function newCanvas() {
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
@@ -881,11 +881,11 @@ function newCanvas() {
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
@@ -992,18 +992,18 @@ function newCanvas() {
return
}
/* Then we check who is the current object underneeth the mounse. */
/* Then we check who is the current object underneath the mouse. */
let container
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
@@ -1063,11 +1063,11 @@ function newCanvas() {
/*
We will go through all the spaces defined at the project schema for each project
and we are going to query each space to see if they have the container that is at
the mouse position. We will order firt the spaces by the sequence order defined
the mouse position. We will order first the spaces by the sequence order defined
at the project schema specifically for this mouse event.
The order of the projects for events evaluations has intentionally been inverted,
because the latest project is drwan the last, on top of the others, that means that
because the latest project is drawn the last, on top of the others, that means that
events should belong to the last first.
*/
for (let i = PROJECTS_SCHEMA.length - 1; i >= 0; i--) {
+3 -3
View File
@@ -77,7 +77,7 @@ function newFileCloud () {
}
if (fileName === undefined) {
logger.write('[ERROR] getFile -> getFileRecursively -> Inconsistant data. Check the following: ')
logger.write('[ERROR] getFile -> getFileRecursively -> Inconsistent data. Check the following: ')
logger.write('[ERROR] getFile -> getFileRecursively -> pMine = ' + JSON.stringify(pMine))
logger.write('[ERROR] getFile -> getFileRecursively -> pBot = ' + JSON.stringify(pBot))
logger.write('[ERROR] getFile -> getFileRecursively -> pDataset = ' + JSON.stringify(pDataset))
@@ -85,7 +85,7 @@ function newFileCloud () {
logger.write('[ERROR] getFile -> getFileRecursively -> pMarket = ' + JSON.stringify(pMarket))
logger.write('[ERROR] getFile -> getFileRecursively -> ptimeFrameLabel = ' + JSON.stringify(ptimeFrameLabel))
throw ('Inconsistant data received.')
throw ('Inconsistent data received.')
}
if (pMarket !== undefined) {
@@ -152,7 +152,7 @@ function newFileCloud () {
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> filePath = ' + filePath) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> fileName = ' + fileName) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> Unexpected Error Ocurred.') }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> Unexpected Error Occurred.') }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> err = ' + err.stack) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> text = ' + text) }
if (ERROR_LOG === true) { logger.write('[ERROR] getFile -> getFileRecursively -> onFileReceived -> response = ' + response) }
+2 -2
View File
@@ -195,7 +195,7 @@ function newFileCursor() {
/*
We are implementing here an algorithm designed to save bandwidth, memory and processing power at the browser.
We say there is a saving mode where the cursor is running at a minimum size. When the end user aproaches the time period the cursor
We say there is a saving mode where the cursor is running at a minimum size. When the end user approaches the time period the cursor
is set, then it should exit the saving mode and go to its actual size.
To do this we are going to measure the distance from the Time Frame received to the one the cursors was initialized with.
@@ -427,7 +427,7 @@ function newFileCursor() {
let targetDate = new Date(cursorDate)
targetDate.setUTCDate(targetDate.getUTCDate() + j)
/* Small algorith to allow load first the current date, then alternate between the most forwad and the most backwards ones. */
/* Small algorithm to allow load first the current date, then alternate between the most forward and the most backwards ones. */
if (j === 0) { j++ } else {
if (j < 0) {
j = -j
+2 -2
View File
@@ -45,7 +45,7 @@ function newFileStorage(host, port, scheme='http') {
url = folder + filePath
}
/* Scaping # since it breaks the URL */
/* Escaping # since it breaks the URL */
url = url.replaceAll('#', '_HASHTAG_')
httpRequest(undefined, url, (response, fileContent) => {
@@ -64,7 +64,7 @@ function newFileStorage(host, port, scheme='http') {
let err = { code: 'The specified key does not exist.' }
callBackFunction(err)
} else {
console.log('Error geting the file from the serever:', err)
console.log('Error getting the file from the server:', err)
callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE)
}
}
+1 -1
View File
@@ -8,7 +8,7 @@ function newEventHandler() {
finalize: finalize
}
let eventHandlers = [] // Here we store all the functions we will call when an event is raiseed.
let eventHandlers = [] // Here we store all the functions we will call when an event is raised.
return thisObject
+2 -2
View File
@@ -225,7 +225,7 @@ function newEventsServerClient(lanNetworkNode) {
port = config.webSocketsPort
extwsurl = config.webSocketsExternalURL
/* Check if we really have to stablish the connection. */
/* Check if we really have to establish the connection. */
if (config.autoConnect === false) { return }
} catch (err) {
lanNetworkNode.payload.uiObject.setErrorMessage(
@@ -285,7 +285,7 @@ function newEventsServerClient(lanNetworkNode) {
}
}
WEB_SOCKETS_CONNECTION.onmessage = e => {
// console.log('Websoked Message Received: ' + e.data)
// console.log('WEB_SOCKET Message Received: ' + e.data)
let message = JSON.parse(e.data)
+8 -8
View File
@@ -6,7 +6,7 @@ function newFrame() {
let thisObject = {
type: 'Rectangle',
containerName: '', // This is for debugging purposes only.
parentFrame: undefined, // Here we store the parent cointainer zoom object.
parentFrame: undefined, // Here we store the parent container zoom object.
radius: 0,
offset: undefined,
position: undefined,
@@ -53,7 +53,7 @@ function newFrame() {
}
function isInViewPort() {
/* This function is usefull to know if the object who has this frame is currently appearing at least in part at the UI.projects.foundations.spaces.chartingSpace.viewport */
/* This function is useful to know if the object who has this frame is currently appearing at least in part at the UI.projects.foundations.spaces.chartingSpace.viewport */
point1 = {
x: 0,
@@ -78,7 +78,7 @@ function newFrame() {
}
function isCenterInViewPort() {
/* This function is usefull to know if the object who has this frame is currently appearing at least in part at the UI.projects.foundations.spaces.chartingSpace.viewport */
/* This function is useful to know if the object who has this frame is currently appearing at least in part at the UI.projects.foundations.spaces.chartingSpace.viewport */
point1 = {
x: thisObject.width * 40 / 100,
@@ -187,8 +187,8 @@ function newFrame() {
}
function isThisPointHere(point, outsideViewPort, dontTransform, padding) {
// The second parameter is usefull when you want to check a point that you already know is outside the viewport.
// The padding is a distance to the borders of the container. Can be either negative (outside, to increase the cointainer size) or positive (inside to decrease the cointainer size)
// The second parameter is useful when you want to check a point that you already know is outside the viewport.
// The padding is a distance to the borders of the container. Can be either negative (outside, to increase the container size) or positive (inside to decrease the cointainer size)
if (padding === undefined) { padding = 0 }
@@ -199,7 +199,7 @@ function newFrame() {
}
/* The point received is on the screen coordinates system, which already has zoom and displacement applied. We need to remove the zoom and displacement
in order to have the point on the containers coordinate system and be able to compare it with its dimmensions. */
in order to have the point on the containers coordinate system and be able to compare it with its dimensions. */
if (dontTransform === false || dontTransform === undefined) {
if (outsideViewPort === true) {
checkPoint = thisObject.container.frame.unframeThisPoint(checkPoint)
@@ -208,7 +208,7 @@ function newFrame() {
}
}
/* Now we check if the resulting point is whin the current Frame. */
/* Now we check if the resulting point is within the current Frame. */
if (isNaN(checkPoint.x) || isNaN(checkPoint.y)) { return false }
if (thisObject.type === 'Circle') {
let distance = Math.sqrt(Math.pow(thisObject.position.x - checkPoint.x, 2) + Math.pow(thisObject.position.y - checkPoint.y, 2))
@@ -244,7 +244,7 @@ function newFrame() {
thisPoint = thisObject.parentFrame.frameThisPoint(thisPoint)
}
/* Now we check if the resulting point is whin the current Frame. */
/* Now we check if the resulting point is within the current Frame. */
if (thisObject.type === 'Circle') {
let distance = Math.sqrt(Math.pow(thisPoint.x - checkPoint.x, 2) + Math.pow(thisPoint.y - checkPoint.y, 2))
+4 -4
View File
@@ -1,4 +1,4 @@
/* Global Constatns */
/* Global Constants */
let canvas
let PROJECTS_SCHEMA
@@ -204,9 +204,9 @@ const _1_MINUTE_IN_MILISECONDS = 1 * 60 * 1000;
let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the UI.projects.foundations.spaces.chartingSpace.viewport.initialize if the user had a prevous session with this same browser.
let NEW_SESSION_INITIAL_DATE = new Date(); // This value will be overwritten at the UI.projects.foundations.spaces.chartingSpace.viewport.initialize if the user had a previous session with this same browser.
let INITIAL_ZOOM_LEVEL = -28.25 // This is the zoom level at the view port in which the APP starts.
let INITIAL_TIME_PERIOD = ONE_DAY_IN_MILISECONDS // This value will be overwritten at the UI.projects.foundations.spaces.chartingSpace.viewport.initialize if the user had a prevous session with this same browser.
let INITIAL_TIME_PERIOD = ONE_DAY_IN_MILISECONDS // This value will be overwritten at the UI.projects.foundations.spaces.chartingSpace.viewport.initialize if the user had a previous session with this same browser.
let VERY_LARGE_NUMBER = 100000000000000
const TOP_MARGIN = 0
@@ -246,7 +246,7 @@ const PERIOD_05_MIN = "05-min";
const PERIOD_01_MIN = "01-min";
/*
We define here the size of the chartingSpace. It has to bee enough big in order to accomodate all the charts we expect to display in this space.
We define here the size of the chartingSpace. It has to bee enough big in order to accommodate all the charts we expect to display in this space.
*/
const TIME_MACHINE_WIDTH = 8;
+2 -1
View File
@@ -888,7 +888,8 @@
#governance-tab13:checked ~ .governance-search-result-content #content13,
#governance-tab14:checked ~ .governance-search-result-content #content14,
#governance-tab15:checked ~ .governance-search-result-content #content15,
#governance-tab16:checked ~ .governance-search-result-content #content16 {
#governance-tab16:checked ~ .governance-search-result-content #content16,
#governance-tab17:checked ~ .governance-search-result-content #content17 {
display: block;
}
+1
View File
@@ -48,6 +48,7 @@ SA.nodeModules = {
http: require('http'),
ccxt: require('ccxt'),
octokit: require("@octokit/rest"),
graphql: require("@octokit/graphql"),
simpleGit: require('simple-git'),
lookpath: require('lookpath'),
process: require('process'),
@@ -228,7 +228,7 @@
logError('key.length:' + exchangeApiKey.config.codeName.length)
logError('secret.length:' + exchangeApiKey.config.secret.length)
logError('Double check that you copied the key at the codeName property and the secret at secret property without bringing any invisible caracter from the exchange web site, or leaving any character from the sample text. Also check that the keys are not disabled at the exchange ot that they are not restricted by IP.')
logError('As a remainder. Binance key and secret are 64 bytes in lenght each one. ')
logError('As a remainder. Binance key and secret are 64 bytes in length each one. ')
}
}
}
@@ -290,7 +290,7 @@
}
}
catch (err) {
/* An unhandled exception occured. in this case we return Fail and log the stack. */
/* An unhandled exception occurred. in this case we return Fail and log the stack. */
if (err.stack) {
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -307,7 +307,7 @@
return
}
/* Some other handled exception occured. We return Fail and move on. */
/* Some other handled exception occurred. We return Fail and move on. */
if (err.result !== TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -1142,12 +1142,12 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) {
if (stage.status.value === 'Open') {
openStage(stage)
checkUserDefinedCode(stageName, 'Open')
checkAnnounce(stageName, 'Open')
checkAnnounce(stageName, stage.status.value)
}
if (stage.status.value === 'Closed') {
checkUserDefinedCode(stageName, 'Closed')
checkAnnounce(stageName, 'Closed')
closeStage(stage, stageName)
checkAnnounce(stageName, stage.status.value)
}
/*
@@ -0,0 +1,253 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 512 512"
fill="none"
version="1.1"
id="svg20"
sodipodi:docname="plugin-assets.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="E:\Superalgos\Projects\Community-Plugins\Icons\plugins\plugin-assets.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<metadata
id="metadata26">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs24" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview22"
showgrid="false"
inkscape:zoom="0.84765625"
inkscape:cx="170.95892"
inkscape:cy="319.19258"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg20"
inkscape:document-rotation="0" />
<path
d="M465.597 170.772C451.908 135.12 429.079 103.698 399.402 79.6613C369.726 55.625 334.247 39.8209 296.529 33.8364L279.477 141.309C298.336 144.301 316.075 152.203 330.914 164.221C345.752 176.239 357.167 191.95 364.011 209.776L465.597 170.772Z"
fill="#0295AA"
id="path2" />
<path
d="M279.701 37.7552C242.02 31.7765 203.418 36.4398 168.244 51.2195C133.071 65.9993 102.723 90.3081 80.6219 121.407L164.111 180.741C175.162 165.192 190.335 153.037 207.922 145.647C225.509 138.258 244.81 135.926 263.651 138.915L279.701 37.7552Z"
fill="#F0353D"
id="path4" />
<path
d="M72.5959 143.961C55.063 168.632 43.6372 197.112 39.2582 227.06C34.8793 257.008 37.6722 287.567 47.4074 316.225L137.929 285.474C133.061 271.145 131.665 255.866 133.854 240.892C136.044 225.918 141.757 211.678 150.523 199.342L72.5959 143.961Z"
fill="#BCD643"
id="path6" />
<path
d="M56.1413 336.123C70.7195 379.037 99.5975 415.641 137.941 439.805C176.284 463.97 221.765 474.229 266.769 468.865L255.067 370.694C232.565 373.376 209.825 368.246 190.653 356.164C171.482 344.082 157.043 325.78 149.753 304.323L56.1413 336.123Z"
fill="#9BAAAB"
id="path8" />
<path
d="m 286.266,471.334 c 33.727,-4.02 66.091,-15.687 94.626,-34.111 28.534,-18.424 52.486,-43.119 70.03,-72.203 17.544,-29.084 28.217,-61.789 31.205,-95.623 2.988,-33.834 -1.787,-67.903 -13.962,-99.612 l -104.154,39.991 c 6.087,15.854 8.475,32.889 6.981,49.806 -1.494,16.917 -6.831,33.269 -15.603,47.811 -8.772,14.542 -20.748,26.89 -35.015,36.102 -14.267,9.212 -30.449,15.045 -47.313,17.055 z"
fill="#4acfd9"
id="path10" />
<path
d="M399.544 84.3453L436.296 38.9697L489.657 38.9697"
stroke="#0295AA"
stroke-width="14"
id="path12" />
<path
d="M422 21H493"
stroke="#F0353D"
stroke-width="12"
stroke-linecap="round"
stroke-linejoin="round"
id="path14" />
<g
id="g900"
transform="matrix(1.5816277,0,0,1.5816277,-148.89669,-145.76707)">
<circle
cx="256"
cy="256"
r="103"
fill="#E6EAEA"
id="circle16" />
<g
id="g1296-7-4"
transform="rotate(90,105.8491,238.03695)">
<g
id="g1027-55-3-7"
transform="rotate(45,1342.5065,-1213.1529)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7-3-4"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027-3-0"
transform="rotate(45,1527.1072,-1095.7609)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58-6-6"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60-6-1"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62-2-1"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64-5-5"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66-2-6"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68-5-4"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70-4-4"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72-3-1"
style="fill:#365558" />
</g>
</g>
</g>
<rect
x="-526.15668"
y="2.3594437"
class="st1"
width="128"
height="128"
id="rect14"
style="fill:#f0353d" />
<rect
x="-398.15668"
y="2.3594437"
class="st2"
width="128"
height="128"
id="rect16"
style="fill:#fd6a33" />
<rect
x="-270.15668"
y="2.3594437"
class="st3"
width="128"
height="128"
id="rect18"
style="fill:#ff8c29" />
<rect
x="-142.15668"
y="2.3594437"
class="st4"
width="128"
height="128"
id="rect20"
style="fill:#ffd1a9" />
<rect
x="-526.15668"
y="130.35944"
class="st5"
width="128"
height="128"
id="rect22"
style="fill:#365558" />
<rect
x="-398.15668"
y="130.35944"
class="st6"
width="128"
height="128"
id="rect24"
style="fill:#0295aa" />
<rect
x="-270.15668"
y="130.35944"
class="st7"
width="128"
height="128"
id="rect26"
style="fill:#4acfd9" />
<rect
x="-526.15668"
y="258.35944"
class="st8"
width="128"
height="128"
id="rect28"
style="fill:#9baaab" />
<rect
x="-398.15668"
y="258.35944"
class="st9"
width="128"
height="128"
id="rect30"
style="fill:#cdd4d5" />
<rect
x="-270.15668"
y="258.35944"
class="st10"
width="128"
height="128"
id="rect32"
style="fill:#e6eaea" />
<rect
x="-142.15668"
y="258.35944"
class="st11"
width="128"
height="128"
id="rect34"
style="fill:#ffffff" />
<rect
x="-526.15668"
y="386.35944"
class="st12"
width="128"
height="128"
id="rect36"
style="fill:#bcd643" />
</svg>

After

Width:  |  Height:  |  Size: 9.7 KiB

@@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 512 512"
fill="none"
version="1.1"
id="svg32"
sodipodi:docname="plugin-features.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="E:\Superalgos\Projects\Community-Plugins\Icons\plugins\plugin-features.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<metadata
id="metadata38">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs36" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview34"
showgrid="false"
inkscape:zoom="0.59938348"
inkscape:cx="134.79507"
inkscape:cy="281.7441"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg32" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M83.0332 13.9705C78.6149 13.9705 75.0332 17.5522 75.0332 21.9705V489.029C75.0332 493.448 78.6149 497.029 83.0332 497.029H333.813V396.17L435.999 390.862L436 390.862V21.9705C436 17.5522 432.419 13.9705 428 13.9705H83.0332Z"
fill="#0295AA"
id="path2" />
<path
d="M75 21.5469C75 17.3789 78.3889 14 82.5694 14H256V497H82.5694C78.3889 497 75 493.621 75 489.453V21.5469Z"
fill="#365558"
id="path4" />
<rect
x="186"
y="95"
width="225"
height="20"
fill="#CDD4D5"
id="rect6" />
<rect
x="186"
y="159"
width="225"
height="21"
fill="#CDD4D5"
id="rect8" />
<rect
x="186"
y="223"
width="225"
height="21"
fill="#CDD4D5"
id="rect10" />
<rect
x="186"
y="288"
width="225"
height="20"
fill="#CDD4D5"
id="rect12" />
<rect
x="186"
y="352"
width="225"
height="21"
fill="#CDD4D5"
id="rect14" />
<rect
x="186"
y="416"
width="180"
height="21"
fill="#CDD4D5"
id="rect16" />
<path
d="M331 396V497L334.987 495.662L434.671 395.35L436 390H337C333.686 390 331 392.686 331 396Z"
fill="#4ACFD9"
id="path18" />
<path
d="M108 103.313L127.28 118L173 72"
stroke="#BCD643"
stroke-width="16"
id="path20" />
<path
d="M108 167.313L127.28 182L173 136"
stroke="#BCD643"
stroke-width="16"
id="path22" />
<path
d="M108 231.313L127.28 246L173 200"
stroke="#BCD643"
stroke-width="16"
id="path24" />
<path
d="M108 296.313L127.28 311L173 265"
stroke="#BCD643"
stroke-width="16"
id="path26" />
<path
d="M108 360.313L127.28 375L173 329"
stroke="#BCD643"
stroke-width="16"
id="path28" />
<path
d="M108 424.313L127.28 439L173 393"
stroke="#BCD643"
stroke-width="16"
id="path30" />
<rect
x="-520.12756"
y="0.42218161"
class="st1"
width="128"
height="128"
id="rect14-3"
style="fill:#f0353d" />
<rect
x="-392.12759"
y="0.42218161"
class="st2"
width="128"
height="128"
id="rect16-8"
style="fill:#fd6a33" />
<rect
x="-264.12759"
y="0.42218161"
class="st3"
width="128"
height="128"
id="rect18"
style="fill:#ff8c29" />
<rect
x="-136.12758"
y="0.42218161"
class="st4"
width="128"
height="128"
id="rect20"
style="fill:#ffd1a9" />
<rect
x="-520.12756"
y="128.42218"
class="st5"
width="128"
height="128"
id="rect22"
style="fill:#365558" />
<rect
x="-392.12759"
y="128.42218"
class="st6"
width="128"
height="128"
id="rect24"
style="fill:#0295aa" />
<rect
x="-264.12759"
y="128.42218"
class="st7"
width="128"
height="128"
id="rect26"
style="fill:#4acfd9" />
<rect
x="-520.12756"
y="256.42218"
class="st8"
width="128"
height="128"
id="rect28"
style="fill:#9baaab" />
<rect
x="-392.12759"
y="256.42218"
class="st9"
width="128"
height="128"
id="rect30"
style="fill:#cdd4d5" />
<rect
x="-264.12759"
y="256.42218"
class="st10"
width="128"
height="128"
id="rect32"
style="fill:#e6eaea" />
<rect
x="-136.12758"
y="256.42218"
class="st11"
width="128"
height="128"
id="rect34"
style="fill:#ffffff" />
<rect
x="-520.12756"
y="384.42218"
class="st12"
width="128"
height="128"
id="rect36"
style="fill:#bcd643" />
<g
id="g1027-55"
transform="matrix(0,1.4446065,-1.4446065,0,1175.199,-1668.2868)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027"
transform="matrix(0,1.4446065,-1.4446065,0,1413.4374,-1626.4793)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72"
style="fill:#365558" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

@@ -0,0 +1,416 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 512 512"
fill="none"
version="1.1"
id="svg34"
sodipodi:docname="plugin-pools.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="E:\Superalgos\Projects\Community-Plugins\Icons\plugin-pools.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<metadata
id="metadata40">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs38" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview36"
showgrid="false"
inkscape:zoom="1.6953125"
inkscape:cx="373.76832"
inkscape:cy="425.14139"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g1296"
inkscape:document-rotation="0" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M248 136.049C181.411 137.902 128 192.464 128 259.5C128 326.537 181.411 381.099 248 382.952V136.049Z"
fill="#0295AA"
id="path10" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M248 136.049C314.589 137.902 368 192.464 368 259.5C368 326.537 314.589 381.099 248 382.952V136.049Z"
fill="#4ACFD9"
id="path12" />
<circle
cx="250.5"
cy="259.5"
r="109.5"
stroke="#E6EAEA"
stroke-width="28"
id="circle22" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M217.979 365.319L199.04 349L154 401.272L172.939 417.591L217.979 365.319ZM381.979 147.319L363.04 131L318 183.272L336.939 199.591L381.979 147.319ZM341.968 310.693L324.146 328.225L364.975 369.73L382.797 352.198L341.968 310.693ZM97.1953 184.729L113.675 165.93L157.456 204.308L140.976 223.107L97.1953 184.729Z"
fill="#E6EAEA"
id="path32" />
<g
id="g1296"
transform="rotate(45,-118.91803,582.50429)">
<g
id="g1027-55"
transform="rotate(45,1342.5065,-1213.1529)"
style="fill:#365558;fill-opacity:1"
inkscape:export-filename="E:\Superalgos\Projects\Community-Plugins\Icons\g1027-55.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<path
id="circle58-7"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027"
transform="rotate(45,1527.1072,-1095.7609)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72"
style="fill:#365558" />
</g>
</g>
<g
id="g1296-7"
transform="rotate(-45,290.29339,-238.26136)">
<g
id="g1027-55-3"
transform="rotate(45,1342.5065,-1213.1529)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7-3"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027-3"
transform="rotate(45,1527.1072,-1095.7609)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58-6"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60-6"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62-2"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64-5"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66-2"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68-5"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70-4"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72-3"
style="fill:#365558" />
</g>
</g>
<g
id="g1296-7-4"
transform="rotate(-135,135.15061,134.65071)">
<g
id="g1027-55-3-7"
transform="rotate(45,1342.5065,-1213.1529)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7-3-4"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027-3-0"
transform="rotate(45,1527.1072,-1095.7609)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58-6-6"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60-6-1"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62-2-1"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64-5-5"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66-2-6"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68-5-4"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70-4-4"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72-3-1"
style="fill:#365558" />
</g>
</g>
<g
id="g1296-7-4-0"
transform="rotate(135,78.950537,254.04452)">
<g
id="g1027-55-3-7-3"
transform="rotate(45,1342.5065,-1213.1529)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7-3-4-7"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027-3-0-1"
transform="rotate(45,1527.1072,-1095.7609)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58-6-6-3"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60-6-1-9"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62-2-1-2"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64-5-5-9"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66-2-6-5"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68-5-4-6"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70-4-4-7"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72-3-1-5"
style="fill:#365558" />
</g>
</g>
<rect
x="-521.27258"
y="0.096461862"
class="st1"
width="128"
height="128"
id="rect14"
style="fill:#f0353d" />
<rect
x="-393.27258"
y="0.096461862"
class="st2"
width="128"
height="128"
id="rect16"
style="fill:#fd6a33" />
<rect
x="-265.27255"
y="0.096461862"
class="st3"
width="128"
height="128"
id="rect18"
style="fill:#ff8c29" />
<rect
x="-137.27257"
y="0.096461862"
class="st4"
width="128"
height="128"
id="rect20"
style="fill:#ffd1a9" />
<rect
x="-521.27258"
y="128.09647"
class="st5"
width="128"
height="128"
id="rect22"
style="fill:#365558" />
<rect
x="-393.27258"
y="128.09647"
class="st6"
width="128"
height="128"
id="rect24"
style="fill:#0295aa" />
<rect
x="-265.27255"
y="128.09647"
class="st7"
width="128"
height="128"
id="rect26"
style="fill:#4acfd9" />
<rect
x="-521.27258"
y="256.0965"
class="st8"
width="128"
height="128"
id="rect28"
style="fill:#9baaab" />
<rect
x="-393.27258"
y="256.0965"
class="st9"
width="128"
height="128"
id="rect30"
style="fill:#cdd4d5" />
<rect
x="-265.27255"
y="256.0965"
class="st10"
width="128"
height="128"
id="rect32"
style="fill:#e6eaea" />
<rect
x="-137.27257"
y="256.0965"
class="st11"
width="128"
height="128"
id="rect34"
style="fill:#ffffff" />
<rect
x="-521.27258"
y="384.0965"
class="st12"
width="128"
height="128"
id="rect36"
style="fill:#bcd643" />
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

@@ -0,0 +1,335 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 512 512"
fill="none"
version="1.1"
id="svg50"
sodipodi:docname="plugin-positions.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="E:\Superalgos\Projects\Community-Plugins\Icons\plugins\plugin-positions.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<g
id="g1080">
<g
id="g1027-55-3"
transform="matrix(-0.60161027,0.60161027,-0.60161027,-0.60161027,1439.1625,-128.03235)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7-5"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027-5"
transform="matrix(-0.60161027,0.60161027,-0.60161027,-0.60161027,1520.9666,-11.406506)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58-2"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60-4"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62-0"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64-3"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66-8"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68-1"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70-2"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72-5"
style="fill:#365558" />
</g>
</g>
<metadata
id="metadata56">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs54" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview52"
showgrid="false"
inkscape:zoom="0.59938348"
inkscape:cx="-314.67389"
inkscape:cy="505.80392"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg50" />
<path
d="M331 235.04L330.998 235.471L331 256.154H181L181.002 235.471L181 235.04V231.162H181.076C182.868 186.08 215.726 150.154 256 150.154C296.274 150.154 329.132 186.08 330.924 231.162H331V235.04Z"
fill="#4ACFD9"
id="path8" />
<path
d="M474 319.272L473.999 319.634L474 337H348L348.001 319.634L348 319.272V316.016H348.064C349.569 278.164 377.17 248 411 248C444.83 248 472.431 278.164 473.936 316.016H474V319.272Z"
fill="#4ACFD9"
id="path10" />
<path
d="M150 386.858L149.999 387.146L150 401H50L50.0011 387.146L50 386.858V384.26H50.0508C51.2453 354.064 73.1507 330 100 330C126.849 330 148.755 354.064 149.949 384.26H150V386.858Z"
fill="#4ACFD9"
id="path12" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M253.765 149.764C214.522 151.032 182.834 186.656 181.076 231.156H181V235.054L181.002 235.488L181 256.278H253.765V149.764Z"
fill="#0295AA"
id="path14" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M409.123 247.424C376.159 248.489 349.541 278.413 348.064 315.794H348V319.068L348.001 319.432L348 336.896H409.123V247.424Z"
fill="#0295AA"
id="path16" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M98.5104 329.85C72.3483 330.695 51.2226 354.445 50.0508 384.111H50V386.71L50.0011 386.999L50 400.859H98.5104V329.85Z"
fill="#0295AA"
id="path18" />
<ellipse
cx="256"
cy="117.154"
rx="52"
ry="53"
fill="#FFD1A9"
id="ellipse20" />
<ellipse
cx="411"
cy="220.5"
rx="44"
ry="44.5"
fill="#FFD1A9"
id="ellipse22" />
<ellipse
cx="100"
cy="308.5"
rx="35"
ry="35.5"
fill="#FFD1A9"
id="ellipse24" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M210.042 141.745C228.775 136.513 254.094 119.319 260.262 100.815C275.29 118.269 287.085 126.474 305.748 132.726C307.429 127.59 308.338 122.105 308.338 116.408C308.338 87.4639 284.874 64 255.93 64C226.985 64 203.521 87.4639 203.521 116.408C203.521 125.598 205.887 134.235 210.042 141.745Z"
fill="#365558"
id="path26" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M372.395 240.688C388.131 236.293 409.4 221.85 414.58 206.306C427.204 220.968 437.111 227.86 452.788 233.111C454.2 228.798 454.964 224.191 454.964 219.406C454.964 195.093 435.254 175.383 410.941 175.383C386.628 175.383 366.918 195.093 366.918 219.406C366.918 227.125 368.905 234.38 372.395 240.688Z"
fill="#365558"
id="path28" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M69.36 324.503C81.8492 321.015 98.7286 309.552 102.84 297.216C112.859 308.853 120.722 314.323 133.165 318.49C134.285 315.067 134.891 311.41 134.891 307.613C134.891 288.316 119.249 272.674 99.9525 272.674C80.6563 272.674 65.0137 288.316 65.0137 307.613C65.0137 313.739 66.5903 319.497 69.36 324.503Z"
fill="#365558"
id="path30" />
<path
d="M245.875 185.154H262.125L267 170.154H241L245.875 185.154Z"
fill="#FD6A33"
id="path32" />
<path
d="M402.125 277H415.875L420 265H398L402.125 277Z"
fill="#FD6A33"
id="path34" />
<path
d="M93.1875 353H103.812L107 344H90L93.1875 353Z"
fill="#FD6A33"
id="path36" />
<path
d="M247.684 185.154H260.316L262 239.756L254 246.154L246 239.756L247.684 185.154Z"
fill="#FD6A33"
id="path38" />
<path
d="M404.368 277H414.632L416 322.65L409.5 328L403 322.65L404.368 277Z"
fill="#FD6A33"
id="path40" />
<path
d="M95.0526 353H102.947L104 389.699L99 394L94 389.699L95.0526 353Z"
fill="#FD6A33"
id="path42" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M253.766 246.004L254.199 246.346L262.428 239.849L260.696 184.409H262.428L267.626 168.816H253.766V246.004Z"
fill="#FF8C29"
id="path44" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M409.123 328.265L409.488 328.552L416.4 323.095L414.945 276.525H416.4L420.766 263.428H409.123V328.265Z"
fill="#FF8C29"
id="path46" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M98.5117 394.01L98.7997 394.237L104.286 389.906L103.131 352.946H104.286L107.751 342.551H98.5117V394.01Z"
fill="#FF8C29"
id="path48" />
<g
id="g1080-7"
transform="translate(153.08206,93.243036)">
<g
id="g1027-55-3-3"
transform="matrix(-0.60161027,0.60161027,-0.60161027,-0.60161027,1439.1625,-128.03235)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7-5-2"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 l 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 v 10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 0.1264,0.13222 0.2544,0.26298 0.3839,0.39223 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 0.1322,-0.12646 0.263,-0.25444 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 28.8149,-28.81491 15.8565,-15.85653 -123.1378,-123.13781 -16.204,16.20231 z"
sodipodi:nodetypes="csccssssssccsscsscccccccsccccc" />
</g>
<g
id="g1027-5-7"
transform="matrix(-0.60161027,0.60161027,-0.60161027,-0.60161027,1520.9666,-11.406506)">
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60-4-9"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62-0-0"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64-3-5"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1354.7502,659.67651 -36.6178,36.61779 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 50.8986,-50.89858 c -44.8808,-44.71921 -0.2541,0.25411 -44.8808,-44.71921 z"
id="path66-8-0"
style="fill:#4acfd9"
sodipodi:nodetypes="cssccc" />
<path
class="st4"
d="m 1399.5502,704.47651 -50.9178,50.91779 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 36.6178,-36.61779 c -44.8192,-44.98079 0,0 -44.9,-44.9 z"
id="path68-1-4"
style="fill:#0295aa"
sodipodi:nodetypes="cccscc" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70-2-1"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72-5-7"
style="fill:#365558" />
</g>
</g>
<g
id="g1080-7-8"
transform="translate(-155.83361,151.82887)">
<g
id="g1027-55-3-3-6"
transform="matrix(-0.60161027,0.60161027,-0.60161027,-0.60161027,1439.1625,-128.03235)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7-5-2-5"
style="fill:#365558;fill-opacity:1"
d="m 1326.7507,518.58054 c -1.3982,1.71447 -1.7926,2.65721 -2.906,4.54395 v 0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 v 10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 0.1264,0.13222 0.2544,0.26298 0.3839,0.39223 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 0.1322,-0.12646 0.263,-0.25444 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 8.326,3.39258 21.839,-0.0801 30.5813,-1.91937 3.3784,-0.71076 6.6845,-1.81772 9.8385,-3.32517 z"
sodipodi:nodetypes="cccssssssccsscsscccccccscc" />
</g>
<g
id="g1027-5-7-1"
transform="matrix(-0.60161027,0.60161027,-0.60161027,-0.60161027,1520.9666,-11.406506)">
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60-4-9-4"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62-0-0-2"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64-3-5-3"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1310.2179,712.52595 c 0,5.14847 4.0062,8.26006 7.9145,12.16835 l 30.6,30.6 2.1269,-2.12694 c -40.6414,-40.64141 0,0 -40.6414,-40.64141 z"
id="path66-8-0-9"
style="fill:#4acfd9"
sodipodi:nodetypes="csccc" />
<path
class="st4"
d="m 1350.8593,753.16736 -2.2269,2.22694 30.6,30.6 c 3.454,3.36763 6.7845,6.29946 11.2262,6.7723 -39.5993,-39.59924 0,0 -39.5993,-39.59924 z"
id="path68-1-4-2"
style="fill:#0295aa"
sodipodi:nodetypes="ccccc" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 14.7269,-14.72694 c -26.949,-26.94909 0,0 -26.949,-26.94909 -0.9277,0.44591 -1.7921,1.03053 -2.5779,1.77603 z"
id="path70-2-1-8"
style="fill:#0295aa"
sodipodi:nodetypes="csccccc" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72-5-7-6"
style="fill:#365558" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

@@ -0,0 +1,246 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 512 512"
fill="none"
version="1.1"
id="svg12"
sodipodi:docname="plugin-user-profiles.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
inkscape:export-filename="E:\Superalgos\Projects\Community-Plugins\Icons\plugin-user-profiles.png"
inkscape:export-xdpi="100"
inkscape:export-ydpi="100">
<metadata
id="metadata18">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs16" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1017"
id="namedview14"
showgrid="false"
inkscape:zoom="0.84765625"
inkscape:cx="318.72475"
inkscape:cy="236.36394"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g1296"
inkscape:document-rotation="0" />
<circle
cx="256"
cy="256"
r="237"
fill="#FD6A33"
id="circle2" />
<path
d="M391 374.955L390.997 375.732L391 413H121L121.003 375.732L121 374.955V367.967H121.137C124.362 286.734 183.507 222 256 222C328.493 222 387.638 286.734 390.863 367.967H391V374.955Z"
fill="#4ACFD9"
id="path4" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M252.136 221.172C181.498 223.454 124.457 287.579 121.293 367.68H121.156V374.697L121.159 375.477L121.156 412.899H252.136V221.172Z"
fill="#0295AA"
id="path6" />
<ellipse
cx="256"
cy="162.5"
rx="93"
ry="95.5"
fill="#FFD1A9"
id="ellipse8" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M173.433 206.736C207.154 197.318 252.729 166.369 263.83 133.061C290.881 164.48 312.112 179.249 345.707 190.502C348.733 181.258 350.369 171.385 350.369 161.131C350.369 109.031 308.133 66.7949 256.033 66.7949C203.933 66.7949 161.697 109.031 161.697 161.131C161.697 177.672 165.955 193.219 173.433 206.736Z"
fill="#365558"
id="path10" />
<rect
x="-552.9718"
y="-2.4061174"
class="st1"
width="128"
height="128"
id="rect14"
style="fill:#f0353d" />
<rect
x="-424.9718"
y="-2.4061174"
class="st2"
width="128"
height="128"
id="rect16"
style="fill:#fd6a33" />
<rect
x="-296.97183"
y="-2.4061174"
class="st3"
width="128"
height="128"
id="rect18"
style="fill:#ff8c29" />
<rect
x="-168.97182"
y="-2.4061174"
class="st4"
width="128"
height="128"
id="rect20"
style="fill:#ffd1a9" />
<rect
x="-552.9718"
y="125.59388"
class="st5"
width="128"
height="128"
id="rect22"
style="fill:#365558" />
<rect
x="-424.9718"
y="125.59388"
class="st6"
width="128"
height="128"
id="rect24"
style="fill:#0295aa" />
<rect
x="-296.97183"
y="125.59388"
class="st7"
width="128"
height="128"
id="rect26"
style="fill:#4acfd9" />
<rect
x="-552.9718"
y="253.59389"
class="st8"
width="128"
height="128"
id="rect28"
style="fill:#9baaab" />
<rect
x="-424.9718"
y="253.59389"
class="st9"
width="128"
height="128"
id="rect30"
style="fill:#cdd4d5" />
<rect
x="-296.97183"
y="253.59389"
class="st10"
width="128"
height="128"
id="rect32"
style="fill:#e6eaea" />
<rect
x="-168.97182"
y="253.59389"
class="st11"
width="128"
height="128"
id="rect34"
style="fill:#ffffff" />
<rect
x="-552.9718"
y="381.59387"
class="st12"
width="128"
height="128"
id="rect36"
style="fill:#bcd643" />
<g
id="g1027-5"
transform="rotate(45,1459.6238,-250.95129)" />
<g
id="g1027-2"
transform="rotate(45,1236.3627,-21.540309)" />
<g
id="g1296"
transform="translate(225.32719,265.43779)">
<g
id="g1027-55"
transform="matrix(0.89392232,0.89392232,-0.89392232,0.89392232,-615.73464,-1669.3517)"
style="fill:#365558;fill-opacity:1">
<path
id="circle58-7"
style="fill:#365558;fill-opacity:1"
d="m 1330.6078,514.40305 c -1.0764,1.07643 -2.0733,2.18605 -2.9914,3.3118 -1.3982,1.71447 -2.6583,3.5229 -3.7717,5.40964 a 23.648492,23.648492 0 0 0 0,0.003 c -0.361,0.61183 -0.7146,1.2446 -1.0565,1.8962 -1.3415,2.55691 -2.4152,5.22036 -3.2151,7.93838 -0.3984,1.35342 -0.73,2.72435 -0.9958,4.11144 -0.2643,1.37961 -0.4619,2.76429 -0.5925,4.16116 a 23.648492,23.648492 0 0 0 0,10e-4 c -0.5208,5.57632 0.03,11.20019 1.6393,16.59354 0.425,1.42424 1.072,2.79 1.6463,4.17634 -1.8589,4.32266 -2.7836,8.93989 -2.7387,13.57175 l -16.6225,16.62254 c -11.2091,11.20909 -11.2091,28.53252 0,39.74161 l 1.1242,1.12419 c -0.3644,7.56395 2.3288,15.22804 8.2767,21.17591 l 1.5993,1.59928 c 6.0511,6.05109 13.8772,8.72023 21.5681,8.23807 0.6425,0.82797 1.2088,1.6956 1.9487,2.47073 a 23.648492,23.648492 0 0 0 0.3839,0.39223 c 11.6538,11.65372 29.4298,11.37928 40.9487,0.38393 a 23.648492,23.648492 0 0 0 0.3922,-0.38393 l 17.523,-17.52299 c 3.4931,-0.30163 6.9254,-1.20699 10.1937,-2.60885 15.8893,6.47437 35.0578,3.55688 47.883,-9.26834 l 39.7996,-39.79961 c 16.9306,-16.93061 16.8035,-45.03795 0,-61.84147 l -2.2815,-2.28152 c 1.2971,-4.36536 2.2067,-8.84004 2.2069,-13.39636 5e-4,-25.05276 -22.7943,-47.84755 -47.8471,-47.8471 a 23.648492,23.648492 0 0 0 0,-0.001 c -4.5026,4.1e-4 -8.9262,0.88989 -13.2445,2.15723 l -0.032,-0.0318 a 23.648492,23.648492 0 0 0 -3.0632,-2.58259 c -0.1112,-0.0929 -0.2134,-0.1987 -0.3245,-0.2914 -0.2843,-0.23201 -0.5342,-0.41252 -0.8038,-0.62149 a 23.648492,23.648492 0 0 0 -0.9626,-0.74716 23.648492,23.648492 0 0 0 0,-10e-4 c -0.6061,-0.44565 -1.2123,-0.86572 -1.8092,-1.25954 v -0.003 c -1.2301,-0.81157 -2.4836,-1.54817 -3.7524,-2.21386 -5.1186,-2.68569 -10.6402,-4.28253 -16.2137,-4.80335 -1.4,-0.13079 -2.7972,-0.19395 -4.1819,-0.19059 -2.7935,0.007 -5.5793,0.28103 -8.3237,0.81898 -1.3653,0.26773 -2.7319,0.6035 -4.0838,1.0068 v -10e-4 c -4.0481,1.2076 -7.9667,3.01514 -11.5982,5.41655 -1.8143,1.19998 -3.5553,2.54797 -5.1984,4.03271 -0.5639,0.50983 -1.1017,1.02167 -1.6103,1.53022 z" />
</g>
<g
id="g1027"
transform="matrix(0.89392232,0.89392232,-0.89392232,0.89392232,-442.44234,-1790.9031)">
<circle
class="st12"
cx="1416.4324"
cy="685.39429"
r="24.200001"
id="circle58"
style="fill:#9baaab" />
<path
class="st7"
d="m 1329.2324,740.5943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path60"
style="fill:#fd6a33" />
<path
class="st10"
d="m 1338.6324,762.8943 c -1.7,-1.7 -4.6,-1.7 -6.3,0 l -33.5,33.5 c -1.7,1.7 -1.7,4.6 0,6.3 l 1.6,1.6 c 1.7,1.7 4.6,1.7 6.3,0 l 33.5,-33.5 c 1.8,-1.8 1.8,-4.5 0,-6.3 z"
id="path62"
style="fill:#ff8c29" />
<path
class="st7"
d="m 1356.2324,775.5943 -31.9,31.9 c -2.1,2.1 -2.1,5.7 0,7.9 2.1,2.1 5.7,2.1 7.9,0 l 31.9,-31.9 c 2.1,-2.1 2.1,-5.7 0,-7.9 -2.3,-2.3 -5.6,-2.3 -7.9,0 z"
id="path64"
style="fill:#fd6a33" />
<path
class="st6"
d="m 1386.3324,656.4943 c -7.9,-7.9 -20.6,-7.8 -28.4,0 l -39.8,39.8 c -7.9,7.9 -7.8,20.6 0,28.4 l 30.6,30.6 68.3,-68.3 -30.6,-30.6 z"
id="path66"
style="fill:#4acfd9" />
<path
class="st4"
d="m 1416.9324,687.0943 -68.3,68.3 30.6,30.6 c 8,7.8 20.7,7.9 28.6,0 l 39.8,-39.8 c 7.9,-7.9 7.8,-20.6 0,-28.4 z"
id="path68"
style="fill:#0295aa" />
<path
class="st4"
d="m 1321.3324,727.9943 -5.7,5.7 c -3.7,3.7 -3.7,9.8 0,13.7 l 20.5,20.5 19.4,-19.4 -20.4,-20.6 c -3.8,-3.6 -9.9,-3.6 -13.8,0.1 z"
id="path70"
style="fill:#0295aa" />
<path
class="st5"
d="m 1355.6324,748.3943 -19.3,19.4 20.5,20.5 c 3.7,3.7 9.8,3.7 13.5,0 l 5.7,-5.7 c 3.7,-3.7 3.7,-9.8 0,-13.7 z"
id="path72"
style="fill:#365558" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

@@ -26,6 +26,7 @@
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "pluginAssets",
"alternativeIcons": "Use Reference Parent Parent",
"attachingRules": {
"compatibleTypes": "->Plugin Project->"
},
@@ -26,6 +26,7 @@
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "pluginFeatures",
"alternativeIcons": "Use Reference Parent Parent",
"attachingRules": {
"compatibleTypes": "->Plugin Project->"
},
@@ -26,6 +26,7 @@
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "pluginPools",
"alternativeIcons": "Use Reference Parent Parent",
"attachingRules": {
"compatibleTypes": "->Plugin Project->"
},
@@ -26,6 +26,7 @@
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "pluginPositions",
"alternativeIcons": "Use Reference Parent Parent",
"attachingRules": {
"compatibleTypes": "->Plugin Project->"
},
@@ -26,6 +26,7 @@
"addLeftIcons": true,
"level": 1,
"propertyNameAtParent": "pluginUserProfiles",
"alternativeIcons": "Use Reference Parent Parent",
"attachingRules": {
"compatibleTypes": "->Plugin Project->"
},
@@ -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": {
@@ -4028,7 +4028,7 @@
"procedureJavascriptCode": {
"type": "Procedure Javascript Code",
"name": "New Procedure Javascript Code",
"code": "/* LiveTester Stats */\n\n// The LiveTester Stats functions to measure and return the values for given probabilities. So instead of aiming towards a % win, you can see \n// the % probability for the % move. It is created with the concept of a profit is profit, no matter the size. Eliminating the risk of loss, will increase the\n// profitability in the long run.\n// Weighting risks vs chance might put your trading at a better win rate.\n// The LiveTester will also allow you to set a minimum profit and allow a 'Take Position' on any chart a valid 'Take Position' event occurs.\n\n//- - - - - - - - - - - - - - - - - - - \n\n// User Parameters\n\nvariable.minProfit = 0.5 // Measured in full value % - 0.5 is 0.5%\nvariable.minProbability = 90 // Measured in full value % - 90 is 90%\nvariable.rewardRatioValue = 1.5 // Set your Reward to Risk ratio by editing \nvariable.riskRatioValue = 1 // the values for the variables\n\nvariable.riskToReward = variable.rewardRatioValue / variable.riskRatioValue\n\n//- - - - - - - - - - - - - - - - - - - \n\n// Dependencies\n// Make sure to add your indicators in this section by using 'getElement', and also as node(s) in the dependencies for this indicator.\n\nlet candle = record.current\n// let indicator = getElement('indicatorPluralNames', candle)\nlet ema = getElement('5xCustomEMAs', candle)\n\n//- - - - - - - - - - - - - - - - - - - \n\n// Create a running candleIndex\nif (variable.candleIndex === undefined) {\n variable.candleIndex = 1\n}\nelse {\n variable.candleIndex = variable.candleIndex + 1\n}\n\nvariable.position = Math.round((candle.begin + candle.end) / 2)\n\n// For the first run, we set our measuring switch to 'Off'\nif (variable.livetesterStats === undefined) {\n variable.livetesterStats = 'Off'\n}\n\nif (variable.arrayLength === undefined) {\n variable.arrayLength = arrLength()\n}\n\n//- - - - - - - - - - - - - - - - - - - \n\n// Strategy section\n// Define your strategy, including 'Trigger on' and/or your 'Take position' depending on your use case\n\n// Define entry in the IF-statement\nif (record.previous !== undefined) {\n if (variable.livetesterStats === 'Off' && ema.ema03 > ema.ema05 && ema.previous.ema03 < ema.previous.ema05) {\n // Defining values to keep track on and use for calulations\n variable.livetesterStats = 'On'\n if (variable.entryIndex !== undefined) {\n variable.previousEntryIndex = variable.entryIndex\n }\n variable.entryIndex = variable.candleIndex\n }\n\n // Define exit in the IF-statement\n if (variable.livetesterStats === 'On' && ema.ema03 < ema.ema05 && ema.previous.ema03 > ema.previous.ema05) {\n // Defining values to keep track on and use for calulations\n variable.livetesterStats = 'Off'\n variable.exitIndex = variable.candleIndex\n }\n}\n//- - - - - - - - - - - - - - - - - - - \n\n// Stats Tracker section\n\nif (variable.livetesterStats === 'On') {\n\n if (variable.entryIndex === variable.candleIndex) {\n // Reset data from previous\n variable.savedPosition.length = 0\n variable.entryRate = candle.close\n variable.entryPos = variable.position\n variable.pMaxUp = 0\n variable.pMaxUpRate = candle.close\n variable.pMaxUpPos = variable.position\n variable.cMaxUp = 0\n variable.pMaxDown = 0\n variable.pMaxDownRate = candle.close\n variable.pMaxDownPos = variable.position\n variable.cMaxDown = 0\n\n variable.entryTimestamp = candle.end \n\n variable.savedPosition.push(variable.entryTimestamp)\n\n if (variable.bullOption === 1) {\n if (variable.previousBullEntry === undefined) {\n variable.previousBullEntry = variable.candleIndex\n }\n variable.bullEntry = variable.candleIndex\n variable.bullTradeToTrade = variable.bullEntry - variable.previousBullEntry\n \n variable.savedBullTradeToTrade.push(variable.bullTradeToTrade)\n if (variable.savedBullTradeToTrade.length > variable.arrayLength) {\n variable.savedBullTradeToTrade.splice(0,1)\n }\n \n variable.previousBullEntry = variable.bullEntry\n }\n \n if (variable.bearOption === 1) {\n if (variable.previousBearEntry === undefined) {\n variable.previousBearEntry = variable.candleIndex\n }\n variable.bearEntry = variable.candleIndex\n variable.bearTradeToTrade = variable.bearEntry - variable.previousBearEntry\n \n variable.savedBearTradeToTrade.push(variable.bearTradeToTrade)\n if (variable.savedBearTradeToTrade.length > variable.arrayLength) {\n variable.savedBearTradeToTrade.splice(0,1)\n }\n \n variable.previousBullEntry = variable.bullEntry\n }\n }\n\n Line truncated
"code": "/* LiveTester Stats */\n\n// The LiveTester Stats functions to measure and return the values for given probabilities. So instead of aiming towards a % win, you can see \n// the % probability for the % move. It is created with the concept of a profit is profit, no matter the size. Eliminating the risk of loss, will increase the\n// profitability in the long run.\n// Weighting risks vs chance might put your trading at a better win rate.\n// The LiveTester will also allow you to set a minimum profit and allow a 'Take Position' on any chart a valid 'Take Position' event occurs.\n\n//- - - - - - - - - - - - - - - - - - - \n\n// User Parameters\n\nvariable.minProfit = 0.5 // Measured in full value % - 0.5 is 0.5%\nvariable.minProbability = 90 // Measured in full value % - 90 is 90%\nvariable.rewardRatioValue = 1.5 // Set your Reward to Risk ratio by editing \nvariable.riskRatioValue = 1 // the values for the variables\n\nvariable.riskToReward = variable.rewardRatioValue / variable.riskRatioValue\n\n//- - - - - - - - - - - - - - - - - - - \n\n// Dependencies\n// Make sure to add your indicators in this section by using 'getElement', and also as node(s) in the dependencies for this indicator.\n\nlet candle = record.current\n// let indicator = getElement('indicatorPluralNames', candle)\nlet ema = getElement('5xCustomEMAs', candle)\n\n//- - - - - - - - - - - - - - - - - - - \n\n// Create a running candleIndex\nif (variable.candleIndex === undefined) {\n variable.candleIndex = 1\n}\nelse {\n variable.candleIndex = variable.candleIndex + 1\n}\n\nvariable.position = Math.round((candle.begin + candle.end) / 2)\n\n// For the first run, we set our measuring switch to 'Off'\nif (variable.livetesterStats === undefined) {\n variable.livetesterStats = 'Off'\n}\n\nif (variable.arrayLength === undefined) {\n variable.arrayLength = arrLength()\n}\n\n//- - - - - - - - - - - - - - - - - - - \n\n// Strategy section\n// Define your strategy, including 'Trigger on' and/or your 'Take position' depending on your use case\n\n// Define entry in the IF-statement\nif (record.previous !== undefined) {\n if (variable.livetesterStats === 'Off' && ema.ema03 > ema.ema05 && ema.previous.ema03 < ema.previous.ema05) {\n // Defining values to keep track on and use for calculations\n variable.livetesterStats = 'On'\n if (variable.entryIndex !== undefined) {\n variable.previousEntryIndex = variable.entryIndex\n }\n variable.entryIndex = variable.candleIndex\n }\n\n // Define exit in the IF-statement\n if (variable.livetesterStats === 'On' && ema.ema03 < ema.ema05 && ema.previous.ema03 > ema.previous.ema05) {\n // Defining values to keep track on and use for calulations\n variable.livetesterStats = 'Off'\n variable.exitIndex = variable.candleIndex\n }\n}\n//- - - - - - - - - - - - - - - - - - - \n\n// Stats Tracker section\n\nif (variable.livetesterStats === 'On') {\n\n if (variable.entryIndex === variable.candleIndex) {\n // Reset data from previous\n variable.savedPosition.length = 0\n variable.entryRate = candle.close\n variable.entryPos = variable.position\n variable.pMaxUp = 0\n variable.pMaxUpRate = candle.close\n variable.pMaxUpPos = variable.position\n variable.cMaxUp = 0\n variable.pMaxDown = 0\n variable.pMaxDownRate = candle.close\n variable.pMaxDownPos = variable.position\n variable.cMaxDown = 0\n\n variable.entryTimestamp = candle.end \n\n variable.savedPosition.push(variable.entryTimestamp)\n\n if (variable.bullOption === 1) {\n if (variable.previousBullEntry === undefined) {\n variable.previousBullEntry = variable.candleIndex\n }\n variable.bullEntry = variable.candleIndex\n variable.bullTradeToTrade = variable.bullEntry - variable.previousBullEntry\n \n variable.savedBullTradeToTrade.push(variable.bullTradeToTrade)\n if (variable.savedBullTradeToTrade.length > variable.arrayLength) {\n variable.savedBullTradeToTrade.splice(0,1)\n }\n \n variable.previousBullEntry = variable.bullEntry\n }\n \n if (variable.bearOption === 1) {\n if (variable.previousBearEntry === undefined) {\n variable.previousBearEntry = variable.candleIndex\n }\n variable.bearEntry = variable.candleIndex\n variable.bearTradeToTrade = variable.bearEntry - variable.previousBearEntry\n \n variable.savedBearTradeToTrade.push(variable.bearTradeToTrade)\n if (variable.savedBearTradeToTrade.length > variable.arrayLength) {\n variable.savedBearTradeToTrade.splice(0,1)\n }\n \n variable.previousBullEntry = variable.bullEntry\n }\n }\n\n Line truncated
"project": "Foundations",
"id": "bb9d955f-fed2-44b8-85f0-90104a30e83b",
"savedPayload": {
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -50,7 +50,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
if (statusDependencies.statusReports.get(reportKey).status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ")
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return;
}
@@ -193,7 +193,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
We will assume that each Dataset is built fetching data from a single endpointNode at the target API.
To get the endpointNode node, we will go through the references at the Record Definition.
We will check that all references are pointing to fields belonging to the same endpointNode node.
If they are not, we will consider the user did not define well the relationaships between nodes
If they are not, we will consider the user did not define well the relationships between nodes
and abort the process.
*/
for (let j = 0; j < productDefinition.record.properties.length; j++) {
@@ -204,7 +204,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
let endpointNodeFound = TS.projects.visualScripting.utilities.nodeFunctions.findNodeInNodeMesh(apiResponseField, 'API Endpoint')
/*
Every Record Property with an apiResponseFieldReference must be on the path
to a certain enpoint.
to a certain endpoint.
*/
if (endpointNodeFound === undefined) {
TS.projects.foundations.utilities.errorHandlingFunctions.throwHandledException(
@@ -223,11 +223,11 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
}
/*
Here we check all enpoints are actually the same endpoiht.
Here we check all endpoints are actually the same endpoint.
*/
if (endpointNodeFound.id !== endpointNode.id) {
/*
We can not reference fields from different enpoints.
We can not reference fields from different endpoints.
*/
TS.projects.foundations.utilities.errorHandlingFunctions.throwHandledException(
processIndex,
@@ -244,7 +244,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
if (endpointNode === undefined) {
/*
API Endpoint counld not be found. Check that the at least one Record Property
API Endpoint could not be found. Check that the at least one Record Property
has an API Response Field Reference child, and that this one is referencing an
API Response Field.
*/
@@ -263,10 +263,10 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
/*
Each record property references an API Response Field, which can be deep into the
data structure received from the API call. What we need to do, is to find for each
record proeprty the nodePath that will help us later retrieve the value of that
particular proeprty.
record property the nodePath that will help us later retrieve the value of that
particular property.
To do so, we will have to recursivelly climb the API Map until reaching the API Response
To do so, we will have to recursively climb the API Map until reaching the API Response
Schema node, which is the one from where we will get the root object of the response data
structure.
*/
@@ -606,7 +606,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
let errorCodeReceived
/*
At this point we have received the first http reponse from the API server,
At this point we have received the first http response from the API server,
and from it we can extract the status code, which is the html code of the
response of our request.
@@ -665,7 +665,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
response.text().then(body => {
apiResponseReceivedText = body
/*
If we received an errror code, we abort the processing at this point.
If we received an error code, we abort the processing at this point.
*/
if (errorCodeReceived === true) {
resolve('ERROR_CODE_RECEIVED')
@@ -719,7 +719,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
resolve('PAGE_FETCHED')
}
/*
If we received an errror code, we abort the processing at this point.
If we received an error code, we abort the processing at this point.
*/
if (errorCodeReceived === true) {
resolve('ERROR_CODE_RECEIVED')
@@ -829,7 +829,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
function appendToExistingDataset() {
/*
We are going to append the curernt apiResponseReceivedText to the existing file.
We are going to append the current apiResponseReceivedText to the existing file.
*/
let existingFileArray = JSON.parse(existingFileContent)
/*
@@ -929,7 +929,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
contextVariables.lastFile = file.date
/*
For One-Min type of datasets, since they are saved as Daily Files, there is no need
to read the already existing content to append to it. In this case is enought to
to read the already existing content to append to it. In this case is enough to
set the existing content to an empty array.
*/
existingFileContent = "[]"
@@ -938,7 +938,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
function appendToExistingDataset() {
/*
We are going to append the curernt apiResponseReceivedText to the existing file.
We are going to append the current apiResponseReceivedText to the existing file.
*/
let existingFileArray = JSON.parse(existingFileContent)
/*
@@ -1108,7 +1108,7 @@ exports.newDataMiningBotModulesFetchingProcess = function (processIndex) {
}
/*
When all Output Datasets have been succesfully written, we can go and write
When all Output Datasets have been successfully written, we can go and write
the Status Report.
*/
writeStatusReport()
@@ -58,7 +58,7 @@
/* We look first for Exchange Raw Data in order to get when the market starts. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Starting Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -67,7 +67,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -99,7 +99,7 @@
/* Second, we get the report from Exchange Raw Data, to know when the marted ends. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Ending Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -108,7 +108,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -132,7 +132,7 @@
/* Finally we get our own Status Report. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -141,7 +141,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because self dependecy Status Report is corrupt. Aborting Process.");
"[ERROR] start -> getContextVariables -> Can not continue because self dependency Status Report is corrupt. Aborting Process.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return;
}
@@ -152,7 +152,7 @@
beginingOfMarket = new Date(thisReport.beginingOfMarket);
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Begining of the Market
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Beginning of the Market
beginingOfMarket = new Date(
contextVariables.datetimeBeginingOfMarketFile.getUTCFullYear() + "-" +
@@ -192,7 +192,7 @@
} else {
/*
In the case when there is no status report, we take the date of the file with the first trades as the begining of the market. Then we will
In the case when there is no status report, we take the date of the file with the first trades as the beginning of the market. Then we will
go one day further in time, so that the previous day does fine a file at the begining of the market.
*/
contextVariables.lastBandFile = new Date(
@@ -237,7 +237,7 @@
try {
let n;
processDate = new Date(contextVariables.lastBandFile.valueOf() - SA.projects.foundations.globals.timeConstants.ONE_DAY_IN_MILISECONDS); // Go back one day to start well when we advance time at the begining of the loop.
processDate = new Date(contextVariables.lastBandFile.valueOf() - SA.projects.foundations.globals.timeConstants.ONE_DAY_IN_MILISECONDS); // Go back one day to start well when we advance time at the beginning of the loop.
let fromDate = new Date(processDate.valueOf())
let lastDate = TS.projects.foundations.utilities.dateTimeFunctions.removeTime(new Date())
@@ -293,7 +293,7 @@
try {
/*
We will iterate through all posible timeFrames
We will iterate through all possible timeFrames
*/
n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
loopBody();
@@ -520,7 +520,7 @@
let numberOfPreviousPeriods;
let currentPosition = pBArray.length;
if (currentPosition < numberOfPeriodsPB) { // Avoinding to get into negative array indexes
if (currentPosition < numberOfPeriodsPB) { // Avoiding to get into negative array indexes
numberOfPreviousPeriods = currentPosition;
} else {
numberOfPreviousPeriods = numberOfPeriodsPB;
@@ -42,7 +42,7 @@
function timeframesLoop() {
try {
/*
We will iterate through all posible time frames.
We will iterate through all possible time frames.
*/
n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
loopBody()
@@ -177,7 +177,7 @@
let numberOfPreviousPeriods;
let currentPosition = pBArray.length;
if (currentPosition < numberOfPeriodsPB) { // Avoinding to get into negative array indexes
if (currentPosition < numberOfPeriodsPB) { // Avoiding to get into negative array indexes
numberOfPreviousPeriods = currentPosition;
} else {
numberOfPreviousPeriods = numberOfPeriodsPB;
@@ -53,7 +53,7 @@
/* We look first for Exchange Raw Data in order to get when the market starts. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Starting Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -62,7 +62,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -94,7 +94,7 @@
/* Second, we get the report from Exchange Raw Data, to know when the marted ends. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Ending Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -103,7 +103,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
}
@@ -130,7 +130,7 @@
/* Finally we get our own Status Report. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
@@ -139,7 +139,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because self dependecy Status Report is corrupt. Aborting Process.")
"[ERROR] start -> getContextVariables -> Can not continue because self dependency Status Report is corrupt. Aborting Process.")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE)
return
}
@@ -148,7 +148,7 @@
if (thisReport.lastFile !== undefined) {
beginingOfMarket = new Date(thisReport.beginingOfMarket)
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Begining of the Market
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Beginning of the Market
beginingOfMarket = new Date(contextVariables.datetimeBeginingOfMarketFile.getUTCFullYear() + "-" + (contextVariables.datetimeBeginingOfMarketFile.getUTCMonth() + 1) + "-" + contextVariables.datetimeBeginingOfMarketFile.getUTCDate() + " " + "00:00" + SA.projects.foundations.globals.timeConstants.GMT_SECONDS);
contextVariables.datetimeLastProducedFile = new Date(
@@ -242,7 +242,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.newInternalLoop(currentDate, percentage);
}
/*
We prepere the arrays that will accumulate all the information for each output file.
We prepare the arrays that will accumulate all the information for each output file.
*/
outputCandles = []
outputVolumes = []
@@ -258,7 +258,7 @@
function timeframesLoop() {
/*
We will iterate through all posible time frames.
We will iterate through all possible time frames.
*/
let n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
loopBody();
@@ -305,7 +305,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack)
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return;
}
@@ -316,7 +316,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Dependency Not Ready -> err = " + err.stack)
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return
@@ -429,7 +429,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.")
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
return
}
@@ -517,7 +517,7 @@
function writeFiles(candles, volumes, timeFrame, callBack) {
/*
Here we will write the contents of the Candles and Volumens files.
Here we will write the contents of the Candles and Volumes files.
*/
try {
writeCandles()
@@ -45,7 +45,7 @@
in-memory arrays. We will then append to this arrays the new information we will get from Exchange Raw Data.
2. We know from our status report which was the last DAY we processed from Exchange Raw Data,
but we must be carefull, because that day might not have been completed yet, if the
but we must be carefully, because that day might not have been completed yet, if the
last loop found the head of the market. That means that we have to be carefull not to append candles
that are already there. To simplify what we do is to discard all candles of the last processed day,
and then we can process that full day again adding all the candles.
@@ -71,7 +71,7 @@
/* We look first for Exchange Raw Data in order to get when the market starts. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Starting Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -80,7 +80,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
}
@@ -112,7 +112,7 @@
/* Second, we get the report from Exchange Raw Data, to know when the marted ends. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Market Ending Point')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -121,7 +121,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because dependecy Status Report is corrupt. ");
"[ERROR] start -> getContextVariables -> Can not continue because dependency Status Report is corrupt. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -148,7 +148,7 @@
/* Finally we get our own Status Report. */
statusReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the beginning of a month.
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getContextVariables -> Status Report does not exist. Retrying Later. ");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
@@ -157,7 +157,7 @@
if (statusReport.status === "Status Report is corrupt.") {
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getContextVariables -> Can not continue because self dependecy Status Report is corrupt. Aborting Process.");
"[ERROR] start -> getContextVariables -> Can not continue because self dependency Status Report is corrupt. Aborting Process.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
return
}
@@ -168,7 +168,7 @@
beginingOfMarket = new Date(thisReport.beginingOfMarket);
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Begining of the Market
if (beginingOfMarket.valueOf() !== contextVariables.datetimeBeginingOfMarketFile.valueOf()) { // Reset Mechanism for Beginning of the Market
beginingOfMarket = new Date(
contextVariables.datetimeBeginingOfMarketFile.getUTCFullYear() + "-" +
@@ -291,7 +291,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getCandles -> onFileReceived -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getCandles -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> findPreviousContent -> loopBody -> getCandles -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
}
} else {
@@ -337,7 +337,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getVolumes -> onFileReceived -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> findPreviousContent -> loopBody -> getVolumes -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> findPreviousContent -> loopBody -> getVolumes -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
}
} else {
@@ -373,7 +373,7 @@
let fromDate = new Date(contextVariables.datetimeLastProducedFile.valueOf())
let lastDate = TS.projects.foundations.utilities.dateTimeFunctions.removeTime(new Date())
/*
Firstly we prepere the arrays that will accumulate all the information for each output file.
Firstly we prepare the arrays that will accumulate all the information for each output file.
*/
let outputCandles = [];
let outputVolumes = [];
@@ -426,7 +426,7 @@
function timeframesLoop() {
/*
We will iterate through all posible time frames.
We will iterate through all possible time frames.
*/
let n = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
@@ -539,7 +539,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
}
@@ -550,7 +550,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Dependency Not Ready -> err = " + JSON.stringify(err));
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[WARN] start -> buildCandles -> timeframesLoop -> loopBody -> nextCandleFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return
@@ -567,8 +567,8 @@
let totalOutputCandles = inputFilePeriod / outputPeriod; // this should be 2 in this case.
let beginingOutputTime = contextVariables.datetimeLastProducedFile.valueOf();
/*
The algorithm that follows is going to agregate candles of 1 min timeFrame read from Exchange Raw Data, into candles of each timeFrame
that Candles Volumes generates. For market files those timePediods goes from 1h to 24hs.
The algorithm that follows is going to aggregate candles of 1 min timeFrame read from Exchange Raw Data, into candles of each timeFrame
that Candles Volumes generates. For market files those time periods goes from 1h to 24hs.
*/
for (let i = 0; i < totalOutputCandles; i++) {
@@ -667,7 +667,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Error Parsing JSON -> err = " + err.stack);
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.");
"[ERROR] start -> buildCandles -> timeframesLoop -> loopBody -> nextVolumeFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.");
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE);
return;
}
@@ -753,7 +753,7 @@
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> writeFiles -> Entering function.")
/*
Here we will write the contents of the Candles and Volumens files.
Here we will write the contents of the Candles and Volumes files.
*/
try {
writeCandles()
@@ -1,12 +1,12 @@
exports.newDataMiningBotModulesFromOneMinToMultiTimeFrameMarket = function (processIndex) {
/*
This module is about converting a One-Min Daily typeo of data set into a Multi Time Frame Market type.
This module is about converting a One-Min Daily type of data set into a Multi Time Frame Market type.
The process to do so involves:
Reading the elements (elements, volumens, bolllinger bands, news, asset metrics, etc.) from a
Reading the elements (elements, volumes, bollinger bands, news, asset metrics, etc.) from a
One-Min Dataset (a dataset that is organized with elements spanning one min, like one min begin-end-elements,
or elements with a timestamp captured approximatelly one minute from each other)
or elements with a timestamp captured approximately one minute from each other)
organized in Daily Files.
It is going to output a Market Files dataset for every Market Time Frame, aggregating the
@@ -35,7 +35,7 @@ exports.newDataMiningBotModulesFromOneMinToMultiTimeFrameMarket = function (proc
let statusDependenciesModule
let dataDependenciesModule
let node = {} // Usefull nodes for this module will be stored here.
let node = {} // Useful nodes for this module will be stored here.
return thisObject;
@@ -67,7 +67,7 @@ exports.newDataMiningBotModulesFromOneMinToMultiTimeFrameMarket = function (proc
datetimeLastProducedFile: undefined, // Datetime of the last file files successfully produced by this process.
datetimeBeginingOfMarketFile: undefined, // Datetime of the first trade file in the whole market history.
datetimeLastAvailableDependencyFile: undefined, // Datetime of the last file available to be used as an input of this process.
beginingOfMarket: undefined // Datetime of the begining of the market.
beginingOfMarket: undefined // Datetime of the beginning of the market.
}
TS.projects.foundations.functionLibraries.fromOneMinToMultiTimeFrameFunctions.getContextVariables(
@@ -129,7 +129,7 @@ exports.newDataMiningBotModulesFromOneMinToMultiTimeFrameMarket = function (proc
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> 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 -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.")
"[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> Assuming this is a temporary situation. Requesting a Retry.")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
}
} else {
@@ -167,7 +167,7 @@ exports.newDataMiningBotModulesFromOneMinToMultiTimeFrameMarket = function (proc
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 outputElements = []
@@ -191,7 +191,7 @@ exports.newDataMiningBotModulesFromOneMinToMultiTimeFrameMarket = function (proc
function timeframesLoop() {
/*
We will iterate through all posible time frames.
We will iterate through all possible time frames.
*/
let timeFrameArrayIndex = 0 // loop Variable representing each possible period as defined at the Time Frame Array.
@@ -252,7 +252,7 @@ exports.newDataMiningBotModulesFromOneMinToMultiTimeFrameMarket = function (proc
function aggregateAndWriteOutputFile(dependencyDailyFile) {
/*
Here we call the function that will aggregate all the information
at the dependency file into standarized begin-end-elements.
at the dependency file into standardized begin-end-elements.
*/
TS.projects.foundations.functionLibraries.fromOneMinToMultiTimeFrameFunctions.aggregateFileContent(
node,
@@ -2,7 +2,7 @@
const MODULE_NAME = "Multi Time Frame Daily"
/*
This module deals with Daily Files, that are data files for Time Frames below 1 hour.
It also assumes that the data dependencias are in Daily Files, one file for each Time Frame.
It also assumes that the data dependencies are in Daily Files, one file for each Time Frame.
*/
let thisObject = {
initialize: initialize,
@@ -58,11 +58,11 @@
let thisReport
let statusReport
/*
We look first for the bot who knows the begining of the market in order to get when the market starts.
We look first for the bot who knows the beginning of the market 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 -> Market Starting Point -> Status Report does not exist or Market Starting Point not defined. Retrying Later. ")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
@@ -114,7 +114,7 @@
*/
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 -> Market Ending Point -> Status Report does not exist or Market Ending Point not defined. Retrying Later. ")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
@@ -149,7 +149,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 -> Self Reference -> Status Report does not exist or Self Reference not defined or badly configured. Check that at the Status Dependency you have chosen Self Reference at the config. Retrying Later. ")
callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE)
@@ -169,7 +169,7 @@
beginingOfMarket = new Date(thisReport.beginingOfMarket)
if (beginingOfMarket.valueOf() !== contextVariables.dateBeginOfMarket.valueOf()) { // Reset Mechanism for Begining of the Market
if (beginingOfMarket.valueOf() !== contextVariables.dateBeginOfMarket.valueOf()) { // Reset Mechanism for Beginning of the Market
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getContextVariables -> Reset Mechanism for Begining of the Market Activated.")
@@ -185,7 +185,7 @@
} else {
/*
In the case when there is no status report, we assume like the last processed file is the one on the date of Begining of Market.
In the case when there is no status report, we assume like the last processed file is the one on the date of Beginning of Market.
*/
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getContextVariables -> Starting from the begining of the market because own status report not found or lastFile was undefined.")
@@ -209,7 +209,7 @@
*/
interExecutionMemoryArray = []
/*
Also, we will remember that we are bootstrapping the process, this will allow us, to advanceTime if necesary.
Also, we will remember that we are bootstrapping the process, this will allow us, to advanceTime if necessary.
It can happen that a process depends on data from another process that does not produce a file during the first day, or even more days,
in that situation we want the process not to just wait for that data that will never arrive, but to advance time until it finds valid data.
*/
@@ -242,7 +242,7 @@
let botNeverRan = true;
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME =
new Date(contextVariables.lastFile.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.
new Date(contextVariables.lastFile.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(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.valueOf())
let lastDate = TS.projects.foundations.utilities.dateTimeFunctions.removeTime(new Date())
@@ -297,7 +297,7 @@
function timeFramesLoop() {
/*
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 timeFrames array.
timeFramesLoopBody()
@@ -375,8 +375,8 @@
function onFileReceived(err, text) {
if ((err.message === "File does not exist." && botNeverRan === true) || err.code === 'The specified key does not exist.') {
/*
Sometimes one of the dependencies of an indicator for some reasons are not calculated from the begining of the market.
When that happens we can not find those files. What we do in this situation is to move the time fordward until we can find
Sometimes one of the dependencies of an indicator for some reasons are not calculated from the beginning of the market.
When that happens we can not find those files. What we do in this situation is to move the time forward until we can find
all the dependencies and the first run of the bot is successful.
After that, we will not accept more missing files on any of the dependencies, and if any is missing we will abort the processing.
@@ -429,7 +429,7 @@
if (bootstrappingTheProcess === true) {
/*
In the special situation where we are running this process for the first time (no status report found),
we will consider the possibility that a depanant process does not produce a file during the first day of the market,
we will consider the possibility that a dependant process does not produce a file during the first day of the market,
or even more than one day. That is why we are going to advance time here.
*/
advanceTime()
@@ -2,7 +2,7 @@
const MODULE_NAME = "Multi Time Frame Market"
/*
This module deals with Market Files, that are data files for Time Frames of 1 hour and above.
It also assumes that the data dependencias are in Market Files, one file for each Time Frame.
It also assumes that the data dependencies are in Market Files, one file for each Time Frame.
*/
let thisObject = {
initialize: initialize,
@@ -46,7 +46,7 @@
timeFramesLoop()
function timeFramesLoop() {
/* 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 timeFrames array.
timeFramesLoopBody()
}
@@ -69,7 +69,7 @@
1. Parameters set by SA user at the Crypto Exchange node are extracted. There might be parameters for each supported method at the CCXT library.
2. The CCXT class for the configured exchange is instantiated, with whatever options where configured.
This gives the SA user a lot of control over the underlaying CCXT gateway to exchanges.
This gives the SA user a lot of control over the underlying CCXT gateway to exchanges.
*/
try {
statusDependencies = pStatusDependencies;
@@ -204,7 +204,7 @@
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;
}
@@ -664,11 +664,11 @@
What we are going to do in this function is to save all the candles
received from the exchange. We need to partition the batch of candles
into 1 day files. At the same time we need to take care of the situation
that some exchanges send inconsitent data. We have detected some cases
that some exchanges send inconsistent data. We have detected some cases
where candles do not begin at second 0 of the minute but are a little
bit shifted. We will try to detect this and fix it as we go.
We have the data received from the exchange at the arrary rawDataArray
We have the data received from the exchange at the array rawDataArray
*/
try {
@@ -761,7 +761,7 @@
Here we will check that the current candle is not going into the future.
Remember we are looping around all possible minutes of a day, and when
that day is the current actual day, and the current minute is in the future,
it manke no more sense to continue inside this loop since we are not going
it make no more sense to continue inside this loop since we are not going
to find more OHLCVs matchings.
At the same time, we are going to check that we haven't processed the whole
@@ -808,7 +808,7 @@
/*
We will check that we can have a record to
analize. It might happen that we don't have one
analyze. It might happen that we don't have one
in the situation that we could not get a single
record from the exchange. We still want to be
here so that everything is properly logged.
@@ -828,7 +828,7 @@
let OHLCVMinute
/*
Some exchanges return inconsistent data. It is not guaranteed
that each candle will have a timeStamp exactly at the begining of an
that each candle will have a timeStamp exactly at the beginning of an
UTC minute. It is also not guaranteed that the distance
between timestamps will be the same. To fix this, we will do this.
*/
@@ -839,12 +839,12 @@
If the minute of the record item received from the exchange is
less than the minute of the current minute in our loop,
that means that we need to reposition the inded at the rawDataArray
array, moving it one record fordward, and that is what we are
array, moving it one record forward, and that is what we are
doing here.
*/
while (OHLCVMinute < candleMinute) {
/* Move fordward at the rawDataArray array. */
/* Move forward at the rawDataArray array. */
ohlcvArrayIndex++
/* Check that we have not passed the end of the array */
@@ -903,7 +903,7 @@
/*
Since we extracted this OHLCV value, we move
fordward our array index.
forward our array index.
*/
if (ohlcvArrayIndex < rawDataArray.length - 1) {
ohlcvArrayIndex++
@@ -915,7 +915,7 @@
}
/*
Here we remeber the last candle and volumen, in case
Here we remember the last candle and volume, in case
we need it.
*/
lastCandle = candle
@@ -1088,7 +1088,7 @@
/*
One possible exit is when we reached the amount of candles downloaded.
This does not necesary happens at the end of the market
This does not necessary happens at the end of the market
if the process was canceled for any reason at the middle,
or the exchange became unavailable.
*/
@@ -1111,7 +1111,7 @@
}
/*
If there is no reson to exit, we will process the next day.
If there is no reason to exit, we will process the next day.
*/
setImmediate(loop)
}
@@ -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": [
@@ -1,7 +1,14 @@
{
"type": "Tutorial Step",
"definition": {
"text": "A tutorial step is a type of node within a tutorial that may not have offspring. As such, it is the smallest unit of information in the hierarchy."
"text": "A tutorial step is a type of node within a tutorial that may not have offspring. As such, it is the smallest unit of information in the hierarchy.",
"translations": [
{
"language": "RU",
"text": "Шаг учебного пособия - это тип узла в пособии, который может не иметь потомков. Таким образом, это самая маленькая единица информации в иерархии.",
"updated": 1635612531097
}
]
},
"paragraphs": [
{
@@ -1,7 +1,14 @@
{
"type": "Tutorial Topic",
"definition": {
"text": "A tutorial topic is an organizational device that helps to keep tutorial step nodes arranged in a logical hierarchy by topics and subtopics."
"text": "A tutorial topic is an organizational device that helps to keep tutorial step nodes arranged in a logical hierarchy by topics and subtopics.",
"translations": [
{
"language": "RU",
"text": "Учебная тема - это организационное устройство, которое помогает упорядочивать узлы этапов обучения в логической иерархии по темам и подтемам.",
"updated": 1635612097339
}
]
},
"paragraphs": [
{
@@ -13,7 +13,13 @@
{
"language": "DE",
"text": "Die Tutorial-Hierarchie besteht aus einer freien Anordnung von Tutorial Topic (Themen) und Tutorial Step nodes (Schritten), die ein Tutorial ausmachen. Jede node in der Hierarchie, einschließlich des übergeordneten Tutorial-nodes, stellt eine HTML-Seite dar, die sowohl über dem Design Space als auch dem Charting Space eingeblendet werden kann. Übersetzt ins deutsche von gitforkgit.",
"updated": 1633975790458
"updated": 1633975790458,
"style": "Definition"
},
{
"language": "RU",
"text": "Иерархия данного пособия содержит свободное расположение Tutorial Topic и узлов Tutorial Step, которые вместе составляют это учебное пособие. Каждый узел в иерархии, включая родительский узел пособия, представляет собой HTML-страницу, которая может быть наложена поверх Design Space и Charting Space.",
"updated": 1635509527381
}
]
},
@@ -30,7 +36,8 @@
{
"language": "DE",
"text": "Die Nodes in der Hierarchie können frei angeordnet werden, das heißt es können beliebig viele Tutorial-Themen (topic) und Tutorial-Steps vorhanden sein. Tutorial Themen können Tutorial Schritte aber auch andere Tutorial Themen enthalten. Dies erlaubt es verschachtelte Themen als Unterthemen verwendet werden.",
"updated": 1633975991952
"updated": 1633975991952,
"style": "Text"
}
]
},
@@ -42,7 +49,8 @@
{
"language": "DE",
"text": "Das System wertet die Hierarchie - wie üblich - im Uhrzeigersinn aus, beginnend mit dem Knoten rechts vom übergeordneten Tutorial-Knoten, zum tiefsten Knoten jedes Zweigs geht, bevor es zum nächsten geht.",
"updated": 1633976627129
"updated": 1633976627129,
"style": "Text"
}
]
},
@@ -54,7 +62,8 @@
{
"language": "DE",
"text": "Im Allgemeinen verhalten sich alle nodes ähnlich in dem Sinne, dass jede node, unabhängig vom genauen Typ, für sich genommen einen Lernschritt darstellt. Das heißt, alle nodes, einschließlich der obersten Tutorial-node, der Tutorial Topic node und der Tutorial Step node können eine Inhaltsseite als Schritt im Tutorial anzeigen. Feinere Unterschiede sind gegebenenfalls hervorzuheben.",
"updated": 1633976586338
"updated": 1633976586338,
"style": "Callout"
}
]
},
@@ -66,7 +75,8 @@
{
"language": "DE",
"text": "Die wichtigste Gemeinsamkeit aller Knotentypen in der Hierarchie ist, dass sie alle Inhalte aus der Sammlung der Dokumentseiten des Tutorials beziehen können. Das heißt, jeder Knoten in der Hierarchie zeigt auf eine Docs Page (Dokumentationsseite), und es ist diese Seite in den Dokumenten, die den Inhalt für den gegebenen Schritt anzeigt. Der Zeiger wird in der Konfiguration jedes Knotens angegeben (siehe die Eigenschaft docs).",
"updated": 1633976778899
"updated": 1633976778899,
"style": "Note"
}
]
},
@@ -82,7 +92,8 @@
{
"language": "DE",
"text": "Tutorial Konfiguration",
"updated": 1633976794872
"updated": 1633976794872,
"style": "Title"
}
]
},
@@ -94,7 +105,8 @@
{
"language": "DE",
"text": "Die Konfiguration jedes Knotens in der Tutorial-Hierarchie bestimmt den Inhalt und das Verhalten der einzelnen Schritte. Alle node-typen haben die gleiche Grundkonfiguration. Tutorial Step nodes haben jedoch zusätzliche Eigenschaften, die auf der Seite \" Tutorial Step nodes \" beschrieben werden.",
"updated": 1633977045116
"updated": 1633977045116,
"style": "Text"
}
]
},
@@ -106,7 +118,8 @@
{
"language": "DE",
"text": "Die auf dieser Seite beschriebenen Konfigurationseigenschaften gelten für alle Arten von Nodes in der Hierarchie.",
"updated": 1633977077545
"updated": 1633977077545,
"style": "Success"
}
]
},
@@ -118,7 +131,8 @@
{
"language": "DE",
"text": "Das Layout der HTML-Seite folgt dem Layout der zugehörigen Seite in den Docs, wird aber innerhalb der Grenzen des Tutorial-Fensters angezeigt.",
"updated": 1633977110132
"updated": 1633977110132,
"style": "Text"
}
]
},
@@ -130,7 +144,8 @@
{
"language": "DE",
"text": "Mit anderen Worten beeinflussen Sie das Layout des jeweiligen Schritts, indem Sie Inhalte schreiben und Stile auf einzelne Absätze in der zugehörigen Docs-Page anwenden.",
"updated": 1633977352460
"updated": 1633977352460,
"style": "Callout"
}
]
},
@@ -142,7 +157,8 @@
{
"language": "DE",
"text": "Die HTML / Tutorial -Seite verfügt über einen begrenzten Platz und unterstützt kein Scrollen. Wenn zu viele Informationen in der zugehörigen Docs Page definiert werden, übersteigt der resultierende Inhalt den verfügbaren Platz im Tutorial-Fenster. Es gibt keine systemseitige Kontrolle, um mit solchen Text-Überläufen (in den Tutorial fenstern) umzugehen, so dass es an Ihnen liegt, die Informationen auf mehrere Schritte zu verteilen und jede Seite innerhalb ihrer Grenzen zu halten.",
"updated": 1633977528479
"updated": 1633977528479,
"style": "Note"
}
]
},
@@ -154,7 +170,8 @@
{
"language": "DE",
"text": "Eigenschaften der Konfiguration",
"updated": 1633977545673
"updated": 1633977545673,
"style": "Title"
}
]
},
@@ -171,7 +188,8 @@
{
"language": "DE",
"text": "Das Eigenschaftssymbol benötigt zwei Definitionen:",
"updated": 1633977572877
"updated": 1633977572877,
"style": "Text"
}
]
},
@@ -182,7 +200,8 @@
{
"language": "DE",
"text": "Der \"name\" des Symbols ohne die Erweiterung;",
"updated": 1633977609627
"updated": 1633977609627,
"style": "List"
}
]
},
@@ -193,7 +212,8 @@
{
"language": "DE",
"text": "Das \"project\", zu dem das Symbol gehört.",
"updated": 1633977635502
"updated": 1633977635502,
"style": "List"
}
]
},
@@ -204,7 +224,8 @@
{
"language": "DE",
"text": "Zu Ihrer Information: Die Icons (Symbole) werden unter folgendem Pfad gespeichert:",
"updated": 1633977674577
"updated": 1633977674577,
"style": "Text"
}
]
},
@@ -221,7 +242,8 @@
{
"language": "DE",
"text": "Verwenden Sie die vorhandene Sammlung von Icons (Symbolen), um jeden Schritt des Tutorials zu illustrieren. Diese Illustrationen tragen sehr viel zu einer überzeugenderen Kommunikation bei.",
"updated": 1633977745001
"updated": 1633977745001,
"style": "Success"
}
]
},
@@ -233,7 +255,8 @@
{
"language": "DE",
"text": "Wenn die Konfiguration vorhanden ist, wird das Symbol in einer Tabelle neben dem Textblock platziert, der das Definitionsfeld der zugehörigen Docs Page bildet. Wenn kein Symbol vorhanden ist, nimmt die Definition die gesamte Breite der Seite ein.",
"updated": 1633977797138
"updated": 1633977797138,
"style": "Text"
}
]
},
@@ -250,7 +273,8 @@
{
"language": "DE",
"text": "Die obige Konfiguration platziert das Symbol balance.png des Superalgos-Projekts in der Tabelle der entsprechenden Docs-Seite (siehe die docs Eigenschaft unten).",
"updated": 1633977851249
"updated": 1633977851249,
"style": "Text"
}
]
},
@@ -267,7 +291,8 @@
{
"language": "DE",
"text": "Die Eigenschaft \"position\" bestimmt die Position des fließenden HTML-Dokuments (Tutorial-Fensters). Es gibt drei Alternativen... \"Links\", \"Rechts\", oder lassen Sie das Feld leer, um die Seite in der Mitte des Bildschirms zu positionieren.",
"updated": 1633977968939
"updated": 1633977968939,
"style": "Text"
}
]
},
@@ -284,7 +309,8 @@
{
"language": "DE",
"text": "Bei der obigen Konfiguration befindet sich das Tutorial-Fenster auf der linken Seite des Bildschirms.",
"updated": 1633978012441
"updated": 1633978012441,
"style": "Text"
}
]
},
@@ -300,7 +326,8 @@
{
"language": "DE",
"text": "Die Eigenschaft slider bestimmt die Position des horizontalen Schiebereglers. Es gibt drei Alternativen... \"toTop\", \"toBottom\", \"toMiddle\".",
"updated": 1633978051324
"updated": 1633978051324,
"style": "Text"
}
]
},
@@ -331,7 +358,8 @@
{
"language": "DE",
"text": "Mit der Eigenschaft pressButton können Sie das Tutorial zwangsweise \"anhalten\", zum \"nächsten\" Schritt gehen, zum \"vorherigen\" Schritt gehen oder einen Schritt \"überspringen\". Wenn ein Schritt geladen wird und eine dieser Optionen in dieser Eigenschaft konfiguriert ist, wird die Aktion sofort ausgeführt.",
"updated": 1633978127988
"updated": 1633978127988,
"style": "Text"
}
]
},
@@ -343,7 +371,8 @@
{
"language": "DE",
"text": "Eine häufige Verwendung dieser Funktion ist das Überspringen eines Schrittes, z.B. einer Tutorial-topic-node, die ausschließlich für organisatorische Zwecke innerhalb der Hierarchie verwendet wird und daher keinen Inhalt hat. Lassen Sie das Feld leer, damit der Schritt auf die übliche Weise abgespielt wird.",
"updated": 1633978359504
"updated": 1633978359504,
"style": "Note"
}
]
},
@@ -360,7 +389,8 @@
{
"language": "DE",
"text": "Die obige Konfiguration führt den Benutzer zum nächsten Schritt des Tutorials, ohne dass der Inhalt der betreffenden node angezeigt wird.",
"updated": 1633978461463
"updated": 1633978461463,
"style": "Text"
}
]
},
@@ -372,7 +402,8 @@
{
"language": "DE",
"text": "Sie können Tutorial Topic nodes nur zu organisatorischen Zwecken verwenden, z.B. um die Hierarchie so anzuordnen, dass sie einfach zu lesen und zu pflegen ist. Themen mit zu vielen Schritten sind später schwieriger zu handhaben. Mit anderen Worten: Sie können einen Tutorial Topic node verwenden, um mehrere Schritte zu gruppieren, auch wenn Sie nicht beabsichtigen, dass die Tutorial Topic node irgendeinen Inhalt anzeigt. In solchen Fällen können Sie diese Eigenschaft verwenden, um den Schritt zu überspringen, der nicht für die Anzeige von Inhalten vorgesehen ist.",
"updated": 1633979074457
"updated": 1633979074457,
"style": "Success"
}
]
},
@@ -389,7 +420,8 @@
{
"language": "DE",
"text": "Die docs-Eigenschaft wird verwendet, um auf die Docs Tutorial Page zu verweisen, die den Inhalt für den jeweiligen Tutorial-Schritt liefert. Die Definition erfordert den Namen des Project (Projekts), die Docs Page Category (Kategorie) welche immer \"Tutorial\" ist, und den vollständigen Namen der Docs Page, das heißt den \"Typ\", wie in der JSON-Datei angegeben.",
"updated": 1633979212224
"updated": 1633979212224,
"style": "Text"
}
]
},
@@ -410,7 +442,8 @@
{
"language": "DE",
"text": "Die Eigenschaft wird verwendet, um das Verhalten des Docs-Panels zu steuern. Innerhalb von controlDocs sind mehrere Eigenschaften verfügbar, die alle optional sind. Sehen wir uns jede im Detail an.",
"updated": 1633979296433
"updated": 1633979296433,
"style": "Text"
}
]
},
@@ -422,7 +455,8 @@
{
"language": "DE",
"text": "Die Panel-Eigenschaft kann auf \"Öffnen\" oder \"Schließen\" eingestellt werden. Diese Eigenschaft steuert die Registerkarte, mit der Sie das Doku-Panel in einem Schritt öffnen und in einem anderen Schritt wieder schließen können, wenn es nicht mehr benötigt wird.",
"updated": 1633979356912
"updated": 1633979356912,
"style": "Text"
}
]
},
@@ -443,7 +477,8 @@
{
"language": "DE",
"text": "Wenn das Docs Panel geschlossen ist, sind die restlichen Eigenschaften irgendwie irrelevant. Wenn das Docs-Panel jedoch geöffnet ist, steuern die restlichen Eigenschaften, was im Docs-Panel angezeigt wird.",
"updated": 1633979402232
"updated": 1633979402232,
"style": "Success"
}
]
},
@@ -455,7 +490,8 @@
{
"language": "DE",
"text": "Die Eigenschaft closeTutorialEditor kann den Docs-Editor ein- und ausschalten. Wenn die Eigenschaft auf false gesetzt ist oder wenn es keine Definition gibt und wenn keine spezifische Docs-Seite aufgerufen wird (siehe controlDocs unten), zeigt das Docs-Panel die Seite, die mit dem aktuellen Tutorial-Schritt im Bearbeitungsmodus verbunden ist.",
"updated": 1633979594120
"updated": 1633979594120,
"style": "Text"
}
]
},
@@ -472,7 +508,8 @@
{
"language": "DE",
"text": "Da diese Definition standardmäßig auf false gesetzt ist, ist dies das standardmäßige Verhalten. Das heißt, wenn das Docs-Bedienfeld geöffnet wird, während ein Tutorial-Schritt abgespielt wird, zeigt das Docs-Bedienfeld standardmäßig die Docs-Seite an, die mit dem jeweiligen Schritt verknüpft ist, so dass die Seite direkt an Ort und Stelle bearbeitet werden kann.",
"updated": 1633979921238
"updated": 1633979921238,
"style": "Success"
}
]
},
@@ -484,7 +521,8 @@
{
"language": "DE",
"text": "Wenn die Eigenschaft closeTutorialEditor auf true gesetzt ist und keine Anforderung zum Öffnen einer Dokumentseite vorliegt (siehe Eigenschaft page weiter unten), dann zeigt das Dokumentseiten-Panel die Dokumentseite an, die im vorherigen Schritt angezeigt wurde.",
"updated": 1633979700958
"updated": 1633979700958,
"style": "Text"
}
]
},
@@ -501,7 +539,8 @@
{
"language": "DE",
"text": "Es kann sinnvoll sein, den Tutorial Editor zu schließen, wenn der Benutzer von einem Schritt zum nächsten mit den Docs interagieren soll. Nehmen wir zum Beispiel an, das Tutorial weist den Benutzer an, eine Suche durchzuführen und dieses Ergebnis im nächsten Schritt zu besprechen. In diesem Fall möchten Sie, dass der Editor des Tutorials geschlossen bleibt, da sonst die vom Benutzer durchgeführte Suche verloren ginge und stattdessen die Seite geladen würde, die dem neuen Schritt des Tutorials entspricht.",
"updated": 1633979902886
"updated": 1633979902886,
"style": "Success"
}
]
},
@@ -513,7 +552,8 @@
{
"language": "DE",
"text": "Die Eigenschaft searchPage überschreibt die Einstellungen des Tutorial-Editors und lädt die Hauptsuchseite mit dem Suchfeld in der Mitte.",
"updated": 1633979953175
"updated": 1633979953175,
"style": "Text"
}
]
},
@@ -530,7 +570,8 @@
{
"language": "DE",
"text": "Verwenden Sie die obige Einstellung, wenn Sie möchten, dass der Benutzer das saubere Suchfeld erhält, um eine Suche durchzuführen oder einen Befehl auszuführen.",
"updated": 1633980006636
"updated": 1633980006636,
"style": "Success"
}
]
},
@@ -542,7 +583,8 @@
{
"language": "DE",
"text": "Mit der page property legen Sie fest, welche Docs Page geladen werden soll. Sie müssen das Project (Projekt), die Docs Page Category (Kategorie) und den \"type\" (Typ), also den vollständigen Namen der Seite, angeben. Die optionale Eigenschaft anchor ermöglicht es Ihnen, den Benutzer mit dem Docs Anchor Style auf einen bestimmten Absatz der Seite zu verweisen.",
"updated": 1633980112889
"updated": 1633980112889,
"style": "Text"
}
]
},
@@ -559,7 +601,8 @@
{
"language": "DE",
"text": "Verwenden Sie die obige Konfiguration, wenn Sie möchten, dass der Benutzer eine bestimmte Seite in den Docs liest.",
"updated": 1633980693215
"updated": 1633980693215,
"style": "Success"
}
]
}
@@ -9,6 +9,31 @@ function newEducationFunctionLibraryDocsStats() {
node,
rootNodes
) {
console.log("this is our docs stats")
console.log("Docs Statistical Report:")
let documentPage
let pagesCount = 0
let projectStats = {}
// Create Stats for each project
for (let j = 0; j < PROJECTS_SCHEMA.length; j++) {
let project = PROJECTS_SCHEMA[j].name
projectStats[project] = 0
}
for (let i = 0; i < UI.projects.education.spaces.docsSpace.searchEngine.docsIndex.length; i++) {
documentPage = UI.projects.education.spaces.docsSpace.searchEngine.docsIndex[i]
pagesCount += 1
if (projectStats[documentPage.project] !== undefined) {
lastValue = projectStats[documentPage.project]
}
projectStats[documentPage.project] = lastValue + 1
//will need to access documentPage.docsSchemaDocument.paragraphs then for each paragraph paragraph.translations
}
console.log("We have this many pages " + pagesCount + " total across all projects.")
for (let project in projectStats) {
console.log(`There are this many pages ${projectStats[project]} in the ${project} project`)
}
}
}
@@ -26,7 +26,6 @@ function newFoundationsDocsCommmandInterface() {
function detectAppCommands() {
if (checkContributeCommand() === undefined) { return true }
if (checkUserUpdateCommand() === undefined) { return true }
if (checkUpdateCommand() === undefined) { return true }
if (fixAppSchema() === undefined) { return true }
@@ -99,75 +98,6 @@ function newFoundationsDocsCommmandInterface() {
}
}
function checkUserUpdateCommand() {
if (UI.projects.education.spaces.docsSpace.commandInterface.command.toLowerCase() === 'app.help app.userupdate') {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Userupdate Command')
return
}
if (UI.projects.education.spaces.docsSpace.commandInterface.command.indexOf('App.UserUpdate') !== 0 && UI.projects.education.spaces.docsSpace.commandInterface.command.indexOf('app.userupdate') !== 0) { return 'Not Contribute Commands' }
/* Set up the commit message */
let message = UI.projects.education.spaces.docsSpace.commandInterface.command.trim().substring(UI.projects.education.spaces.docsSpace.commandInterface.command.indexOf(' ') + 1, UI.projects.education.spaces.docsSpace.commandInterface.command.length)
if (message.toLowerCase() === 'app.userupdate') {
message = 'This is my UserUpdate to Superalgos'
}
/* Find the Username and Password */
let apisNode = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadByNodeType('APIs')
if (apisNode === undefined) {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
return
}
if (apisNode.githubAPI === undefined) {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
return
}
let config = JSON.parse(apisNode.githubAPI.config)
if (config.username === undefined || config.username === "") {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
return
}
if (config.token === undefined || config.token === "") {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Error - Github Credentials Missing', 'Anchor Github Credentials Missing')
return
}
message = message.replaceAll('#', '_HASHTAG_')
message = message.replaceAll('/', '_SLASH_')
httpRequest(
undefined,
'App/UserUpdate/' +
message + '/' +
config.username + '/' +
config.token + '/' +
UI.projects.education.spaces.docsSpace.currentBranch + '/' +
UI.projects.education.spaces.docsSpace.contributionsBranch
, onResponse)
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Message - UserUpdate Request')
return
function onResponse(err, data) {
/* Lets check the result of the call through the http interface */
data = JSON.parse(data)
if (err.result === GLOBAL.DEFAULT_OK_RESPONSE.result && data.result === GLOBAL.DEFAULT_OK_RESPONSE.result) {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Message - UserUpdate Done')
} else {
UI.projects.education.spaces.docsSpace.navigateTo(
data.docs.project,
data.docs.category,
data.docs.type,
data.docs.anchor,
undefined,
data.docs.placeholder
)
}
}
}
function checkUpdateCommand() {
if (UI.projects.education.spaces.docsSpace.commandInterface.command.toLowerCase() === 'app.help app.update') {
UI.projects.education.spaces.docsSpace.navigateTo('Foundations', 'Topic', 'App Update Command')
@@ -619,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) {
/*
@@ -172,7 +172,6 @@ function newFoundationsDocsFooter() {
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeCurrentBranch(\'master\')">Master</a></li>'
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeCurrentBranch(\'develop\')">Develop</a></li>'
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeCurrentBranch(\'plugins-docs\')">Plugins-Docs</a></li>'
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeCurrentBranch(\'next-version\')">Next-Version</a></li>'
HTML = HTML + '</ul>'
HTML = HTML + '</div>'
@@ -183,7 +182,6 @@ function newFoundationsDocsFooter() {
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeContributionsBranch(\'master\')">Master</code></li>'
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeContributionsBranch(\'develop\')">Develop</a></li>'
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeContributionsBranch(\'plugins-docs\')">Plugins-Docs</a></li>'
HTML = HTML + '<li><a href="#" onClick="UI.projects.education.spaces.docsSpace.changeContributionsBranch(\'next-version\')">Next-Version</a></li>'
HTML = HTML + '</ul>'
HTML = HTML + '</ul>'
+4 -4
View File
@@ -120,7 +120,7 @@ function newEducationUtilitiesDocs() {
if (UI.projects.education.spaces.docsSpace.language === UI.projects.education.globals.docs.DEFAULT_LANGUAGE) {
if (paragraph.text !== text) {
/* This will make the Client to save this in a file overwritting the previous version*/
/* This will make the Client to save this in a file overwriting the previous version*/
UI.projects.education.spaces.docsSpace.documentPage.docsSchemaDocument.updated = true
paragraph.text = text
@@ -145,7 +145,7 @@ function newEducationUtilitiesDocs() {
if (translation.language === UI.projects.education.spaces.docsSpace.language) {
if (translation.text !== text) {
/* This will make the Client to save this in a file overwritting the previous version*/
/* This will make the Client to save this in a file overwriting the previous version*/
UI.projects.education.spaces.docsSpace.documentPage.docsSchemaDocument.updated = true
translation.text = text
@@ -161,7 +161,7 @@ function newEducationUtilitiesDocs() {
}
paragraph.translations.push(translation)
/* This will make the Client to save this in a file overwritting the previous version*/
/* This will make the Client to save this in a file overwriting the previous version*/
UI.projects.education.spaces.docsSpace.documentPage.docsSchemaDocument.updated = true
return
}
@@ -613,7 +613,7 @@ function newEducationUtilitiesDocs() {
function tagDefinedTypes(text, excludedType) {
const MAX_NUMBER_OF_WORDS = 10
text = text.trim()
let cleanText = text.replace(/'/g, ' AMPERSAND ') // scaping ampersands, separating them from other words
let cleanText = text.replace(/'/g, ' AMPERSAND ') // escaping ampersands, separating them from other words
.replaceAll(':', ' :')
.replaceAll(',', ' ,')
.replaceAll('.', ' .')
@@ -48,7 +48,7 @@
/* these are module specific variables: */
let bands = []; // Here we keep the bands to be ploted every time the Draw() function is called by the AAWebPlatform.
let bands = []; // Here we keep the bands to be plotted every time the Draw() function is called by the AAWebPlatform.
let onMouseOverEventSuscriptionId
let zoomChangedEventSubscriptionId
@@ -65,7 +65,7 @@
function finalize() {
try {
/* Stop listening to the necesary events. */
/* Stop listening to the necessary events. */
thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId)
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId);
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId);
@@ -74,7 +74,7 @@
marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId);
dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId);
/* Destroyd References */
/* Destroyed References */
marketFiles = undefined;
dailyFiles = undefined;
@@ -119,7 +119,7 @@
marketFile = marketFiles.getFile(pTimeFrame);
fileCursor = dailyFiles.getFileCursor(pTimeFrame);
/* Listen to the necesary events. */
/* Listen to the necessary events. */
zoomChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged);
offsetChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged);
@@ -385,7 +385,7 @@
currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS);
}
/* Lests check if all the visible screen is going to be covered by bands. */
/* Lets check if all the visible screen is going to be covered by bands. */
let lowerEnd = leftDate.valueOf();
let upperEnd = rightDate.valueOf();
@@ -587,7 +587,7 @@
if (userPositionDate >= band.begin && userPositionDate <= band.end) {
/* highlight the current band */
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.05)'; // Current band accroding to time
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.05)'; // Current band according to time
}
if (
@@ -603,7 +603,7 @@
/* Next we are drawing the outter bands lines */
/* Next we are drawing the outer bands lines */
browserCanvasContext.beginPath();
@@ -620,7 +620,7 @@
/* highlight the current band */
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band accroding to time
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band according to time
let currentBand = {
bodyWidth: bandPoint3.x - bandPoint2.x,
@@ -658,7 +658,7 @@
if (userPositionDate >= band.begin && userPositionDate <= band.end) {
/* highlight the current band */
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band accroding to time
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current band according to time
}
browserCanvasContext.lineWidth = 0.2;
@@ -118,7 +118,7 @@ function newBollingerPlottersBollingerBandsBollingerBandsBollingerBandsPanel() {
y: Y_AXIS - currentBand.rightBodyHeight / 2 + currentBand.bottomDelta / 4
};
/* Extra bounderies due to constrained space */
/* Extra boundaries due to constrained space */
const upperLimit = frameTitleHeight + frameBodyHeight * 0.25;
const downLimit = frameTitleHeight + frameBodyHeight * 0.75;
@@ -141,7 +141,7 @@ function newCandlesPlottersCandlesVolumesCandlesCandlePanel() {
};
/* Extra bounderies due to constrained space */
/* Extra boundaries due to constrained space */
const upperLimit = frameTitleHeight + frameBodyHeight * 0.15;
const downLimit = frameTitleHeight + frameBodyHeight * 0.85;
@@ -38,7 +38,7 @@
/* these are module specific variables: */
let candles = []; // Here we keep the candles to be ploted every time the Draw() function is called by the AAWebPlatform.
let candles = []; // Here we keep the candles to be plotted every time the Draw() function is called by the AAWebPlatform.
let onMouseOverEventSuscriptionId
let zoomChangedEventSubscriptionId
@@ -55,7 +55,7 @@
function finalize() {
try {
/* Stop listening to the necesary events. */
/* Stop listening to the necessary events. */
thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId)
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId);
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId);
@@ -64,7 +64,7 @@
marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId);
dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId);
/* Destroyd References */
/* Destroyed References */
marketFiles = undefined;
dailyFiles = undefined;
@@ -108,7 +108,7 @@
marketFile = marketFiles.getFile(pTimeFrame);
fileCursor = dailyFiles.getFileCursor(pTimeFrame);
/* Listen to the necesary events. */
/* Listen to the necessary events. */
zoomChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged);
offsetChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged);
@@ -376,7 +376,7 @@
currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS);
}
/* Lests check if all the visible screen is going to be covered by candles. */
/* Lets check if all the visible screen is going to be covered by candles. */
let lowerEnd = leftDate.valueOf();
let upperEnd = rightDate.valueOf();
@@ -719,7 +719,7 @@
}
/* Draw mouse candel and Raise Event. */
/* Draw mouse candle and Raise Event. */
if (mouseCandle) {
/* highlight the current candle */
@@ -735,7 +735,7 @@
browserCanvasContext.closePath();
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current candle accroding to time
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 1)'; // Current candle according to time
browserCanvasContext.fill();
@@ -141,7 +141,7 @@ function newCandlesPlottersCandlesVolumesCandlesCandlePanel() {
};
/* Extra bounderies due to constrained space */
/* Extra boundaries due to constrained space */
const upperLimit = frameTitleHeight + frameBodyHeight * 0.15;
const downLimit = frameTitleHeight + frameBodyHeight * 0.85;
@@ -177,7 +177,7 @@ exports.newFoundationsUtilitiesHttpResponses = function () {
if (fileNameReceived === '') {
/*
When there is no endpoint specidied we will respond with this app's Home Page.
When there is no endpoint specified we will respond with this app's Home Page.
*/
let fs = SA.nodeModules.fs
@@ -194,7 +194,7 @@ exports.newFoundationsUtilitiesHttpResponses = function () {
} else {
/*
When there is a parameter but it does not match any of the available endpoints, we
will serve the file with the same name at at a location that depends on it's file extention.
will serve the file with the same name at at a location that depends on it's file extension.
*/
let completeFileName = fileNameReceived
let fileExtension = completeFileName.split('.')[1]
@@ -9,6 +9,17 @@
"dontShowAtFullscreen": true,
"actionFunction": "uiObject.configEditor.activate"
},
{
"action": "Install Product",
"label": "Install Product",
"askConfirmation": true,
"confirmationLabel": "Confirm to Proceed",
"workDoneLabel": "Done",
"relatedUiObject": "Product Definition",
"actionFunction": "payload.executeAction",
"relatedUiObjectProject": "Foundations"
},
{
"action": "Add UI Object",
"disableIfPropertyIsDefined": true,
@@ -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": [
{
@@ -7,7 +7,13 @@
{
"language": "ES",
"text": "El Client, junto con el TS y la UI es uno de los tres componentes centrales del Software Superalgos.",
"updated": 1624379422979
"updated": 1624379422979,
"style": "Definition"
},
{
"language": "RU",
"text": "Клиент вместе с TS и UI является одним из трех основных компонентов программного обеспечения Superalgos.\n",
"updated": 1635511193244
}
]
},
@@ -9,6 +9,11 @@
"text": "La Community, o la Superalgos Community, es el grupo de entidades que participan en el proyecto Superalgos, ya sea contribuyendo activamente al avance del proyecto o utilizando pasivamente el software Superalgos.",
"updated": 1628046272721,
"style": "Definition"
},
{
"language": "RU",
"text": "Сообщество, или Сообщество Superalgos - это группа организаций, участвующих в проекте Superalgos или активно способствующих продвижению проекта, или пассивно использующих Superalgos Network.",
"updated": 1635453748177
}
]
},
Loaded 100 of 363 files, more files were not shown because too many files have changed in this diff. Show more