Compare commits

...
Author SHA1 Message Date
Luis Fernando Molina ff5727dfa8 Merge pull request #471 from Superalgos/develop
Beta 8 SP2
2021-01-26 08:00:05 +01:00
Julian Molina cdba2315f8 Merge pull request #470 from julian-molina/develop
Contribution: Contribute tutorial split from Welcome
2021-01-25 20:59:25 +01:00
Julian Molina 821c96564d Contribute tutorial split from Welcome 2021-01-25 20:58:02 +01:00
Luis Fernando Molina 5e1e47b2dc Merge pull request #469 from Luis-Fernando-Molina/develop
Contribution: Trading Position Error Handling improved, connected to the Docs.
2021-01-25 18:59:25 +01:00
Luis Fernando Molina 80f063e92a Trading Position Error Handling improved, connected to the Docs. 2021-01-25 18:58:48 +01:00
Luis Fernando Molina 7dc9d3f884 Merge pull request #468 from Luis-Fernando-Molina/develop
Contribution: Improvement of Error handling when reaching the Max or Min balance configured / Integration with the Docs
2021-01-25 17:02:32 +01:00
Luis Fernando Molina e588048edf Improvement of Error handling when reaching the Max or Min balance configured / Integration with the Docs 2021-01-25 17:01:39 +01:00
Luis Fernando Molina 788085d15b Merge pull request #467 from Luis-Fernando-Molina/develop
Contribution: Icon names refactoring
2021-01-25 16:09:45 +01:00
Luis Fernando Molina 3c758ff2cd Icon names refactoring 2021-01-25 16:08:52 +01:00
Luis Fernando Molina 13fe2e7cfb Merge pull request #466 from Luis-Fernando-Molina/develop
Contribution: Reference to Phase Node Missing Error handlling Improved / Integrated with Docs
2021-01-25 14:46:29 +01:00
Luis Fernando Molina 4cdf5db8fe Reference to Phase Node Missing Error handlling Improved / Integrated with Docs 2021-01-25 14:38:02 +01:00
Luis Fernando Molina ba77d3b297 Merge pull request #465 from Luis-Fernando-Molina/develop
Contribution: Formula evaluation to not numeric valuie, handling improved and intergrate to Docs
2021-01-25 14:13:30 +01:00
Luis Fernando Molina 9885fe2c5a Formula evaluation to not numeric valuie, handling improved and intergrate to Docs 2021-01-25 14:12:39 +01:00
Luis Fernando Molina cb693be776 Merge pull request #464 from Luis-Fernando-Molina/develop
Contribution: Improving on LF Trading Formula evaluation error handling and UX / integration with the Docs
2021-01-25 13:30:31 +01:00
Luis Fernando Molina 4839ee9da1 Improving on LF Trading Formula evaluation error handling and UX / integration with the Docs 2021-01-25 13:29:30 +01:00
Luis Fernando Molina ca5e1c9d30 Merge pull request #461 from Luis-Fernando-Molina/develop
Contribution: Master Datamine cleaned of unused proeprty at Bollinger Band Indicator (repo)
2021-01-25 11:53:34 +01:00
Luis Fernando Molina 461cdbc267 Improvement at the error handling of conditions / integration with Docs 2021-01-25 11:52:41 +01:00
Luis Fernando Molina 33ca84bb4c Master Datamine cleaned of unused proeprty at Bollinger Band Indicator (repo) 2021-01-25 08:39:21 +01:00
Julian Molina 2ba63da81c Merge pull request #460 from julian-molina/develop
Contribution: Troubleshooting
2021-01-24 20:19:23 +01:00
Julian Molina a61930cd95 Investigating Issues - Check the Integrity of Your Data 2021-01-24 20:17:31 +01:00
Julian Molina eba2d94359 Investigating Issues - Check for Errors at the Browser 2021-01-24 20:13:17 +01:00
Julian Molina 1a5525d14c Investigating Issues - On-Screen Errors and Warnings 2021-01-24 20:11:14 +01:00
Julian Molina 52c08f2efa Investigating Issues - I Think I Broke Something... How Do I Start Over 2021-01-24 20:04:07 +01:00
Julian Molina fe05a88dcb Perception Issues - Indicator Data Seems Wrong 2021-01-24 20:01:50 +01:00
Julian Molina 254f79e651 Perception Issues - Market Data or Indicators Seem to be Outdated 2021-01-24 19:48:01 +01:00
Julian Molina c3e25cba44 Perception Issues - There Are No Candles on The Charts 2021-01-24 19:46:45 +01:00
Julian Molina 0f7ad28f01 Perception Issues - My System Gets Slow 2021-01-24 19:42:43 +01:00
Julian Molina 6b63cb5663 Initial Setup - Superalgos Failed to Connect Via Websockets 2021-01-24 19:34:07 +01:00
Julian Molina f7453d92fc Initial Setup - Node is not Recognized as an Internal or External Command 2021-01-24 19:11:52 +01:00
Julian Molina ce1d06cd69 How to Upgrade Your Existing Installation 2021-01-24 19:06:52 +01:00
Julian Molina cb059822ab How to Report an Issue 2021-01-24 19:01:37 +01:00
Julian Molina 7b9d600a8b Troubleshooting 2021-01-24 18:37:22 +01:00
Julian Molina e5729e9ac0 Merge pull request #459 from julian-molina/develop
Contribution: User Manual
2021-01-24 16:56:36 +01:00
Julian Molina df135d57ff User Manual 2021-01-24 16:55:25 +01:00
Julian Molina cb11b3db7d Merge pull request #458 from julian-molina/develop
Contribution: Productivity tools
2021-01-24 13:23:55 +01:00
Julian Molina babaef4b55 Screen capture 2021-01-24 13:21:52 +01:00
Julian Molina fc2f4a0117 Shares 2021-01-24 13:18:04 +01:00
Julian Molina afed59d336 Clones 2021-01-24 13:15:41 +01:00
Julian Molina d3af74aec6 Productivity tools 2021-01-24 13:09:15 +01:00
Julian Molina ca2f80a5b2 Merge pull request #457 from julian-molina/develop
Contribution: Integrations (telegram announcements and webhooks)
2021-01-24 12:28:59 +01:00
Julian Molina 8be353b246 Integrations (telegram announcements and webhooks) 2021-01-24 12:21:24 +01:00
Julian Molina dd9fe3aed2 Merge pull request #455 from julian-molina/develop
Contribution: Data Mines
2021-01-24 11:23:31 +01:00
Julian Molina 6356587af0 Data Mines Done 2021-01-24 11:22:44 +01:00
Julian Molina 51b79063c4 Merge branch 'develop' of https://github.com/Superalgos/Superalgos into develop 2021-01-24 11:17:19 +01:00
Julian Molina 2d9e33eb44 WIP 2021-01-23 21:31:19 +01:00
Julian Molina 5352fd90a8 WIP 2021-01-23 21:09:06 +01:00
Julian Molina 29c9cc2cf8 WIP 2021-01-23 20:47:19 +01:00
Julian Molina 44d2ea2ff1 WIP 2021-01-23 19:34:06 +01:00
Luis Fernando Molina 7e729a5c93 Merge pull request #456 from Luis-Fernando-Molina/develop
Contribution: Imrpovement on Error Reporting from the TS to the Docs
2021-01-23 15:53:07 +01:00
Luis Fernando Molina 4e50f9a699 Imrpovement on Error Reporting from the TS to the Docs 2021-01-23 15:51:48 +01:00
Julian Molina 97ec6be8f8 WIP 2021-01-23 14:52:30 +01:00
Julian Molina e5729262e4 Data Mines 2021-01-23 14:20:34 +01:00
Luis Fernando Molina 0d9c664fef Merge pull request #454 from Luis-Fernando-Molina/develop
Contribution: Refactoring of Icon Names and unused Configs Removed
2021-01-23 11:36:28 +01:00
Luis Fernando Molina b566e3de72 Merge pull request #453 from julian-molina/develop
Contribution: Refactoring of menu icons
2021-01-23 11:36:21 +01:00
Luis Fernando Molina 1873332a3b Removing config feature from nodes that don;t need them. 2021-01-23 11:34:58 +01:00
Luis Fernando Molina a336f3a385 Refactoring in order to fit icon names with page names 2021-01-23 11:26:40 +01:00
Julian Molina f24d469455 Refactoring of menu icons 2021-01-23 11:21:39 +01:00
Luis Fernando Molina e37e86e571 Merge pull request #452 from Luis-Fernando-Molina/develop
Contribution: Session Errors Handling / UX improved
2021-01-23 10:29:11 +01:00
Luis Fernando Molina 70774efa55 Session Errors Handling / UX improved 2021-01-23 10:28:24 +01:00
Julian Molina 81558e8d74 Merge pull request #450 from julian-molina/develop
Contribution: Crypto Ecosystem
2021-01-22 21:13:59 +01:00
Julian Molina 5d2909e087 Crypto Ecosystem 2021-01-22 21:13:33 +01:00
Julian Molina 9000dfb7c2 Merge pull request #449 from julian-molina/develop
Contribution: Trading Farms
2021-01-22 20:44:25 +01:00
Julian Molina 653b320256 Trading Farms 2021-01-22 20:43:33 +01:00
Julian Molina c2b956eaee Merge pull request #448 from julian-molina/develop
Contribution: Trading Engine Topic Done
2021-01-22 19:07:42 +01:00
Julian Molina 51ae97b46e Trading Engine Topic Done 2021-01-22 19:05:57 +01:00
Julian Molina 35c5e67c2f Trading Engine Topic WIP 2021-01-22 18:23:37 +01:00
Luis Fernando Molina 1fa826329a Merge pull request #447 from Luis-Fernando-Molina/develop
Contribution: Trading Session Errors Topic
2021-01-22 18:19:45 +01:00
Luis Fernando Molina ba453abc6e More Session Errors Pages Implemented 2021-01-22 18:16:22 +01:00
Julian Molina bee243d909 Trading Engine Topic WIP 2021-01-22 17:31:11 +01:00
Luis Fernando Molina 9ca921e8c3 Trading Session Errors Topic 2021-01-22 15:04:36 +01:00
Luis Fernando Molina 0ece30c358 Merge pull request #446 from Superalgos/develop
Bug Fixes that impact MAC users doing the Tutorial
2021-01-22 12:52:21 +01:00
Luis Fernando Molina 9d947f0ca1 Merge pull request #445 from Luis-Fernando-Molina/develop
Contribution: Bug Fixed, Workspace tab not showing anything
2021-01-22 12:29:38 +01:00
Luis Fernando Molina d4a811a449 Bug Fixed, Workspace tab not showing anything 2021-01-22 12:28:47 +01:00
Julian Molina 3b736015cf Merge pull request #444 from julian-molina/develop
Welcome tutorial browser zoom on Mac step fix
2021-01-22 12:22:53 +01:00
Julian Molina d11f08ea33 This is my contribution to Superalgos 2021-01-22 12:21:02 +01:00
Luis Fernando Molina 6646632fe6 Merge pull request #443 from Luis-Fernando-Molina/develop
Contribution: Bug Fixed on repositioning at chart in charting space while zoomed if
2021-01-22 11:54:23 +01:00
Luis Fernando Molina 31bb098ff6 Bug Fixed on repositioning at chart in charting space while zoomed if 2021-01-22 11:53:57 +01:00
Luis Fernando Molina 85d9285eba Merge pull request #442 from Luis-Fernando-Molina/develop
Contribution: Process Error Handling Improved / UX Improved
2021-01-22 10:51:00 +01:00
Luis Fernando Molina 9f42d6bc11 Function not used 2021-01-22 10:50:10 +01:00
Luis Fernando Molina e63771b9ee Process Error Handling Improved / UX Improved 2021-01-22 10:46:47 +01:00
Luis Fernando Molina 97e2246601 Merge pull request #441 from Luis-Fernando-Molina/develop
Contribution: Bug Fixed on MAC OS not repositionig charts correctly during tutorial.
2021-01-22 09:42:43 +01:00
Luis Fernando Molina 4433ade3df Bug Fixed on MAC OS not repositionig charts correctly during tutorial. 2021-01-22 09:41:54 +01:00
Luis Fernando Molina ff54bfa142 Merge pull request #439 from Luis-Fernando-Molina/develop
Contribution: Bug Fixed, context menu not dissapearing when docs were closed
2021-01-22 07:37:37 +01:00
Luis Fernando Molina e72669ce61 Bug Fixed, context menu not dissapearing when docs were closed 2021-01-22 07:36:38 +01:00
Julian Molina ccc2c10606 Merge pull request #436 from julian-molina/develop
Contribution: Trading Engine Topic WIP
2021-01-21 21:30:49 +01:00
Julian Molina 8f3b6aa7e9 Trading Engine Topic WIP 2021-01-21 21:30:08 +01:00
Luis Fernando Molina 9e30cb8fcc Merge pull request #438 from Luis-Fernando-Molina/develop
Contribution: Improvements in Error Handlng / Error UX
2021-01-21 20:58:37 +01:00
Luis Fernando Molina 56e961ad01 Improvements in Error Handlng / Error UX 2021-01-21 20:57:45 +01:00
Julian Molina ae70226347 Trading Engine Topic WIP 2021-01-21 20:54:55 +01:00
Luis Fernando Molina 3a11c1e2b3 Improvemnts in error handling 2021-01-21 20:50:43 +01:00
Julian Molina 04d39bb111 Trading Engine Topic WIP 2021-01-21 20:17:43 +01:00
Luis Fernando Molina 6bb37ab10d Merge pull request #437 from Luis-Fernando-Molina/develop
Contribution: Bug Fixed Issue #318. Using # in the name of the trading system didn't show backtest results.
2021-01-21 20:15:47 +01:00
Luis Fernando Molina 3ea470bf60 Bug Fixed Issue #318. Using # in the name of the trading system didn't show backtest results. 2021-01-21 20:14:57 +01:00
Julian Molina 6d78112bc2 Trading Engine Topic WIP 2021-01-21 19:35:12 +01:00
Julian Molina 2508438889 Merge pull request #435 from julian-molina/develop
Contribution: User Manual Book
2021-01-21 18:20:46 +01:00
Julian Molina 22c91844da Merge branch 'develop' of https://github.com/julian-molina/Superalgos into develop 2021-01-21 14:59:44 +01:00
Julian Molina e0186e2ef7 User Manual Book WIP 2021-01-21 14:58:29 +01:00
Julian Molina 3536d2659a User Manual Book wip 2021-01-21 14:38:09 +01:00
Luis Fernando Molina e91610dc34 Merge pull request #433 from Superalgos/develop
Hot Fix to fix bug with Exchange Raw data during Live Trading
2021-01-21 14:15:13 +01:00
Luis Fernando Molina e80592530f Merge pull request #432 from Luis-Fernando-Molina/develop
Contribution: This is my contribution to Superalgos
2021-01-21 13:53:36 +01:00
Luis Fernando Molina 29614b9646 Bug Fixed with # in commit message 2021-01-21 13:52:44 +01:00
Luis Fernando Molina f8c6b40c7c Bug Fix 2021-01-21 13:38:27 +01:00
Luis Fernando Molina 1e1fa783ca Bug Fix 2021-01-21 13:33:07 +01:00
Julian Molina 590e9c4564 Merge pull request #2 from Superalgos/develop
Develop
2021-01-21 13:22:28 +01:00
Luis Fernando Molina e19ba0793c Merge pull request #429 from Luis-Fernando-Molina/develop
Contribution: Update Message updated
2021-01-20 17:40:46 +01:00
Luis Fernando Molina 9522b7b848 Update Message updated 2021-01-20 17:40:00 +01:00
Luis Fernando Molina 3904290bec Merge pull request #428 from Luis-Fernando-Molina/develop
Contribution: Bug Fixed: removing Github user requirement for app.update command.
2021-01-20 17:19:27 +01:00
Luis Fernando Molina 27734e85f4 Bug Fixed: removing Github user requirement for app.update command. 2021-01-20 17:18:38 +01:00
Luis Fernando Molina 2e3c667459 Merge pull request #427 from Luis-Fernando-Molina/develop
Contribution: Swithching Branches Error Handling Improved, with Docs and Placeholders
2021-01-20 16:38:58 +01:00
Luis Fernando Molina 5ae4d0aa5b Swithching Branches Error Handling Improved, with Docs and Placeholders 2021-01-20 16:38:06 +01:00
Luis Fernando Molina 24e140badb Merge pull request #426 from Luis-Fernando-Molina/develop
Contribution: Contribute Command Error Handling Improved with Docs and Placeholders
2021-01-20 16:10:25 +01:00
Luis Fernando Molina b6056f0d2e This is my contribution to Superalgos 2021-01-20 16:08:24 +01:00
Luis Fernando Molina ab595e6e31 This is my contribution to Superalgos 2021-01-20 16:05:29 +01:00
Luis Fernando Molina d910a83a30 This is my contribution to Superalgos 2021-01-20 16:03:10 +01:00
Luis Fernando Molina d9ab664a57 This is my contribution to Superalgos 2021-01-20 16:01:36 +01:00
Luis Fernando Molina 5d932ec16d This is my contribution to Superalgos 2021-01-20 15:53:17 +01:00
Luis Fernando Molina 3ca384e94f This is my contribution to Superalgos 2021-01-20 15:52:10 +01:00
Luis Fernando Molina aed93f3d21 This is my contribution to Superalgos 2021-01-20 15:51:26 +01:00
Luis Fernando Molina f013baaaec This is my contribution to Superalgos 2021-01-20 15:48:59 +01:00
Luis Fernando Molina 086db81331 This is my contribution to Superalgos 2021-01-20 15:47:36 +01:00
Luis Fernando Molina 7b1d627270 This is my contribution to Superalgos 2021-01-20 15:44:13 +01:00
Luis Fernando Molina 3a3bc2ae1b This is my contribution to Superalgos 2021-01-20 15:42:11 +01:00
Luis Fernando Molina eb1ad95d66 This is my contribution to Superalgos 2021-01-20 15:37:30 +01:00
Luis Fernando Molina 5a511d4d5d Merge pull request #425 from Luis-Fernando-Molina/develop
Contribution: Error Handling Improved for command app.update
2021-01-20 15:19:48 +01:00
Luis Fernando Molina ac891d603d Error Handling Improved for command app.update 2021-01-20 15:17:42 +01:00
Luis Fernando Molina c61db756d6 test update conflict 2021-01-20 15:09:52 +01:00
Luis Fernando Molina 22b5f95b6b test 2021-01-20 15:08:14 +01:00
Luis Fernando Molina eecb143ca9 Merge pull request #420 from 9808us/develop
Initial Italian Translation
2021-01-20 13:05:31 +01:00
Luis Fernando Molina 9c5f17ac51 Merge pull request #424 from julian-molina/master
Contribution: Getting started workspace fix
2021-01-20 12:54:26 +01:00
Julian Molina 709ac5ff24 Getting started workspace fix 2021-01-20 12:04:07 +01:00
9808us f6269c2ecd Merge branch 'develop' of https://github.com/Superalgos/Superalgos into develop 2021-01-16 15:16:16 +01:00
9808us b3563d24fe This is my contribution to Superalgos 2021-01-16 15:12:43 +01:00
217 changed files with 8759 additions and 1570 deletions

No files matched your search

+2 -7
View File
@@ -62,11 +62,6 @@ margin-bottom: 0px;
margin-top: 0px;
border: 0px solid #cdcdcd;
padding: 5px;
/* DELETE candidate
margin: auto;
margin-right: 20px;
*/
}
.docs-table-cell{
@@ -817,7 +812,6 @@ padding-left: 180px;
margin-top: 20px;
}
.docs-search-results-header-tabs-container > input {
display: none;
}
@@ -858,7 +852,8 @@ display: none;
#tab4:checked ~ .docs-search-result-content #content4,
#tab5:checked ~ .docs-search-result-content #content5,
#tab6:checked ~ .docs-search-result-content #content6,
#tab7:checked ~ .docs-search-result-content #content7 {
#tab7:checked ~ .docs-search-result-content #content7,
#tab8:checked ~ .docs-search-result-content #content8 {
display: block;
}
+2 -2
View File
@@ -62,7 +62,7 @@
Jeff Braun, rico4dev, 9808us, Barry Low, Nikola Bjelogrlic, Hirajin Koizuko, Francisco J. Santillán, Norman,
Viktoria B., Guillermo V., Daniel J.,
Javier A., Gustavo J., Romina GS, Pedro P., Thais M., Andrey M., Loui M., Natalia M., Bashar A., Carlos V.,
Diego M.,
Diego M., CarnivalBen,
Sebastian E., Bogdan P., Marko V., Igor S., Niksa K., Rodrigo M., Nicanor M., Alejandro P., Mateo H., Lan
T., Leon A., Uroš R., Filip M., Vladimir J. and Pavle B.</p>
<p><span class="credits-red">With Superalgos Beta 8, contributing is easier than ever! Become a contributor!</span></p>
@@ -155,7 +155,7 @@
</div>
<div class="menu-row">
<div class="menu-item" onClick="window.contextMenu.toPlaceholder()">
<img src="Icons/Superalgos/bitcoin.png" class="menu-img" title="Placeholder">
<img src="Icons/Superalgos/docs-placeholder-style.png" class="menu-img" title="Placeholder">
</div>
<div class="menu-item" onClick="window.contextMenu.toSummary()">
<img src="Icons/Superalgos/docs-summary-style.png" class="menu-img" title="Summary">
+111 -23
View File
@@ -563,7 +563,7 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
}
function cleanFileName(fileName) {
for (let i = 0; i < 10; i++) {
for (let i = 0; i < 100; i++) {
fileName = fileName
.replace(' ', '-')
.replace('--', '-')
@@ -590,21 +590,50 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
switch (requestParameters[2]) { // switch by command
case 'Contribute': {
try {
const commitMessage = unescape(requestParameters[3])
let commitMessage = unescape(requestParameters[3])
const username = unescape(requestParameters[4])
const token = unescape(requestParameters[5])
const currentBranch = unescape(requestParameters[6])
const contributionsBranch = unescape(requestParameters[7])
let error
/* Unsavping # */
for (let i = 0; i < 10; i++) {
commitMessage = commitMessage.replace('_SLASH_', '/')
commitMessage = commitMessage.replace('_HASHTAG_', '#')
}
contribute()
async function contribute() {
if (await doGit() === false) {
respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
await doGit()
if (error !== undefined) {
let docs = {
project: 'Superalgos',
category: 'Topic',
type: 'App Error - Contribution Not Sent',
anchor: undefined,
placeholder: {}
}
respondWithDocsObject(docs, error)
return
}
if (await doGithub() === false) {
respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
await doGithub()
if (error !== undefined) {
let docs = {
project: 'Superalgos',
category: 'Topic',
type: 'App Error - Contribution Not Sent',
anchor: undefined,
placeholder: {}
}
console.log('respond with docs ')
respondWithDocsObject(docs, error)
return
}
respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
@@ -623,14 +652,13 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
await git.add('./*')
await git.commit(commitMessage)
await git.push('origin', currentBranch)
return true
} catch (err) {
console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> Method call produced an error.')
console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> err.stack = ' + err.stack)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> commitMessage = ' + commitMessage)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> currentBranch = ' + currentBranch)
console.log('[ERROR] httpInterface -> App -> Contribute -> doGit -> contributionsBranch = ' + contributionsBranch)
return false
error = err
}
}
@@ -657,20 +685,19 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
head,
base,
});
return true
} catch (err) {
if (err.stack.indexOf('A pull request already exists') >= 0) {
return true
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 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 false
error = err
}
}
}
@@ -693,22 +720,33 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
}
break
}
case 'Update': {
try {
const currentBranch = unescape(requestParameters[3])
update()
async function update() {
let message = await doGit()
let result = await doGit()
if (message !== undefined) {
if (result.error === undefined) {
let customResponse = {
result: global.CUSTOM_OK_RESPONSE.result,
message: message
message: result.message
}
respondWithContent(JSON.stringify(customResponse), httpResponse)
} else {
respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
let docs = {
project: 'Superalgos',
category: 'Topic',
type: 'App Error - Update Failed',
anchor: undefined,
placeholder: {}
}
respondWithDocsObject(docs, result.error)
}
}
@@ -724,10 +762,11 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
let message
try {
message = await git.pull('https://github.com/Superalgos/Superalgos', currentBranch)
return message
return { message: message }
} catch (err) {
console.log('[ERROR] Error updating ' + currentBranch)
console.log(err.stack)
return { error: err }
}
}
@@ -751,15 +790,25 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
case 'Checkout': {
try {
const currentBranch = unescape(requestParameters[3])
let error
checkout()
async function checkout() {
let result = await doGit()
await doGit()
if (result === true) {
if (error === undefined) {
respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), httpResponse)
} else {
respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
let docs = {
project: 'Superalgos',
category: 'Topic',
type: 'Switching Branches - Current Branch Not Changed',
anchor: undefined,
placeholder: {}
}
respondWithDocsObject(docs, error)
}
}
@@ -776,9 +825,8 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
} catch (err) {
console.log('[ERROR] Error changing current branch to ' + currentBranch)
console.log(err.stack)
return false
error = err
}
return true
}
} catch (err) {
@@ -798,6 +846,41 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
break
}
}
function respondWithDocsObject(docs, error) {
if (error.message !== undefined) {
docs.placeholder.errorMessage = {
style: 'Error',
text: error.message
}
}
if (error.stack !== undefined) {
docs.placeholder.errorStack = {
style: 'Javascript',
text: error.stack
}
}
if (error.code !== undefined) {
docs.placeholder.errorCode = {
style: 'Json',
text: error.code
}
}
docs.placeholder.errorDetails = {
style: 'Json',
text: JSON.stringify(error, undefined, 4)
}
let customResponse = {
result: global.CUSTOM_FAIL_RESPONSE.result,
docs: docs
}
respondWithContent(JSON.stringify(customResponse), httpResponse)
}
}
break
@@ -1267,7 +1350,12 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
case 'Storage':
{
respondWithFile(global.env.PATH_TO_DATA_STORAGE + '/' + httpRequest.url.substring(9), httpResponse)
let pathToFile = httpRequest.url.substring(9)
/* Unsavping # */
for (let i = 0; i < 10; i++) {
pathToFile = pathToFile.replace('_HASHTAG_', '#')
}
respondWithFile(global.env.PATH_TO_DATA_STORAGE + '/' + pathToFile, httpResponse)
}
break
+54 -54
View File
@@ -38,8 +38,8 @@
"confirmationLabel": "Confirm to Delete",
"actionFunction": "payload.executeAction",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete"
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity"
}
],
"isProjectHead": true,
@@ -81,8 +81,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -112,8 +112,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -162,8 +162,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -202,8 +202,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -223,8 +223,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -256,8 +256,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -302,8 +302,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -336,8 +336,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -370,8 +370,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -404,8 +404,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -448,8 +448,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -498,8 +498,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -529,8 +529,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -565,8 +565,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -601,8 +601,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -642,8 +642,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -683,8 +683,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -710,8 +710,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -739,8 +739,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -768,8 +768,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -797,8 +797,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -826,8 +826,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -855,8 +855,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -884,8 +884,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -927,8 +927,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
@@ -979,8 +979,8 @@
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete",
"iconPathOn": "delete",
"iconPathOff": "delete",
"iconPathOn": "delete-entity",
"iconPathOff": "delete-entity",
"actionFunction": "payload.executeAction"
}
],
+6
View File
@@ -462,6 +462,12 @@
"propertyName": "miscellaneousFunctions",
"functionName": "newSuperalgosUtilitiesMiscellaneousFunctions",
"fileName": "MiscellaneousFunctions.js"
},
{
"name": "Docs Functions",
"propertyName": "docsFunctions",
"functionName": "newSuperalgosUtilitiesDocsFunctions",
"fileName": "DocsFunctions.js"
}
],
"taskModules": [
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

@@ -1 +1 @@
{"type":"Data Mine","name":"Masters","config":"{\n\"codeName\": \"Masters\"\n}","project":"Superalgos","sensorBots":[{"type":"Sensor Bot","name":"Exchange Raw Data","config":"{\n\"codeName\": \"Exchange-Raw-Data\"\n}","project":"Superalgos","processes":[{"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}","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[],"id":"dfe2556e-a765-4e38-9d30-7f91090c0069","savedPayload":{"position":{"x":7542.108005075513,"y":17855.768569069416},"targetPosition":{"x":7502.950147409498,"y":18153.20202748156},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Superalgos","statusDependencies":[{"type":"Status Dependency","name":"Exchange Raw Data Historic-OHLCVs","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Superalgos","id":"ea39c98b-18e2-44ce-9f7f-86a8a76a688a","savedPayload":{"position":{"x":7868.207004814731,"y":17677.190023306815},"targetPosition":{"x":7685.578576112114,"y":17915.196025394187},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e"}}}],"dataDependencies":[],"dataMineDataDependencies":[],"id":"5c7fae5a-6da6-4864-a167-f2f21d578c72","savedPayload":{"position":{"x":7685.578576112114,"y":17915.196025394187},"targetPosition":{"x":7502.950147409498,"y":18153.20202748156},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Superalgos","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e","savedPayload":{"position":{"x":7780.114007162883,"y":18038.396997772034},"targetPosition":{"x":7502.950147409498,"y":18153.20202748156},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"","project":"Superalgos","id":"957e7e3a-b167-40be-93b5-9ba4ceff56e5","savedPayload":{"position":{"x":7800.383605821641,"y":18192.359885147573},"targetPosition":{"x":7502.950147409498,"y":18153.20202748156},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Superalgos","id":"fe40a546-43ee-49df-908a-7e72f598f0cd","savedPayload":{"position":{"x":7740.956149496868,"y":18335.830456184176},"targetPosition":{"x":7502.950147409498,"y":18153.20202748156},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc","savedPayload":{"position":{"x":7502.950147409498,"y":18153.20202748156},"targetPosition":{"x":7225.786287656112,"y":18268.007057191084},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"products":[{"type":"Product Definition","name":"Candles","config":"{\n\"codeName\": \"Candles\"\n}","project":"Superalgos","datasets":[{"type":"Dataset Definition","name":"One-Min","config":"{\n\"codeName\": \"One-Min\"\n}","project":"Superalgos","id":"1c3696e4-c28e-4744-9100-706d6dce0c3c","savedPayload":{"position":{"x":7675.786287656112,"y":18268.007057191084},"targetPosition":{"x":7525.786287656112,"y":18268.007057191084},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}}],"id":"2443883b-6959-42a3-ae3b-ef3102ffcdcc","savedPayload":{"position":{"x":7525.786287656112,"y":18268.007057191084},"targetPosition":{"x":7225.786287656112,"y":18268.007057191084},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Product Definition","name":"Volumes","config":"{\n\"codeName\": \"Volumes\"\n}","project":"Superalgos","datasets":[{"type":"Dataset Definition","name":"One-Min","config":"{\n\"codeName\": \"One-Min\"\n}","proLine truncated
{"type":"Data Mine","name":"Masters","config":"{\n\"codeName\": \"Masters\"\n}","project":"Superalgos","sensorBots":[{"type":"Sensor Bot","name":"Exchange Raw Data","config":"{\n\"codeName\": \"Exchange-Raw-Data\"\n}","project":"Superalgos","processes":[{"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}","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[],"id":"dfe2556e-a765-4e38-9d30-7f91090c0069","savedPayload":{"position":{"x":19495.67390477555,"y":18276.314530096774},"targetPosition":{"x":19456.516047109537,"y":18573.747988508916},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Superalgos","statusDependencies":[{"type":"Status Dependency","name":"Exchange Raw Data Historic-OHLCVs","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Superalgos","id":"ea39c98b-18e2-44ce-9f7f-86a8a76a688a","savedPayload":{"position":{"x":19821.77290451477,"y":18097.735984334173},"targetPosition":{"x":19639.144475812154,"y":18335.741986421544},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e"}}}],"dataDependencies":[],"dataMineDataDependencies":[],"id":"5c7fae5a-6da6-4864-a167-f2f21d578c72","savedPayload":{"position":{"x":19639.144475812154,"y":18335.741986421544},"targetPosition":{"x":19456.516047109537,"y":18573.747988508916},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Superalgos","id":"181c7c34-7243-497a-9ddb-1b0067c6d66e","savedPayload":{"position":{"x":19733.679906862923,"y":18458.94295879939},"targetPosition":{"x":19456.516047109537,"y":18573.747988508916},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"","project":"Superalgos","id":"957e7e3a-b167-40be-93b5-9ba4ceff56e5","savedPayload":{"position":{"x":19753.94950552168,"y":18612.90584617493},"targetPosition":{"x":19456.516047109537,"y":18573.747988508916},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Superalgos","id":"fe40a546-43ee-49df-908a-7e72f598f0cd","savedPayload":{"position":{"x":19694.52204919691,"y":18756.376417211533},"targetPosition":{"x":19456.516047109537,"y":18573.747988508916},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc","savedPayload":{"position":{"x":19456.516047109537,"y":18573.747988508916},"targetPosition":{"x":19179.35218735615,"y":18688.55301821844},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"products":[{"type":"Product Definition","name":"Candles","config":"{\n\"codeName\": \"Candles\"\n}","project":"Superalgos","datasets":[{"type":"Dataset Definition","name":"One-Min","config":"{\n\"codeName\": \"One-Min\"\n}","project":"Superalgos","id":"1c3696e4-c28e-4744-9100-706d6dce0c3c","savedPayload":{"position":{"x":19629.35218735615,"y":18688.55301821844},"targetPosition":{"x":19479.35218735615,"y":18688.55301821844},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}}],"id":"2443883b-6959-42a3-ae3b-ef3102ffcdcc","savedPayload":{"position":{"x":19479.35218735615,"y":18688.55301821844},"targetPosition":{"x":19179.35218735615,"y":18688.55301821844},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Product Definition","name":"Volumes","config":"{\n\"codeName\": \"Volumes\"\n}","project":"Superalgos","datasets":[{"type":"Dataset Definition","name":"One-Min","config":"{\n\"codeName\": \"One-Min\"\Line truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Getting Started","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d244c564-4e86-43c7-9796-dc3b6294ec8b","savedPayload":{"position":{"x":23490.023749611923,"y":29239.135911211026},"targetPosition":{"x":23779.801497498644,"y":29316.781624741783},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"343313ae-5705-484d-8bf8-aed25ba61cfa","savedPayload":{"position":{"x":23779.801497498644,"y":29316.781624741783},"targetPosition":{"x":24069.579245385365,"y":29394.42733827254},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a8f38508-1cac-4ab1-815f-d338fc813377","savedPayload":{"position":{"x":24069.579245385365,"y":29394.42733827254},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"f0ef12ed-f0fd-4b88-8e15-27cf24265a5f","savedPayload":{"position":{"x":23799.549372136753,"y":28802.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7c8b312c-09bf-4c59-853f-1592391a9c57","savedPayload":{"position":{"x":24059.356993272086,"y":28652.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"8d58e84b-d7ef-464f-8079-0ec0887e3da3","savedPayload":{"position":{"x":24059.356993272086,"y":28952.457809532632},"targetPosition":{"x":24209.356993272086,"y":29212.265430667965},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"bf29e3bd-9386-408b-9091-042da0c53e81","savedPayload":{"position":{"x":24209.356993272086,"y":29212.265430667965},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Period-Market","project":"Superalgos","id":"a707814e-b81b-4102-9b5b-4e2fe969324f","savedPayload":{"position":{"x":24437.002706802843,"y":28602.739808143135},"targetPosition":{"x":24514.6484203336,"y":28892.517556029856},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"refeLine truncated
{"type":"Workspace","name":"Getting Started","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d244c564-4e86-43c7-9796-dc3b6294ec8b","savedPayload":{"position":{"x":23490.023749611923,"y":29239.135911211026},"targetPosition":{"x":23779.801497498644,"y":29316.781624741783},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"343313ae-5705-484d-8bf8-aed25ba61cfa","savedPayload":{"position":{"x":23779.801497498644,"y":29316.781624741783},"targetPosition":{"x":24069.579245385365,"y":29394.42733827254},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a8f38508-1cac-4ab1-815f-d338fc813377","savedPayload":{"position":{"x":24069.579245385365,"y":29394.42733827254},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"f0ef12ed-f0fd-4b88-8e15-27cf24265a5f","savedPayload":{"position":{"x":23799.549372136753,"y":28802.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7c8b312c-09bf-4c59-853f-1592391a9c57","savedPayload":{"position":{"x":24059.356993272086,"y":28652.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"8d58e84b-d7ef-464f-8079-0ec0887e3da3","savedPayload":{"position":{"x":24059.356993272086,"y":28952.457809532632},"targetPosition":{"x":24209.356993272086,"y":29212.265430667965},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"bf29e3bd-9386-408b-9091-042da0c53e81","savedPayload":{"position":{"x":24209.356993272086,"y":29212.265430667965},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Period-Market","project":"Superalgos","id":"a707814e-b81b-4102-9b5b-4e2fe969324f","savedPayload":{"position":{"x":24437.002706802843,"y":28602.739808143135},"targetPosition":{"x":24514.6484203336,"y":28892.517556029856},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"refeLine truncated
File diff suppressed because it is too large. Load diff
@@ -36,20 +36,56 @@
"updated": 1610310832197
},
{
"style": "Text",
"text": "Work in Progress"
"style": "Chapter",
"text": "VII->Superalgos->Topic->Low-Frequency Trading Bot->In Superalgos, the Trading Bot plays no part in the definition of the trading logic. Instead, it is the program that executes the trading logic, interacts with the exchange, and keeps track of orders.",
"updated": 1611236020198
},
{
"style": "Chapter",
"text": "VIII->Superalgos->Topic->Order Management->One of the crucial aspects of trading automation is the management of orders. The system operates with assumptions that must be verified and synchronized with the exchange. Learning how the Low-Frequency Trading Bot manages orders will help you understand the life cycle of orders and how your definitions in the Open Stage and the Close Stage affect the results.",
"updated": 1611237227549
},
{
"style": "Text",
"text": "Work in Progress"
"text": ""
},
{
"style": "Chapter",
"text": "IX->Superalgos->Topic->Trading Engine->The trading engine is about making the data processed by the Trading Bot accessible. Use it while debugging strategies to visually track every piece of information processed by the trading bot at any point in time. Use it from within trading systems to feed strategies with the details of what happens at runtime.",
"updated": 1611260954268
},
{
"style": "Text",
"text": "Work in Progress"
"text": ""
},
{
"style": "Chapter",
"text": "X->Superalgos->Topic->Trading Farms->Superalgos may coordinate Data Tasks and Trading Tasks across different machines on a network. Trading farms provide a robust environment for smart and scalable deployments.",
"updated": 1611503033139
},
{
"style": "Chapter",
"text": "XI->Superalgos->Topic->Crypto Ecosystem->The crypto ecosystem manages the interactions with parties external to Superalgos, primarily exchanges. ",
"updated": 1611503004599
},
{
"style": "Chapter",
"text": "XII->Superalgos->Topic->Data Mines->Data Mines deal with bots that process data and feature a visual scripting framework that solves most all of the infrastructure intricacies of building indicators and plotters.",
"updated": 1611503425133
},
{
"style": "Chapter",
"text": "XIII->Superalgos->Topic->Integrations->Superalgos integrates with Telegram Bots to broadcast announcements emerging from trading sessions. On the other hand, Superalgos supports receiving webhook messages, enabling automated actions originating from messages sent from third-party services, like TradingView.",
"updated": 1611503645995
},
{
"style": "Chapter",
"text": "XIV->Superalgos->Topic->Productivity Tools->This chapter discusses a collection of tools that help optimize productivity.",
"updated": 1611503697142
},
{
"style": "Text",
"text": "Work in Progress"
"text": ""
}
]
}
@@ -6,8 +6,9 @@
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode."
"style": "Warning",
"text": "This operation can not be undone.",
"updated": 1611398340598
}
]
}
@@ -0,0 +1,13 @@
{
"type": "LF Trading Bot",
"definition": {
"text": "The Low Frequency Trading Bot is an implementation of at the Masters Trading Mine of a Trading Bot specialized in executing strategies for time frames of 1 minute and above. ",
"updated": 1611581184850
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,13 @@
{
"type": "LF",
"definition": {
"text": "LF is the abbreviation of Low Frequency, and most likey refering to the Low Frequency Trading Bot implemented at the Masters Trading Mine.",
"updated": 1611577213413
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,14 @@
{
"type": "Node JS Javsacript",
"definition": {
"text": "A Task in Superalgos runs in Node JS, which means that the Conditions and Formulas you write at your Trading System must comply with Javascript for Node JS syntax. ",
"updated": 1611323749488
},
"paragraphs": [
{
"style": "Text",
"text": "The same is true for properties values in configs. They need to be valid data types of Javascript for Node JS.",
"updated": 1611323797820
}
]
}
@@ -24,6 +24,26 @@
"text": "Dummy",
"updated": 1610121260808
},
{
"style": "Title",
"text": "Note for Hierarchy Tables No Discussion",
"updated": 1611254828783
},
{
"style": "Block",
"text": "Note for Hierarchy Tables No Discussion",
"updated": 1611254840023
},
{
"style": "Note",
"text": "Click on any of the nodes to get the details, including particulars on their configuration, when applicable.",
"updated": 1611254904577
},
{
"style": "Block",
"text": "Dummy",
"updated": 1611254890702
},
{
"style": "Title",
"text": "Important for Live Sessions"
@@ -4,9 +4,75 @@
"text": "ROI is a ratio that compares the profit loss with the cost of the investment, expressed as a percentage."
},
"paragraphs": [
{
"style": "Block",
"text": "Content",
"updated": 1611332841853
},
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode."
"text": "In general financial terms, ROI is equal to the Net Return on Investment divided by the Cost of Investment, expressed as a percentage."
},
{
"style": "Text",
"text": "In Superalgos, the Net Return on Investment is the profit loss, as defined elsewhere. The Cost of Investment is solely the begin balance, as the fees are subtracted from the balance to calculate the profit loss, so we don’t need to account for them in the divisor side of the ratio."
},
{
"style": "Text",
"text": "That is:"
},
{
"style": "Javascript",
"text": "ROI = profit loss / begin balance * 100"
},
{
"style": "Text",
"text": "In the context of the episode base asset and episode quoted asset, the calculation is done relative to the corresponding assets, and the overall context."
},
{
"style": "Text",
"text": "The formula:"
},
{
"style": "Javascript",
"text": "tradingEngine.current.episode.episodeBaseAsset.ROI.value =\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value /\n tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * 100 \n \ntradingEngine.current.episode.episodeQuotedAsset.ROI.value =\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value /\n tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value * 100",
"updated": 1611332768337
},
{
"style": "Text",
"text": " "
},
{
"style": "Text",
"text": "In the context of the position base asset and position quoted asset, the size filled is used instead of the balance, so that ROI may be properly calculated for complex execution algorithms.",
"updated": 1611332787435
},
{
"style": "Text",
"text": "The formula:"
},
{
"style": "Javascript",
"text": "tradingEngine.current.position.positionBaseAsset.ROI.value =\n tradingEngine.current.position.positionBaseAsset.profitLoss.value * 100 /\n tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value\n \ntradingEngine.current.position.positionQuotedAsset.ROI.value =\n tradingEngine.current.position.positionQuotedAsset.profitLoss.value * 100 /\n tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value",
"updated": 1611332799800
},
{
"style": "Text",
"text": "In the context of the episode statistics, the calculation is done using the consolidated balance, as explained in the profit loss definition.",
"updated": 1611332810457
},
{
"style": "Text",
"text": " Note: When the context does not refer to either of the assets in particular, then both asset balances are consolidated, and denominated in the quoted asset."
},
{
"style": "Text",
"text": "The formula:"
},
{
"style": "Javascript",
"text": "tradingEngine.current.episode.episodeStatistics.ROI.value =\n (\n tradingEngine.current.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.current.episode.endRate.value +\n tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value\n ) / (\n tradingEngine.current.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.current.episode.beginRate.value +\n tradingEngine.current.episode.episodeQuotedAsset.beginBalance.value\n ) * 100",
"updated": 1611332824026
},
{
"style": "Block",
@@ -31,10 +31,6 @@
"text": "The market ending point is a status dependency existing both in Multi-Period-Market and Multi-Period-Daily processes so that the process establishing the reference knows the datetime of the end of the market.",
"updated": 1609787745299
},
{
"style": "Text",
"text": "The image above shows a case of a self-reference status dependency as well as a market ending point status dependency."
},
{
"style": "Block",
"text": "Configuring"
@@ -9,8 +9,77 @@
"paragraphs": [
{
"style": "Text",
"text": "Check for the Client's console for details on what may have happened. After you fix the issue that prevented the App Contribute Command to run, you may try again.",
"updated": 1611129009743
"text": "Check the following section for details on what may have happened. After you fix the issue that prevented the App Contribute Command to run, you may try again.",
"updated": 1611152997869
},
{
"style": "Title",
"text": "Error Info",
"updated": 1611154606702
},
{
"style": "Text",
"text": "In the following section you will find the specific information received when this error occured."
},
{
"style": "Note",
"text": "You will only see it if you opened this page as a result of the error actually happening.",
"updated": 1611153032408
},
{
"style": "Subtitle",
"text": "Error Message"
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorMessage"
},
{
"style": "Subtitle",
"text": "Error Stack"
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorStack"
},
{
"style": "Subtitle",
"text": "Error Code"
},
{
"style": "Text",
"text": "The follwing is the Error Code of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorCode"
},
{
"style": "Subtitle",
"text": "Error Details",
"updated": 1611154543778
},
{
"style": "Text",
"text": "The follwing are all the Error details of the Exception that occured at the Client:",
"updated": 1611154675224
},
{
"style": "Placeholder",
"text": "errorDetails",
"updated": 1611154555419
},
{
"style": "Text",
"text": ""
}
]
}
@@ -9,8 +9,77 @@
"paragraphs": [
{
"style": "Success",
"text": "Check for the Client's console for details on what may have happened. After you fix the issue, you may try again.",
"updated": 1611129360143
"text": "Check for the following section for details on what may have happened. After you fix the issue, you may try again.",
"updated": 1611152967185
},
{
"style": "Title",
"text": "Error Info",
"updated": 1611154641024
},
{
"style": "Text",
"text": "In the following section you will find the specific information received when this error occured."
},
{
"style": "Note",
"text": "You will only see it if you opened this page as a result of the error actually happening.",
"updated": 1611151375974
},
{
"style": "Subtitle",
"text": "Error Message"
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the Client:",
"updated": 1611151299633
},
{
"style": "Placeholder",
"text": "errorMessage"
},
{
"style": "Subtitle",
"text": "Error Stack"
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the Client:",
"updated": 1611151427220
},
{
"style": "Placeholder",
"text": "errorStack"
},
{
"style": "Subtitle",
"text": "Error Code"
},
{
"style": "Text",
"text": "The follwing is the Error Code of the Exception that occured at the Client:",
"updated": 1611151443562
},
{
"style": "Placeholder",
"text": "errorCode"
},
{
"style": "Subtitle",
"text": "Error Details"
},
{
"style": "Text",
"text": "The follwing are all the Error details of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorDetails"
},
{
"style": "Text",
"text": ""
}
]
}
@@ -9,8 +9,12 @@
"paragraphs": [
{
"style": "Success",
"text": "You now have the latest version of Superalgos. Just remeber to restart the Client and the UI.",
"updated": 1610454408134
"text": "You now have the latest version of Superalgos. Just remeber to restart the Client and the UI. If you have Tasks running, you should first stop the tasks, and then restart the Client, so that you can run those task again using the updated codebase.",
"updated": 1611160648343
},
{
"style": "Note",
"text": "The update you made, only afffects the Client which you are connected to via http using your browser. If you have more Clients running as part of a Network, you will need to update them too, etither manually using Git or by navigating with your browser to their URL and doing running the App Update Command there."
}
]
}
@@ -7,10 +7,75 @@
"updated": 1610543788194
},
"paragraphs": [
{
"style": "Text",
"text": "More detailed info of what caused this failure to switch can be found below.",
"updated": 1611155878425
},
{
"style": "Title",
"text": "Error Info"
},
{
"style": "Text",
"text": "In the following section you will find the specific information received when this error occured."
},
{
"style": "Note",
"text": "More detailed info of what caused this failure to switch can be find at the Client's Console.",
"updated": 1610543823314
"text": "You will only see it if you opened this page as a result of the error actually happening.",
"updated": 1611155956953
},
{
"style": "Subtitle",
"text": "Error Message"
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorMessage"
},
{
"style": "Subtitle",
"text": "Error Stack"
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorStack"
},
{
"style": "Subtitle",
"text": "Error Code"
},
{
"style": "Text",
"text": "The follwing is the Error Code of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorCode"
},
{
"style": "Subtitle",
"text": "Error Details"
},
{
"style": "Text",
"text": "The follwing are all the Error details of the Exception that occured at the Client:"
},
{
"style": "Placeholder",
"text": "errorDetails"
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,93 @@
{
"topic": "Crypto Ecosystem",
"pageNumber": "1",
"type": "Crypto Ecosystem Hierarchy",
"definition": {
"text": "The crypto ecosystem hierarchy organizes the infrastructure of exchanges, markets and user accounts.",
"updated": 1611502351384
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Crypto Ecosystem->Definition",
"updated": 1611345733796
},
{
"style": "Include",
"text": "Superalgos->Node->Crypto Ecosystem->Content",
"updated": 1611345736864
},
{
"style": "Title",
"text": "Crypto Exchanges",
"updated": 1611345864281
},
{
"style": "Include",
"text": "Superalgos->Node->Crypto Exchanges->Definition",
"updated": 1611345871538
},
{
"style": "Text",
"text": ""
},
{
"style": "Title",
"text": "Crypto Exchange",
"updated": 1611346094494
},
{
"style": "Text",
"text": ""
},
{
"style": "Include",
"text": "Superalgos->Node->Crypto Exchange->Definition",
"updated": 1611346105028
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Crypto Exchange->2",
"updated": 1611346132838
},
{
"style": "Title",
"text": "Exchange Assets",
"updated": 1611346189806
},
{
"style": "Include",
"text": "Superalgos->Node->Exchange Assets->Definition",
"updated": 1611346192805
},
{
"style": "Title",
"text": "Exchange Markets",
"updated": 1611346210580
},
{
"style": "Include",
"text": "Superalgos->Node->Exchange Markets->Definition",
"updated": 1611346214054
},
{
"style": "Title",
"text": "Exchange Accounts",
"updated": 1611346229086
},
{
"style": "Include",
"text": "Superalgos->Node->Exchange Accounts->Definition",
"updated": 1611346232501
},
{
"style": "Include",
"text": "Superalgos->Node->Exchange Accounts->Content",
"updated": 1611346236477
}
]
}
@@ -0,0 +1,106 @@
{
"topic": "Data Mines",
"pageNumber": "1",
"type": "Data Mine Hierarchy",
"definition": {
"text": "Data mines enable the processing of data by consuming datasets others have produced, performing calculations, and outputting a new value-added data product that others may consume.",
"updated": 1611407680590
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos puts a powerful data processing and visualization system in your hands. Use it to the fullest and you will see your intelligence increase by orders of magnitude.",
"updated": 1611407700153
},
{
"style": "Text",
"text": "Anyone may access raw trades and order book data from exchanges. Anyone may access information in the form of standard indicators and technical studies."
},
{
"style": "Callout",
"text": "However, Superalgos allows you to perform any sort of processing over existing information across the whole span of the market, store the results into new datasets, and make them available to trading strategies. Moreover, it allows you to produce elaborate graphical representations of data, which is instantly browsable over the charts."
},
{
"style": "Text",
"text": "Data mines’ functionality is highly flexible and works under the same paradigm used for building strategies. They provide a visual interface and a framework that leads you through the process of creating new bots, with minimal coding skills required."
},
{
"style": "Text",
"text": "The vast majority of the complexity of processing data is handled internally by the bots, and you don’t need to deal with it or even understand it. The system isolates complexity and only exposes you to the crucial elements that impact what you wish to accomplish."
},
{
"style": "Text",
"text": "This section of the documentation provides you with the technical understanding of how data is handled by the system. The core of the functionality this section unveils covers—in essence—the following points:"
},
{
"style": "Text",
"text": "The capacity to define any number of calculation processes that may feed on each other’s outputs, resulting in a wealth of information that may be consumed by trading strategies."
},
{
"style": "Text",
"text": "The properties and characteristics of datasets resulting from the execution of such processes—how and where they are stored, in what format, how they are consumed internally, and potentially, by other systems."
},
{
"style": "Text",
"text": "The capacity to visualize the data over the charts and browse it with all the features built in the charting system."
},
{
"style": "Title",
"text": "Data Mine",
"updated": 1611407778880
},
{
"style": "Include",
"text": "Superalgos->Node->Data Mine->Definition",
"updated": 1611407782909
},
{
"style": "Include",
"text": "Superalgos->Node->Data Mine->Content",
"updated": 1611407786577
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Data Mine->2",
"updated": 1611407832651
},
{
"style": "Text",
"text": ""
},
{
"style": "Title",
"text": "Sensor Bot",
"updated": 1611407910652
},
{
"style": "Include",
"text": "Superalgos->Node->Sensor Bot->Definition",
"updated": 1611407914247
},
{
"style": "Title",
"text": "Indicator Bot",
"updated": 1611407935038
},
{
"style": "Include",
"text": "Superalgos->Node->Indicator Bot->Definition",
"updated": 1611407948292
},
{
"style": "Title",
"text": "Plotter",
"updated": 1611407956192
},
{
"style": "Include",
"text": "Superalgos->Node->Plotter->Definition",
"updated": 1611407972840
}
]
}
@@ -0,0 +1,30 @@
{
"topic": "Data Mines",
"pageNumber": "2",
"type": "Indicator Bots",
"definition": {
"text": "Indicator bots enable the processing of data by consuming datasets others have produced, performing calculations, and outputting a new value-added data product that others may consume.",
"updated": 1611408124910
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Indicator Bot->Definition",
"updated": 1611408242603
},
{
"style": "Include",
"text": "Superalgos->Node->Indicator Bot->Content",
"updated": 1611408247595
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Indicator Bot->2",
"updated": 1611408262027
}
]
}
@@ -0,0 +1,228 @@
{
"topic": "Data Mines",
"pageNumber": "3",
"type": "Indicator Bots - Process Definition",
"definition": {
"text": "The process definition is the compilation of configurations, dependencies, and references that make up a process.",
"updated": 1611410324543
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Process Definition->Definition",
"updated": 1611408487552
},
{
"style": "Include",
"text": "Superalgos->Node->Process Definition->Content",
"updated": 1611408491273
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Process Definition->2",
"updated": 1611409733095
},
{
"style": "Title",
"text": "Process Output",
"updated": 1611408788144
},
{
"style": "Include",
"text": "Superalgos->Node->Process Output->Definition",
"updated": 1611408791768
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables",
"updated": 1611409787758
},
{
"style": "Hierarchy",
"text": "Superalgos->Process Output->2"
},
{
"style": "Subtitle",
"text": "Output Dataset Folder",
"updated": 1611408893086
},
{
"style": "Include",
"text": "Superalgos->Node->Output Dataset Folder->Definition",
"updated": 1611408897031
},
{
"style": "Include",
"text": "Superalgos->Node->Output Dataset Folder->Content",
"updated": 1611408901554
},
{
"style": "Subtitle",
"text": "Output Dataset",
"updated": 1611408932688
},
{
"style": "Include",
"text": "Superalgos->Node->Output Dataset->Definition",
"updated": 1611408940761
},
{
"style": "Include",
"text": "Superalgos->Node->Output Dataset->Content",
"updated": 1611408945614
},
{
"style": "Title",
"text": "Process Dependencies",
"updated": 1611409011999
},
{
"style": "Include",
"text": "Superalgos->Node->Process Dependencies->Definition",
"updated": 1611409021282
},
{
"style": "Include",
"text": "Superalgos->Node->Process Dependencies->Content",
"updated": 1611409025810
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables",
"updated": 1611409846972
},
{
"style": "Hierarchy",
"text": "Superalgos->Process Dependencies->4",
"updated": 1611409904800
},
{
"style": "Subtitle",
"text": "Status Dependency",
"updated": 1611409068335
},
{
"style": "Include",
"text": "Superalgos->Node->Status Dependency->Definition",
"updated": 1611409075880
},
{
"style": "Include",
"text": "Superalgos->Node->Status Dependency->Content",
"updated": 1611409079269
},
{
"style": "Subtitle",
"text": "Data Dependency",
"updated": 1611409226728
},
{
"style": "Include",
"text": "Superalgos->Node->Data Dependency->Definition",
"updated": 1611409243546
},
{
"style": "Include",
"text": "Superalgos->Node->Data Dependency->Content",
"updated": 1611409247489
},
{
"style": "Subtitle",
"text": "Data Mine Data Dependencies",
"updated": 1611409321781
},
{
"style": "Include",
"text": "Superalgos->Node->Data Mine Data Dependencies->Definition",
"updated": 1611409326033
},
{
"style": "Include",
"text": "Superalgos->Node->Data Mine Data Dependencies->Content",
"updated": 1611409329439
},
{
"style": "Subtitle",
"text": "Bot Data Dependencies",
"updated": 1611409418545
},
{
"style": "Include",
"text": "Superalgos->Node->Bot Data Dependencies->Definition",
"updated": 1611409422639
},
{
"style": "Include",
"text": "Superalgos->Node->Bot Data Dependencies->Content",
"updated": 1611409426189
},
{
"style": "Subtitle",
"text": "Data Dependency Folder",
"updated": 1611409491551
},
{
"style": "Include",
"text": "Superalgos->Node->Data Dependency Folder->Definition",
"updated": 1611409495392
},
{
"style": "Include",
"text": "Superalgos->Node->Data Dependency Folder->Content",
"updated": 1611409498720
},
{
"style": "Title",
"text": "Status Report",
"updated": 1611409535037
},
{
"style": "Title",
"text": ""
},
{
"style": "Include",
"text": "Superalgos->Node->Status Report->Definition",
"updated": 1611409555435
},
{
"style": "Include",
"text": "Superalgos->Node->Status Report->Content",
"updated": 1611409559374
},
{
"style": "Title",
"text": "Execution Started Event",
"updated": 1611409586862
},
{
"style": "Include",
"text": "Superalgos->Node->Execution Started Event->Definition",
"updated": 1611409590304
},
{
"style": "Include",
"text": "Superalgos->Node->Execution Started Event->Content",
"updated": 1611409593797
},
{
"style": "Title",
"text": "Execution Finished Event",
"updated": 1611409630398
},
{
"style": "Include",
"text": "Superalgos->Node->Execution Finished Event->Definition",
"updated": 1611409635844
},
{
"style": "Include",
"text": "Superalgos->Node->Execution Finished Event->Content",
"updated": 1611409640116
}
]
}
@@ -0,0 +1,181 @@
{
"topic": "Data Mines",
"pageNumber": "4",
"type": "Indicator Bots - Product Definition",
"definition": {
"text": "The product definition is the compilation of configurations, references, and JavaScript code that make up the data product.",
"updated": 1611425764441
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Product Definition->Definition",
"updated": 1611425809992
},
{
"style": "Include",
"text": "Superalgos->Node->Product Definition->Content",
"updated": 1611425814195
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Product Definition->2",
"updated": 1611425866970
},
{
"style": "Title",
"text": "Dataset Definition",
"updated": 1611425958957
},
{
"style": "Include",
"text": "Superalgos->Node->Dataset Definition->Definition",
"updated": 1611425968181
},
{
"style": "Include",
"text": "Superalgos->Node->Dataset Definition->Content",
"updated": 1611425972488
},
{
"style": "Title",
"text": "Record Definition",
"updated": 1611426032529
},
{
"style": "Include",
"text": "Superalgos->Node->Record Definition->Definition",
"updated": 1611426038754
},
{
"style": "Include",
"text": "Superalgos->Node->Record Definition->Content",
"updated": 1611426042645
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables",
"updated": 1611426075537
},
{
"style": "Hierarchy",
"text": "Superalgos->Record Definition->4",
"updated": 1611426088183
},
{
"style": "Subtitle",
"text": "Record Property",
"updated": 1611426123252
},
{
"style": "Include",
"text": "Superalgos->Node->Record Property->Definition",
"updated": 1611426129988
},
{
"style": "Include",
"text": "Superalgos->Node->Record Property->Content",
"updated": 1611426133406
},
{
"style": "Subtitle",
"text": "Record Formula",
"updated": 1611426162635
},
{
"style": "Text",
"text": ""
},
{
"style": "Include",
"text": "Superalgos->Node->Record Formula->Definition",
"updated": 1611426176713
},
{
"style": "Title",
"text": "Calculations Procedure",
"updated": 1611426226554
},
{
"style": "Include",
"text": "Superalgos->Node->Calculations Procedure->Definition",
"updated": 1611426233636
},
{
"style": "Include",
"text": "Superalgos->Node->Calculations Procedure->Content",
"updated": 1611426238550
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Calculations Procedure->5",
"updated": 1611426280589
},
{
"style": "Subtitle",
"text": "Procedure Initialization",
"updated": 1611426543003
},
{
"style": "Include",
"text": "Superalgos->Node->Procedure Initialization->Definition",
"updated": 1611426555977
},
{
"style": "Subtitle",
"text": "Procedure Loop",
"updated": 1611426364374
},
{
"style": "Include",
"text": "Superalgos->Node->Procedure Loop->Definition",
"updated": 1611426368953
},
{
"style": "Subtitle",
"text": "Procedure Javascript Code",
"updated": 1611426387898
},
{
"style": "Include",
"text": "Superalgos->Node->Procedure Javascript Code->Definition",
"updated": 1611426391763
},
{
"style": "Title",
"text": "Data Building Procedure",
"updated": 1611426735172
},
{
"style": "Include",
"text": "Superalgos->Node->Data Building Procedure->Definition",
"updated": 1611426741534
},
{
"style": "Include",
"text": "Superalgos->Node->Data Building Procedure->Content",
"updated": 1611426749058
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Data Building Procedure->3",
"updated": 1611426785067
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,122 @@
{
"topic": "Data Mines",
"pageNumber": "6",
"type": "Indicator Bots - Data Mining Workflow",
"definition": {
"text": "When running on a data mining operation, indicators follow a cycle designed to fulfill their purpose: to process data others have produced and make the result available for others to consume.",
"updated": 1611427674749
},
"paragraphs": [
{
"style": "Text",
"text": "Indicators take datasets produced by sensors or by other indicators as input. These inputs are determined by the data dependencies defined. The calculations procedure and the data building procedure produce the intended transformations. The data building procedure stores the results in datasets that others may use as input, and the calculations procedure may make certain pieces of information available without ever writing it in the files.",
"updated": 1611427699110
},
{
"style": "Text",
"text": "The following is the breakdown of the cycle."
},
{
"style": "Title",
"text": "1. Loading of data dependencies"
},
{
"style": "Text",
"text": "Datasets produced by indicators are sets of text files with data stored in the form of arrays. Each value in a record is separated by colons, and each record is delimited by square brackets. Records are too separated by colons. The format in which data is stored in files aims to make files as lightweight as possible."
},
{
"style": "Text",
"text": "For example, the following fragment features three records in the 24-hours Multi-Period-Market Bollinger Bands Data.json file:"
},
{
"style": "Json",
"text": "... ,[1586044800000,1586131199999,6339.464,440.8934655492186,881.7869310984372],[1586131200000,1586217599999,6440.327,424.9041072418576,849.8082144837152],[1586217600000,1586303999999,6530.541,382.3824677453191,764.7649354906382], ..."
},
{
"style": "Text",
"text": "That is what the system encounters at the time of reading a typical file in a dataset, which is the first step in the runtime cycle."
},
{
"style": "Title",
"text": "2. Inflation of files into JSON objects with named properties"
},
{
"style": "Text",
"text": "Once a file is loaded in memory, it is inflated into a JSON object structure, with named properties. This is the second step in the cycle and aims to make accessing each record—from within the code—much easier."
},
{
"style": "Title",
"text": "3. Calculation of properties not stored in the dataset"
},
{
"style": "Text",
"text": "Because performance is inversely related to the weight of files, developers may choose not to store all indicator properties in files. They may choose to leave properties that are easy to calculate out of the dataset and make them available as calculated properties instead. Calculated properties are calculated by the calculations procedure and fed to the record definition formulas to be made available as an integral part of the object other indicators may access."
},
{
"style": "Text",
"text": "For example, picture an indicator that offers buy, sell, and total volumes. Because the total volume is so easy to calculate, the developer of such an indicator may choose to store the buy and sell volumes only and make the total volume available as a calculated property."
},
{
"style": "Success",
"text": "Make your indicators more efficient by limiting the amount of information you store in files.",
"updated": 1611428939223
},
{
"style": "Text",
"text": "The third step in the runtime cycle is, therefore, to run the calculations procedure of each data dependency and add the calculated properties to the JSON object structure in memory, so that all properties are available for the next steps in the cycle."
},
{
"style": "Title",
"text": "4. Products structure"
},
{
"style": "Text",
"text": "Steps 1, 2, and 3 are run for each one of the data dependencies, and the results are put inside an object named products. In this way, all data dependencies may be easily accessed with the following kind of syntax:"
},
{
"style": "Javascript",
"text": "products.pluralVariableName[index].property"
},
{
"style": "Text",
"text": "For example: ",
"updated": 1611428967240
},
{
"style": "Javascript",
"text": "products.bollingerBands[10].deviation"
},
{
"style": "Text",
"text": "Each product remains an array of JSON objects with named variables."
},
{
"style": "Title",
"text": "5. Data building"
},
{
"style": "Text",
"text": "The fifth step in the runtime cycle is running the indicator’s data building procedure. This is where the developer codes the logic to go over the input datasets and perform the calculations required to produce the indicator’s output."
},
{
"style": "Text",
"text": "Indicators may have multiple products, thus, the data building procedure corresponding to each product is run sequentially, in the order products have been defined around the indicator bot node."
},
{
"style": "Text",
"text": "As transformations for a given product are finished, the results are appended to the products object and made available immediately for the rest of the products in the queue to use as input, in addition to the original data dependencies. Data dependencies are the same for all products, as data dependencies are defined at the level of processes."
},
{
"style": "Title",
"text": "6. Writing the output"
},
{
"style": "Text",
"text": "The final step is turning the object-formatted records back into a minimized array format, and saving the corresponding files in the dataset."
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,194 @@
{
"topic": "Data Mines",
"pageNumber": "7",
"type": "Indicator Bots - Coding the Indicator's Logic",
"definition": {
"text": "Learn how to use data dependencies, the variable object, and how to deal with indicators with irregular periods.",
"updated": 1611429211176
},
"paragraphs": [
{
"style": "Title",
"text": "Main Data Dependency",
"updated": 1611430812568
},
{
"style": "Text",
"text": "The data building procedure works under the premise that the algorithm loops around a data collection and that—for each loop—generates a record for the product being built. For example, the SMA indicator loops around the candles product of the Candles Volumes indicator, thus, candles is the main data dependency. In the case of the bollingerChannels product, the main data dependency is the bollingerBands product of the Bollinger Bands indicator."
},
{
"style": "Text",
"text": "The main data dependency is the first dependency declared at the level of the processes. This dependency is made available in the record object, which features three properties:"
},
{
"style": "List",
"text": "previous: ",
"updated": 1611429276716
},
{
"style": "Javascript",
"text": "mainDependency.records[index - 1]"
},
{
"style": "List",
"text": "current: ",
"updated": 1611429281291
},
{
"style": "Javascript",
"text": "mainDependency.records[index]",
"updated": 1611429297570
},
{
"style": "List",
"text": "next: ",
"updated": 1611429287433
},
{
"style": "Javascript",
"text": "mainDependency.records[index + 1]"
},
{
"style": "Text",
"text": "The variable index is the index in the array of the main dependency."
},
{
"style": "Text",
"text": "For example, you may use the statement record.propertyName to access the value of any of the properties in the input datasets for the current record, or record.previous.propertyName to access the value of the property in the previous record."
},
{
"style": "Note",
"text": "The order in which dependencies are defined determines which one is the main data dependency.",
"updated": 1611429327162
},
{
"style": "Title",
"text": "Multiple Data Dependencies",
"updated": 1611430826204
},
{
"style": "Text",
"text": "The products object features a property for each data dependency, and each property is named with the pluralVariableName defined in the product’s configuration. Each property features an array with the dependency’s data collection."
},
{
"style": "Text",
"text": "Data collections of different products may begin and end at different points in time. For example, it takes 20 candles to build the first bollingerBands object of the Bollinger Bands indicator, or 200 candles to build the first popularSMAs object of the SMA indicator. Therefore, the record in i position in the array of one product may not correspond to the same period of time of the record in the same position of a different product."
},
{
"style": "Text",
"text": "To overcome that hurdle, the getElement function, which takes two parameters, may be used:"
},
{
"style": "List",
"text": "The name of the data collection (pluralVariableName) you wish to consult."
},
{
"style": "List",
"text": "An object with begin and end properties, for example, the tenth candle."
},
{
"style": "Text",
"text": "The function returns the record that matches the begin and end datetime of the second parameter."
},
{
"style": "Text",
"text": "This is an example from the Candle Patterns indicator, which has the candles product of the Candles Volumes indicator as the main data dependency:"
},
{
"style": "Javascript",
"text": "let candle = record.current // Calling \"Candles\"\nlet basicCandle = getElement ('basicCandles', candle) // Calling \"Basic Candles\"",
"updated": 1611430980056
},
{
"style": "Title",
"text": "Variable Object",
"updated": 1611431014179
},
{
"style": "Text",
"text": "The output generated must be stored as new properties of the variable object, which is made available to record properties under the record definition node."
},
{
"style": "Text",
"text": "In the case of the data building procedure loop, the variable object may also be used to store and—later—retrieve information between different loop cycles, or even between different executions of the indicator process. Such a feature is not available in the calculations procedure loop, as the object does not persist beyond each loop in that context."
},
{
"style": "Title",
"text": "Multi-Period-Daily"
},
{
"style": "Text",
"text": "In time frames below one hour, the system allows to access data up to 48 hours in the past, relative to the current record. If more than 48-hours worth of data is required to produce the desired data building, then data must be stored into the variable object to be retrieved later on, as explained above."
},
{
"style": "Important",
"text": "Procedures may only access data up to 48 hours in the past counting from the datetime of the record being processed. For example, the calculation of a moving average spanning 100 periods requires temporarily storing data in an array, as the 45 minutes time frame needs 75-hours worth of data.",
"updated": 1611431032118
},
{
"style": "Text",
"text": "The following is an example of a procedure loop code, in particular, the code that calculates the Popular SMAs product of the Simple Moving Average (SMA) indicator. Notice how the output generated by the calculateSMA function is stored into the variable object, and how an array stored in the variable object is used to overcome the 48-hours data-access limitation of Multi-Priod-Daily time frames."
},
{
"style": "Javascript",
"text": "/* Loop Code. */\n\nlet candle = record.current // Our main dependency is candles \nvariable.last200.push(candle.close) // Add the current close value to the last 200 array.\n\nif (variable.last200.length > 200) { // Store data in the variable object to overcome the limitations in multi-period-daily.\n variable.last200.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 200 elements.\n}\n\nvariable.sma20 = calculateSMA(20)\nvariable.sma50 = calculateSMA(50)\nvariable.sma100 = calculateSMA(100)\nvariable.sma200 = calculateSMA(200)\n\nfunction calculateSMA(periods) { // Having a function saves us from duplicating code.\n /* We check we have enough values to make the calculation */\n if (variable.last200.length < periods) { return 0 } // If we dont, we define the value is zero.\n\n let sum = 0 // Initialize sum variable. \n for (let i = variable.last200.length - periods; i < variable.last200.length; i++) { // Iterate through the last periods\n sum = sum + variable.last200[i]\n }\n let sma = sum / periods\n return sma\n}",
"updated": 1611431047895
},
{
"style": "Title",
"text": "Irregular Periods",
"updated": 1611431066723
},
{
"style": "Text",
"text": "Occasionally, a one-to-one mapping of the periods of the data dependency with the periods of the resulting product does not exist. For example, in the case of the bollingerChannels product, using the bollingerBands as the main dependency. In such a case, the algorithm may read the 1-hour bollingerBands as input but the resulting object may span several hours."
},
{
"style": "Text",
"text": "By default, the system pushes a record into the data collection for every loop. To build products that span several periods of the main dependency, you must make the push from within your own code."
},
{
"style": "Text",
"text": "When the system detects a push in the procedure loop code, it cancels the automatic push on each loop."
},
{
"style": "Text",
"text": "The following example taken from the data building procedure loop of the Bollinger Channels Object indicator features several instances of arbitrary use of pushes."
},
{
"style": "Javascript",
"text": "if (record.next !== undefined) {\n\n if (\n record.current.direction === record.next.direction) {\n\n if (variable.channel === undefined) {\n\n variable.channel = {\n begin: undefined,\n end: undefined,\n direction: undefined,\n period: 0,\n firstMovingAverage: 0,\n lastMovingAverage: 0,\n firstDeviation: 0,\n lastDeviation: 0\n }\n\n variable.channel.direction = record.current.direction\n variable.channel.period = 2\n\n variable.channel.begin = record.current.begin\n variable.channel.end = record.next.end\n\n variable.channel.firstMovingAverage = record.current.movingAverage\n variable.channel.lastMovingAverage = record.next.movingAverage\n\n variable.channel.firstDeviation = record.current.deviation\n variable.channel.lastDeviation = record.next.deviation\n\n } else {\n\n variable.channel.period++\n variable.channel.end = record.next.end\n variable.channel.lastMovingAverage = record.next.movingAverage\n variable.channel.lastDeviation = record.next.deviation\n\n }\n } else {\n\n if (variable.channel !== undefined) {\n results.push(variable.channel)\n variable.channel = undefined\n } else {\n /* The variable.channel has only one period */\n\n variable.channel = {}\n\n variable.channel.direction = record.current.direction\n variable.channel.period = 1\n\n variable.channel.begin = record.current.begin\n variable.channel.end = record.current.end\n\n variable.channel.firstMovingAverage = record.current.movingAverage\n variable.channel.lastMovingAverage = record.current.movingAverage\n\n variable.channel.firstDeviation = record.current.deviation\n variable.channel.lastDeviation = record.current.deviation\n\n results.push(variable.channel)\n variable.channel = undefined\n }\n }\n} else {\n if (variable.channel !== undefined) {\n variable.channel.period++\n variable.channel.end = record.current.end\n variable.channel.lastMovingAverage = record.current.movingAverage\n variable.channel.lastDeviation = record.current.deviation\n results.push(variable.channel)\n variable.channel = undefined\n } else {\n /* The variable.channel has only one period */\n\n variable.channel = {}\n\n variable.channel.direction = record.current.direction\n variable.channel.period = 1\n\n variable.channel.begin = record.current.begin\n variable.channel.end = record.current.end\n\n variable.channel.firstMovingAverage = record.current.movingAverage\n variable.channel.lastMovingAverage = record.current.movingAverage\n\n variable.channel.firstDeviation = record.current.deviation\n variable.channel.lastDeviation = record.current.deviation\n\n results.push(variable.channel)\n variable.channel = undefined\n }\n}",
"updated": 1611431088524
},
{
"style": "Title",
"text": "Managing Undefined Objects",
"updated": 1611431116629
},
{
"style": "Text",
"text": "In many instances, objects may be undefined. For example, the first 199 candles in the data collection corresponding to a 200-period moving average may be undefined, as the data building procedure may only build the object once the 200th candle is evaluated."
},
{
"style": "Text",
"text": "Storing undifined property values is highly undesirable, as that would likely produce errors downstream when others attempt to consume the products produced by the indicator. How to handle such circumstances is up to the developer."
},
{
"style": "Text",
"text": "The Bollinger Channels Object example above features deliberate handling of undefined objects."
},
{
"style": "Text",
"text": "In the case of a 200-period moving average discussed above, the developer may want to produce an arbitrary estimation of the moving average for the first 199 candles, or simply set the value to zero for the first 199 candles. The later was the choice for the popularSMAs product as may be observed in the code of the initialization procedure:"
},
{
"style": "Javascript",
"text": "/* Initialization Code*/\n\nvariable.previousEMA20 = 0\nvariable.previousEMA50 = 0\nvariable.previousEMA100 = 0\nvariable.previousEMA200 = 0",
"updated": 1611431131070
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,49 @@
{
"topic": "Data Mines",
"pageNumber": "8",
"type": "Plotters",
"definition": {
"text": "Plotters read data products created by bots and map certain coordinate points to use them as vertices for polygons, which are assigned styles to create graphic representations of the underlying data.",
"updated": 1611431276108
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Plotter->Definition",
"updated": 1611431307735
},
{
"style": "Include",
"text": "Superalgos->Node->Plotter->Content",
"updated": 1611431313998
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Plotter->2",
"updated": 1611431826589
},
{
"style": "Text",
"text": ""
},
{
"style": "Title",
"text": "Plotter Module",
"updated": 1611431881154
},
{
"style": "Include",
"text": "Superalgos->Node->Plotter Module->Definition",
"updated": 1611431891320
},
{
"style": "Include",
"text": "Superalgos->Node->Plotter Module->Content",
"updated": 1611431894467
}
]
}
@@ -0,0 +1,70 @@
{
"topic": "Data Mines",
"pageNumber": "9",
"type": "Plotters - Plotter Panel",
"definition": {
"text": "A plotter panel allows building panels with numerical representations of data.",
"updated": 1611432021846
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Plotter Panel->Definition",
"updated": 1611432049796
},
{
"style": "Include",
"text": "Superalgos->Node->Plotter Panel->Content",
"updated": 1611432052734
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Plotter Panel->4",
"updated": 1611432061472
},
{
"style": "Title",
"text": "Panel Data",
"updated": 1611432322437
},
{
"style": "Include",
"text": "Superalgos->Node->Panel Data->Definition",
"updated": 1611432326601
},
{
"style": "Include",
"text": "Superalgos->Node->Panel Data->Content",
"updated": 1611432330023
},
{
"style": "Subtitle",
"text": "Data Formula",
"updated": 1611432338583
},
{
"style": "Include",
"text": "Superalgos->Node->Data Formula->Definition",
"updated": 1611432348376
},
{
"style": "Subtitle",
"text": "Text Style",
"updated": 1611432394440
},
{
"style": "Include",
"text": "Superalgos->Node->Text Style->Definition",
"updated": 1611432402298
},
{
"style": "Include",
"text": "Superalgos->Node->Text Style->Content",
"updated": 1611432405386
}
]
}
@@ -0,0 +1,202 @@
{
"topic": "Data Mines",
"pageNumber": "10",
"type": "Plotters - Shapes",
"definition": {
"text": "Shapes define coordinate points to use as vertex for polygons, which are assigned styles.",
"updated": 1611432676884
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Shapes->Definition",
"updated": 1611432703073
},
{
"style": "Include",
"text": "Superalgos->Node->Shapes->Content",
"updated": 1611432706401
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Shapes->2",
"updated": 1611432712346
},
{
"style": "Title",
"text": "Chart Points",
"updated": 1611432774706
},
{
"style": "Include",
"text": "Superalgos->Node->Chart Points->Definition",
"updated": 1611432778350
},
{
"style": "Include",
"text": "Superalgos->Node->Chart Points->Content",
"updated": 1611432781813
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Chart Points->8",
"updated": 1611432807680
},
{
"style": "Title",
"text": "Point",
"updated": 1611432845898
},
{
"style": "Include",
"text": "Superalgos->Node->Point->Definition",
"updated": 1611432849816
},
{
"style": "Include",
"text": "Superalgos->Node->Point->Content",
"updated": 1611432853027
},
{
"style": "Subtitle",
"text": "Point Formula",
"updated": 1611432862646
},
{
"style": "Include",
"text": "Superalgos->Node->Point Formula->Definition",
"updated": 1611432866497
},
{
"style": "Include",
"text": "Superalgos->Node->Point Formula->Content",
"updated": 1611432870720
},
{
"style": "Title",
"text": "Polygon",
"updated": 1611433008071
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon->Definition",
"updated": 1611433012029
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon->Content",
"updated": 1611433015599
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables"
},
{
"style": "Hierarchy",
"text": "Superalgos->Polygon->8",
"updated": 1611433074724
},
{
"style": "Text",
"text": ""
},
{
"style": "Title",
"text": "Polygon Condition",
"updated": 1611433130396
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Condition->Definition",
"updated": 1611433134852
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Condition->Content",
"updated": 1611433139614
},
{
"style": "Title",
"text": "Polygon Body",
"updated": 1611433166294
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Body->Definition",
"updated": 1611433175296
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Body->Content",
"updated": 1611433178676
},
{
"style": "Subtitle",
"text": "Style",
"updated": 1611433231745
},
{
"style": "Include",
"text": "Superalgos->Node->Style->Definition",
"updated": 1611433235523
},
{
"style": "Include",
"text": "Superalgos->Node->Style->Content",
"updated": 1611433238663
},
{
"style": "Subtitle",
"text": "Style Condition",
"updated": 1611433273738
},
{
"style": "Include",
"text": "Superalgos->Node->Style Condition->Definition",
"updated": 1611433277376
},
{
"style": "Include",
"text": "Superalgos->Node->Style Condition->Content",
"updated": 1611433280995
},
{
"style": "Title",
"text": "Polygon Border",
"updated": 1611433347131
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Border->Definition",
"updated": 1611433354769
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Border->Content",
"updated": 1611433358287
},
{
"style": "Title",
"text": "Polygon Vertex",
"updated": 1611433401279
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Vertex->Definition",
"updated": 1611433405348
},
{
"style": "Include",
"text": "Superalgos->Node->Polygon Vertex->Content",
"updated": 1611433408699
}
]
}
@@ -0,0 +1,111 @@
{
"topic": "Data Mines",
"pageNumber": "11",
"type": "How to Build an Indicator - Video Series",
"definition": {
"text": "This video series goes through the entire process of building an indicator, step by step.",
"updated": 1611434001380
},
"paragraphs": [
{
"style": "Text",
"text": "This video series focuses on the “how to” aspect of building an indicator. It does not go through definitions nor does it explain the underlying concepts. Therefore, it is highly recommended to read the data mines page as well as the pages about indicator bots before attempting to build an indicator.",
"updated": 1611434011723
},
{
"style": "Note",
"text": "Reading the whole documentation on indicators and plotters is certainly desirable and will save you time in the long run.",
"updated": 1611434037598
},
{
"style": "Important",
"text": "The video series on how to build an indicator was produced for the Beta 5 version of the system; however, the functionality still works similarly. That said, there may be minor differences that are yet to be documented. Please drop by the Develop group and ask any questions you may have, particularly if something is not working as expected, or as instructed in the videos.",
"updated": 1611434212027
},
{
"style": "Title",
"text": "Step 1 - Visual Definitions",
"updated": 1611434706444
},
{
"style": "Text",
"text": "Setting up the multi-period-market and multi-period-daily process definitions, status and data dependencies, execution events, and dataset definitions for the main product.",
"updated": 1611434720860
},
{
"style": "Youtube",
"text": "KXKKS_o8Zjw",
"updated": 1611434740393
},
{
"style": "Title",
"text": "Step 2 - Code & Record Definition",
"updated": 1611435476284
},
{
"style": "Text",
"text": "Reviewing common coding practice and configuring record properties and their formulas.",
"updated": 1611435495283
},
{
"style": "Youtube",
"text": "zx5N5D2tkwo",
"updated": 1611435834819
},
{
"style": "Title",
"text": "Step 3 - Testing & Troubleshooting",
"updated": 1611435879103
},
{
"style": "Text",
"text": "Setting up a data mining task to run the bot instance, checking the dataset files for errors, and troubleshooting common issues with the code and the process definitions.",
"updated": 1611435892931
},
{
"style": "Youtube",
"text": "gjv5lPmLVSI",
"updated": 1611435919312
},
{
"style": "Title",
"text": "Step 4 - Plotters",
"updated": 1611435948687
},
{
"style": "Text",
"text": "How to create the device that will interpret the dataset generated by the indicator and render a graphical representation over the charts.",
"updated": 1611435955116
},
{
"style": "Youtube",
"text": "UBtUtUfZPk4",
"updated": 1611436312247
},
{
"style": "Title",
"text": "Step 5 - Trading Bot Dependencies",
"updated": 1611436344230
},
{
"style": "Text",
"text": "Before you may use the new indicator on a trading system, you must create the corresponding dependencies on the Low frequency trading bot.",
"updated": 1611436373962
},
{
"style": "Text",
"text": "To call the properties of a new indicator from within the definitions of a trading system, you first need to let the Low Frequency trading bot that your data mine exists. To do this, you need to add the corresponding data dependencies at the trading bot’s Trading process definitions.",
"updated": 1611436404033
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/how-to-build-an-indicator-step-5.gif",
"updated": 1611436528224
},
{
"style": "Important",
"text": "Because the Low Frequency trading bot is a plugin, the modifications you make to the hierarchy do not persist after closing the frontend app. The workaround is to take a backup of the hierarchy after making the modifications, and replace the plugin file with the backup. Should you decide to contribute your data mine to the project, we will incorporate the dependencies in the official release.",
"updated": 1611436549743
}
]
}
@@ -3,25 +3,60 @@
"pageNumber": "4",
"type": "Docs In Italian",
"definition": {
"text": "The Docs articles are fully written in English. The system allow users to search / browse articles in other languages as well, as long as other users contribute translations."
"text": "The Docs articles are fully written in English. The system allow users to search / browse articles in other languages as well, as long as other users contribute translations.",
"translations": [
{
"language": "IT",
"text": "La guida di Superalgos è scritta interamente in inglese ma anche tu puoi aiutare a tradurre nella tua lingua preferita. Il sistema attualmente consente agli utenti di cercare o sfogliare la guida anche in altre lingue purché altri utenti contribuiscano alle traduzioni.",
"updated": 1610794887971
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos and any other integrated project are written in English, since English is considered the default language. Node types, variable names, etc., all is originally in English language. "
"text": "Superalgos and any other integrated project are written in English, since English is considered the default language. Node types, variable names, etc., all is originally in English language. ",
"translations": [
{
"language": "IT",
"text": "Superalgos e gli altri progetti integrati sono scritti in inglese perchè considerata la lingua predefinita. Tipi di nodi, nomi di variabili, ecc., Tutto è originariamente in lingua inglese.",
"updated": 1610806159263
}
]
},
{
"style": "Text",
"text": "The Docs content can be translated by anyone willing to contribute some time doing so. That helps users to read the contents of the Docs in their native language. "
"text": "The Docs content can be translated by anyone willing to contribute some time doing so. That helps users to read the contents of the Docs in their native language. ",
"translations": [
{
"language": "IT",
"text": "Il contenuto della guida può essere tradotto da chiunque desideri contribuire! Così facendo aiuterai gli utenti a leggere i contenuti della guida nella loro lingua madre e tu potrai dare il tuo contributo.",
"updated": 1610806232380
}
]
},
{
"style": "Success",
"text": " Users can switch between languages using the links provided at the footer of every page at the Docs. ",
"updated": 1609085068937
"updated": 1609085068937,
"translations": [
{
"language": "IT",
"text": "Gli utenti possono passare da una lingua all'altra utilizzando i collegamenti che si trovano nel footer di ogni pagina in questa guida.",
"updated": 1610806272356
}
]
},
{
"style": "Note",
"text": "You can only add or delete pages to the Docs if you are navigating it in English, because English is the default language, and from there pages are later translated. "
"text": "You can only add or delete pages to the Docs if you are navigating it in English, because English is the default language, and from there pages are later translated. ",
"translations": [
{
"language": "IT",
"text": "Puoi aggiungere o eliminare le pagine della guida solo se stai navigando in inglese perché è la lingua predefinita e da lì le pagine possono essere tradotte in seguito.",
"updated": 1610806324698
}
]
}
]
}
@@ -0,0 +1,288 @@
{
"topic": "Integrations",
"pageNumber": "1",
"type": "Telegram Announcements",
"definition": {
"text": "Setup a Telegram bot to broadcast the activity of trading sessions to a Telegram group. You may produce plain-text or dynamic-content announcements at every event in your trading systems.",
"updated": 1611484869105
},
"paragraphs": [
{
"style": "Title",
"text": "Overview",
"updated": 1611484892100
},
{
"style": "Text",
"text": "The announcements feature allows users to set up notifications tied to specific events, and triggered once each particular event becomes active while running any of the available types of trading sessions."
},
{
"style": "Text",
"text": "You may use this feature to stay informed about the actions of your strategies while trading live, or to broadcast signals over a Telegram group while paper trading, for instance."
},
{
"style": "Text",
"text": "Supported events are:"
},
{
"style": "List",
"text": "Trigger-on event"
},
{
"style": "List",
"text": "Trigger-off event"
},
{
"style": "List",
"text": "Take position event"
},
{
"style": "List",
"text": "Stop and take profit next-phase events"
},
{
"style": "Text",
"text": "In addition, you can implement announcements at the level of stop and take profit phases, a particular case that shall be discussed too."
},
{
"style": "Text",
"text": "The current implementation is based on broadcasting announcements via Telegram bots. The system uses Telegram’s bots API to interact with a Telegram bot you will create. The bot will be added as a user in the Telegram group of your choice in which it will deliver the announcements as per the configuration you will set up in the system."
},
{
"style": "Title",
"text": "Setting Up a Telegram Bot and a Telegram Group"
},
{
"style": "Text",
"text": "Telegram’s documentation explains the details of how to use Telegram bots:",
"updated": 1611485108327
},
{
"style": "Link",
"text": "Bots: An introduction for developers->core.telegram.org/bots",
"updated": 1611485151851
},
{
"style": "Text",
"text": "You may choose to read Telegram’s documentation or simple follow the next few steps, which have been extracted for your convenience:"
},
{
"style": "List",
"text": "1. Go to Telegram and find the user @BotFather: You may use the link or simply search for the user.",
"updated": 1611485257909
},
{
"style": "List",
"text": "2. Type and send /newbot: BotFather will ask you to pick a name for your bot. Once the name is set, it will respond with the token (a text string) to access the HTTP API.",
"updated": 1611485277898
},
{
"style": "Text",
"text": "You will need this token at a later time."
},
{
"style": "List",
"text": "3. Create a Telegram: Your bot will broadcast the announcements here.",
"updated": 1611485421498
},
{
"style": "List",
"text": "4. Add your bot in the group: And add @myidbot as user in the group too.",
"updated": 1611485472896
},
{
"style": "List",
"text": "5. Type and send /getgroupid in the group: IDBot will answer with the group’s ID.",
"updated": 1611485491256
},
{
"style": "Text",
"text": "You will need this ID at a later time."
},
{
"style": "Title",
"text": "Setting Up the Telegram Bot in Superalgos"
},
{
"style": "Text",
"text": "You will set up your bot in a backtesting session, so that you may easily test the announcements."
},
{
"style": "List",
"text": "1. Go to any of your backtesting sessions and add a Social Bot node using the session’s menu: A social bot will be added along with a telegram bot.",
"updated": 1611485546279
},
{
"style": "List",
"text": "2. Select Edit Telegram Bot on the telegram bot menu: Replace the placeholder text with the actual botToken and chatId you got earlier.",
"updated": 1611485581216
},
{
"style": "Text",
"text": "For example:"
},
{
"style": "Json",
"text": "{\n\"botToken\": \"927642627:2B1QkNX2620C2B1ZTp9JrQUV04YKtJrQ2t4\",\n\"chatId\":-388158765\n}",
"updated": 1611485597629
},
{
"style": "Text",
"text": "The system now has everything it needs to communicate with your Telegram bot."
},
{
"style": "Title",
"text": "Create Your Announcements"
},
{
"style": "Text",
"text": "You may create as many announcements as you wish, on any of the events listed in the Overview section above by clicking Add Announcement on the corresponding event node menu."
},
{
"style": "Text",
"text": "There are two different ways in which you may customize announcements:"
},
{
"style": "List",
"text": "Plain text"
},
{
"style": "List",
"text": "Dynamic content"
},
{
"style": "Success",
"text": "The Weak-hands buster strategy shipping with Superalgos features a complete set of announcements. Check them out and reuse them in your setup!",
"updated": 1611485640517
},
{
"style": "Title",
"text": "Plain Text"
},
{
"style": "Text",
"text": "To set a plain text announcement, click Edit Announcement on the announcement node menu and set a message on the field text."
},
{
"style": "Text",
"text": "For example:"
},
{
"style": "Json",
"text": "{\n\"text\": \"WHB Triggered-on!\"\n}",
"updated": 1611485680647
},
{
"style": "Title",
"text": "Dynamic Content"
},
{
"style": "Text",
"text": "To broadcast more elaborate messages that may include dynamic values of any of the current indicators or internal variables, set the message in the formula attached to the announcement instead."
},
{
"style": "Text",
"text": "The typical set up for a dynamic message consists of building a string by alternating “text between double quotes” with variables, separating them with plus signs (+)."
},
{
"style": "Text",
"text": "For example, a typical announcement formula for the take position event may look like this:"
},
{
"style": "Javascript",
"text": "\"Selling BTC at $\" + candle.close.toFixed(0) + \", with stop at $\" + stopLoss.toFixed(0) + \" and TP target at $\" + takeProfit.toFixed(0)"
},
{
"style": "Text",
"text": ".toFixed(0) rounds the number to zero decimal places. The above formula would result in something like:"
},
{
"style": "Json",
"text": "Selling BTC at $9703, with stop at $9896 and TP target at $9115"
},
{
"style": "Note",
"text": "If your formula is valid, the system will ignore the plain text version you may have set up in the announcement configuration. If for any reason the formula results in an error, then the plain text version will be used.",
"updated": 1611485748590
},
{
"style": "Title",
"text": "Announcements on Stop and Take Profit Phases"
},
{
"style": "Text",
"text": "We mentioned earlier that, beyond setting announcements on events, you may also implement announcements at the level of a stop or take profit phase. These are useful to broadcast the management of dynamic stop and take profit targets."
},
{
"style": "Text",
"text": "When implemented at the level of a phase, the announcement is triggered every time the value of the underlying variable (the stop or take profit target) changes. This is an important difference, as the value may change at every candle (if you are using formulas that use variables)."
},
{
"style": "Text",
"text": "This could result in too many announcements in relatively short intervals."
},
{
"style": "Text",
"text": "The valueVariation parameter introduced in the announcement configuration may be used to filter out announcements until a certain threshold is achieved. The value you enter will set the percentage of variation that needs to occur before a new announcement is broadcasted."
},
{
"style": "Text",
"text": "For instance, \"valueVariation\": 0.5 means a new announcement will be broadcasted every time the value of the underlying variable changes by 0.5%."
},
{
"style": "Json",
"text": "{\n\"text\": \"Write here what you want to announce.\",\n\"valueVariantion\": 0.5\n}",
"updated": 1611485849624
},
{
"style": "Title",
"text": "Finishing the Setup"
},
{
"style": "Text",
"text": "It is unlikely that you will want to use the announcements feature from within a backtesting session. A more likely scenario is you will want to use it with a paper trading session (to generate signals) or from a live trading session, to monitor the activity of your live trading."
},
{
"style": "Text",
"text": "All you need to do to finish your set up is detach the social bot node from the backtesting session and attach it to the session you wish to use it in. Make sure the corresponding tasks are stopped before detaching and attaching the social bot."
},
{
"style": "Title",
"text": "Commercial Setups"
},
{
"style": "Text",
"text": "If you are settting up a signals business or require a more complex setup to broadcast announcements from multiple sessions, multiple strategies, or even to multiple groups, the following considerations may help you decide how to move forwards."
},
{
"style": "Important",
"text": "Telegram does not allow running multiple instances of the same bot. Doing so may produce warnings, cause errors, delays in message delivery, lost messages, and erratic behavior in general.",
"updated": 1611485876079
},
{
"style": "Text",
"text": "The solution is quite simple. Set up multiple bots. The rule of thumb is you should use one bot for each trading session. Remember you can include as many bots as you wish in your Telegram groups. That is, you may have different bots broadcast from different sessions in the same group."
},
{
"style": "Success",
"text": "If you wish to broadcast signals from multiple sessions to the same Telegram Group, you may name each bot in a way that each references their specific session, so that group members know exactly what each message is referring to.",
"updated": 1611485909076
},
{
"style": "Text",
"text": "For example, let’s say you are broadcasting signals from different markets… you may name your bots BTC/USDT, ETH/USDT and XMR/BTC."
},
{
"style": "Text",
"text": "Or maybe you have different strategies, then simply name the bots after each strategy."
},
{
"style": "Text",
"text": "This makes it really easy for group members to know what market or strategy the bot broadcasting the signal is referring to."
},
{
"style": "Text",
"text": "Another example… let’s say you are running a trading operation for friends and family. Each person is working with a different initial capital, different assets or different exchanges. in such case, you may set up multiple Telegram groups and multiple bots, so that each person may get precise information on what the bots are doing."
}
]
}
@@ -0,0 +1,200 @@
{
"topic": "Integrations",
"pageNumber": "2",
"type": "Webhook Notifications",
"definition": {
"text": "Receive webhook notifications from other systems and use them as signals in your strategies.",
"updated": 1611486052936
},
"paragraphs": [
{
"style": "Title",
"text": "Overview",
"updated": 1611486037477
},
{
"style": "Text",
"text": "Superalgos allows you to receive webhook notifications from TradingView or any other system supporting webhooks. You may use this feature to turn notifications into signals upon which you may act from within your strategies."
},
{
"style": "Text",
"text": "The system’s Web Server receives notifications and serves them to a sensor bot running as a data mining task. The sensor creates a data product with several properties which are made available to be used from within strategies."
},
{
"style": "Text",
"text": "The rest of this page describes the set up process and how to use webhook notifications from within Superalgos."
},
{
"style": "Title",
"text": "Set-up the Webhooks Sensor Bot Tasks"
},
{
"style": "Text",
"text": "The Masters data mine features the definition of the Webhooks sensor bot used to monitor incoming notifications. You need to run an instance of this bot in the data mining section of the exchange and market of your choice."
},
{
"style": "Text",
"text": "The default workspace does not feature these tasks. To create a task for the Webhooks sensor bot, you need to uninstall and re-install the corresponding market."
},
{
"style": "Text",
"text": "Once the Webhooks sensor task is set up and running, you are all set at the application level. It’s that simple."
},
{
"style": "Title",
"text": "Run a Quick Local Test"
},
{
"style": "Text",
"text": "Before setting up the actual signal at the corresponding provider, you may run a quick local test that will help you familiarize with how Superalgos handles webhooks."
},
{
"style": "Text",
"text": "In the crypto ecosystem node menu, select Add Signals Providers. A structure of nodes is added with a signals provider node that allows you to run a little test. Select Configure Signals Provider on the menu."
},
{
"style": "Json",
"text": "{\n\"webhookURL\": \"Webhook/New-Message/Trading-View/Binance/BTC-USDT\",\n\"testMessage\": \"\"\n}",
"updated": 1611486196742
},
{
"style": "List",
"text": "webhookURL: This is the URL you need to use for testing purposes. Make sure you refer to the correct exchange and market."
},
{
"style": "List",
"text": "testMessage: Enter any message, for testing purposes."
},
{
"style": "Text",
"text": "Once the test message is configured, select Send Test Message on the menu."
},
{
"style": "Title",
"text": "Webhooks Sensor Bot Output"
},
{
"style": "Text",
"text": "The Webhooks sensor bot outputs a single file, Data.json, in the following location: ",
"updated": 1611486267182
},
{
"style": "Json",
"text": "\\Data-Storage\\Exchange\\Market\\Masters\\Webhooks\\Output\\External-Signals\\Single-File\\",
"updated": 1611486278677
},
{
"style": "Text",
"text": "You may open the file and see if the content corresponds to what is expected."
},
{
"style": "Note",
"text": "Make sure the Webhooks sensor bot task is running. The process is configured to run every 30 seconds by default. If that time has passed, you should find the messages you may have sent.",
"updated": 1611486302392
},
{
"style": "Text",
"text": "This is what the file may look like, assuming you sent four different test messages:"
},
{
"style": "Json",
"text": "[[1587998459260,\"Trading-View\",\"Sell\"],[1587998475409,\"Trading-View\",\"Buy\"],[1587998530190,\"Trading-View\",\"A custom signal I just configured\"],[1588000300940,\"Trading-View\",\"This is my new message\"]]"
},
{
"style": "Text",
"text": "As per the record definition of the Webhooks sensor bot in the Masters data mine, each record in the file features three fields:"
},
{
"style": "List",
"text": "timestamp: the Unix datetime of the message."
},
{
"style": "List",
"text": "source: the name of the signal provider."
},
{
"style": "List",
"text": "message: the message set up at the provider’s system."
},
{
"style": "Title",
"text": "Using Webhooks Signals from within Strategies"
},
{
"style": "Text",
"text": "You may use each of the three available properties with the following syntax:"
},
{
"style": "Javascript",
"text": "chart.atAnyTimeFrame.externalSignal.timestamp"
},
{
"style": "Javascript",
"text": "chart.atAnyTimeFrame.externalSignal.source"
},
{
"style": "Javascript",
"text": "chart.atAnyTimeFrame.externalSignal.message"
},
{
"style": "Text",
"text": "For example, a simple condition evaluating to true when a the last message received is a buy signal from TradingView would look like this:"
},
{
"style": "Javascript",
"text": "chart.atAnyTimeFrame.externalSignal.source === \"Trading-View\" && chart.atAnyTimeFrame.externalSignal.message === \"Buy\""
},
{
"style": "Text",
"text": "You may also use the previous property to check the previous message, as follows:"
},
{
"style": "Javascript",
"text": "chart.atAnyTimeFrame.externalSignal.previous.message === \"Buy\""
},
{
"style": "Text",
"text": "It may be wise to verify the date of the message, or to check if the message corresponds to a certain time frame. To do that, you may use the isItInside function as follows:"
},
{
"style": "Javascript",
"text": "isItInside(chart.atAnyTimeFrame.externalSignal, chart.at01hs.candle)"
},
{
"style": "Text",
"text": "In the above example, the first parameter chart.atAnyTimeFrame.externalSignal is the signal object you wish to check, and the second parameter chart.at01hs.candle is any other object that is delimited in time. In this case, the condition validates true if the last message falls within the last 1-hour candle."
},
{
"style": "Title",
"text": "Set-up Alerts/Messages at the Provider"
},
{
"style": "Text",
"text": "You will use the following syntax to craft the URL you need to configure for the webhooks at the provider:"
},
{
"style": "Javascript",
"text": "http://YourIPAddress:Port/Webhook/New-Message/Provider-Name/Exchange/Market"
},
{
"style": "Text",
"text": "For example:"
},
{
"style": "Json",
"text": "http://182.45.73.1:34247/Webhook/New-Message/Trading-View/Binance/BTC-USDT"
},
{
"style": "Text",
"text": "Set-up Your Network to Accept Incoming Connections"
},
{
"style": "Text",
"text": "Needless to say, you need to configure your network / router / firewall to allow incoming webhook messages on the corresponding port."
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,32 @@
{
"topic": "Low-Frequency Trading Bot",
"pageNumber": "3",
"type": "Data Products Visualization",
"definition": {
"text": "The Superalgos trading bot outputs several data products which may be visualized on the frontend application in multiple manners.",
"updated": 1611240250659
},
"paragraphs": [
{
"style": "Text",
"text": "The Low-Frequency trading bot outputs tens of data products, which are made available for others to use through the data structure provided by the Trading Engine hierarchy, the Trading System involved in the trading session, and the time machines installed to visualize the trading simulations.",
"updated": 1611252948830
},
{
"style": "Success",
"text": "The Trading Bot Layers interactive tutorial available in the Weak-Hands Buster v.2 plugin workspace covers all the trading bot features that enable the visualization of trading information:"
},
{
"style": "List",
"text": "Visualization of simulations over the chart for all types of trading sessions."
},
{
"style": "List",
"text": "Visualization of all the trading information managed by the trading bot on the trading engine hierarchy."
},
{
"style": "List",
"text": "Visualization of event highlights, values, warnings, errors, and general information concerning the trading system."
}
]
}
@@ -0,0 +1,134 @@
{
"topic": "Productivity Tools",
"pageNumber": "1",
"type": "Backups",
"definition": {
"text": "The backup feature is designed to preserve the integrity of references as you would expect when you wish to restore a data structure to a previous state of affairs.",
"updated": 1611489612653
},
"paragraphs": [
{
"style": "Title",
"text": "Introduction",
"updated": 1611489635384
},
{
"style": "Text",
"text": "When you back up a single node, a structure of nodes, a complete hierarchy or even the workspace, all existing references are stored in the resulting JSON file."
},
{
"style": "Text",
"text": "When you restore a workspace backup, the current workspace is discarded entirely and replaced with the backup. Now, let’s see what happens when you restore anything other than a workspace, that is, any of the data structures contained in the workspace."
},
{
"style": "Text",
"text": "In particular, what we want to analyze is what happens with each type of reference that may be present in the structure."
},
{
"style": "Text",
"text": "What happens with each type of reference when the back up is restored varies depending on one factor: the original structure is present in the workspace, or instead, it has been deleted prior to restoring the backup."
},
{
"style": "Title",
"text": "Outgoing References"
},
{
"style": "Callout",
"text": "Outgoing references are kept no matter if the original structure of nodes still exists or not."
},
{
"style": "Text",
"text": "For example, in a task set up for running a testing session, the trading bot process instance references the trading bot Multi-Period process, and the session references a trading sytem."
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/backups-01.gif",
"updated": 1611489923510
},
{
"style": "Text",
"text": "As the capture above shows, when restoring the backup of a task, both outgoing references are maintained, even when the original task has not been deleted."
},
{
"style": "Text",
"text": "This means that restoring a back up is a viable way to duplicate structures of nodes with outgoing references when you expect outgoing references to be preserved."
},
{
"style": "Title",
"text": "Incoming References"
},
{
"style": "Callout",
"text": "Incoming references are restored only when the original structure of nodes is deleted before restoring the backup."
},
{
"style": "Text",
"text": "Let’s take a trading system as an example. Trading systems usually have several incoming references originating at different testing and live trading sessions."
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/backups-02.gif",
"updated": 1611489956681
},
{
"style": "Text",
"text": "The capture above shows that restoring a backup of a trading system when the orginal definition is still in the workspace causes the incoming references to be lost."
},
{
"style": "Text",
"text": "However, as the capture below shows, if the original structure of nodes is deleted before the backup is restored, then the incoming references are restored as well."
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/backups-03.gif",
"updated": 1611489978479
},
{
"style": "Title",
"text": "Internal References"
},
{
"style": "Text",
"text": "Internal references are kept internally only when the original structure of nodes is deleted before restoring the backup. If the original structure of nodes is present, then the references will point to the original nodes on the original structure of nodes."
},
{
"style": "Text",
"text": "Let’s see what happens when we restore a backup of a shapes node without deleting the original node first:"
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/backups-04.gif",
"updated": 1611490001325
},
{
"style": "Text",
"text": "As expected, the references from vertices in the restored backup do not point to the points in the same structure, but instead point to the original points in the original strucutre."
},
{
"style": "Text",
"text": "On the other hand, if the original structure of nodes is deleted before restoring the backup, then the references point to the nodes within the same structure:"
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/backups-05.gif",
"updated": 1611490016934
},
{
"style": "Title",
"text": "Conclusion"
},
{
"style": "Text",
"text": "The backup feature is designed to preserve the integrity of references as you would expect when you wish to restore a data structure to a previous state of affairs."
},
{
"style": "Text",
"text": "However, the tool’s particular behavior when restoring a backup without deleting the original structure may be of use in certain ocassions. In such cases, the backup feature behaves differently than the clone feature.",
"updated": 1611490099609
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,95 @@
{
"topic": "Productivity Tools",
"pageNumber": "2",
"type": "Clones",
"definition": {
"text": "The clone feature is designed to produce copies of data structures when you need to replicate nodes and expect the copies to behave similarly to the original.",
"updated": 1611490308337
},
"paragraphs": [
{
"style": "Title",
"text": "Introduction",
"updated": 1611490329180
},
{
"style": "Text",
"text": "We will analyze the case of clones under the same lens we analyzed how backups work: we will study how clones treat outgoing, incoming and internal references."
},
{
"style": "Text",
"text": "Unlike with backups, clones behave in the same way independently of the existence of the original structure of nodes in the workspace, therefore, we will not make such distinction in the following paragraphs."
},
{
"style": "Title",
"text": "Outgoing References"
},
{
"style": "Callout",
"text": "Outgoing references are kept intact."
},
{
"style": "Text",
"text": "Pretty much like with backups, a clone preserves outgoing references."
},
{
"style": "Text",
"text": "The same example as with backups apply: cloning a task running a session produces a copy of the task with the trading bot process instance maintaining the reference to the trading bot Multi-Period process, and the session maintaining the reference with the corresponding trading system."
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/clones-01.gif",
"updated": 1611490442818
},
{
"style": "Title",
"text": "Incoming References"
},
{
"style": "Callout",
"text": "Incoming references are discarded."
},
{
"style": "Text",
"text": "Let’s go back to the example of a trading system, like we did when exploring backups:"
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/clones-02.gif",
"updated": 1611490471957
},
{
"style": "Text",
"text": "The capture above shows that restoring a clone of a trading system does not restore incoming references, even when the original structure of nodes is deleted before restoration."
},
{
"style": "Title",
"text": "Internal References"
},
{
"style": "Callout",
"text": "Internal references are kept intact."
},
{
"style": "Text",
"text": "Going back to the shapes node example, the capture below shows how restonring a clone keeps internal references intact:"
},
{
"style": "Gif",
"text": "GIFs/Superalgos/Docs/design-space/clones-03.gif",
"updated": 1611490496345
},
{
"style": "Title",
"text": "Conclusion"
},
{
"style": "Text",
"text": "The clone feature is designed to produce copies of data structures when you need to replicate nodes and expect the copies to behave similarly to the original."
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,41 @@
{
"topic": "Productivity Tools",
"pageNumber": "3",
"type": "Shares",
"definition": {
"text": "The share feature works almost the same as the back up feature, but discarding personal information like exchange keys.",
"updated": 1611490590355
},
"paragraphs": [
{
"style": "Text",
"text": "The share feature works almost the same as the back up feature, with the sole difference that shares do not store personal information, like exchange API keys.",
"updated": 1611490600062
},
{
"style": "Text",
"text": "On that note, we will not analyze this feature further, other than reminding the user that it is recommended to develop the habit to only share shares and not backups, to avoid the potential accidental dissemination of exchange keys."
},
{
"style": "Callout",
"text": "On a different note, it is also critical to bring one more issue to your attention regarding sharing work and—what’s more more important— using other people’s work."
},
{
"style": "Text",
"text": "You may have noticed that the system accepts JavaScript code in a multitude of input forms such as configurations, conditions, formulas and more. At this point, there is no restriction to the code that may be used. This is a design feature, as we wish advanced users to be able to use their programing skills to make the most out of the system."
},
{
"style": "Text",
"text": "However, this also means that using workspaces or any other data structure coming from untrusted sources is not free of risks. On the contrary, it may be a high-risk choice, as it is possible to introduce malicious code that may, for example, attempt to steal people’s API keys."
},
{
"style": "Warning",
"text": "Beware of using shared data structures from untrusted sources as they may contain malicious code that could, for example, steal your exchange keys.",
"updated": 1611490613530
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,37 @@
{
"topic": "Productivity Tools",
"pageNumber": "4",
"type": "Screen Capture and Sharing",
"definition": {
"text": "Share you screen with friends and colleagues capturing still images or videos directly from within the frontend.",
"updated": 1611490773902
},
"paragraphs": [
{
"style": "List",
"text": "Hit Ctrl + F8 to capture a static PNG image.",
"updated": 1611490790992
},
{
"style": "List",
"text": "Hit Ctrl + F9 to start capturing a GIF video, and hit the same key combination again to end the capture. Once the capture ends, it takes some time to process the capture and generate the final file."
},
{
"style": "List",
"text": "Hit Ctrl + F10 to start capturing a WEBM video, and hit the same key combination again to end the capture. WEBM videos are processed instantly."
},
{
"style": "Text",
"text": "In all three cases, the browser downloads the resulting file and makes it available in the downloads folder."
},
{
"style": "Note",
"text": "GIF files tend to grow a lot in long captures, but are more universal, thus more devices can display them properly. WEBM files are a lot more efficient, but do not work in Apple and, potentially, other platforms or devices.",
"updated": 1611490891864
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,24 @@
{
"topic": "Trading Engine",
"pageNumber": "1",
"type": "Trading Engine Hierarchy",
"definition": {
"text": "The trading engine provides a feedback loop to trading systems so that your strategies may leverage the information processed by the trading bot.",
"updated": 1611253515308
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Trading Engine->Definition",
"updated": 1611253576142
},
{
"style": "Include",
"text": "Superalgos->Node->Trading Engine->Content"
},
{
"style": "Success",
"text": "The trading engine hierarchy is deep and large, with many ramifications. It is best to learn it through hands-on experimentation, by testing an existing trading system."
}
]
}
@@ -0,0 +1,68 @@
{
"topic": "Trading Engine",
"pageNumber": "2",
"type": "Monitoring Runtime Data",
"definition": {
"text": "Use the trading engine hierarchy to track every piece of information processed by the trading bot, candle by candle.",
"updated": 1611253725593
},
"paragraphs": [
{
"style": "Text",
"text": "The trading engine hierarchy is a portal into the trading bot’s machine room—the brain. Think of the trading engine as a terminal connected to each of the brain’s neurons, taking a snapshot for every candle, and registering with precision every piece of data handled by the trading bot during the trading session.",
"updated": 1611253749127
},
{
"style": "Text",
"text": "Superalgos combines the time navigation features of the charts with the visual environment representing data structures of the design space, to create an immersive user experience."
},
{
"style": "Callout",
"text": "Each of the nodes in the hierarchy may display its value on the design space, right below the icon representing the node, for each candle."
},
{
"style": "Note",
"text": "How users may monitor the information featured in the Trading Engine hierarchy is explained and demonstrated on the Trading Bot Layers tutorial available on the Weak-hands Buster V2.0 plugin workspace.",
"updated": 1611253775463
},
{
"style": "Text",
"text": "As a quick refresher, the process is more or less as follows:"
},
{
"style": "List",
"text": "Run a trading session. Start with a backtest, so that you may get a quick feel of how the Trading Engine hierarchy displays data spanning any period.",
"updated": 1611253817389
},
{
"style": "List",
"text": "Go to the chart displaying the simulation and find one of the positions.",
"updated": 1611253824254
},
{
"style": "List",
"text": "Turn on the Current Position layer in the Trading Engine layer manager. This layer monitors the position structure of nodes under the current node, that is, the information regarding current positions.",
"updated": 1611253835635
},
{
"style": "List",
"text": "Split the screen to make room for both the design space and the charting space.",
"updated": 1611253840769
},
{
"style": "List",
"text": "Position the view on the design space so that you may see the corresponding structure of nodes.",
"updated": 1611253852074
},
{
"style": "List",
"text": "Slide the pointer of the mouse over the charts, across the position, and notice how the values for each node displayed on the design space change. Each node displays the corresponding value for each candle.",
"updated": 1611253859589
},
{
"style": "Success",
"text": "Much of the data handled by the trading engine may also be visualized over the charts through the layers and panels in the Trading Charts layer manager. If any of the above is not clear, please refer to the Trading Bot Layers Tutorial available on the Weak-hands Buster V2.0 plugin workspace.",
"updated": 1611253891479
}
]
}
@@ -0,0 +1,28 @@
{
"topic": "Trading Engine",
"pageNumber": "3",
"type": "Trading Bot Output",
"definition": {
"text": "The trading bot stores every piece of information processed in files, making all data accessible to others, both online and offline.",
"updated": 1611254037722
},
"paragraphs": [
{
"style": "Text",
"text": "As explained elsewhere, the trading bot makes the information it processes available to users through the hierarchy of the trading engine, which may be visualized both on the design space and over the charts. It also makes it available to trading systems.",
"updated": 1611254053601
},
{
"style": "Text",
"text": "On top of that, the information is also stored in files, sorted by concept. These makes the runtime information available to other processes and external systems, to be accessed both online, that is, at runtime, of offline."
},
{
"style": "Text",
"text": "The trading bot outputs files on the node it runs on, particularly, in the following location:"
},
{
"style": "Json",
"text": "Data Storage > [Exchange] > [Market] > Masters-Trading > Low-Frequency > Output > [Session] > Concept > Multi-Period-[Daily/Market] > Time Frame"
}
]
}
@@ -0,0 +1,76 @@
{
"topic": "Trading Engine",
"pageNumber": "4",
"type": "Temporal Context - Current and Last",
"definition": {
"text": "Much of the information provided by the trading engine may be accessed for the current instance of the object as well as for the last instance that was open, at any point in time.",
"updated": 1611254206670
},
"paragraphs": [
{
"style": "Text",
"text": "The trading engine hierarchy is organized by context. That is, the main offspring nodes—current, last, and exchange orders—describe the context in which their respective offspring live.",
"updated": 1611254225764
},
{
"style": "Text",
"text": "For example, the concept of an episode—a whole run of the trading bot— exists only in the context of the current episode, as the system keeps track of one episode at the time only."
},
{
"style": "Text",
"text": "However, the concept of a position is tracked both as the current position and the last position. This is possible because the system keeps track of all positions occurring within an episode."
},
{
"style": "Callout",
"text": "Superalgos developers thought it was worth it to provide certain information, positions, for example, in both contexts, as this allows you—visually—and your trading system—using simple syntax—to access information about the current position and the last position at any given point in time."
},
{
"style": "Title",
"text": "Current",
"updated": 1611254496763
},
{
"style": "Include",
"text": "Superalgos->Node->Current->Definition",
"updated": 1611254540559
},
{
"style": "Include",
"text": "Superalgos->Node->Current->Content"
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion",
"updated": 1611255184563
},
{
"style": "Hierarchy",
"text": "Superalgos->Current->2",
"updated": 1611254736085
},
{
"style": "Title",
"text": "Last",
"updated": 1611254547170
},
{
"style": "Include",
"text": "Superalgos->Node->Last->Definition",
"updated": 1611254556715
},
{
"style": "Include",
"text": "Superalgos->Node->Last->Content"
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion",
"updated": 1611255197793
},
{
"style": "Hierarchy",
"text": "Superalgos->Last->2",
"updated": 1611255233693
}
]
}
@@ -0,0 +1,239 @@
{
"topic": "Trading Engine",
"pageNumber": "5",
"type": "Conceptual Context - Episode, Strategy, Position, Strategy Stages",
"definition": {
"text": "Track the properties within each of the major concepts handled by the trading bot, such as episodes, strategies, positions, strategy stages, and exchange orders.",
"updated": 1611256914210
},
"paragraphs": [
{
"style": "Text",
"text": "Episodes, strategies, positions, strategy stages, exchange orders, and other concepts may be seen as different contexts too, although not of the temporal kind.",
"updated": 1611256927199
},
{
"style": "Text",
"text": "For instance, you may want to know what the ROI is in the context of the episode—that is, the ROI after several positions have passed—or the ROI of the current position only."
},
{
"style": "Callout",
"text": "In other words, many properties such as performance metrics—like ROI, or profit loss—or market data—like the begin and end datetimes or any of these concepts—exist in more than one conceptual context."
},
{
"style": "Text",
"text": "The following pages describe each of these major conceptual contexts, which, in turn, may exist in more than one temporal context."
},
{
"style": "Note",
"text": "From the perspective of systems design, each of these concepts is handled as an object that may be open or closed, thus has a lifespan. The same object may be open more than once, but only after the previous instance has been closed.",
"updated": 1611256963378
},
{
"style": "Title",
"text": "Episode",
"updated": 1611257045974
},
{
"style": "Include",
"text": "Superalgos->Node->Episode->Definition",
"updated": 1611257060021
},
{
"style": "Include",
"text": "Superalgos->Node->Episode->Content",
"updated": 1611257063548
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Episode->2",
"updated": 1611257076886
},
{
"style": "Text",
"text": ""
},
{
"style": "Title",
"text": "Strategy",
"updated": 1611257279919
},
{
"style": "Text",
"text": ""
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy->Definition",
"updated": 1611257297317
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy->Content",
"updated": 1611257300492
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Strategy->2",
"updated": 1611257312551
},
{
"style": "Title",
"text": "Position",
"updated": 1611257347308
},
{
"style": "Include",
"text": "Superalgos->Node->Position->Definition",
"updated": 1611257358664
},
{
"style": "Include",
"text": "Superalgos->Node->Position->Content",
"updated": 1611257362447
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Position->2",
"updated": 1611257376163
},
{
"style": "Title",
"text": "Strategy Stages",
"updated": 1611257433526
},
{
"style": "Text",
"text": "The Superalgos Protocol implements a trading framework by which strategies within a trading system are described in stages. The trading bot uses these definitions during runtime.",
"updated": 1611257532139
},
{
"style": "Text",
"text": "The concept of strategy stages in the context of the trading engine is an extension of the original concept, useful to keep track of the activity of the trading bot and organize the information processed during runtime."
},
{
"style": "Text",
"text": "Use these sections of the trading engine if you wish to track exactly what is going on, at a granular level, step by step, from the instant a strategy is triggered until it is closed, with the information segregated by strategy stage."
},
{
"style": "Callout",
"text": "The exercise may be particularly useful to grasp the intricacies of the workings of the trading bot or to research particular behaviors."
},
{
"style": "Subtitle",
"text": "Strategy Trigger Stage",
"updated": 1611257553903
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Trigger Stage->Definition",
"updated": 1611257563170
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Trigger Stage->Content",
"updated": 1611257566539
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Strategy Trigger Stage->2",
"updated": 1611257598667
},
{
"style": "Text",
"text": ""
},
{
"style": "Subtitle",
"text": "Strategy Open Stage",
"updated": 1611257613573
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Open Stage->Definition",
"updated": 1611257617299
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Open Stage->Content",
"updated": 1611257621534
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Strategy Open Stage->3",
"updated": 1611257686884
},
{
"style": "Text",
"text": ""
},
{
"style": "Subtitle",
"text": "Strategy Manage Stage",
"updated": 1611257655850
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Manage Stage->Definition",
"updated": 1611257660113
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Manage Stage->Content",
"updated": 1611257664015
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Strategy Manage Stage->2",
"updated": 1611257866068
},
{
"style": "Subtitle",
"text": "Strategy Close Stage",
"updated": 1611257705432
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Close Stage->Definition",
"updated": 1611257709416
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Close Stage->Content",
"updated": 1611257713254
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Strategy Close Stage->3",
"updated": 1611257720858
}
]
}
@@ -0,0 +1,169 @@
{
"topic": "Trading Engine",
"pageNumber": "6",
"type": "Base Asset and Quoted Asset",
"definition": {
"text": "Keep track of accounts denominated in the base asset and the quoted asset, in multiple contexts. On this page: Episode Base Asset, Episode Quoted Asset, Position Base Asset, Position Quoted Asset, Stage Base Asset, Stage Quoted Asset, Order Base Asset, Order Quoted Asset.",
"updated": 1611258310236
},
"paragraphs": [
{
"style": "Text",
"text": "Because the system aims to be as flexible as possible, the trading engine keeps the accounts relative to both the base asset and the quoted asset. This allows the user to set up the trading system with whatever logic is required and decide which set of accounts suits the intent—the goal—of the trading strategy.",
"updated": 1611258333516
},
{
"style": "Callout",
"text": "Notice that—usually—the accounts denominated in one asset will be valid, while the accounts denominated in the other asset will likely make no sense."
},
{
"style": "Text",
"text": "Which set of accounts you will monitor to track the performance of the episode depends on how you define your trading system."
},
{
"style": "Text",
"text": "For example, If you are trading the BTC/USDT market and developed a trading system to accumulate USDT, then the set of accounts that will make sense for you is the one denominated in the quoted asset, that is, in USDT. This is why:"
},
{
"style": "Text",
"text": "Your strategy will likely buy BTC (the base asset) expecting the price to go up while the position is open, in order to sell BTC at a higher rate and end up with more USDT (the quoted asset) than you started with."
},
{
"style": "Title",
"text": "Example",
"updated": 1611258412121
},
{
"style": "Text",
"text": "Let’s say you buy 10,000 USDT worth of BTC. BTC price increases by 10%, so you sell the whole amount of BTC to close the position and end up with 10,900 USDT (exchange fees are deducted from the balance)."
},
{
"style": "Text",
"text": "In terms of the base asset, your begin balance is 0 BTC and your end balance is 0.00000012 BTC, as the exchange left some BTC dust in the account due to rate conversion limitations. Also in terms of the base asset, your profit loss for the position is...",
"updated": 1611258453118
},
{
"style": "Text",
"text": ""
},
{
"style": "Json",
"text": "0.00000012 BTC - 0 BTC = 0.00000012 BTC",
"updated": 1611258465358
},
{
"style": "Text",
"text": "ROI and other metrics may be derived from these initial observations as well. Needless to say, such metrics are irrelevant to the intent of the strategy, which is to accumulate USDT."
},
{
"style": "Text",
"text": "Now, in terms of the base asset, your begin balance is 10,000 USDT and your end balance is 10,900 USDT (exchange fees are deducted from the balance). Also in terms of the quoted asset, your profit loss for the position is...",
"updated": 1611258484205
},
{
"style": "Json",
"text": "10,900 USDT - 10,000 USDT = 900 USDT"
},
{
"style": "Text",
"text": "It should be clear by now that these are the metrics relevant to the intent of the strategy."
},
{
"style": "Note",
"text": "With other types of strategies, for example, those in which the intent is to accumulate both assets, both sets of metrics may be relevant. Also, the consolidated metrics provided in the context of statistics may be relevant too.",
"updated": 1611258499505
},
{
"style": "Text",
"text": "The concepts relative to base and quoted asset, such as the balance of each asset and the performance metrics computed from the perspective of each asset, are tracked in multiple contexts simultaneously."
},
{
"style": "Text",
"text": "What follows are the definitions of the base and quoted asset in each of the contexts that the concepts are tracked."
},
{
"style": "Title",
"text": "Episode Base Asset",
"updated": 1611258577948
},
{
"style": "Include",
"text": "Superalgos->Node->Episode Base Asset->Definition",
"updated": 1611258580907
},
{
"style": "Title",
"text": "Episode Quoted Asset",
"updated": 1611258588997
},
{
"style": "Include",
"text": "Superalgos->Node->Episode Quoted Asset->Definition",
"updated": 1611258592849
},
{
"style": "Title",
"text": "Position Base Asset",
"updated": 1611258602952
},
{
"style": "Include",
"text": "Superalgos->Node->Position Base Asset->Definition",
"updated": 1611258605932
},
{
"style": "Title",
"text": "Position Quoted Asset",
"updated": 1611258616805
},
{
"style": "Include",
"text": "Superalgos->Node->Position Quoted Asset->Definition",
"updated": 1611258619810
},
{
"style": "Title",
"text": "Stage Base Asset",
"updated": 1611258630368
},
{
"style": "Include",
"text": "Superalgos->Node->Stage Base Asset->Definition",
"updated": 1611258633312
},
{
"style": "Title",
"text": "Stage Quoted Asset",
"updated": 1611258644044
},
{
"style": "Include",
"text": "Superalgos->Node->Stage Quoted Asset->Definition",
"updated": 1611258647352
},
{
"style": "Title",
"text": "Order Base Asset",
"updated": 1611258657391
},
{
"style": "Include",
"text": "Superalgos->Node->Order Base Asset->Definition",
"updated": 1611258660759
},
{
"style": "Title",
"text": "Order Quoted Asset",
"updated": 1611258669352
},
{
"style": "Include",
"text": "Superalgos->Node->Order Quoted Asset->Definition",
"updated": 1611258672239
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,171 @@
{
"topic": "Trading Engine",
"pageNumber": "7",
"type": "Counters",
"definition": {
"text": "Keep track of how many instances of certain objects have existed in a given context. On this page: Periods, Strategies, Positions, Orders, and Days.",
"updated": 1611259332958
},
"paragraphs": [
{
"style": "Text",
"text": "A counter keeps track of how many instances of certain objects have come to exist—or have taken a certain value—during the duration of a certain context.",
"updated": 1611259349617
},
{
"style": "Text",
"text": "For example, how many positions have been open during an episode, or how many of those positions have been hits."
},
{
"style": "Text",
"text": "Counters are kept in multiple contexts simultaneously. In particular, you will find episode counters, strategy counters, position counters, and order counters."
},
{
"style": "Text",
"text": ""
},
{
"style": "Title",
"text": "Counter-specific Nodes"
},
{
"style": "Subtitle",
"text": "Periods",
"updated": 1611259406618
},
{
"style": "Include",
"text": "Superalgos->Node->Periods->Definition",
"updated": 1611259409668
},
{
"style": "Subtitle",
"text": "Strategies",
"updated": 1611259416144
},
{
"style": "Include",
"text": "Superalgos->Node->Strategies->Definition",
"updated": 1611259419177
},
{
"style": "Subtitle",
"text": "Positions",
"updated": 1611259428759
},
{
"style": "Include",
"text": "Superalgos->Node->Positions->Definition",
"updated": 1611259431976
},
{
"style": "Subtitle",
"text": "Orders",
"updated": 1611259442020
},
{
"style": "Include",
"text": "Superalgos->Node->Orders->Definition",
"updated": 1611259444724
},
{
"style": "Subtitle",
"text": "Days",
"updated": 1611259453496
},
{
"style": "Include",
"text": "Superalgos->Node->Days->Definition",
"updated": 1611259459728
},
{
"style": "Include",
"text": "Superalgos->Node->Days->Content",
"updated": 1611259823914
},
{
"style": "Text",
"text": ""
},
{
"style": "Note",
"text": "Other properties typical to counters are defined elsewhere, as they are not specific to counters. Find below the different contexts in which counters are found.",
"updated": 1611259860203
},
{
"style": "Title",
"text": "Episode Counters",
"updated": 1611260075956
},
{
"style": "Include",
"text": "Superalgos->Node->Episode Counters->Definition",
"updated": 1611260079244
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Episode Counters->2",
"updated": 1611260082549
},
{
"style": "Title",
"text": "Strategy Counters"
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Counters->Definition",
"updated": 1611259923717
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Strategy Counters->2",
"updated": 1611259927606
},
{
"style": "Title",
"text": "Position Counters",
"updated": 1611259936812
},
{
"style": "Include",
"text": "Superalgos->Node->Position Counters->Definition",
"updated": 1611259939595
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Position Counters->2",
"updated": 1611259944892
},
{
"style": "Title",
"text": "Order Counters",
"updated": 1611259959379
},
{
"style": "Include",
"text": "Superalgos->Node->Order Counters->Definition",
"updated": 1611259963832
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Order Counters->2",
"updated": 1611259967561
}
]
}
@@ -0,0 +1,77 @@
{
"topic": "Trading Engine",
"pageNumber": "8",
"type": "Statistics",
"definition": {
"text": "Track popular statistics consolidating both the base asset and the quoted asset. On this page: Episode Statistics, Position Statistics, and Order Statistics.",
"updated": 1611260196449
},
"paragraphs": [
{
"style": "Text",
"text": "Statistics are accounts and performance metrics calculated by consolidating the base asset and the quoted asset, that is, taking both assets into account.",
"updated": 1611260210428
},
{
"style": "Text",
"text": "The mechanics of how both assets are consolidated and how the consolidation affects the calculations are explained in the definitions of each of the concepts."
},
{
"style": "Title",
"text": "Episode Statistics",
"updated": 1611260256691
},
{
"style": "Include",
"text": "Superalgos->Node->Episode Statistics->Definition",
"updated": 1611260259469
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Episode Statistics->2",
"updated": 1611260262273
},
{
"style": "Title",
"text": "Position Statistics",
"updated": 1611260273697
},
{
"style": "Include",
"text": "Superalgos->Node->Position Statistics->Definition",
"updated": 1611260277415
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Position Statistics->2",
"updated": 1611260280519
},
{
"style": "Title",
"text": "Order Statistics",
"updated": 1611260292859
},
{
"style": "Include",
"text": "Superalgos->Node->Order Statistics->Definition",
"updated": 1611260295959
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Order Statistics->2",
"updated": 1611260299229
}
]
}
@@ -0,0 +1,30 @@
{
"topic": "Trading Engine",
"pageNumber": "9",
"type": "Distance to Events",
"definition": {
"text": "Track the number of periods that have passed since the last occurrence of each type of event. On this page: Trigger On, Trigger Off, Take Position, Close Position, Next Phase, Move to Phase, Create Order, Cancel Order, Close Order.",
"updated": 1611327154424
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Distance To Event->Definition",
"updated": 1611327304404
},
{
"style": "Include",
"text": "Superalgos->Node->Distance To Event->Content",
"updated": 1611327325113
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Distance To Event->2",
"updated": 1611327347651
}
]
}
@@ -0,0 +1,69 @@
{
"topic": "Trading Engine",
"pageNumber": "10",
"type": "Balances",
"definition": {
"text": "Keep track of the balances of each asset, at different points in time. On this page: Balance, Begin Balance, and End Balance.",
"updated": 1611331647405
},
"paragraphs": [
{
"style": "Text",
"text": "Balances are the basis of the account-keeping features, by which you may know exactly how much of each asset there is on the account at any given point in time.",
"updated": 1611331659066
},
{
"style": "Text",
"text": "The system keeps track of balances in multiple contexts, but also saves snapshots of what the balance was at key moments in time, so that such information may be available both to study the results of operations, and so that it may be used form within trading strategies."
},
{
"style": "Callout",
"text": "It is important to understand that balances are an internal concept managed by the trading engine, and are calculated based on the information processed by the trading bot. Balances do not necessarily reflect the actual amount of assets at the exchange."
},
{
"style": "Title",
"text": "Balance",
"updated": 1611331710709
},
{
"style": "Include",
"text": "Superalgos->Node->Balance->Definition",
"updated": 1611331715062
},
{
"style": "Include",
"text": "Superalgos->Node->Balance->Content",
"updated": 1611331718713
},
{
"style": "Title",
"text": "Begin Balance",
"updated": 1611331731595
},
{
"style": "Include",
"text": "Superalgos->Node->Begin Balance->Definition",
"updated": 1611331735070
},
{
"style": "Include",
"text": "Superalgos->Node->Begin Balance->Content",
"updated": 1611331738675
},
{
"style": "Title",
"text": "End Balance",
"updated": 1611331749501
},
{
"style": "Include",
"text": "Superalgos->Node->End Balance->Definition",
"updated": 1611331752868
},
{
"style": "Include",
"text": "Superalgos->Node->End Balance->Content",
"updated": 1611331756749
}
]
}
@@ -0,0 +1,101 @@
{
"topic": "Trading Engine",
"pageNumber": "11",
"type": "Common Metrics - Hits, Fails, Hit Ratio, Profit Loss, ROI, Annualized Rate of Return",
"definition": {
"text": "These metrics are available in different contexts, for instance, at the level of the Episode, the Position or the Position, and both for the base and quoted assets.",
"updated": 1611333971023
},
"paragraphs": [
{
"style": "Title",
"text": "Hits",
"updated": 1611331909747
},
{
"style": "Include",
"text": "Superalgos->Node->Hits->Definition",
"updated": 1611331919409
},
{
"style": "Include",
"text": "Superalgos->Node->Hits->Content",
"updated": 1611331922558
},
{
"style": "Title",
"text": "Fails",
"updated": 1611331934877
},
{
"style": "Include",
"text": "Superalgos->Node->Fails->Definition",
"updated": 1611331939264
},
{
"style": "Include",
"text": "Superalgos->Node->Fails->Content",
"updated": 1611331942803
},
{
"style": "Title",
"text": "Hit Ratio",
"updated": 1611331974360
},
{
"style": "Include",
"text": "Superalgos->Node->Hit Ratio->Definition",
"updated": 1611331977537
},
{
"style": "Include",
"text": "Superalgos->Node->Hit Ratio->Content",
"updated": 1611331980968
},
{
"style": "Title",
"text": "Profit Loss",
"updated": 1611332640555
},
{
"style": "Include",
"text": "Superalgos->Node->Profit Loss->Definition",
"updated": 1611332643604
},
{
"style": "Include",
"text": "Superalgos->Node->Profit Loss->Content",
"updated": 1611332647277
},
{
"style": "Title",
"text": "ROI",
"updated": 1611332671387
},
{
"style": "Include",
"text": "Superalgos->Node->ROI->Definition",
"updated": 1611332674792
},
{
"style": "Include",
"text": "Superalgos->Node->ROI->Content",
"updated": 1611332677943
},
{
"style": "Title",
"text": "Annualized Rate Of Return",
"updated": 1611332963859
},
{
"style": "Include",
"text": "Superalgos->Node->Annualized Rate Of Return->Definition",
"updated": 1611332970973
},
{
"style": "Include",
"text": "Superalgos->Node->Annualized Rate Of Return->Content",
"updated": 1611332975434
}
]
}
@@ -0,0 +1,71 @@
{
"topic": "Trading Engine",
"pageNumber": "12",
"type": "Accounts Specific to the Open and Close Stages",
"definition": {
"text": "Learn about accounts specific to the context of the open and close stages. On this page: Target Size, Size Placed, Size Filled, and Fees Paid.",
"updated": 1611335734722
},
"paragraphs": [
{
"style": "Title",
"text": "Target Size",
"updated": 1611335751425
},
{
"style": "Include",
"text": "Superalgos->Node->Target Size->Definition",
"updated": 1611335756518
},
{
"style": "Include",
"text": "Superalgos->Node->Target Size->Content",
"updated": 1611335759648
},
{
"style": "Title",
"text": "Size Placed",
"updated": 1611335767899
},
{
"style": "Include",
"text": "Superalgos->Node->Size Placed->Definition",
"updated": 1611335798845
},
{
"style": "Include",
"text": "Superalgos->Node->Size Placed->Content",
"updated": 1611335806225
},
{
"style": "Title",
"text": "Size Filled",
"updated": 1611335816288
},
{
"style": "Include",
"text": "Superalgos->Node->Size Filled->Definition",
"updated": 1611335820275
},
{
"style": "Include",
"text": "Superalgos->Node->Size Filled->Content",
"updated": 1611335823030
},
{
"style": "Title",
"text": "Fees Paid",
"updated": 1611335839409
},
{
"style": "Include",
"text": "Superalgos->Node->Fees Paid->Definition",
"updated": 1611335846433
},
{
"style": "Include",
"text": "Superalgos->Node->Fees Paid->Content",
"updated": 1611335849981
}
]
}
@@ -0,0 +1,101 @@
{
"topic": "Trading Engine",
"pageNumber": "13",
"type": "Accounts Specific to Orders",
"definition": {
"text": "Learn about accounts specific to the context of orders. On this page: Rate, Actual Rate, Size, Percentage Filled, Fees Paid, and Lock.",
"updated": 1611336548381
},
"paragraphs": [
{
"style": "Title",
"text": "Rate",
"updated": 1611336589519
},
{
"style": "Include",
"text": "Superalgos->Node->Rate->Definition",
"updated": 1611336592312
},
{
"style": "Include",
"text": "Superalgos->Node->Rate->Content",
"updated": 1611336595025
},
{
"style": "Title",
"text": "Actual Rate",
"updated": 1611336604269
},
{
"style": "Include",
"text": "Superalgos->Node->Actual Rate->Definition",
"updated": 1611336607169
},
{
"style": "Include",
"text": "Superalgos->Node->Actual Rate->Content",
"updated": 1611336610243
},
{
"style": "Title",
"text": "Size",
"updated": 1611336619074
},
{
"style": "Include",
"text": "Superalgos->Node->Size->Definition",
"updated": 1611336621768
},
{
"style": "Include",
"text": "Superalgos->Node->Size->Content",
"updated": 1611336624678
},
{
"style": "Title",
"text": "Percentage Filled",
"updated": 1611336634683
},
{
"style": "Include",
"text": "Superalgos->Node->Percentage Filled->Definition",
"updated": 1611336637426
},
{
"style": "Include",
"text": "Superalgos->Node->Percentage Filled->Content",
"updated": 1611336641053
},
{
"style": "Title",
"text": "Fees Paid",
"updated": 1611336663062
},
{
"style": "Include",
"text": "Superalgos->Node->Fees Paid->Definition",
"updated": 1611336665926
},
{
"style": "Include",
"text": "Superalgos->Node->Fees Paid->Content",
"updated": 1611336669591
},
{
"style": "Title",
"text": "Lock",
"updated": 1611336682293
},
{
"style": "Include",
"text": "Superalgos->Node->Lock->Definition",
"updated": 1611336685521
},
{
"style": "Include",
"text": "Superalgos->Node->Lock->Content",
"updated": 1611336688288
}
]
}
@@ -0,0 +1,98 @@
{
"topic": "Trading Engine",
"pageNumber": "14",
"type": "Market Data",
"definition": {
"text": "Write a summary for this topic page."
},
"paragraphs": [
{
"style": "Title",
"text": "Begin",
"updated": 1611336944906
},
{
"style": "Include",
"text": "Superalgos->Node->Begin->Definition",
"updated": 1611336947757
},
{
"style": "Include",
"text": "Superalgos->Node->Begin->Content",
"updated": 1611336952843
},
{
"style": "Title",
"text": "End",
"updated": 1611336959587
},
{
"style": "Include",
"text": "Superalgos->Node->End->Definition",
"updated": 1611336962371
},
{
"style": "Include",
"text": "Superalgos->Node->End->Content",
"updated": 1611336966142
},
{
"style": "Title",
"text": "Begin Rate",
"updated": 1611336976107
},
{
"style": "Include",
"text": "Superalgos->Node->Begin Rate->Definition",
"updated": 1611336978830
},
{
"style": "Include",
"text": "Superalgos->Node->Begin Rate->Content",
"updated": 1611336981597
},
{
"style": "Title",
"text": "End Rate",
"updated": 1611336991778
},
{
"style": "Include",
"text": "Superalgos->Node->End Rate->Definition",
"updated": 1611336994931
},
{
"style": "Include",
"text": "Superalgos->Node->End Rate->Content",
"updated": 1611336998261
},
{
"style": "Title",
"text": "Candle",
"updated": 1611337007474
},
{
"style": "Text",
"text": ""
},
{
"style": "Include",
"text": "Superalgos->Node->Candle->Definition",
"updated": 1611337017053
},
{
"style": "Include",
"text": "Superalgos->Node->Candle->Content",
"updated": 1611337019761
},
{
"style": "Include",
"text": "Superalgos->Concept->Reusable Snippets->Note for Hierarchy Tables No Discussion"
},
{
"style": "Hierarchy",
"text": "Superalgos->Candle->2",
"updated": 1611337398702
}
]
}
@@ -0,0 +1,161 @@
{
"topic": "Trading Engine",
"pageNumber": "15",
"type": "Identity and Status",
"definition": {
"text": "Keep track of information related to the identity or status of the particular object, in the corresponding context. On this page: Index, Serial Number, Identifier, Exchange Id, Status, Exit Type, Situation Name, Situation Name, Algorithm Name, and Algorithm Name.",
"updated": 1611337690744
},
"paragraphs": [
{
"style": "Text",
"text": "This page compiles nodes common to many different contexts and which have a relationship with the identity, status, or similar properties of the object.",
"updated": 1611337706400
},
{
"style": "Title",
"text": "Index",
"updated": 1611338005986
},
{
"style": "Include",
"text": "Superalgos->Node->Index->Definition",
"updated": 1611338008928
},
{
"style": "Include",
"text": "Superalgos->Node->Index->Content",
"updated": 1611338011615
},
{
"style": "Title",
"text": "Serial Number",
"updated": 1611338019622
},
{
"style": "Include",
"text": "Superalgos->Node->Serial Number->Definition",
"updated": 1611338022203
},
{
"style": "Include",
"text": "Superalgos->Node->Serial Number->Content",
"updated": 1611338024711
},
{
"style": "Title",
"text": "Identifier",
"updated": 1611338034234
},
{
"style": "Include",
"text": "Superalgos->Node->Identifier->Definition",
"updated": 1611338037288
},
{
"style": "Include",
"text": "Superalgos->Node->Identifier->Content",
"updated": 1611338041111
},
{
"style": "Title",
"text": "Exchange Id",
"updated": 1611338051756
},
{
"style": "Include",
"text": "Superalgos->Node->Exchange Id->Definition",
"updated": 1611338054763
},
{
"style": "Include",
"text": "Superalgos->Node->Exchange Id->Content",
"updated": 1611338057839
},
{
"style": "Title",
"text": "Status",
"updated": 1611338066340
},
{
"style": "Include",
"text": "Superalgos->Node->Status->Definition",
"updated": 1611338069198
},
{
"style": "Include",
"text": "Superalgos->Node->Status->Content",
"updated": 1611338075010
},
{
"style": "Title",
"text": "Exit Type",
"updated": 1611338088984
},
{
"style": "Include",
"text": "Superalgos->Node->Exit Type->Definition",
"updated": 1611338091878
},
{
"style": "Include",
"text": "Superalgos->Node->Exit Type->Content",
"updated": 1611338095878
},
{
"style": "Title",
"text": "Situation Name",
"updated": 1611338259000
},
{
"style": "Include",
"text": "Superalgos->Node->Situation Name->Definition",
"updated": 1611338261763
},
{
"style": "Include",
"text": "Superalgos->Node->Situation Name->Content",
"updated": 1611338265343
},
{
"style": "Title",
"text": "Strategy Name",
"updated": 1611338279553
},
{
"style": "Include",
"text": "Superalgos->Node->Strategy Name->Definition",
"updated": 1611338282513
},
{
"style": "Title",
"text": "Algorithm Name",
"updated": 1611338404013
},
{
"style": "Include",
"text": "Superalgos->Node->Algorithm Name->Definition",
"updated": 1611338523928
},
{
"style": "Include",
"text": "Superalgos->Node->Algorithm Name->Content",
"updated": 1611338526964
},
{
"style": "Title",
"text": "Order Name",
"updated": 1611338535849
},
{
"style": "Include",
"text": "Superalgos->Node->Order Name->Definition",
"updated": 1611338538713
},
{
"style": "Include",
"text": "Superalgos->Node->Order Name->Content",
"updated": 1611338541890
}
]
}
@@ -0,0 +1,57 @@
{
"topic": "Trading Farms",
"pageNumber": "1",
"type": "Trading Farms Fundamental Concepts",
"definition": {
"text": "How to set up a flexible and scalable crypto-trading farm running Superalgos distributed on multiple machines.",
"updated": 1611343209935
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos is designed for coordinated, flexible, and scalable trading operations.",
"updated": 1611343220386
},
{
"style": "Text",
"text": "In its current version, the system may be deployed in multiple machines—as many as desired—and each machine may constitute a node in a network of nodes. In fact, different networks of nodes may live within the same computer network."
},
{
"style": "Callout",
"text": "Each node on a network may specialize in a single type of process or handle multiple processes of different types."
},
{
"style": "Text",
"text": "For example, you may have a set of nodes running data mining operations extracting data from multiple markets and multiple exchanges. You may have a set of nodes specializing in processing indicators and technical studies. And you may have a set of nodes specializing in running trading sessions."
},
{
"style": "Text",
"text": "You may also use different criteria to arrange the network. For example, you may have a node running combined data mining, data processing, and trading operations on a single exchange or market, and other nodes running similar combined operations on other exchanges or markets."
},
{
"style": "Text",
"text": "Or you may have a network of nodes for your testing environment and another network of nodes for your production environment."
},
{
"style": "Callout",
"text": "In other words, the system allows building any arrangement of networks of nodes responding to the organizational logic of your preference."
},
{
"style": "Text",
"text": "What is unique about Superalgos is that the system keeps track of the network arrangements you create and makes sure that all components and data structures in the system can seamlessly track dependencies across the network. This means, for example, that trading sessions running on Node X may access data in Node Y and Node Z without requiring any sort of configuration."
},
{
"style": "Callout",
"text": "On top of that, the operation may be managed entirely from any node on the network. In fact, it may be managed from a computer in the network not running Superalgos, by pointing the browser to any of the nodes in the network to run the frontend."
},
{
"style": "Text",
"text": "The following explanations assume that you are familiar with the basic workings of Superalgos, and in particular, of the Network hierarchy. If that is not the case, then please read the Network pages before diving into building a trading farm."
},
{
"style": "Warning",
"text": "At this stage, Superalgos does not implement any form of security measures, therefore, the system is to be used in the context of a restricted Local Area Network only.",
"updated": 1611343257268
}
]
}
@@ -0,0 +1,129 @@
{
"topic": "Trading Farms",
"pageNumber": "2",
"type": "Set Up a Network of Nodes",
"definition": {
"text": "Install Superalgos on each machine, to then create and set up a network node for each machine.",
"updated": 1611343340124
},
"paragraphs": [
{
"style": "Text",
"text": "This page does not go through the process of setting up a computer network. Instead, it assumes the network is already set up. So, do verify the local area network setup and make sure your computer network is functioning properly before starting.",
"updated": 1611343358129
},
{
"style": "Text",
"text": "In a network of nodes, each node has it’s own web server, web sockets server, and task server."
},
{
"style": "Note",
"text": "The default web server and web sockets ports used by Superalgos are 34248 and 18041 respectively. If you wish to change these defaults, you must modify the.env file on the root folder, and also \\TaskServer\\.env.",
"updated": 1611343376974
},
{
"style": "Title",
"text": "Before You Begin"
},
{
"style": "Text",
"text": "Make a quick list with the name you wish to give to each node and the corresponding IP address on the network. You will need those to configure each network node."
},
{
"style": "Text",
"text": "Also, you may want to plan what your operation should look like."
},
{
"style": "Callout",
"text": "First and foremost, you may want to decide on which node you will keep the workspace on which the network of nodes shall be configured. We call this, the home node."
},
{
"style": "Text",
"text": "This is not a requirement, as you may keep different workspaces in different nodes, and even set up different networks on different workspaces, but it’s the most usual setup."
},
{
"style": "Text",
"text": "Also, you may want to plan which nodes in the network should run which data-mining tasks, which nodes should run which trading sessions, and so on. As hinted in the fundamental concepts page, possibilities are endless, so we are not going to cover alternatives here. If you know exactly what you want to do, it should be easy to implement. That said, you are free to explore and experiment as well."
},
{
"style": "Title",
"text": "Start Here"
},
{
"style": "Text",
"text": "1. Set up Superalgos on each machine. Once Superalgos is installed, run the system for the first time using the node run noBrowser command. The noBrowser parameter runs the backend without firing up the frontend."
},
{
"style": "Success",
"text": "On computers with 8 GB of RAM or less, such as minicomputers or single-board computers like the Raspberry Pi, use node run noBrowser minMemo to run the app. minMemo sets up the system to run with minimal RAM requirements.",
"updated": 1611343440835
},
{
"style": "Text",
"text": "Leave the machine online, with the backend running."
},
{
"style": "Text",
"text": "2. Run the frontend to access the home node."
},
{
"style": "Text",
"text": "You may access the home node locally, that is, running the browser on the machine where the home node is running, or you may run the browser on any other machine in the physical network—even one not running Superalgos—by navigating to the home node’s IP address."
},
{
"style": "Note",
"text": "If you are accessing the home node remotely, you need to configure the My Computer network node to use the machine’s IP address instead of localhost in the host parameter. This enables the web sockets connection.",
"updated": 1611343511090
},
{
"style": "Success",
"text": "For organizational purposes and to avoid confusion later on, it is recommended to clean up the home node’s workspace uninstalling the markets that you don’t need.",
"updated": 1611343505445
},
{
"style": "Text",
"text": "Click to learn how to uninstall an existing market"
},
{
"style": "Text",
"text": "3. Add and configure a network node for each machine."
},
{
"style": "Subtitle",
"text": "Adding a Network Node"
},
{
"style": "Text",
"text": "To add a network node, select Add Network Node on the Superalgos Network node menu. A network node is added along with the basic structure of nodes to set up a node."
},
{
"style": "Subtitle",
"text": "Configuring the Network Node"
},
{
"style": "Text",
"text": "Select Configure on the menu to access the configuration."
},
{
"style": "Javascript",
"text": "{\n\"host\": \"localhost\",\n\"webPort\": \"34248\",\n\"webSocketsPort\": \"18041\"\n}",
"updated": 1611344373383
},
{
"style": "List",
"text": "host is the machine or hardware represented by the network node. The default parameter is localhost, but if you intend to access the backend services of this node from a remote computer, then you must change localhost for the IP Address of the machine on which the node is running, for example, to 147.0.0.1."
},
{
"style": "List",
"text": "webPort is the port used by the Web Server, at this stage 34248."
},
{
"style": "List",
"text": "webSocketsPort is the port used by the system to communicate over the local area network, by default set at 18041."
},
{
"style": "Text",
"text": "Configure the first node and hit F5 to refresh the page. Once the page reloads, a notice indicating the system is connecting with the new network node will show on the top of the screen. Repeat the process for each machine."
}
]
}
@@ -0,0 +1,25 @@
{
"topic": "Trading Farms",
"pageNumber": "3",
"type": "Set Up Each Node on the Network",
"definition": {
"text": "Install the markets you wish to work with and remove the tasks where you don't need them.",
"updated": 1611344470552
},
"paragraphs": [
{
"style": "Text",
"text": "When you install a market, several structures of nodes are created on each of the main sections of the network hierarchy for all nodes defined on the network: data storage, data mining, testing environment, and production environment, as well as the corresponding time machines in the charting space.",
"updated": 1611344492853
},
{
"style": "Text",
"text": "In other words, the process of installing a new market replicates all data structures in all nodes."
},
{
"style": "Success",
"text": "You will most likely want to delete the tasks that you don’t need on certain nodes, and keep only those that you wish each node to handle.",
"updated": 1611344498395
}
]
}
Loaded 100 of 217 files, more files were not shown because too many files have changed in this diff. Show more