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

This commit is contained in:
9808us committed 2021-05-30 13:49:40 +02:00
commit d978df049e
104 files changed
+1301 -871

No files matched your search

+1 -1
View File
@@ -1112,7 +1112,7 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
let fs = require('fs')
try {
let filePath = global.env.PATH_TO_DEFAULT_WORKSPACE + '/Getting-Started.json'
let filePath = global.env.PATH_TO_DEFAULT_WORKSPACE + '/Getting-Started-Tutorials.json'
fs.readFile(filePath, onFileRead)
} catch (e) {
console.log('[ERROR] Error reading the Workspace.', e)
@@ -0,0 +1,27 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="146.564" height="348.799" transform="matrix(0.83147 0.55557 0 1 73 13)" fill="#9BAAAB"/>
<rect width="146.564" height="348.799" transform="matrix(0.83147 0.55557 0 1 316.137 13)" fill="#9BAAAB"/>
<rect width="146.564" height="348.799" transform="matrix(-0.83147 0.55557 0 1 316.432 13)" fill="#CDD4D5"/>
<path d="M103.5 89L149.5 184" stroke="#F0353D" stroke-width="28"/>
<path d="M160.5 115L88 160" stroke="#F0353D" stroke-width="28"/>
<path d="M118 182.5C84.4995 288 224.5 486 258 212.5C299.5 57.4994 459.5 198.5 388.5 337.5" stroke="#F0353D" stroke-width="13" stroke-dasharray="10 10"/>
<path d="M418.214 495.077C462.222 488.792 496 451.016 496 405.35C496 359.355 461.766 321.365 417.303 315.484C410.517 271.171 367.066 237 314.5 237C261.934 237 218.483 271.171 211.697 315.484C167.234 321.365 133 359.355 133 405.35C133 451.016 166.778 488.792 210.786 495.077V496H418.214V495.077Z" fill="#365558"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M315 496H418.214V495.077C462.222 488.791 496 451.016 496 405.35C496 359.355 461.766 321.365 417.303 315.484C410.538 271.311 367.341 237.217 315 237.001V496Z" fill="#0295AA"/>
<path d="M265.938 439.906H228.953L221.922 461H199.492L237.602 358.625H257.148L295.469 461H273.039L265.938 439.906ZM234.648 422.82H260.242L247.375 384.5L234.648 422.82ZM326.125 424.93V461H305.031V358.625H344.969C352.656 358.625 359.406 360.031 365.219 362.844C371.078 365.656 375.578 369.664 378.719 374.867C381.859 380.023 383.43 385.906 383.43 392.516C383.43 402.547 379.984 410.469 373.094 416.281C366.25 422.047 356.758 424.93 344.617 424.93H326.125ZM326.125 407.844H344.969C350.547 407.844 354.789 406.531 357.695 403.906C360.648 401.281 362.125 397.531 362.125 392.656C362.125 387.641 360.648 383.586 357.695 380.492C354.742 377.398 350.664 375.805 345.461 375.711H326.125V407.844ZM420.414 461H399.32V358.625H420.414V461Z" fill="#E6EAEA"/>
<path d="M30.9668 171.493H20.9668V181.493V210.45H12V220.45V254.537V264.537H20.9668V293.493V303.493H30.9668H119.339H124.603L127.582 299.154L144.668 274.276H174.436H184.436V264.276V255.609H194H204V245.609V229.377V219.377H194H184.436V210.711V200.711H174.436H144.668L127.582 175.832L124.603 171.493H119.339H30.9668Z" fill="#365558" stroke="#2E2E2E" stroke-width="20"/>
<rect width="15" height="34" transform="matrix(-1 0 0 1 37 220.493)" fill="#9BAAAB"/>
<path d="M31 181.493H119.7L139 209.493V237.493V265.493L119.7 293.493H31V181.493Z" fill="#4ACFD9"/>
<rect x="139" y="210.493" width="35" height="15" fill="#FD6A33"/>
<rect x="139" y="229.493" width="55" height="16" fill="#FD6A33"/>
<rect x="139" y="249.493" width="35" height="15" fill="#FD6A33"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M30.9668 237.247V293.494H119.339L138.569 265.37V237.247L30.9668 237.247Z" fill="#0295AA"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M120 293.493H120.335L139.564 265.37V237.246V209.123L120.335 181H120V293.493Z" fill="#365558"/>
<path d="M480.033 171.493H490.033V181.493V210.45H499V220.45V254.537V264.537H490.033V293.493V303.493H480.033H391.661H386.397L383.418 299.154L366.332 274.276H336.564H326.564V264.276V255.609H317H307V245.609V229.377V219.377H317H326.564V210.711V200.711H336.564H366.332L383.418 175.832L386.397 171.493H391.661H480.033Z" fill="#365558" stroke="#2E2E2E" stroke-width="20"/>
<rect x="474" y="220.493" width="15" height="34" fill="#9BAAAB"/>
<path d="M480 181.493H391.3L372 209.493V237.493V265.493L391.3 293.493H480V181.493Z" fill="#4ACFD9"/>
<rect width="35" height="15" transform="matrix(-1 0 0 1 372 210.493)" fill="#FD6A33"/>
<rect width="55" height="16" transform="matrix(-1 0 0 1 372 229.493)" fill="#FD6A33"/>
<rect width="35" height="15" transform="matrix(-1 0 0 1 372 249.493)" fill="#FD6A33"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M480.033 237.247V293.494H391.661L372.431 265.37V237.247H480.033Z" fill="#0295AA"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M391 293.493H390.665L371.436 265.37V237.246V209.123L390.665 181H391V293.493Z" fill="#365558"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -1 +1 @@
{"type":"API Map","name":"Messari","config":"{\n \"codeName\": \"Messari\",\n \"protocol\": \"https\",\n \"hostName\": \"data.messari.io\",\n \"portNumber\": \"\",\n \"path\": \"api\",\n \"millisecondsBetweenCalls\": 4000\n}","project":"Superalgos","apiVersions":[{"type":"API Version","name":"Version 1","config":"{\n \"codeName\": \"v1\"\n}","project":"Superalgos","apiEndpoints":[{"type":"API Endpoint","name":"Get All News","config":"{\n \"codeName\": \"news\"\n}","project":"Superalgos","apiQueryParameters":{"type":"API Query Parameters","name":"New API Query Parameters","config":"{\n \"codeName\": \"\"\n}","project":"Superalgos","apiQueryParameters":[{"type":"API Query Parameter","name":"Page","config":"{\n \"codeName\": \"page\",\n \"isString\": false,\n \"isOptional\": false,\n \"description\": \"Page number, starts at 1. Increment to paginate through results (until result is empty array)\",\n \"isPageNumber\": true\n}","project":"Superalgos","id":"754e2724-36bc-4e4e-94cf-bfba88dadd3b","savedPayload":{"position":{"x":14018.222252113279,"y":10179.489044198583},"targetPosition":{"x":14308,"y":10257.134757729338},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},{"type":"API Query Parameter","name":"Fields","config":"{\n \"codeName\": \"fields\",\n \"isString\": true,\n \"isOptional\": true,\n \"description\": \"pare down the returned fields (comma , separated, drill down with a slash /)\"\n}","project":"Superalgos","id":"3199c37c-5ecc-47fd-8868-eddaa15fdc59","savedPayload":{"position":{"x":14158,"y":9997.327136594007},"targetPosition":{"x":14308,"y":10257.134757729338},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},{"type":"API Query Parameter","name":"As Markdown","config":"{\n \"codeName\": \"as-markdown\",\n \"isString\": false,\n \"isOptional\": true,\n \"description\": \"formatting (other than HTML links) is hidden. Use this query param to return content with markdown syntax\"\n}","project":"Superalgos","id":"fa87b1ad-2d0f-4462-85fb-524630e9db7a","savedPayload":{"position":{"x":14385.645713530756,"y":9967.357009842617},"targetPosition":{"x":14308,"y":10257.134757729338},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}}],"id":"03f8b00d-10cf-423d-a654-d8db598c76a9","savedPayload":{"position":{"x":14308,"y":10257.134757729338},"targetPosition":{"x":14458,"y":10516.942378864669},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"apiQueryResponses":{"type":"API Query Responses","name":"New API Query Responses","config":"{\n \"codeName\": \"\"\n}","project":"Superalgos","apiQueryResponses":[{"type":"API Query Response","name":"200 Successful","config":"{\n \"codeName\": \"200\"\n}","project":"Superalgos","apiResponseSchema":{"type":"API Response Schema","name":"New API Response Schema","config":"{\n \"nodePath\": \"apiResponseReceivedObject.data\"\n}","project":"Superalgos","apiResponseFields":{"type":"API Response Field","name":"Root Object","config":"{\n \"codeName\": \"Root-Object\",\n \"fieldType\": \"object\",\n \"descrption\": \"This is the root object of the API response.\"\n}","project":"Superalgos","apiResponseFields":[{"type":"API Response Field","name":"Status","config":"{\n \"codeName\": \"status\",\n \"fieldType\": \"object\",\n \"descrption\": \"object (ApiStatus)\"\n}","project":"Superalgos","apiResponseFields":[{"type":"API Response Field","name":"Enlapsed","config":"{\n \"codeName\": \"enlapsed\",\n \"fieldType\": \"number\",\n \"descrption\": \"\"\n}","project":"Superalgos","apiResponseFields":[],"id":"9c472348-ac24-4567-a36f-8600a1fac914","savedPayload":{"position":{"x":14957.080319710783,"y":9159.037626303341},"targetPosition":{"x":15126.07633712987,"y":9406.90925859814},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"API Response Field","name":"Timestamp","config":"{\n \"codeName\": \"timestamp\",\n \"fieldType\": \"date\",\n \"descrption\": \"\"\n}","project":"Superalgos","apiResponseFields":[],"id":"12b796fd-85eb-49b2-a88e-b400f52cc5e9","savedPayload":{"position":{"x":15256.241458865137,"y":9136.618598227415},"targetPosition":{"x":15126.07633712987,"y":9406.90925859814},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"5d45e7d6-8964-449e-8f34-c7f5f4839d54","savedPayload":{"position":{"x":15126.07633712987,"y":9406.9092585Line truncated
{"type":"API Map","name":"Messari","config":"{\n \"codeName\": \"Messari\",\n \"protocol\": \"https\",\n \"hostName\": \"data.messari.io\",\n \"portNumber\": \"\",\n \"path\": \"api\",\n \"millisecondsBetweenCalls\": 4000\n}","project":"Superalgos","apiVersions":[{"type":"API Version","name":"Version 1","config":"{\n \"codeName\": \"v1\"\n}","project":"Superalgos","apiEndpoints":[{"type":"API Endpoint","name":"Get All News","config":"{\n \"codeName\": \"news\"\n}","project":"Superalgos","apiQueryParameters":{"type":"API Query Parameters","name":"New API Query Parameters","config":"{\n \"codeName\": \"\"\n}","project":"Superalgos","apiQueryParameters":[{"type":"API Query Parameter","name":"Page","config":"{\n \"codeName\": \"page\",\n \"isString\": false,\n \"isOptional\": false,\n \"description\": \"Page number, starts at 1. Increment to paginate through results (until result is empty array)\",\n \"isPageNumber\": true\n}","project":"Superalgos","id":"754e2724-36bc-4e4e-94cf-bfba88dadd3b","savedPayload":{"position":{"x":14012.485238430854,"y":10170.798147156756},"targetPosition":{"x":14302.262986317575,"y":10248.443860687512},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},{"type":"API Query Parameter","name":"Fields","config":"{\n \"codeName\": \"fields\",\n \"isString\": true,\n \"isOptional\": true,\n \"description\": \"pare down the returned fields (comma , separated, drill down with a slash /)\"\n}","project":"Superalgos","id":"3199c37c-5ecc-47fd-8868-eddaa15fdc59","savedPayload":{"position":{"x":14152.262986317575,"y":9988.636239552181},"targetPosition":{"x":14302.262986317575,"y":10248.443860687512},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},{"type":"API Query Parameter","name":"As Markdown","config":"{\n \"codeName\": \"as-markdown\",\n \"isString\": false,\n \"isOptional\": true,\n \"description\": \"formatting (other than HTML links) is hidden. Use this query param to return content with markdown syntax\"\n}","project":"Superalgos","id":"fa87b1ad-2d0f-4462-85fb-524630e9db7a","savedPayload":{"position":{"x":14379.90869984833,"y":9958.66611280079},"targetPosition":{"x":14302.262986317575,"y":10248.443860687512},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}}],"id":"03f8b00d-10cf-423d-a654-d8db598c76a9","savedPayload":{"position":{"x":14302.262986317575,"y":10248.443860687512},"targetPosition":{"x":14452.262986317575,"y":10508.251481822843},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"apiQueryResponses":{"type":"API Query Responses","name":"New API Query Responses","config":"{\n \"codeName\": \"\"\n}","project":"Superalgos","apiQueryResponses":[{"type":"API Query Response","name":"200 Successful","config":"{\n \"codeName\": \"200\"\n}","project":"Superalgos","apiResponseSchema":{"type":"API Response Schema","name":"New API Response Schema","config":"{\n \"nodePath\": \"apiResponseReceivedObject.data\"\n}","project":"Superalgos","apiResponseFields":{"type":"API Response Field","name":"Root Object","config":"{\n \"codeName\": \"Root-Object\",\n \"fieldType\": \"object\",\n \"descrption\": \"This is the root object of the API response.\"\n}","project":"Superalgos","apiResponseFields":[{"type":"API Response Field","name":"Status","config":"{\n \"codeName\": \"status\",\n \"fieldType\": \"object\",\n \"descrption\": \"object (ApiStatus)\"\n}","project":"Superalgos","apiResponseFields":[{"type":"API Response Field","name":"Enlapsed","config":"{\n \"codeName\": \"enlapsed\",\n \"fieldType\": \"number\",\n \"descrption\": \"\"\n}","project":"Superalgos","apiResponseFields":[],"id":"9c472348-ac24-4567-a36f-8600a1fac914","savedPayload":{"position":{"x":14951.343306028359,"y":9150.346729261515},"targetPosition":{"x":15120.339323447446,"y":9398.218361556314},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"API Response Field","name":"Timestamp","config":"{\n \"codeName\": \"timestamp\",\n \"fieldType\": \"date\",\n \"descrption\": \"\"\n}","project":"Superalgos","apiResponseFields":[],"id":"12b796fd-85eb-49b2-a88e-b400f52cc5e9","savedPayload":{"position":{"x":15250.504445182713,"y":9127.927701185588},"targetPosition":{"x":15120.339323447446,"y":9398.218361556314},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"5d45e7d6-8964-449e-8f34-Line truncated
@@ -1 +1 @@
{"type":"Data Mine","name":"Masters","config":"{\n \"codeName\": \"Masters\"\n}","project":"Superalgos","sensorBots":[],"apiDataFetcherBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Candle Channels","config":"{\n\"codeName\": \"Candle-Channels\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market Candles Channels","project":"Superalgos","id":"98bb0dce-e233-4f70-a4ab-9051ee23abd5","savedPayload":{"position":{"x":19583.91966989329,"y":21641.32100245677},"targetPosition":{"x":18969.6794350459,"y":20983.514850239706},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"df7d1cd7-95b0-499c-b51a-772c3fb8a2b0"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market Candles Channels Objects","project":"Superalgos","id":"e5d3a974-b3e5-4f0c-acaf-9cf9915850ee","savedPayload":{"position":{"x":19392.737181251472,"y":21777.883872404756},"targetPosition":{"x":18969.6794350459,"y":20983.514850239706},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"566b9df4-da86-4b4f-a3f4-ef8a76443714"}}}],"outputDatasetFolders":[],"id":"81b11bce-fa94-4295-b3a9-a24b6c0c45d3","savedPayload":{"position":{"x":19324.033753975265,"y":19282.4884909688},"targetPosition":{"x":19035.65524519377,"y":19199.7972842237},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Superalgos","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Market Ending Point\"\n}","project":"Superalgos","id":"8c5feff4-7b13-404f-9fb7-844f3945715c","savedPayload":{"position":{"x":19294.41367459389,"y":21813.95400030735},"targetPosition":{"x":18820.30750768436,"y":21048.955083642526},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Candle Channels Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Superalgos","id":"34699cb0-bf71-4fbc-8671-9570617b1cd0","savedPayload":{"position":{"x":19136.059972543495,"y":21891.748285404014},"targetPosition":{"x":18820.30750768436,"y":21048.955083642526},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"902925d3-1d23-4894-9459-0be8df3965df"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Superalgos","id":"ab069a67-5e2f-4a3b-91e1-967d56ba62b6","savedPayload":{"position":{"x":18965.572080344584,"y":21937.15450040086},"targetPosition":{"x":18820.30750768436,"y":21048.955083642526},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"4775daf3-4ac9-4971-a4fb-4cf66d4fbb45","savedPayload":{"position":{"x":19292.805435404403,"y":19354.308706696716},"targetPosition":{"x":19035.65524519377,"y":19199.7972842237},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Superalgos","id":"902925d3-1d23-4894-9459-0be8df3965df","savedPayload":{"position":{"x":19244.05275633147,"y":19415.599224325295},"targetPosition":{"x":19035.65524519377,"y":19199.7972842237},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Market","project":Line truncated
{"type":"Data Mine","name":"Masters","config":"{\n \"codeName\": \"Masters\"\n}","project":"Superalgos","sensorBots":[],"apiDataFetcherBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Candle Channels","config":"{\n\"codeName\": \"Candle-Channels\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":"{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market Candles Channels","project":"Superalgos","id":"98bb0dce-e233-4f70-a4ab-9051ee23abd5","savedPayload":{"position":{"x":19583.91966989329,"y":21641.32100245677},"targetPosition":{"x":18969.6794350459,"y":20983.514850239706},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"df7d1cd7-95b0-499c-b51a-772c3fb8a2b0"}}},{"type":"Output Dataset","name":"Multi-Time-Frame-Market Candles Channels Objects","project":"Superalgos","id":"e5d3a974-b3e5-4f0c-acaf-9cf9915850ee","savedPayload":{"position":{"x":19392.737181251472,"y":21777.883872404756},"targetPosition":{"x":18969.6794350459,"y":20983.514850239706},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"566b9df4-da86-4b4f-a3f4-ef8a76443714"}}}],"outputDatasetFolders":[],"id":"81b11bce-fa94-4295-b3a9-a24b6c0c45d3","savedPayload":{"position":{"x":19324.033753975265,"y":19282.4884909688},"targetPosition":{"x":19035.65524519377,"y":19199.7972842237},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Superalgos","statusDependencies":[{"type":"Status Dependency","name":"Candles Volumes Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Market Ending Point\"\n}","project":"Superalgos","id":"8c5feff4-7b13-404f-9fb7-844f3945715c","savedPayload":{"position":{"x":19294.41367459389,"y":21813.95400030735},"targetPosition":{"x":18820.30750768436,"y":21048.955083642526},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}},{"type":"Status Dependency","name":"Candle Channels Multi-Time-Frame-Market","config":"{\n \"mainUtility\": \"Self Reference\"\n}","project":"Superalgos","id":"34699cb0-bf71-4fbc-8671-9570617b1cd0","savedPayload":{"position":{"x":19136.059972543495,"y":21891.748285404014},"targetPosition":{"x":18820.30750768436,"y":21048.955083642526},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"902925d3-1d23-4894-9459-0be8df3965df"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Superalgos","id":"ab069a67-5e2f-4a3b-91e1-967d56ba62b6","savedPayload":{"position":{"x":18965.572080344584,"y":21937.15450040086},"targetPosition":{"x":18820.30750768436,"y":21048.955083642526},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":4,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"4775daf3-4ac9-4971-a4fb-4cf66d4fbb45","savedPayload":{"position":{"x":19292.805435404403,"y":19354.308706696716},"targetPosition":{"x":19035.65524519377,"y":19199.7972842237},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Superalgos","id":"902925d3-1d23-4894-9459-0be8df3965df","savedPayload":{"position":{"x":19244.05275633147,"y":19415.599224325295},"targetPosition":{"x":19035.65524519377,"y":19199.7972842237},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"Candles Volumes Multi-Time-Frame-Market","project":Line truncated
@@ -0,0 +1 @@
{"type":"Data Mine","name":"Messari","config":"{\n \"codeName\": \"Messari\"\n}","project":"Superalgos","sensorBots":[],"apiDataFetcherBots":[{"type":"API Data Fetcher Bot","name":"News","config":"{\n \"codeName\": \"News\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Fetching Process","config":"{\n \"codeName\": \"Fetching-Process\",\n \"description\": \"Fetches Data from an API\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 60000,\n \"retryWaitTime\": 10000,\n \"botModule\": \"API Data Fetcher Fetching Process\"\n}","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Single File News","project":"Superalgos","id":"86c094dc-c27d-4c89-8254-90face77eab8","savedPayload":{"position":{"x":14580.807621135331,"y":18002.75},"targetPosition":{"x":14580.807621135331,"y":18302.75},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Single File","id":"135e76cc-93dc-499c-9825-4546a9da3048"}}}],"outputDatasetFolders":[],"id":"6ae652ed-33d8-48cb-828e-c58137f98a70","savedPayload":{"position":{"x":14580.807621135331,"y":18302.75},"targetPosition":{"x":14580.807621135331,"y":18602.75},"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":"","config":"{ \n\"mainUtility\": \"Self Reference|Market Starting Point|Market Ending Point\"\n}","project":"Superalgos","id":"707cf1ee-d397-40a0-8691-12b3d66b2000","savedPayload":{"position":{"x":14880.807621135331,"y":18083.134757729335},"targetPosition":{"x":14730.807621135331,"y":18342.942378864667},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"e16040d4-96c9-4ab9-86fb-39d81db42b3f"}}}],"dataDependencies":[],"dataMineDataDependencies":[],"id":"4b6de2ac-ec9f-4aed-8c38-0c5a08b85e5d","savedPayload":{"position":{"x":14730.807621135331,"y":18342.942378864667},"targetPosition":{"x":14580.807621135331,"y":18602.75},"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":"e16040d4-96c9-4ab9-86fb-39d81db42b3f","savedPayload":{"position":{"x":14840.615242270662,"y":18452.75},"targetPosition":{"x":14580.807621135331,"y":18602.75},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"","project":"Superalgos","id":"ba31d68b-8788-44e5-9cdb-dc05b03814ad","savedPayload":{"position":{"x":14880.807621135331,"y":18602.75},"targetPosition":{"x":14580.807621135331,"y":18602.75},"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":"20e4520e-1532-4e92-8f9c-bb52f929e793","savedPayload":{"position":{"x":14840.615242270662,"y":18752.75},"targetPosition":{"x":14580.807621135331,"y":18602.75},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"051353f4-6e0b-4641-bd7d-b0f621f64ccb","savedPayload":{"position":{"x":14580.807621135331,"y":18602.75},"targetPosition":{"x":14321,"y":18752.75},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"products":[{"type":"Product Definition","name":"News","config":"{\n \"codeName\": \"News\",\n \"singularVariableName\": \"new\",\n \"pluralVariableName\": \"news\"\n}","project":"Superalgos","datasets":[{"type":"Dataset Definition","name":"Single File","config":"{\n \"codeName\": \"Single-File\",\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.json\",\n \"validTimeFrames\": [\n \"Any Time Frame\"\n ]\n}","project":"Superalgos","id":"135e76cc-93dc-499c-9825-4546a9da3048","savedPayload":{"position":{"x":14878.241079547473,"y":18941.907857666014},"targetPosition":{"x":14580.807621135331,"y":18902.75},"floatingObLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"API-Data-Fetcher-Bot-Demo","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":"Candle Channels","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candle Channels","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candle Channels Multi-Time-Frame-Market","project":"Superalgos","id":"aadb5194-5dce-48d9-af13-f4b4709d5467","savedPayload":{"position":{"x":25067.356993272086,"y":30629.11115747996},"targetPosition":{"x":25013.356993272086,"y":30577.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"2ab8c00c-8e15-4bdc-87fa-291c8d4edadb"}}},{"type":"Indicator Process Instance","name":"Candle Channels Multi-Time-Frame-Daily","project":"Superalgos","id":"1957e62b-09bf-4228-b9e2-b4d4dbcf318d","savedPayload":{"position":{"x":25051.356993272086,"y":30590.11115747996},"targetPosition":{"x":25013.356993272086,"y":30577.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"0de6dd1f-5bca-4f66-a5db-cd068dd4190f"}}}],"id":"e105597f-9820-4f46-969f-25b54b6d9881","savedPayload":{"position":{"x":25013.356993272086,"y":30577.11115747996},"targetPosition":{"x":25112.356993272086,"y":30515.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"05036d44-8a85-4b4f-a836-f92acb4685ce","savedPayload":{"position":{"x":25112.356993272086,"y":30515.11115747996},"targetPosition":{"x":25072.356993272086,"y":30537.11115747996},"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":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Market","project":"Superalgos","id":"98162878-d377-4a40-98f2-9ce564e26e1d","savedPayload":{"position":{"x":25168.356993272086,"y":30567.11115747996},"targetPosition":{"x":25228.356993272086,"y":30531.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"5d9b2729-43fb-4e7e-aa4f-b8477c424e51"}}},{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Daily","project":"Superalgos","id":"ede3c7c1-ba34-46cd-9a74-7c399598a544","savedPayload":{"position":{"x":25314.356993272086,"y":30463.11115747996},"targetPosition":{"x":25228.356993272086,"y":30531.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"be19d91b-9337-4f84-96b3-f4e54ea12df5"}}}],"id":"125c7030-7222-458d-b110-ad4992318b31","savedPayload":{"position":{"x":25228.356993272086,"y":30531.11115747996},"targetPosition":{"x":25142.356993272086,"y":30519.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"e0d68f6f-b086-4bf8-8623-93e04302de88","savedPayload":{"position":{"x":25142.356993272086,"y":30519.11115747996},"targetPosition":{"x":25072.356993272086,"y":30537.11115747996},"floatingObject":{"isPinned":false,"isFrozen":fLine truncated
{"type":"Workspace","name":"API-Data-Fetcher-Bot-Demo","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":" 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":"Candle Channels","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candle Channels","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candle Channels Multi-Time-Frame-Market","project":"Superalgos","id":"9abbcecc-9b28-492c-a0b2-83526d12b451","savedPayload":{"position":{"x":24659.356993272086,"y":30668.11115747996},"targetPosition":{"x":24748.356993272086,"y":30674.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"2ab8c00c-8e15-4bdc-87fa-291c8d4edadb"}}},{"type":"Indicator Process Instance","name":"Candle Channels Multi-Time-Frame-Daily","project":"Superalgos","id":"d8ae0748-ea08-4248-a235-c4e340d28eb4","savedPayload":{"position":{"x":24811.356993272086,"y":30645.11115747996},"targetPosition":{"x":24748.356993272086,"y":30674.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"0de6dd1f-5bca-4f66-a5db-cd068dd4190f"}}}],"id":"159e876a-c239-4798-9232-d1a1e5d8a8bc","savedPayload":{"position":{"x":24748.356993272086,"y":30674.11115747996},"targetPosition":{"x":24776.356993272086,"y":30627.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"d1d36fab-12cb-4fed-8e07-5f030b285d4f","savedPayload":{"position":{"x":24776.356993272086,"y":30627.11115747996},"targetPosition":{"x":24833.356993272086,"y":30707.11115747996},"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":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Market","project":"Superalgos","id":"31080f4e-ff13-440a-b4a8-e97bf7f06208","savedPayload":{"position":{"x":24966.356993272086,"y":30659.11115747996},"targetPosition":{"x":24874.356993272086,"y":30655.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"5d9b2729-43fb-4e7e-aa4f-b8477c424e51"}}},{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Daily","project":"Superalgos","id":"b3dcbd06-f4db-4a32-a809-ea0a6e57a269","savedPayload":{"position":{"x":24888.356993272086,"y":30641.11115747996},"targetPosition":{"x":24874.356993272086,"y":30655.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"be19d91b-9337-4f84-96b3-f4e54ea12df5"}}}],"id":"ca7b97ef-cd47-4dd7-afe5-06bdc0341bbd","savedPayload":{"position":{"x":24874.356993272086,"y":30655.11115747996},"targetPosition":{"x":24922.356993272086,"y":30641.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"1bc1a7fc-b04e-4ba5-b417-31746b75eb0f","savedPayload":{"position":{"x":24922.356993272086,"y":30641.11115747996},"targetPosition":{"x":24833.356993272086,"y":30707.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"iLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Custom Charts Tutorials","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":"48da2d1f-85aa-4206-8e53-cc010c3280d2","savedPayload":{"position":{"x":26808.380470322878,"y":28508.890029831477},"targetPosition":{"x":26964.5208127148,"y":28252.725642225134},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"7d9aefc0-f001-4acb-9e97-34039ed84072","savedPayload":{"position":{"x":26964.5208127148,"y":28252.725642225134},"targetPosition":{"x":27120.66115510672,"y":27996.56125461879},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"9157e60f-5ffa-48e0-8d48-a5d328bcc073","savedPayload":{"position":{"x":27120.66115510672,"y":27996.56125461879},"targetPosition":{"x":27276.801497498644,"y":27740.39686701245},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Webhooks","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Webhooks","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Webhooks Check-Webhook","project":"Superalgos","id":"43d40b57-8729-4b76-8c23-785afca39d6c","savedPayload":{"position":{"x":26610.84526955405,"y":28345.79120334358},"targetPosition":{"x":26832.830678868915,"y":28143.993091233202},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Check-Webhook","id":"69f37820-ab16-4e19-bfd8-386dd6e249a3"}}}],"id":"d7618750-0098-4802-ac35-9d06ce6c534d","savedPayload":{"position":{"x":26832.830678868915,"y":28143.993091233202},"targetPosition":{"x":27054.81608818378,"y":27942.194979122825},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"77c8d6b4-be65-43b9-8e4a-23036d9e03d9","savedPayload":{"position":{"x":27054.81608818378,"y":27942.194979122825},"targetPosition":{"x":27276.801497498644,"y":27740.39686701245},"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":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Time-Frame-Market","project":"Superalgos","id":"0e5261ce-0641-49c1-944a-75ff40a394fa","savedPayload":{"position":{"x":26510.383548046007,"y":28199.02179461765},"targetPosition":{"x":26737.108420352284,"y":28002.563574434065},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Time-Frame-Daily","project":"Superalgos","id":"3b721729-5767-4b5d-b62d-16d83eba5a88","savedPayload":{"position":{"x":26442.529811173474,"y":28059.338947742188},"targetPosition":{"x":26737.108420352284,"y":28002.563574434065},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"Line truncated
{"type":"Workspace","name":"Custom Charts Tutorials","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":"Sparta","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Sparta","project":"Superalgos","tasks":[{"type":"Task","name":"Simple Moving Average (SMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Simple Moving Average (SMA)","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Time-Frame-Market","project":"Superalgos","id":"07281d67-3aad-46e6-b78d-8b85bf2fdb26","savedPayload":{"position":{"x":25070.356993272086,"y":28790.11115747996},"targetPosition":{"x":25090.356993272086,"y":28756.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"456269f6-9849-4d5f-9c8c-7cd7d1eef297"}}},{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Time-Frame-Daily","project":"Superalgos","id":"bfc9c489-a981-4800-8f61-092f19ff0e93","savedPayload":{"position":{"x":25172.356993272086,"y":28806.11115747996},"targetPosition":{"x":25090.356993272086,"y":28756.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"333ae5d7-7ec1-4f08-b206-91e3b4f2c99f"}}}],"id":"b1ab4a4a-256f-4cc3-a1df-b921c8fe4605","savedPayload":{"position":{"x":25090.356993272086,"y":28756.11115747996},"targetPosition":{"x":25177.356993272086,"y":28674.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"19a527e8-8570-4766-8190-e2fbc7ece275","savedPayload":{"position":{"x":25177.356993272086,"y":28674.11115747996},"targetPosition":{"x":25124.356993272086,"y":28583.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Exponential Moving Average (EMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Exponential Moving Average (EMA)","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Time-Frame-Market","project":"Superalgos","id":"098228d9-c139-46bc-8938-46c84811e33d","savedPayload":{"position":{"x":25191.356993272086,"y":28759.11115747996},"targetPosition":{"x":25211.356993272086,"y":28715.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"278c34a7-199d-400e-8a06-087149e3d391"}}},{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Time-Frame-Daily","project":"Superalgos","id":"16d1a19b-fd61-4d41-9cad-56cc68774b62","savedPayload":{"position":{"x":25134.356993272086,"y":28660.11115747996},"targetPosition":{"x":25211.356993272086,"y":28715.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"943ea24f-ee24-4eae-9b4b-e8a73122b1c2"}}}],"id":"dab1daf1-4a5d-4abb-b4a6-3ebfe99aa543","savedPayload":{"position":{"x":25211.356993272086,"y":28715.11115747996},"targetPosition":{"x":25176.356993272086,"y":28674.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"603927bd-8140-45d6-ba57-47b3d7d5a77f","savedPayload":{"position":{"x":25176.356993272086,"y":28674.11115747996},"targetPosition":{"x":25124.356993272086,"y"Line truncated
@@ -1 +0,0 @@
{"type":"Workspace","name":"Getting Started Provisional","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":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Market","project":"Superalgos","id":"afeed756-c931-4f34-b27c-12fd2b5ef39a","savedPayload":{"position":{"x":23310.348760844034,"y":29310.042580543206},"targetPosition":{"x":23600.126508730755,"y":29387.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"5d9b2729-43fb-4e7e-aa4f-b8477c424e51"}}},{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Daily","project":"Superalgos","id":"f11443df-d85b-486c-acaf-a446a5086c09","savedPayload":{"position":{"x":23387.99447437479,"y":29175.556259718},"targetPosition":{"x":23600.126508730755,"y":29387.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"be19d91b-9337-4f84-96b3-f4e54ea12df5"}}}],"id":"e644a294-b0f0-4996-817e-0d95f92042d5","savedPayload":{"position":{"x":23600.126508730755,"y":29387.688294073963},"targetPosition":{"x":23859.934129866087,"y":29537.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"0f9200a1-81fe-4ef4-affc-f4a00c89a52a","savedPayload":{"position":{"x":23859.934129866087,"y":29537.688294073963},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"6e864d3c-4660-42c2-8499-7db31789fd12","savedPayload":{"position":{"x":24119.74175100142,"y":29687.688294073963},"targetPosition":{"x":24379.549372136753,"y":29837.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"e04f5978-a32c-4950-a7e3-d2b8c0658000","savedPayload":{"position":{"x":24379.549372136753,"y":29837.688294073963},"targetPosition":{"x":24639.356993272086,"y":29987.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Data Mine","name":"Masters","id":"35be7b1c-a0f7-4b5f-9ee1-8fb51595e959"}}},{"type":"Data Mine Tasks","name":"","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Candles","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":"","project":"Superalgos","id":"ef7ba335-da83-4c53-9bb2-480360223fb5","savedPayload":{"position":{"x":24189.356993272086,"y":28608.265430667965},"targetPosition":{"x":24339.356993272086,"y":28868.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"92b80bac-30e0-410a-ac74-c8894ed52b64","savedPayload":{"position":{"x":24339.356993272086,"y":28868.073051803298},"targetPosition":{"x":24489.356993272086,"y":29127.88067293863},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangeLine truncated
@@ -0,0 +1 @@
{"type":"Workspace","name":"Getting Started Tutorials","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":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Market","project":"Superalgos","id":"afeed756-c931-4f34-b27c-12fd2b5ef39a","savedPayload":{"position":{"x":23310.348760844034,"y":29310.042580543206},"targetPosition":{"x":23600.126508730755,"y":29387.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Market","id":"5d9b2729-43fb-4e7e-aa4f-b8477c424e51"}}},{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Time-Frame-Daily","project":"Superalgos","id":"f11443df-d85b-486c-acaf-a446a5086c09","savedPayload":{"position":{"x":23387.99447437479,"y":29175.556259718},"targetPosition":{"x":23600.126508730755,"y":29387.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Time-Frame-Daily","id":"be19d91b-9337-4f84-96b3-f4e54ea12df5"}}}],"id":"e644a294-b0f0-4996-817e-0d95f92042d5","savedPayload":{"position":{"x":23600.126508730755,"y":29387.688294073963},"targetPosition":{"x":23859.934129866087,"y":29537.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"0f9200a1-81fe-4ef4-affc-f4a00c89a52a","savedPayload":{"position":{"x":23859.934129866087,"y":29537.688294073963},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"6e864d3c-4660-42c2-8499-7db31789fd12","savedPayload":{"position":{"x":24119.74175100142,"y":29687.688294073963},"targetPosition":{"x":24379.549372136753,"y":29837.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"e04f5978-a32c-4950-a7e3-d2b8c0658000","savedPayload":{"position":{"x":24379.549372136753,"y":29837.688294073963},"targetPosition":{"x":24639.356993272086,"y":29987.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Data Mine","name":"Masters","id":"35be7b1c-a0f7-4b5f-9ee1-8fb51595e959"}}},{"type":"Data Mine Tasks","name":"Candles","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Candles","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":"ef7ba335-da83-4c53-9bb2-480360223fb5","savedPayload":{"position":{"x":24189.356993272086,"y":28608.265430667965},"targetPosition":{"x":24339.356993272086,"y":28868.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"92b80bac-30e0-410a-ac74-c8894ed52b64","savedPayload":{"position":{"x":24339.356993272086,"y":28868.073051803298},"targetPosition":{"x":24489.356993272086,"y":29127.88067293863},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToPLine truncated
@@ -1 +0,0 @@
{"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-Time-Frame-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-Time-Frame-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Time-Frame-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-Time-Frame-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-Time-Frame-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":{"isRLine truncated
@@ -9,7 +9,7 @@
"compatibleTypes": "->Plotter Panel->"
},
"initialValues": {
"config": "{\n \"valueDecimals\": 2\n}"
"config": "{\n \"valueDecimals\": 10\n}"
},
"childrenNodesProperties": [
{
@@ -10,6 +10,7 @@
"compatibleTypes": "->Polygon->"
},
"title": [
"Use Reference Parent Parent",
"Use Reference Parent"
],
"menuItems": [
@@ -1,8 +1,8 @@
{
"type": "Plugin Workspace",
"definition": {
"text": "This refers to a Workspace created by a user, contributed to the project as a plugin and distributed with the whole software package. Plugin workspaces are useful to give access to users to ready to run strategies, demos, tutorials or areas of the system under development.",
"updated": 1622053231319
"text": "Refers to a Workspace created by a user, contributed to the project as a plugin and distributed with the whole software package. Plugin workspaces are useful to give access to users to ready-to-run strategies, demos, tutorials, or areas of the system under development.",
"updated": 1622193639612
},
"paragraphs": [
{
@@ -1,8 +1,8 @@
{
"type": "UI",
"definition": {
"text": "UI is an abbreviation for User Interface (user interface), which refers to the operation screen and operation method of the software. In Superalgos the UI is a Web App that runs at an Internet Browser.",
"updated": 1610911735769
"text": "UI is an abbreviation for User Interface, which refers to the operation screen and operation method of the software. In Superalgos the UI is a Web App that runs on an Internet Browser.",
"updated": 1622192912866
},
"paragraphs": [
{
@@ -1,8 +1,8 @@
{
"type": "User Workspace",
"definition": {
"text": "This refers to a Workspace created by a user, and stored locally at the My Workspaces folder.",
"updated": 1622053351023
"text": "Refers to a Workspace created by a user, and stored locally at the My-Workspaces folder.",
"updated": 1622192760962
},
"paragraphs": [
{
@@ -43,6 +43,11 @@
"style": "Text",
"text": "For example, in the open stage, you probably defined the target size as a function of the capital allocated to the trading system. In the close stage, you will likely want to define the target size as a function of the size filled, that is, the amount of the orders placed that was filled during the open stage."
},
{
"style": "Text",
"text": "In the event that the target size of the asset to be traded in Close Stage is equal to zero then Close Stage will close as will the currently running strategy. For example: Suppose the Open Stage was to trade x amount of quoted asset at y price via a limit order. But instead price moved in the opposite direction and to the point that Open Stage closed prior to the accumulation of any of the Base Asset which was to be traded via the Close Stage. In that scenario Close Stage would not take any action and would Close the current instance of the Strategy and the system would resume polling for another Trigger On event.",
"updated": 1622300970890
},
{
"style": "Include",
"text": "Superalgos->Topic->Why My Stage is not Closing?->The Stage Does Not Close",
@@ -51,6 +51,25 @@
{
"style": "List",
"text": "timeFrames sets the name and path of the file indicating which time frames shall be filtered when the users sets a time frames filter."
},
{
"style": "Subtitle",
"text": "Multi-Time-Frame-Market"
},
{
"style": "Json",
"text": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\",\n \"timeFrames\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}",
"updated": 1622230173671
},
{
"style": "Subtitle",
"text": "Multi-Time-Frame-Daily",
"updated": 1622230146222
},
{
"style": "Json",
"text": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n },\n \"timeFrames\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Time.Frames.json\"\n }\n}",
"updated": 1622230187172
}
]
}
@@ -23,6 +23,26 @@
{
"style": "Text",
"text": "Storing objects with named properties in the JSON format would be inappropriate as labels would repeat over and over, creating a ridiculous amount of unnecessary information. However, storing arrays in the JSON standard facilitates the handling of files in the context of JavaScript and Node.JS."
},
{
"style": "Block",
"text": "Record Properties"
},
{
"style": "Title",
"text": "What are the Record Properties used for?"
},
{
"style": "Text",
"text": "In general this is the mechanism to define what information is going to be available to the consumers of data of this product. "
},
{
"style": "Text",
"text": "When properties don't have a Formula, they define the format of the file that stores this data on disk. These record properties defines, the data type (string, number, etc), and in which order the data is saved. At the file there are no headers, just the data, because the header information is available here, for any process writing or reading the data from disk."
},
{
"style": "Text",
"text": "The formulas nodes there are used to expand the record definition adding fields that are not actually going to be saved on disk, to minimize space used, and they are going to be calculated at runtime. This allows proceeses that consume this data to have ell the fields available at runtime even though some were not actually saved on disk."
}
]
}
@@ -5,10 +5,19 @@
"updated": 1609788711861
},
"paragraphs": [
{
"style": "Include",
"text": "Superalgos->Node->Record Definition->Record Properties",
"updated": 1622292888747
},
{
"style": "Title",
"text": "How is a Record Formula used?",
"updated": 1622292907320
},
{
"style": "Text",
"text": "Formulas may use both the record and the variable objects made available by the calculations procedure and the data building procedure (see procedure loop).",
"updated": 1609788725463
"text": "Formulas may use both the record and the variable objects made available by the calculations procedure and the data building procedure (see procedure loop)."
},
{
"style": "Text",
@@ -8,6 +8,11 @@
"style": "Block",
"text": "Content"
},
{
"style": "Include",
"text": "Superalgos->Node->Record Definition->Record Properties",
"updated": 1622292794198
},
{
"style": "Text",
"text": "Records may have as many properties as required."
@@ -1,8 +1,8 @@
{
"type": "User Defined Code",
"definition": {
"text": "You can use this node to inject your own executable code into the the Trading System. The exact moment when this code will be run depends on its config properties. From your code you can access the Trading Engine, read and modify it's values, modifying the standar behaviour of the Trading Bot.",
"updated": 1621988586103
"text": "You can use this node to inject your own executable code into the the Trading System. The exact moment when this code will be run depends on its config properties. From your code you can access the Trading Engine, read and modify it's values, modifying the standard behaviour of the Trading Bot.",
"updated": 1622299982600
},
"paragraphs": [
{
@@ -0,0 +1,14 @@
{
"type": "User Defined Variable",
"definition": {
"text": "The User-Defined-Variable is a mutable storage container for whatever arbitrary data the user may want to manage while running a Trading System.",
"updated": 1622299578764
},
"paragraphs": [
{
"style": "Text",
"text": "These variables can be easily set or get by using the Copy Node Path in the node's popup modal.",
"updated": 1622299861437
}
]
}
@@ -0,0 +1,33 @@
{
"type": "User Defined Variables",
"definition": {
"text": "The User Defined Variables node structure is an unused area of the Trading Engine users can access from within their Trading System to store data.",
"updated": 1622234154032
},
"paragraphs": [
{
"style": "Text",
"text": "<h4>Overview</h4>",
"updated": 1622299369556
},
{
"style": "Text",
"text": "Oftentimes, when building a strategy, the need for a place to store some data may arise. The User-Defined-Variables nodes are the correct place to do this. The children nodes, (User Defined variable nodes), of this node are unused by the base code of the Superalgos processes thus the data placed inside these variables will remain unchanged and available for the duration of the episode."
},
{
"style": "Text",
"text": "<h4>Additional Info</h4>",
"updated": 1622250099965
},
{
"style": "Text",
"text": "- Persistence: It should be noted that these variables will persist throughout the System's episode; not just at the stage or strategy layer from which they are set.",
"updated": 1622299441071
},
{
"style": "Text",
"text": "- State: A user defined variable is mutable.",
"updated": 1622250209793
}
]
}
@@ -1,7 +1,7 @@
{
"topic": "Community Workspaces",
"pageNumber": "2",
"type": "Getting Started Plugin Workspace",
"type": "Getting Started Tutorials Plugin Workspace",
"definition": {
"text": "This workspace is the first point of contact with Superalgos. It's purpose is to get new users familiar with all the basic aspects of Superalgos.",
"updated": 1616145473343
@@ -36,7 +36,7 @@
},
{
"style": "List",
"text": "@julian-molina",
"text": "@julian-molina (Telegram)",
"updated": 1616151219045
}
]
@@ -3,14 +3,14 @@
"pageNumber": 1,
"type": "Data Mining - Introduction",
"definition": {
"text": "Data Mining in Superalgos means extracting data from external sources and procesing that data in order to have it ready for consumption by trading strategies.",
"updated": 1621899758597
"text": "Data Mining in Superalgos means extracting data from external sources and processing that data in order to have it ready for consumption by trading strategies.",
"updated": 1622200589433
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos offers a set of Data Mining tools. With those, users can fetch data from external sources, process them into more elaborate datasets, plot them at the charts, feed ML Bot's models and ultimately consume the data within their trading strategies.",
"updated": 1621899827534
"text": "Superalgos offers an extensive set of Data Mining tools. These tools allow users to fetch data from external sources, process that data into more elaborate datasets, plot the datasets within the Charting Space, feed ML Bot's models, and ultimately consume the data within their trading strategies.",
"updated": 1622200769538
},
{
"style": "Title",
@@ -19,28 +19,28 @@
},
{
"style": "Text",
"text": "All of the data inside the Superalgos system has an origin somewhere outside the system, usually somewhere at the Internet. There are currently 3 ways to bring data into the system:",
"updated": 1621899913780
"text": "All of the data inside the Superalgos system has an origin somewhere outside the system, usually somewhere on the Internet. There are currently 3 ways to bring data into the system:",
"updated": 1622200785987
},
{
"style": "List",
"text": "By coding an Algorithm: with this method dev users can extract data from any source at all. The way to do it is to implement a new process into the already existing Sensor Bot. This ype of bot is just for that, to allow users to write code to extract data from different places outside of the system when they can not do it by the second method listed below. An example of such algorithms is the Historic-OHLCVs which uses the CCXT open source library to extract one minute candles from any exchange supported by that library.",
"updated": 1621705279013
"text": "By coding an Algorithm: with this method, users who have developer skills can extract data from any source imaginable. The way to do it is by implementing a new process within the already existing Sensor Bot. In other words, the sensor bot allows users to write code that extracts data from different places outside of the system. This method is ideal for when it is not possible to use the second method listed below. An example of such algorithms is the Historic-OHLCVs which uses the CCXT open source library to extract one minute candles from any exchange supported by that library.",
"updated": 1622201355726
},
{
"style": "List",
"text": "Without coding an Algorithm: (available since Beta 10) via the API Data Fetcher Bot, this method involves designing an API Map which is later feeded to an API Data Fetcher Bot at runtime so that it can fetch data from APIs without needing the user to write a single line of code at all.",
"updated": 1621900116590
"text": "Without coding an Algorithm: (available since Beta 10) via the API Data Fetcher Bot. This method involves designing an API Map which is later feed to an API Data Fetcher Bot at runtime. From there it can fetch data from APIs without needing the user to write a single line of code.",
"updated": 1622201515378
},
{
"style": "List",
"text": "External processing: it is also possible to gather the data and process it outside the system, and put it in the right folder, with the right format, and in this way feed the system with data. This use case is not the most popular, but it is a valid possibility.",
"updated": 1621900136004
"text": "External processing: it is also possible to gather data and process it outside the system. Once data has been processed in this manner, it can be put in the right folder, with the right format, and the system will pick it up from there. This use case is not the most popular, but it is a valid possibility.",
"updated": 1622201656015
},
{
"style": "Text",
"text": "Once the data is in the system, it is then processed for different reasons by Indicator Bots. Some of the processed data might be plotted, some might feed machine learning bots, and some might be consumed by a Trading Strategy.",
"updated": 1622189233205
"text": "Once data is within the system, it is then processed for different reasons by Indicator Bots. Some of the processed data might be plotted, some might feed machine learning bots, and some might be consumed by a Trading Strategy.",
"updated": 1622201764822
}
]
}
@@ -3,19 +3,19 @@
"pageNumber": 2,
"type": "Data Mining - Workflows",
"definition": {
"text": "Superalgos enable users to setup powerful data mining operations. At this page we will learn the workflows involved.",
"updated": 1621694789923
"text": "Superalgos enables users to setup powerful data mining operations. This page will introduce the workflows that are involved in data mining.",
"updated": 1622201830789
},
"paragraphs": [
{
"style": "Text",
"text": "In general data flows from the Internet into the Superalgos system. Inside of it, it is processed and reprocessed and finally consumed by trading strategies.",
"updated": 1622189344287
"text": "In general, data flows from the Internet into the Superalgos system. Once inside, it is then processed and reprocessed and finally consumed by trading strategies.",
"updated": 1622201876819
},
{
"style": "Text",
"text": "As more users jump in and create more assets that they share with the community, the data mining capabilities of the system expands.",
"updated": 1622189375502
"style": "Note",
"text": "As more users jump in to contribute and create more assets that they share with the community, the data mining capabilities of the system will expand.",
"updated": 1622201931367
},
{
"style": "Title",
@@ -27,18 +27,22 @@
},
{
"style": "List",
"text": "Sensor Bot Workflow: Data arrives into the system through a Sensor Bot. In this main workflow, the resulting dataset serves as an input for an Indicator Bot that will further process it. Why? Because the data arrives in a format that is not standarized to be consumed from trading strategies or plotted at the charts just yet (except for Webhooks that records data in Single-File Dataset type and can be consumed by plotters and trading strategies).",
"updated": 1622189468973
"text": "Sensor Bot Workflow: Data arrives into the system through a Sensor Bot. In this main workflow, the resulting dataset serves as an input for an Indicator Bot that will further process it. ",
"updated": 1622202312743
},
{
"style": "Success",
"text": "Why? Because the data arrives in a format that is not standardized to be consumed by trading strategies or plotted at the charts just yet (except for Webhooks that record data in the Single-File Dataset type which can be consumed by plotters and trading strategies)."
},
{
"style": "List",
"text": "API Data Fetcher Bot Workflow: Data arrives into the system through a API Data Fetcher Bot. In this main workflow, the resulting dataset serves as an input for an Indicator Bot that will further process it.",
"updated": 1621695610873
"text": "API Data Fetcher Bot Workflow: Data arrives into the system through an API Data Fetcher Bot. In this main workflow, the resulting dataset serves as an input for an Indicator Bot that will further process it.",
"updated": 1622202181798
},
{
"style": "Note",
"text": "The data just arrived from an external source is considered Raw Data. Both of these 2 workflows produce Raw Data that has to be digested by Indicator Bots.",
"updated": 1621900437233
"text": "The data arriving from an external source is considered Raw Data. Both of these 2 workflows produce Raw Data that has to be digested by Indicator Bots.",
"updated": 1622202291043
},
{
"style": "Subtitle",
@@ -51,13 +55,13 @@
},
{
"style": "List",
"text": "Standardize Datasets: They are used for standardization of raw data extracted from the Internet by a Sensor Bot or an API Data Fetcher Bot. Once data is standardized, it can be run through other Indicator Bots that will extract the juice out of them. Once standardized, data can also be plotted and consumed by Trading Strategies. By standardizing we are specifically referring to transforming the data into a Dataset type that can be used for Plotting, to feed Learning Bots and Trading Bots. These Dataset types are Multi-Time-Frame-Daily and Multi-Time-Frame-Market.",
"updated": 1622190462143
"text": "Standardize Datasets: They are used for standardization of raw data extracted from the Internet by a Sensor Bot or an API Data Fetcher Bot. Once data is standardized, it can be run through other Indicator Bots that will extract the juice out of them. Once standardized, data can also be plotted and consumed by Trading Strategies. By standardizing, we are specifically referring to transforming the data into a Dataset type that can be used for plotting charts, or feeding Learning and Trading Bots. These Dataset types are Multi-Time-Frame-Daily and Multi-Time-Frame-Market.",
"updated": 1622203207179
},
{
"style": "List",
"text": "Process Data: This means processing the data in any way which make sense for users. Many of this processing end up calculating standard indicators, others calculate non-standard stuff, maybe just user's ideas of what could be useful to extract from a certain dataset. The system is open and allows users to do just that, play with the data transforming it in any way they wish.",
"updated": 1622190245827
"text": "Process Data: This means processing the data in any way that makes sense for users. Many users use Indicator Bots to calculate standard indicators, others calculate non-standard stuff, even ideas of what could be useful to extract from a certain dataset can be implemented. The system is open and allows users to do just that, play with the data by transforming it in any way they wish.",
"updated": 1622203469938
},
{
"style": "Subtitle",
@@ -66,12 +70,12 @@
},
{
"style": "Text",
"text": "Plotters are tools for users, not for bots. Plotters will render at the charts informations of a Dataset based on the plotter's definitions. Plotters can only read data from certain Dataset types, you will learn which ones later at this Topic.",
"updated": 1622190504661
"text": "Plotters are tools for users, not for bots. Plotters will render the information of a Dataset at the charts based on the plotter's definition. This allows users to visually discover patterns in datasets and generate ideas. These ideas can then help the user decide how to process the data further or feed the data to a Learning Bot or a Trading Bot.",
"updated": 1622203827359
},
{
"style": "Text",
"text": "Plotters are used by users to visually discover patterns in datasets and generate ideas, which can be on the side of how to process the data further or how to consume the data from a Learning Bot or a Trading Bot."
"style": "Important",
"text": "Plotters can only read data from certain Dataset types, you will learn which ones later on in this Topic."
},
{
"style": "Subtitle",
@@ -80,7 +84,8 @@
},
{
"style": "Text",
"text": "Learning Bots have access to data mined, and they use it to train their AI Models. Those AI Models once trained, can be used by trading strategies to request predictions and act upon them."
"text": "Learning Bots have access to mined data which they use to train their AI Models. Once trained, these AI Models can be used by trading strategies to request predictions and act upon them.",
"updated": 1622204001242
},
{
"style": "Subtitle",
@@ -89,8 +94,8 @@
},
{
"style": "Text",
"text": "Trading bots are the ultimate consumer of data, which they use to take trading decisions based on their definitions. The ultimate purpose of the whole Data Mining operation is to digest data so that it is easily accessible for trading strategies.",
"updated": 1622190585840
"text": "Trading bots are the ultimate consumer of data. They use the data they receive to make trading decisions based on their definitions. The ultimate purpose of the whole Data Mining operation is to digest data so that it is easily accessible for trading strategies.",
"updated": 1622204325508
}
]
}
@@ -3,8 +3,8 @@
"pageNumber": 3,
"type": "Data Mining - Dataset Types",
"definition": {
"text": "Superalgos organizes data in datasets. These datasets are standardized across the system in different types.",
"updated": 1622190798240
"text": "Superalgos organizes data into datasets. These datasets are standardized across the system using different type definitions.",
"updated": 1622204454559
},
"paragraphs": [
{
@@ -12,15 +12,24 @@
"text": "Dataset List",
"updated": 1622052318412
},
{
"style": "Title",
"text": "Dataset Types",
"updated": 1622227827875
},
{
"style": "Text",
"text": "This is the complete list of Dataset types currently supported by the system:",
"updated": 1622190817372
"text": "This is the complete list of Dataset types currently supported by the system:"
},
{
"style": "List",
"text": "Single-File: As the name suggest, this Dataset contains only one file with all the data in there. It is not frequently used. So far is the Dataset type where data coming from Webhooks is stored at. It is stored in this way because it is assumed that not a lot of data will come through this pipe, only signals produced by external systems. Webhooks feature is expected to evolve in the future managing the incoming data in another type of Dataset. This Dataset type can be plotted and its data consumed by and within Trading Strategies. The API Data Fetcher Bot also can save Raw Data in this type of dataset, if needed.",
"updated": 1622190927687
"text": "Single-File: As the name suggests, this Dataset consists of only one file containing all the data. This Dataset type can be plotted and its data consumed by and within Trading Strategies. The API Data Fetcher Bot can also save Raw Data in this type of dataset, if needed.",
"updated": 1622204763019
},
{
"style": "Note",
"text": "The Single-File Dataset type is not frequently used. Currently, it is the Dataset type used to store data coming from Webhooks. It is stored in this way because it is assumed that not a lot of data will come through this pipe, only signals produced by external systems. The Webhooks feature is expected to evolve in the future managing the incoming data in another type of Dataset.",
"updated": 1622204852370
},
{
"style": "List",
@@ -38,7 +47,7 @@
"updated": 1622191087786
},
{
"style": "Note",
"style": "Success",
"text": "By far, the most popular Dataset Types are Multi-Time-Frame-Daily and Multi-Time-Frame-Market. "
}
]
@@ -3,14 +3,18 @@
"pageNumber": 4,
"type": "Data Mining - Datasets Type Conversions",
"definition": {
"text": "Processes fetching data from the Internet are optimized for accessing a wide range of APIs available out there. The Dataset Type they use to store raw data is usually not the best one for data consumption within the system. For that reason Dataset Type conversions needs to be done.",
"updated": 1622191231588
"text": "Processes fetching data from the Internet are optimized for accessing a wide range of APIs available out there. The Dataset Type they use to store raw data is usually not the best one for data consumption within the system. For that reason Dataset Type conversions need to be done.",
"updated": 1622205220555
},
"paragraphs": [
{
"style": "Title",
"text": "Types of Dataset Conversions",
"updated": 1622227863425
},
{
"style": "Text",
"text": "The type of conversions currently implemented into the system are:",
"updated": 1622191259939
"text": "The type of conversions currently implemented within the system are:"
},
{
"style": "List",
@@ -24,7 +28,8 @@
},
{
"style": "Subtitle",
"text": "How to convert from one Dataset type to another"
"text": "How to Convert from One Dataset Type to Another",
"updated": 1622205287155
},
{
"style": "Text",
@@ -33,8 +38,8 @@
},
{
"style": "List",
"text": "Custom Code: Users can write code to handle the conversion in cases the standard converter is not available for the type of conversion needed.",
"updated": 1621711355058
"text": "Custom Code: Users can write code to handle the conversion in cases where the standard converter is not available for the type of conversion needed.",
"updated": 1622205316515
},
{
"style": "List",
@@ -43,8 +48,8 @@
},
{
"style": "Subtitle",
"text": "Custom Code Exmaple",
"updated": 1621699475475
"text": "Custom Code Example",
"updated": 1622205366974
},
{
"style": "Text",
@@ -53,7 +58,8 @@
},
{
"style": "Note",
"text": "The reason this was implemented as custom code is because when it was needed there was no standard converter implemented and still this was not migrated to the currently existing one."
"text": "The reason this was implemented as custom code is because when it was needed there was no standard converter and it has not been migrated to the currently existing one.",
"updated": 1622205482848
},
{
"style": "Subtitle",
@@ -62,13 +68,13 @@
},
{
"style": "Text",
"text": "The Asset Metrics Indicator Bot, defined at the Messari Data Mine uses a Standard Converter from One-Min-Daily Dataset type to Multi-Time-Frame-Daily and Multi-Time-Frame-Market Dataset types. To use the converter, the bot's Process Definition nodes need to have at their config the framework of this converter.",
"updated": 1621901387602
"text": "The Asset Metrics Indicator Bot, defined at the Messari Data Mine, uses the Standard Converter from One-Min-Daily Dataset type to Multi-Time-Frame-Daily and Multi-Time-Frame-Market Dataset types. In order to use the converter, the bot's Process Definition nodes needs to have a framework of the converter defined within its config.",
"updated": 1622205718679
},
{
"style": "Text",
"text": "To convert to Multi-Time-Frame-Daily, set the framework name like in this example:",
"updated": 1621701835162
"text": "To convert to Multi-Time-Frame-Daily, set the framework name as follows:",
"updated": 1622205768649
},
{
"style": "Json",
@@ -77,8 +83,8 @@
},
{
"style": "Text",
"text": "To convert to Multi-Time-Frame-Market, set the framework name like in this example:",
"updated": 1621701845744
"text": "To convert to Multi-Time-Frame-Market, set the framework name like this:",
"updated": 1622205804137
},
{
"style": "Json",
@@ -7,38 +7,33 @@
"updated": 1621705750736
},
"paragraphs": [
{
"style": "Text",
"text": "When running custom code, users have full control of the process and there is no limit on what it can be done in terms of data manipulation. The trade off is that the user must be a developer.",
"updated": 1621902338195
},
{
"style": "Text",
"text": "On the other hand, by running one of the available frameworks, an indicator can do powerful stuff leaving to the user the task to write only a very tiny piece of code to do the data transformations. In this case the flexibility is reduced comparing to custom code.",
"updated": 1621705829052
},
{
"style": "Note",
"text": "You don't need to be a developer to write these code snippets, most of the time are very simple javascript code.",
"updated": 1622195430462
},
{
"style": "Text",
"text": "Here we will see examples of each use case and list all the currently available indicator frameworks users can use."
},
{
"style": "Title",
"text": "Types of Indicators Implementations"
"text": "Types of Indicator Implementations",
"updated": 1622211317016
},
{
"style": "List",
"text": "Custom Code: This means the Indicator Bot will use custom made code to handle all data transformations.",
"updated": 1621902418790
},
{
"style": "Note",
"text": "When running custom code, users have full control of the process and there is no limit on what can be done in terms of data manipulation. The trade off is that the user must be a developer."
},
{
"style": "List",
"text": "UI-Defined: This means that the Indictor Bot will base its behaviour on the definitions at the UI including the code snippets provided by the user.",
"updated": 1622195507610
"text": "UI-Defined: This means that the Indictor Bot will base its behaviour on the definitions at the UI including available frameworks, as well as the code snippets provided by the user.",
"updated": 1622211583849
},
{
"style": "Note",
"text": "By running one of the available frameworks, an indicator can do powerful stuff while only leaving the task of writing a very tiny piece of code to do the data transformations. In this case the flexibility is reduced comparing to custom code, but ease of development is greatly increased.",
"updated": 1622211470919
},
{
"style": "Success",
"text": "You don't need to be a developer to write these code snippets, most of the time they are very simple javascript code."
},
{
"style": "Title",
@@ -65,13 +60,13 @@
},
{
"style": "Subtitle",
"text": "How to Implement them",
"updated": 1621711303350
"text": "How to Implement Custom Code",
"updated": 1622212152208
},
{
"style": "Text",
"text": "The way to implement a Custom Code Indicator tell the Bot at the config of the Process Definition that there is custom code for this process. Specifically, you need to add the botModule property to the config. This is how it looks like.",
"updated": 1621902538119
"text": "The way to implement a Custom Code Indicator is to set up the config for the Bot's Process Definition using the botModule property. This tells the bot that there will be custom code used for this Indicator. This is an example of what it should look like:",
"updated": 1622212134508
},
{
"style": "Json",
@@ -84,14 +79,14 @@
"updated": 1622195849390
},
{
"style": "Text",
"style": "Success",
"text": "Most likely your new Bot will be added to the Superalgos project, so you should find the Project Schema File inside the Projects folder.",
"updated": 1622196885148
},
{
"style": "Text",
"text": "The definition to be added there should look something like this:",
"updated": 1621902599128
"text": "The definition you will need to add in the Schema file should look something like this:",
"updated": 1622212304362
},
{
"style": "Json",
@@ -100,8 +95,8 @@
},
{
"style": "Text",
"text": "After that you will need to add to the codebase a new Javascript module with your code.",
"updated": 1621902622372
"text": "Finally, you will need to add a new Javascript module with your code to the codebase using the same file name you defined in the Schema file.",
"updated": 1622212386180
},
{
"style": "Title",
@@ -144,12 +139,13 @@
},
{
"style": "Subtitle",
"text": "How to use those Frameworks",
"updated": 1621711329707
"text": "How to Use an Indicator Framework",
"updated": 1622212547671
},
{
"style": "Text",
"text": "In all cases, to use an Indicator Framework at your Indicator Bot all you need to do is to specify the framework name at the Process Definition. "
"text": "In order to use a framework at your Indicator Bot, all you need to do is specify the framework name at the Process Definition under the framework property.",
"updated": 1622212711775
},
{
"style": "Text",
@@ -163,8 +159,8 @@
},
{
"style": "Text",
"text": "In this other example, the process will use the Multi-Time-Frame-Market framework.",
"updated": 1622197516426
"text": "Here is an example using the Multi-Time-Frame-Market framework.",
"updated": 1622212639925
},
{
"style": "Json",
@@ -0,0 +1,178 @@
{
"topic": "Data Mining",
"pageNumber": 6,
"type": "Data Mining - 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. In other words, Data Mines are user created packages of definitions. These definitions usually include Sensor Bot, Indicator Bot and Plotter definitions. The Data Mines shipped with Superalgos are packages contributed by users of the software.",
"updated": 1622238150464
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos puts a powerful data processing and visualization system into your hands. Use it to the fullest and you will see your intelligence increase by orders of magnitude.",
"updated": 1622235471834
},
{
"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 to the charting system.",
"updated": 1622235587518
},
{
"style": "Title",
"text": "How Bots Use Data Mines"
},
{
"style": "Text",
"text": "It is important to undestand that a Data Mine is a package of definitions. When users run a Bot, they do it inside a Task. This task needs to know how to run the bot. In order to find this out, the bot within the task must have a reference to a Process Definition exisiting at a Data Mine. When the bot is launched inside the task, at that moment, it receives all the information regarding the task that is being used to launch the bot, while at the same time it also receives the information regarding the Bot's definition from the Data Mine."
},
{
"style": "Important",
"text": "Using both sides of this information (Task data and Bot definition) the Bot is able to do it's job.",
"updated": 1622238315541
},
{
"style": "Title",
"text": "Who Creates Data Mines?"
},
{
"style": "Text",
"text": "Data Mines are created by power users and contributed to the project (the ones shipping with the software). Users might create Data Mines for their personal use and never share them. However, if they share them, they receive SA tokens for that, and also for adapting and mantaining them, if necessary, for each new release."
},
{
"style": "Title",
"text": "Supported Bots"
},
{
"style": "Text",
"text": "There are three types of bots that can hold their definitions at a Data Mine."
},
{
"style": "List",
"text": "Sensor Bots: used to fetch data from some Internet source by coding a specialized algorithm."
},
{
"style": "List",
"text": "API Data Fetcher Bots: used to fetch data from an Internet API without needing to code."
},
{
"style": "List",
"text": "Indicator Bots: used to process data."
},
{
"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
},
{
"style": "Title",
"text": "Interdependency of Data Mines"
},
{
"style": "Text",
"text": "Data Mines might depend on other Data Mines. What this means is the bots within a Data Mine may depend on bots belonging to other Data Mines. Further on in this Topic, you will learn more about how a bot can depend on other bots in detail. In a nutshell, they can depend in 3 ways. They can have a:"
},
{
"style": "List",
"text": "Data Dependency: This means that a Bot uses as an input the data produced by another bot."
},
{
"style": "List",
"text": "Status Dependency: This means that a Bot uses the status of another Bot as parameters for it's own processing."
},
{
"style": "Success",
"text": "The most common use case is when a Bot needs the date on which a market starts or ends. This information is automatically fetched from the Status Report of the bot that produces the raw data because it knows which data is the oldest and the newest at all times.",
"updated": 1622237821439
},
{
"style": "List",
"text": "Execution Dependency: This means that a Bot depends on other Bot execution to finish in order for it to start it's own execution."
},
{
"style": "Important",
"text": "When a Data Mine depends on another Data Mine, both need to be present at the Workspace where the Task executing the Bot is located.",
"updated": 1622237827110
}
]
}
@@ -1,77 +0,0 @@
{
"topic": "Data Mining",
"pageNumber": 6,
"type": "Data Mining - Data Mines",
"definition": {
"text": "Data Mines are user created packages of definitions. These definitions usually include Sensor Bot, Indicator Bot and Plotter definitions. The Data Mines shipped with Superalgos are packages contributed by users of the software.",
"updated": 1621708561783
},
"paragraphs": [
{
"style": "Text",
"text": "It is important to undestand that a Data Mine is a package of definitions. When users run a Bot, they do it inside a Task and they need to reference a Process Definition exisiting at one Data Mine. When the bot is launched inside the Task, it receives at that moment all the information regarding the Task that is being used to launch the bot, but at the same time it receives all the information regarding the the Bot's definitions at the Data Mine.",
"updated": 1621709219036
},
{
"style": "Text",
"text": "With all that information the Bot is able to do it's job."
},
{
"style": "Title",
"text": "Who creates them?"
},
{
"style": "Text",
"text": "Data Mines are created by power users and contributed to the project (the ones shipping with the software). Users might create Data Mines for their personal use and never share them. If they share them, they receive SA tokens for that, and also for mantaining them to adapt them to every new release, if necesary.",
"updated": 1622188509380
},
{
"style": "Title",
"text": "Supported Bots"
},
{
"style": "Text",
"text": "There are three types of bots that can hold their definitions at a Data Mine."
},
{
"style": "List",
"text": "Sensor Bots: used to fetch data from some source at the Internet by coding a specialized algorithm for that."
},
{
"style": "List",
"text": "API Data Fetcher Bots: used to fetch data from an Internet API without needing to code."
},
{
"style": "List",
"text": "Indicator Bots: used to process data."
},
{
"style": "Title",
"text": "Interdependency of Data Mines",
"updated": 1621709799491
},
{
"style": "Text",
"text": "Data Mines might depend of other Data Mines if any of their bots depend on bots belonging to other Data Mines. You will learn further down this Topic how a bot can depend on other bots in detail. In a nutshell, they can depend in 3 ways. They can have a:",
"updated": 1621903084681
},
{
"style": "List",
"text": "Data Dependency: This means that a Bot uses as an input the data produced by another bot."
},
{
"style": "List",
"text": "Status Dependency: This means that a Bot uses the status of another Bot as parameters for it's own process. The most common use case is when a Bot needs for instance the date where a market starts or ends. This information is automatically fetched from the Status Report of the bot that produces the raw data and knows which data is the oldest and the newest all the time."
},
{
"style": "List",
"text": "Execution Dependency: This means that a Bot depends on other Bot execution to finish in order for it to start it's own execution.",
"updated": 1621709849717
},
{
"style": "Note",
"text": "When a Data Mine depends on another Data Mine, both need to be present at the Workspace where the Task defining the execution of the Bot is located.",
"updated": 1621903174117
}
]
}
@@ -3,58 +3,87 @@
"pageNumber": 7,
"type": "Data Mining - Managing Execution",
"definition": {
"text": "Bots can execute at their own pace or they can wait for other bots to finish executing in order for them to start.",
"updated": 1621903220369
"text": "Bots can execute at their own pace or they can wait for other bots to finish executing before starting.",
"updated": 1622214711890
},
"paragraphs": [
{
"style": "Text",
"text": "Usually when a bot produces raw data, it executes itself based on the configuration of it's Process Definition node. These bots are usually the root of an execution tree formed by all the bots that will process and reprocess the raw data into more and more elaborate datasets.",
"updated": 1621710144112
"style": "Title",
"text": "Bot Execution Tree",
"updated": 1622215214005
},
{
"style": "Text",
"text": "There are two types of execution managment."
"text": "A helpful way to think about managing bot execution is to think of the image of a tree. The roots support the trunk which supports the branches. In the same way, Superalgos uses many bots to process data each relying on the output of the last to form a tree. As data is passed through the tree the raw data is processed and reprocessed to build more and more elaborate datasets.",
"updated": 1622215593975
},
{
"style": "Title",
"text": "Types of Execution Managment"
},
{
"style": "Text",
"text": "There are two types of execution managment:"
},
{
"style": "List",
"text": "Standalone Bots: These bots are the root of the Bot Execution Tree. They don't depend on any other bot to run. They usually run on a pre-defined schedulle, in most cases every one minute.",
"updated": 1621710324631
"text": "Standalone Bots: These bots are the root of the Bot Execution Tree. They don't depend on any other bot to run but use the configuration of it's Process Definition node to run on a pre-defined schedule (in most cases every one minute).",
"updated": 1622215038717
},
{
"style": "Note",
"text": "Usually when a bot produces raw data, it operates as a standalone bot. ",
"updated": 1622215509477
},
{
"style": "List",
"text": "Execution Dependent Bots: These bots are the branches of the Bot Execution Tree and they need to wait for another Bot to finish it's execution in order for it to start.",
"updated": 1621710352983
"text": "Execution Dependent Bots: These bots are the branches of the Bot Execution Tree. They need to wait for other Bots to finish their execution in order to start.",
"updated": 1622215195801
},
{
"style": "Title",
"text": "Configuring a Standalone Bot",
"updated": 1622215700788
},
{
"style": "Text",
"text": "This is an example of how to configure a bot to be a Standalone Bot from the execution point of view. As you can see in the example below, the normalWaitTime property has a non zero value, in this case 60 seconds.",
"updated": 1621710692139
"text": "This is an example of how to configure a bot to execute as a Standalone Bot. Within the Process Definition of a Bot, the normalWaitTime property has a non zero value, in this case 60 seconds.",
"updated": 1622215895631
},
{
"style": "Json",
"text": "{\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}",
"updated": 1621710641664
"text": "{\n \"codeName\": \"Historic-OHLCVs\",\n \"description\": \"Retrieves and saves historical market data\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 60000,\n \"retryWaitTime\": 10000,\n \"botModule\": \"Exchange Raw Data Historic OHLCVs\"\n}",
"updated": 1622215784605
},
{
"style": "Title",
"text": "Configuring an Execution Dependent Bot",
"updated": 1622215826932
},
{
"style": "Text",
"text": "This is how to configure the Process Definition of a Bot that it's execution depends on other Bot. Here the normalWaitTime has a value of zero, which will force the Bot to inmediatelly run the next loop, but since there is an Execution Started Event defined, that will make it wait until the referenced Bot finishes.",
"updated": 1621903624630
"text": "In order to configure a bot to execute as an Execution Dependent Bot two things need to be in place. ",
"updated": 1622216289412
},
{
"style": "List",
"text": "First, the bot's definition will need to have an Execution Started Event defined. After this, the Execution Started Event will need to have a reference to the Execution Finished Event of the Bot on which it is waiting.",
"updated": 1622216544766
},
{
"style": "List",
"text": "Second, the Bot's Process Definition will need a zero in the normalWaitTime property. This will force the Bot to immediately run the next loop, but since there is an Execution Started Event defined, that will make it wait until the referenced Bot finishes.",
"updated": 1622216345546
},
{
"style": "Json",
"text": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}",
"updated": 1621710596317
},
{
"style": "Success",
"text": "In this case users must also define which bot to wait for. To do this they stablish a reference from the Execution Started Event node of the Bot that needs to wait, to the Execution Finished Event of the Bot they are waiting for to finish.",
"updated": 1621710539966
},
{
"style": "Note",
"text": "From the deployment point of view, the dependant bots can be physically located at the same machine, or at multiple different machines. Superalgos handles the syncronization across multiples machines.",
"updated": 1621903914878
"text": "From a deployment point of view, the dependant bots can be physically located on the same machine, or on multiple different machines. Superalgos handles syncronization across multiples machines.",
"updated": 1622216626010
}
]
}
@@ -3,35 +3,48 @@
"pageNumber": 8,
"type": "Data Mining - Data Dependencies",
"definition": {
"text": "Indicator Bots have data dependencies. That means that they have as their input a Dataset created by other Bot. ",
"updated": 1621715782447
"text": "Indicator Bots have data dependencies. This means that they receive their input as Datasets created by other Bots.",
"updated": 1622216765574
},
"paragraphs": [
{
"style": "Text",
"text": "You can also think about data dependencies as a type of relationship between bots. Bots producing raw data (Sensor Bot and API Data Fetcher Bot) don't have them, since their job is to extract data from an external source. At the same time they are the root of a tree or graph of data dependencies relationships.",
"updated": 1621715986533
"style": "Title",
"text": "Data Dependency Tree",
"updated": 1622219215680
},
{
"style": "Text",
"text": "The data dependencias are in fact at the Process Definition level. Each process might have their own set of data dependencies. "
"text": "You can think about data dependencies as a type of relationship between bots. Bots producing raw data (Sensor Bot and API Data Fetcher Bot) don't have them, since their job is to extract data from an external source. At the same time, they are also the root of the data dependancy tree of relationships. This tree is very similar to the execution tree but instead of describing how bots run, it describes how bots send and receive Data Products.",
"updated": 1622217397887
},
{
"style": "Title",
"text": "Defining Data Dependencies",
"updated": 1622217419549
},
{
"style": "Text",
"text": "The definition of data dependencias is held at the Process Definition level. Each process might have its own set of data dependencies. This means that a single bot may have many varying dependencies depending on the number of Process Definitions it contains."
},
{
"style": "Note",
"text": "It is possible for a single Bot's process to have more than one Data Dependency, from the same Bot or from different Bot's. That is particulary usefull to aggregate data from many datasets into another one. The dependent datasets could belong to Bots at the same Data Mine or at bots at other Data Mines. From the deployment point of view, the dependant datasets could be physically located at the same machine, or at multiple different machines."
"text": "In addtion to this, it is possible for a single Bot's process to have more than one Data Dependency (from the same Bot or from different Bots). That is particulary useful to aggregate data from many datasets into another one. The dependent datasets could belong to Bots at the same Data Mine or at bots at other Data Mines.",
"updated": 1622217595798
},
{
"style": "Text",
"text": "The first declared dependency is called the Main Dependency and has a special meaning. The process of the Bot is going to iterate the Dataset of the Main Dependency to produce the output Dataset. All other data dependencies will be used to extract data from."
"text": "The first declared dependency is called the Main Dependency and has a special meaning. It is used by the process of the Bot to iterate. What this means is that the process will loop over the Dataset of the Main Dependency to produce the output Dataset. All the other data dependencies will be used each iteration to extract additional data.",
"updated": 1622218002546
},
{
"style": "Success",
"text": "As with bot execution, the dependant datasets can be physically located on the same machine, or at multiple different machines. However, when a Bot has a Data Dependency of a dataset produced by a Bot defined at a different Data Mine, both Data Mines must be present at the Workspace where the Bot is going to be launched.",
"updated": 1622218098435
},
{
"style": "Text",
"text": "When a Bot has a Data Dependency of a dataset produced by a Bot defined at a different Data Mine, then both Data Mines must be present at the Workspace where the Bot is going to be lauched at.",
"updated": 1621903950116
},
{
"style": "Text",
"text": "The Masters Data Mine is the most referenced Data Mine because is the one that defines the Candles-Volumes Indicator Bot, that produces the most used information for trading systems: Candles."
"text": "The Candles Data Mine is the most referenced Data Mine because it defines the Candles-Volumes Indicator Bot, that produces the most used information for trading systems: Candles.",
"updated": 1622218178970
}
]
}
@@ -3,23 +3,33 @@
"pageNumber": 9,
"type": "Data Mining - Status Reports",
"definition": {
"text": "Status Reports are files produced by each Bot's processes with some key information that the Bot needs to save in order to remember it the next time is run.",
"updated": 1621904046327
"text": "Status Reports are files produced by each Bot's processes with key information the Bot needs to save in order to remember the next time it is run.",
"updated": 1622218351726
},
"paragraphs": [
{
"style": "Text",
"text": "Most Bots in Superalgos are run by the Task Server and they implement a Main Loop. At each loop execution, bots do their job and at the end they go to sleep. How much time they sleep and other details are configured at the Bot's Process Definition.",
"updated": 1621904131214
"style": "Title",
"text": "The Task Server Main Loop",
"updated": 1622218578406
},
{
"style": "Text",
"text": "Before going to sleep, all the memory is flushed from all information related to the Bot, so that hardware resources are freed for other bots in the same machine to use. There is some info Bots need to remember between every execution of the Main Loop, and between executions of the Task itself. That info is stored in a JSON / text file called the Status Report.",
"updated": 1621904194069
"text": "Most Bots in Superalgos are run by the Task Server and implement a Main Loop. At each loop execution, bots do their job and at the end they go to sleep. ",
"updated": 1622218637972
},
{
"style": "Note",
"text": "How much time they sleep and other details are configured at the Bot's Process Definition."
},
{
"style": "Title",
"text": "Status Report Mechanics",
"updated": 1622218611081
},
{
"style": "Text",
"text": "The name Status was used since the information stored is often the status of the Bot's process. Here is an example of a simple Status Report file."
"text": "Before a bot goes to sleep, computer memory is flushed of all information related to the Bot. This is important to free up hardware resources for other bots running on the same machine. However, there is some information Bots need to remember between each execution of the Main Loop, and between executions of the Task itself. That info is stored in a JSON / text file called the Status Report. The name Status was used since the information stored is often the status of the Bot's process. Here is an example of a simple Status Report file:",
"updated": 1622218847283
},
{
"style": "Json",
@@ -28,8 +38,8 @@
},
{
"style": "Note",
"text": "Status Report files also might include a data structure called Inter Execution Memory. Status information is kind of standard for all types of bots. Inter Execution Memory on the other hand, depends on each Bot type and what is actually processing.",
"updated": 1621904260686
"text": "Status Report files might also include a data structure called Inter Execution Memory. Status information is standard for all types of bots. Inter Execution Memory, on the other hand, depends on each Bot's type and what is actually being processed.",
"updated": 1622218782345
},
{
"style": "Text",
@@ -3,24 +3,32 @@
"pageNumber": 10,
"type": "Data Mining - Status Dependencies",
"definition": {
"text": "Status Dependencies is a type of relationship between Bots. Sometimes bots don't depend on the Datasets produced by other bots, but they depend directly on the status of other bots.",
"updated": 1621717479906
"text": "Status Dependencies are another type of relationship between Bots. Sometimes bots don't depend on the Datasets produced by other bots, but they depend directly on the status of other bots.",
"updated": 1622219077845
},
"paragraphs": [
{
"style": "Text",
"text": "A good way to undestand why Status Dependencies are needed is with an example:",
"updated": 1621717585017
"style": "Title",
"text": "Status Dependency Tree",
"updated": 1622219244127
},
{
"style": "Text",
"text": "The Indicator Bot Bollinger-Bands depends on Candles-Volumes Dataset in order to calculate the Bollinger Bands, but it depend's on Exchange Raw Data Sensor Bot in order to know where the market begins, which is the date of the first piece of data. That information is part of the Status information that Exchange Raw Data Sensor Bot keeps at it's Satus Report.",
"updated": 1621717669486
"text": "Status dependencies operate using the same idea of a tree as execution and data dependencies. Any Bot can have from zero to many status dependencies. For each Status Dependency, the Bot's process at runtime will load the Status Report file of the dependent Bot and will extract from there the information it needs.",
"updated": 1622222998840
},
{
"style": "Note",
"text": "Bots that produce Raw Data usually do not depend on any other Bot's status and are usually the root of a status dependency tree. "
},
{
"style": "Text",
"text": "Bots that produce Raw Data usually do not depend on any other Bot's status and they are usually the root of a dependency tree or graph. Any Bot can have from zero to many status dependencies. For each Status Dependency, the Bot's process at runtime will load the Status Report file of the dependent Bot and will extract from there the information it needs.",
"updated": 1621904417277
"text": "A good way to undestand why Status Dependencies are needed is with an example:"
},
{
"style": "Text",
"text": "The Indicator Bot Bollinger-Bands depends on Candles-Volumes Dataset in order to calculate the Bollinger Bands, but it depend's on Exchange Raw Data Sensor Bot in order to know where the market begins, which is the date of the first piece of data. That information is part of the Status information that Exchange Raw Data Sensor Bot keeps at it's Status Report.",
"updated": 1622223640276
},
{
"style": "Title",
@@ -29,21 +37,22 @@
},
{
"style": "Text",
"text": "A Status Dependency can be classified by it's utility. This make it easier for processes to handle them in code. There are currently three different utilities:",
"updated": 1621904453267
"text": "A Status Dependency can be classified by it's utility. This makes it easier for processes to handle them in code. There are currently three different utilities:",
"updated": 1622223177318
},
{
"style": "List",
"text": "Self Reference: this is used to load it's own Status Report to extract data from it or modify it."
},
{
"style": "List",
"text": "Market Ending Point: this means that the referenced Status Report is to be used to extract the information of where the market ends, meaning which date the market ends."
"text": "Self Reference: this is used to load a bot's Status Report to extract data from it or modify it.",
"updated": 1622223714025
},
{
"style": "List",
"text": "Market Starting Point: this means that the referenced Status Report is to be used to extract the information of where the market begins.",
"updated": 1621718175842
"updated": 1622223349370
},
{
"style": "List",
"text": "Market Ending Point: this means that the referenced Status Report is to be used to extract the information of where the market ends, meaning which date the market ends."
},
{
"style": "Important",
@@ -3,19 +3,19 @@
"pageNumber": 11,
"type": "Data Mining - Deployments",
"definition": {
"text": "Data Minign Bots can be deployed into one or many machines at the same time and they will automatically find the way too coordinate their actions.",
"updated": 1621718512909
"text": "Data Mining Bots can be deployed into one or many machines at the same time and they will automatically find the way too coordinate their actions.",
"updated": 1622225530181
},
"paragraphs": [
{
"style": "Text",
"text": "Once you are done defining your data mining Bots, you can move the Tasks that execute them to other Network Nodes and some other node structures at the Network hierarchy and the bot's will still run even from different machines on the network.",
"updated": 1621719049976
"text": "Once you are done defining your data mining Bots, you can move the Tasks that execute them to other Network Nodes and some other node structures within the Network hierarchy. The bot's will still run even from different machines on the network.",
"updated": 1622226742772
},
{
"style": "Title",
"text": "How does Superalgos know how to coordinate Bots?",
"updated": 1621904714762
"text": "How Does Superalgos Know How to Coordinate Bots?",
"updated": 1622226151968
},
{
"style": "Text",
@@ -24,26 +24,28 @@
},
{
"style": "List",
"text": "In Data Mines: The definitions at the Data Mine contain the 3 types of relationships between Bots. Execution, Data Dependency and Status Dependency. "
"text": "In Data Mines: The definitions at the Data Mine contain the 3 types of relationships between Bots: Execution Dependency, Data Dependency and Status Dependency.",
"updated": 1622226774180
},
{
"style": "List",
"text": "At the Network: The Network hierarchy contains all the information needed to know where the dependent bots are running (looking at the Tasks we can know at which machine in the network) and where the Datasets are in the network (looking at the Data Storage section)."
"text": "At the Network: The Network hierarchy contains all the information needed to know where the dependent bots are running. Looking at the Tasks on the network node, we can know which bots are running on a particular machine in the network. Looking at the Data Storage hierarchy, we can know where Datasets are being storied in the network.",
"updated": 1622226083877
},
{
"style": "Title",
"text": "How does a Bot know where are it's dependencies running?",
"updated": 1621904824161
"text": "How Does a Bot Know Where Its Dependencies are Running?",
"updated": 1622226168096
},
{
"style": "Text",
"text": "Everytime a Task is executed, the whole Network hierarchy, together with the bot's definitions at Data Mines are sent to the Task Server. This includes not only the Bot to be ran definitions, but also all the definitions of the dependent bots. ",
"updated": 1621904939603
"text": "Everytime a Task is executed, the whole Network hierarchy, together with the bot definitions at the Data Mines are sent to the Task Server. This includes not only the running Bot's definition, but also all the definitions of the dependent bots.",
"updated": 1622226410465
},
{
"style": "Success",
"text": "At runtime, Superalgos will provide the Bot with the Datasets defined at Data Depencies, the Status Reports defined as Status Dependencies and if necesary, it iwll help the Bot wait for the Bot defined as an Execution Dependency, no matter where all those resources are within the physical network.",
"updated": 1621905102590
"text": "At runtime, Superalgos will provide the Bot with the Datasets defined at Data Depencies, the Status Reports defined as Status Dependencies, and if necessary, it will help the Bot wait for the Bot defined as an Execution Dependency, no matter where all those resources are within the physical network.",
"updated": 1622226870002
}
]
}
@@ -3,14 +3,14 @@
"pageNumber": 12,
"type": "Data Mining - Products",
"definition": {
"text": "All Datasets of any type of bot within the Superalgos system are considered products of the Bot that produced them. Why products? Because users will be able to sell hese datasets in the form of subscriptions once the Superalgos Network is implemented.",
"updated": 1621905194343
"text": "All Datasets of any type created by bots within the Superalgos system are considered data products of the Bot that produced them. Why products? Because users will be able to sell these datasets in the form of subscriptions once the Superalgos Network is implemented.",
"updated": 1622226983424
},
"paragraphs": [
{
"style": "Text",
"text": "In the future, users will be able to offer products to the rest of the users of the Superalgos Network / Superalgos Marketplace. A single bot might produce as many products as the bot designer wishes. Each product might contain one or more datasets.",
"updated": 1621905284676
"text": "In the future, users will be able to offer products to the rest of the users within the Superalgos Network / Superalgos Marketplace. A single bot might produce as many products as the bot designer wishes. Each product might contain one or more datasets.",
"updated": 1622227043268
}
]
}
@@ -3,14 +3,14 @@
"pageNumber": 13,
"type": "Data Mining - Plotting",
"definition": {
"text": "Each product might have one Plotter Module associated with it. This Plotter Module has all the definitions needed to interpret the Product's datasets and render the information at the charts.",
"updated": 1621905321330
"text": "Each product may have one Plotter Module associated with it. This Plotter Module has all the definitions needed to interpret the Product's datasets and render the information on a chart.",
"updated": 1622227086801
},
"paragraphs": [
{
"style": "Text",
"text": "Superalgos has the capability to allow it's users to create plotters without writing any code at all. The ploter is defined at the Designer Space, and by the means of defining vertices and polygons, users can create custom charts for any Dataset.",
"updated": 1621905478694
"text": "Superalgos has the capability to allow it's users to create plotters without writing any code. The plotter is defined at the Designer Space. This is done by means of defining vertices and polygons. Users can create custom charts for any Dataset.",
"updated": 1622227235452
}
]
}
@@ -3,8 +3,8 @@
"pageNumber": 14,
"type": "Data Mining - Fetching Data From APIs",
"definition": {
"text": "Superalgos allow it's users to fetch data from any API on the Internet without needing to write code to do it. Instead, users design an API Map, which is a set of definitions of how a Bot can access a certain API and how to interpret the API Server responses. With this API Maps, a API Data Fetcher Bot can be configured to extract data from any API Server and stored inside the system as Raw Data that later can processed and consumed by other Bots.",
"updated": 1621906349521
"text": "Superalgos allows its users to fetch data from any API on the Internet without needing to write code. Instead, users design an API Map, which is a set of definitions for how a Bot can access a certain API and how to interpret the API Server responses. With this API Map, an API Data Fetcher Bot can be configured to extract data from any API Server and store Raw Data inside the system. This raw data can later be processed and consumed by other Bots.",
"updated": 1622228621778
},
"paragraphs": [
{
@@ -14,24 +14,28 @@
},
{
"style": "Title",
"text": "How to fetch data from an API?",
"updated": 1621951311144
"text": "How to Fetch Data from an API?",
"updated": 1622228699547
},
{
"style": "Text",
"text": "The main workflow to pull this out is quite straight forward and it does not require coding at all. Follow this guide and you will be using data from any source at the Internet from your trading strategies in no time."
"text": "The main workflow to pull this off is quite straight forward. It does not require coding at all. Follow this guide and you will be using data from any source on the Internet for your trading strategies in no time.",
"updated": 1622228741015
},
{
"style": "List",
"text": "1. Choose an API: Current version is limited to public APIs only. Secured APIs comming soon. "
"text": "1. Choose an API: The current version is limited to public APIs only. Secured APIs coming soon.",
"updated": 1622229777229
},
{
"style": "List",
"text": "2. Design an API Map: Read the APIs online documentation and identify the Endpoints that returns the data you would like to fetch. Carefully map those Endpoints defining the parameters the API Server expects at each call, and also how the API Server response is formatted."
"text": "2. Design an API Map: Read the APIs online documentation and identify the Endpoints that return the data you would like to fetch. Carefully map the Endpoints defining the parameters the API Server expects at each call, and also how the API Server response is formatted.",
"updated": 1622229840237
},
{
"style": "List",
"text": "3. Setup an API Data Fetcher Bot: Create a Data Mine for this API and create there an API Data Fetcher Bot. From that Bot's Record Properties you will need to reference the fields returned by the API Server defined at the API Map, defining in this way which fields from each response you are going to save to disk. You might also need to define query or path parameters here. "
"text": "3. Setup an API Data Fetcher Bot: Create a Data Mine for this API and add an API Data Fetcher Bot. From that Bot's Record Properties you will need to reference the fields returned by the API Server defined at the API Map. This is how you define which fields from each response you are going to save to disk. You might also need to define query or path parameters here.",
"updated": 1622229993447
},
{
"style": "List",
@@ -40,11 +44,13 @@
},
{
"style": "List",
"text": "5. Setup Indicator Bots: Once the data is converted, you can extract from it specific Datasets defining a set of indicators you can build from that data. These Indicators can be just a reorganization of the data, with some adjustments on the names of fields and splitting the data in different indicators, or it can also include some data processing / transformations if you wish (this would require some coding)."
"text": "5. Setup Indicator Bots: Once the data is converted, you can extract specific Datasets from it. These datasets can be used to define a set of indicators you can build from that data. These Indicators can be as simple as reorganizations of the data (with some adjustments to the names of fields and splitting the data into different indicators), or it can include some data processing / transformations if you wish (this would require some coding).",
"updated": 1622230478744
},
{
"style": "List",
"text": "6. Setup Plotters: These last indicators can have their plotters if you wish."
"text": "6. Setup Plotters: After you have set up your indicators. You can design plotters for them if you wish.",
"updated": 1622230566915
},
{
"style": "List",
@@ -52,20 +58,18 @@
},
{
"style": "Success",
"text": "There is a Workspace called API Data Fetcher Bot Demo with a simple working example of the previous steps you can take as reference."
},
{
"style": "Block",
"text": "Data Aggregation"
"text": "There is a Workspace called API Data Fetcher Bot Demo with a simple working example of the previous steps you can use as a reference.",
"updated": 1622230619069
},
{
"style": "Title",
"text": "How does data aggregation works?"
"text": "How Does Data Aggregation Work?",
"updated": 1622230634850
},
{
"style": "Text",
"text": "When Raw Data is fetched from the Internet, it needs to be converted into a Dataset Type either of Multi-Time-Frame-Daily and Multi-Time-Frame-Market types. Usually Raw Data is a timestamped dataset with a timesStamp field or it has a begin and end properties if they are fragmented in time slots of one minute.",
"updated": 1621973202254
"text": "When Raw Data is fetched from the Internet, it needs to be converted into a Dataset Type either of Multi-Time-Frame-Daily or Multi-Time-Frame-Market types. Usually Raw Data is a timestamped dataset with a timesStamp field, or it has begin and end properties if they are fragmented in time slots of one minute.",
"updated": 1622230917402
},
{
"style": "Text",
@@ -73,8 +77,8 @@
},
{
"style": "Text",
"text": "At the Bot where this conversion happens, the Record Property nodes needs to have a config property agregattionMode that defines how this is going to be handled. Here is a list of the supported aggregated methods that can be used during this conversion procedure.",
"updated": 1621973294298
"text": "At the Bot where this conversion happens, the Record Property nodes needs to have an aggregationMethod config property that defines how this is going to be handled. Here is a list of the supported aggregation methods that can be used during this conversion procedure:",
"updated": 1622235156415
},
{
"style": "List",
@@ -86,11 +90,13 @@
},
{
"style": "List",
"text": "Min: This means that the mathematical minimun value from all values found in the time range will be used as the value for the Record Proeprty."
"text": "Min: This means that the mathematical minimum value from all values found in the time range will be used as the value for the Record Proeprty.",
"updated": 1622231381194
},
{
"style": "List",
"text": "Max: This means that the mathematical maximun value from all values found in the time range will be used as the value for the Record Proeprty."
"text": "Max: This means that the mathematical maximum value from all values found in the time range will be used as the value for the Record Proeprty.",
"updated": 1622231375974
},
{
"style": "List",
@@ -100,13 +106,10 @@
"style": "List",
"text": "Avg: This means that the average of all values found in the time range will be used as the value for the Record Proeprty."
},
{
"style": "Block",
"text": "Step By Step"
},
{
"style": "Title",
"text": "Step by step guite to fetch data from an API"
"text": "Step by Step Guide to Fetch Data from an API",
"updated": 1622231458352
},
{
"style": "Text",
@@ -120,13 +123,13 @@
},
{
"style": "List",
"text": "Step #2: Open a second UI (this will prevent the previous one to save the changes, but you don't need to do that). You will use the first UI to check from time to time how nodes are configured there, and the second UI to build your own data mining operation from scratch. The rest of the staps you will do it at the second UI.",
"updated": 1621976658929
"text": "Step #2: Open a second UI (this will prevent the previous one from saving the changes, but you don't need to do that). You will use the first UI to check from time to time how nodes are configured there, and the second UI to build your own data mining operation from scratch. The rest of the steps you will do within the second UI.",
"updated": 1622231623225
},
{
"style": "List",
"text": "Step #3: Select an API from the Internet with data that might be usefull at your Trading Strategy.",
"updated": 1621976668506
"text": "Step #3: Select an API from the Internet with data that might be useful at your Trading Strategy.",
"updated": 1622231649073
},
{
"style": "List",
@@ -150,13 +153,13 @@
},
{
"style": "List",
"text": "Step #8: Define one API Endpoint first, once you have the first one working, go for the rest of the enpoints available.",
"updated": 1621976699911
"text": "Step #8: Define one API Endpoint first, once you have the first one working, go for the rest of the endpoints available.",
"updated": 1622231734738
},
{
"style": "List",
"text": "Step #9: Define the query or path parameters and the the responses. Find at each node's help the details on how to do it right.",
"updated": 1621976710636
"text": "Step #9: Define the query, or path parameters, and the responses. Read each node's help for details on how to do it right.",
"updated": 1622231862303
},
{
"style": "List",
@@ -165,18 +168,18 @@
},
{
"style": "List",
"text": "Step #11: Create a new Data Mine woth the name of the company that host the API.",
"updated": 1621976722023
"text": "Step #11: Create a new Data Mine with the name of the company that hosts the API.",
"updated": 1622231912331
},
{
"style": "List",
"text": "Step #12: Create at that Data Mine and a API Data Fetcher Bot. Configure the Bot's nodes following the example at the UI #1.",
"updated": 1621976915804
"text": "Step #12: Within the Data Mine add an API Data Fetcher Bot. Configure the Bot's nodes following the example at the UI #1.",
"updated": 1622231954570
},
{
"style": "List",
"text": "Step #13: Install a new market. This procedure is going to setup many things for you. It will detect the API Map, and the Data Mine you created and will create appropiate Tasks to run your API Fertcher Bot.",
"updated": 1621976960858
"text": "Step #13: Install a new market. This procedure is going to setup many things for you. It will detect the API Map, and the Data Mine you created and will create appropiate Tasks to run your API Fetcher Bot.",
"updated": 1622232103844
},
{
"style": "List",
@@ -184,7 +187,8 @@
},
{
"style": "List",
"text": "Step #15: Define at your API Data Fetcher Bot Product Definition Record Properties the fields that you would like to save from the API Server response. You don't need to save everything, only what makes sense to you."
"text": "Step #15: At your API Data Fetcher Bot's Product Definition Record Properties, define the fields that you would like to save from the API Server response. You don't need to save everything, only what makes sense to you.",
"updated": 1622232590430
},
{
"style": "List",
@@ -192,12 +196,13 @@
},
{
"style": "List",
"text": "Step #17: Pay attention to the special case of the needed timeStamp Record Property, specially because it might be pointing to the header of the API response. Read the docs of the API Response Field Reference node to set up the nodePath property if necesary."
"text": "Step #17: Pay attention to the special case of the required timeStamp Record Property. Specifically because it might be pointing to the header of the API response. Read the docs of the API Response Field Reference node to set up the nodePath property if necessary.",
"updated": 1622232714229
},
{
"style": "List",
"text": "Step #18: Setup an your Data Mine an Indicator Bot and configure their Process Definition nodes to be of the framework that converts from One-Min-Daily to Multi-Time-Frame-Daily and Multi-Perio-Market types of Datasets. See how it was done at the UI #1.",
"updated": 1621977642805
"text": "Step #18: At your Data Mine, set up an Indicator Bot and configure its Process Definition nodes to the framework that will convert from One-Min-Daily to Multi-Time-Frame-Daily and Multi-Perio-Market types of Datasets. See how it was done at the UI #1.",
"updated": 1622232795794
},
{
"style": "List",
@@ -205,11 +210,13 @@
},
{
"style": "List",
"text": "Step #20: Configure at each Record Proeprty the aggregationMode property. Check the docs of that node for details."
"text": "Step #20: Configure the aggregationMethod property for each Record Property. Check the docs of that node for details.",
"updated": 1622235178187
},
{
"style": "List",
"text": "Step #21: If you wish you can create multiple other Indicator Bots to cut the dataset in different groups of Record Properties."
"text": "Step #21: If you wish, you can create multiple Indicator Bots to cut the dataset in different groups of Record Properties.",
"updated": 1622233072603
},
{
"style": "List",
@@ -225,24 +232,28 @@
},
{
"style": "List",
"text": "Step #25: Iterate through step #24 until everything is working. Re read node's documentations until you get the details of what it explains there. Reread this guide or this whole Topic from the start, until the concepts explained sinks in. "
"text": "Step #25: Iterate through step #24 until everything is working. Re read node's documentation until you get the details of what it explains there. Reread this guide or this whole Topic from the start, until the concepts explained sinks in.",
"updated": 1622233708371
},
{
"style": "List",
"text": "Step #26: If after digesting the docs, and following all this advice you stil can not put it to work, go to the Telegram Support group and ask for help."
"text": "Step #26: If after digesting the docs, and following all this advice you still cannot get it to work, go to the Telegram Support group and ask for help.",
"updated": 1622233735826
},
{
"style": "List",
"text": "Step #27: Once all is running well, set up your Trading Stragegy in a way that allows you to test if you have acces to the prcessed data, the one provided by the latest Indicator Bots created."
"text": "Step #27: Once all is running well, set up your Trading Strategy in a way that allows you to test if you have access to the processed data (the one provided by the latest Indicator Bots created).",
"updated": 1622233777598
},
{
"style": "List",
"text": "Step #29: Once the data is correctly consumed by your Trading Strategy iterate throug this guide by adding another API Endpoint to the API Map. You will need for that a new API Fetcher Bot.",
"updated": 1621978484377
"text": "Step #29: Once the data is correctly consumed by your Trading Strategy, iterate through this guide by adding another API Endpoint to the API Map. You will need to add an addtional API Fetcher Bot.",
"updated": 1622233824073
},
{
"style": "List",
"text": "Step #30: Once you have sucessfully mapped the whole API and you have all the needed API Data Fetcher, Indicator Bots and Plotters tested, you are ready to share your API Map and Data Mine with the community as plugins, and get in exchange SA tokens for your contribution. "
"text": "Step #30: Once you have successfully mapped the whole API and you have all the needed API Data Fetchers, Indicator Bots and Plotters tested, you are ready to share your API Map and Data Mine with the community as a plugin, and receive SA tokens in exchange for your contribution.",
"updated": 1622233875203
},
{
"style": "Text",
@@ -3,13 +3,14 @@
"pageNumber": 15,
"type": "Data Mining - Consuming Data From Strategies",
"definition": {
"text": "Traing Bots can have as Data Dependencies datasets from any Indicator Bots. This allows Trading Strategies to act upon the data processed by Indicator Bots.",
"updated": 1621721963137
"text": "Trading Bots can have Data Dependencies from any Indicator Bot that puts out data products. This allows Trading Strategies to act upon the data processed by Indicator Bots.",
"updated": 1622234087314
},
"paragraphs": [
{
"style": "Text",
"text": "Right 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 docs.save to save your changes and app.contribute to send it to the main repository."
"text": "This is the heart and soul of the data mining process allowing users to create trading bots that act upon sophisticated data and data analysis logic.",
"updated": 1622234159617
}
]
}
@@ -1,106 +0,0 @@
{
"topic": "Data Mining",
"pageNumber": 16,
"type": "Data Mining - 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
}
]
}
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 17,
"pageNumber": 16,
"type": "Data Mining - 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.",
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 18,
"pageNumber": 17,
"type": "Data Mining - Indicator Bots - Process Definition",
"definition": {
"text": "The process definition is the compilation of configurations, dependencies, and references that make up a process.",
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 19,
"pageNumber": 18,
"type": "Data Mining - Indicator Bots - Product Definition",
"definition": {
"text": "The product definition is the compilation of configurations, references, and JavaScript code that make up the data product.",
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 20,
"pageNumber": 19,
"type": "Data Mining - 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.",
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 21,
"pageNumber": 20,
"type": "Data Mining - 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.",
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 22,
"pageNumber": 21,
"type": "Data Mining - 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.",
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 23,
"pageNumber": 22,
"type": "Data Mining - Plotters - Shapes",
"definition": {
"text": "Shapes define coordinate points to use as vertex for polygons, which are assigned styles.",
@@ -1,6 +1,6 @@
{
"topic": "Data Mining",
"pageNumber": 24,
"pageNumber": 23,
"type": "Data Mining - How to Build an Indicator - Video Series",
"definition": {
"text": "This video series goes through the entire process of building an indicator, step by step.",
@@ -0,0 +1,20 @@
{
"topic": "Frequently Asked Questions",
"pageNumber": "2",
"type": "How does the system handle changes to trading system during live trading?",
"definition": {
"text": "You need to restart the Trading Session and sometimes the Task in order for the Bot to get the new definitions.",
"updated": 1622293227672
},
"paragraphs": [
{
"style": "Text",
"text": "Users cannot change the definitions and feed them to a running bot in real time. If the definitions are at the Trading System level, or the Session Parameters level, you can change them and they will be sent to the running Task the next time you stop and run the Trading Session again.",
"updated": 1622293262444
},
{
"style": "Text",
"text": "It the definitions are at the Task level or upwards, like a change of market, you will need to stop the Task and run it again in order to be recognized."
}
]
}
@@ -13,20 +13,22 @@
{
"language": "IT",
"text": "Clicca il pulsante Help nel menu dei Trading Parameters per accedere alla pagina Docs del nodo. Ti mostrerò una cosa...",
"updated": 1619500388726
"updated": 1619500388726,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Scroll the page all the way to the bottom until you find the Trading Parameters Attaching Rules title.",
"updated": 1615583276420,
"text": "Scroll the page all the way to the bottom until you find the \"Trading Parameters Attaching Rules\" title.",
"updated": 1622372858654,
"translations": [
{
"language": "IT",
"text": "Scorri la pagina fino in fondo, finchè trovi il titolo \"Trading Parameters Attaching Rules\"!",
"updated": 1619500470210
"updated": 1619500470210,
"style": "Callout"
}
]
},
@@ -38,7 +40,8 @@
{
"language": "IT",
"text": "Ogni nodo può essere attaccato solo a certi tipi di nodo. Questi criteri sono elencati nella pagina Docs di ogni nodo.",
"updated": 1619500530342
"updated": 1619500530342,
"style": "Text"
}
]
},
@@ -50,7 +53,8 @@
{
"language": "IT",
"text": "Quando più nodi possono accettare la connessione, ogni candidato mostra un cerchio grigio. Solo il candidato più vicino al nodo da collegare sarà evidenziato in arancione.",
"updated": 1619500597194
"updated": 1619500597194,
"style": "Success"
}
]
}
@@ -13,20 +13,22 @@
{
"language": "IT",
"text": "A un certo punto, dovrai stabilire tu una reference con un nodo. Quindi tanto vale imparare subito come si fa!",
"updated": 1619501421155
"updated": 1619501421155,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click the delink button on the menu of the Trading System Reference node!",
"updated": 1615806300267,
"text": "Double-click the delink button on the menu of the Trading System Reference node!",
"updated": 1622373319578,
"translations": [
{
"language": "IT",
"text": "Clicca sul bottone \"delink\" nel menù del nodo Trading System Reference!",
"updated": 1619501451689
"updated": 1619501451689,
"style": "Callout"
}
]
},
@@ -38,7 +40,8 @@
{
"language": "IT",
"text": "Hai rotto la reference! Ma non preoccuparti...la ricreeremo nei prossimi step!",
"updated": 1619501479311
"updated": 1619501479311,
"style": "Note"
}
]
},
@@ -50,7 +53,8 @@
{
"language": "IT",
"text": "Per stabilire una reference, segui lo stesso processo usato per collegare un nodo: clicca con il tasto destro sul nodo da cui la reference avrà origine, trascinala vicino al nodo con cui vuoi stabilire il collegamento e rilascia quando vedi un anello arancione!",
"updated": 1619501669049
"updated": 1619501669049,
"style": "Text"
}
]
},
@@ -13,7 +13,8 @@
{
"language": "IT",
"text": "I Clones (cloni) si differenziano dai backup dal fatto che sono progettati per replicare strutture di dati in modo che la copia sia uguale all'originale.",
"updated": 1619545781267
"updated": 1619545781267,
"style": "Definition"
}
]
},
@@ -26,7 +27,8 @@
{
"language": "IT",
"text": "Leggi attentamente questa pagina!",
"updated": 1619545792048
"updated": 1619545792048,
"style": "Callout"
}
]
},
@@ -38,7 +40,8 @@
{
"language": "IT",
"text": "In sintesi:",
"updated": 1619545801000
"updated": 1619545801000,
"style": "Text"
}
]
},
@@ -50,7 +53,8 @@
{
"language": "IT",
"text": "Il comportamento dei cloni <b>non</b> varia in base alla presenza o meno dell'originale al momento del ripristino.",
"updated": 1619546165377
"updated": 1619546165377,
"style": "List"
}
]
},
@@ -61,19 +65,21 @@
{
"language": "IT",
"text": "Le references in ingresso vengono sempre perse.",
"updated": 1619545955251
"updated": 1619545955251,
"style": "List"
}
]
},
{
"style": "Success",
"text": "Feel free to take the time to test the Clones feature on your own! We'll move on to other topics without further due!",
"updated": 1615884678255,
"text": "Feel free to take the time to test the Clones feature on your own! We'll move on to other topics without further ado!",
"updated": 1622374462370,
"translations": [
{
"language": "IT",
"text": "Prenditi pure del tempo per testare la funzionalità dei cloni! Poi ci muoveremo ad altri argomenti!",
"updated": 1619546030194
"updated": 1619546030194,
"style": "Success"
}
]
}
@@ -13,20 +13,22 @@
{
"language": "IT",
"text": "Le Shares sono come i Backups, ma dal file vengono rimossi i dati personali e sensibili!",
"updated": 1619546242891
"updated": 1619546242891,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Get used to share Shares! This good practice will help you avoid dangerous mistakes in the future!",
"updated": 1617037960260,
"text": "Get used to sharing Shares! This good practice will help you avoid dangerous mistakes in the future!",
"updated": 1622374504966,
"translations": [
{
"language": "IT",
"text": "Abituati al loro utilizzo! È una buona pratica per evitare possibili errori pericolosi in futuro!",
"updated": 1619546289258
"updated": 1619546289258,
"style": "Text"
}
]
},
@@ -37,7 +39,8 @@
{
"language": "IT",
"text": "Leggi la pagina sulle Shares per maggiori info!",
"updated": 1619546300806
"updated": 1619546300806,
"style": "Callout"
}
]
},
@@ -48,7 +51,8 @@
{
"language": "IT",
"text": "Quando vuoi condividere il tuo lavoro, non condividere mai i tuoi Workspace o Backups. Questi file possono contenere informazioni sensibili, come la tua Exchange Account Key. Piuttosto, condividi le tue Shares!",
"updated": 1619546375019
"updated": 1619546375019,
"style": "Warning"
}
]
}
@@ -13,7 +13,8 @@
{
"language": "IT",
"text": "Puoi vedere il Workspace come il palco di un teatro. È il luogo dove qualcosa andrà in scena!",
"updated": 1619546463150
"updated": 1619546463150,
"style": "Definition"
}
]
},
@@ -26,20 +27,23 @@
{
"language": "IT",
"text": "Puoi configurare quanti workspace vuoi, ognuno per uno specifico utilizzo. Per esempio:",
"updated": 1619546502168
"updated": 1619546502168,
"style": "Text"
}
]
},
{
"style": "List",
"text": "You may have a workspace to build a Trading Sytem that will need specific indicators from a specific Data Mine.",
"text": "You may have a workspace to build a Trading System that will need specific indicators from a specific Data Mine.",
"translations": [
{
"language": "IT",
"text": "Puoi avere un workspace per costruire un Trading System che ha bisogno di specifici indicatori da specifici Data Mine.",
"updated": 1619546574933
"updated": 1619546574933,
"style": "List"
}
]
],
"updated": 1622374580811
},
{
"style": "List",
@@ -49,7 +53,8 @@
{
"language": "IT",
"text": "Puoi avere un altro workspace con tutti gli indicatori disponibili così da studiare come funziona ognuno di essi.",
"updated": 1619546609509
"updated": 1619546609509,
"style": "List"
}
]
},
@@ -61,7 +66,8 @@
{
"language": "IT",
"text": "Leggi questa pagina per imparare le basi su come lavorare con i workspaces...",
"updated": 1619546636057
"updated": 1619546636057,
"style": "Callout"
}
]
}
@@ -13,7 +13,8 @@
{
"language": "IT",
"text": "Apri il File Explorer del tuo computer e cerca i seguenti path relativi alla cartella root di Superalgos...",
"updated": 1619553622852
"updated": 1619553622852,
"style": "Definition"
}
]
},
@@ -26,19 +27,21 @@
{
"language": "IT",
"text": "\\My-Workspaces",
"updated": 1619553626181
"updated": 1619553626181,
"style": "Json"
}
]
},
{
"style": "List",
"text": "In this folder, you will find a file named Getting Started.json. This is the current workspace; the one you are using at this moment. Everything you have been doing lately has been stored in this file.",
"updated": 1615906276410,
"text": "In this folder, you will find a file named Getting Started Tutorials.json. This is the current workspace; the one you are using at this moment. Everything you have been doing lately has been stored here.",
"updated": 1622374674340,
"translations": [
{
"language": "IT",
"text": "In questa cartella troverai un file chiamato Getting Started.json. È il workspace che stai usando in questo momento! Tutto ciò che hai fatto finora è salvato su questo file.",
"updated": 1619553718618
"updated": 1619553718618,
"style": "List"
}
]
},
@@ -54,7 +57,8 @@
{
"language": "IT",
"text": "Qui troverai i Plugin Workspaces originali di Superalgos. Per imparare cosa fa ognuno di essi, leggi il relativo topic nella documentazione!",
"updated": 1619553810915
"updated": 1619553810915,
"style": "List"
}
]
},
@@ -1,16 +0,0 @@
{
"tutorial": "Setting Up a New Chart",
"pageNumber": 1,
"type": "Setting Up a New Chart Tutorial",
"definition": {
"text": "This Tutorial walks through the basic inner workings of the Charting Space to help you learn how to create your own custom charts.",
"updated": 1617371694835
},
"paragraphs": [
{
"style": "Text",
"text": "This tutorial can be found in the Creating Custom Charts Workspace",
"updated": 1617660792312
}
]
}
@@ -13,8 +13,8 @@
"paragraphs": [
{
"style": "Text",
"text": "You should see the Masters, Sparta, and Alpha data mine plugins. These give us access to a range of interesting indicators. For this tutorial we will only be using the Masters Data Mine. My friends will teach you how to create charts using the other data mines later. I also installed the Lighting Strike Trading System plugin.",
"updated": 1620044502486
"text": "You should see the Candles, Masters, and Sparta data mine plugins. These give us access to a range of interesting indicators. For this tutorial we will only be using the Candles Data Mine. My friends will teach you how to create charts using the other data mines later. I also installed the Lighting Strike Trading System plugin.",
"updated": 1622169189639
},
{
"style": "Success",
@@ -13,8 +13,8 @@
"paragraphs": [
{
"style": "Text",
"text": "In particular, we are going to hook up a Time Machine to the indicators of the Masters Data Mine. These indicators will be the core data we plot on our chart. ",
"updated": 1620007866528
"text": "In particular, we are going to hook up a Time Machine to the indicators of the Candles Data Mine. These indicators will be the core data we plot on our chart.",
"updated": 1622169394289
},
{
"style": "Note",
@@ -18,12 +18,12 @@
},
{
"style": "Text",
"text": "Giving a helpful name to a Timeline Chart is important. A good naming practice is to reference the Data Mine or Data Product with which it will be connected. Right now we will be adding Masters Data Mine data to this timeline chart. A helpful name would be:",
"text": "Giving a helpful name to a Timeline Chart is important. A good naming practice is to reference the Data Mine or Data Product with which it will be connected. Right now we will be adding Candles Data Mine data to this timeline chart. A helpful name would be:",
"updated": 1620045091728
},
{
"style": "Json",
"text": "Masters Layers",
"text": "Candles Layers",
"updated": 1620044855601
},
{
@@ -13,7 +13,7 @@
"paragraphs": [
{
"style": "Text",
"text": "All of the Data Products you will want to visualize in your charts are kept in the Data Storage node. Let’s start by getting some practice finding where the data we want is stored. Remember, we want to connect our chart to the Masters Data Mine. Accessing these products will let us visualize Indicators and other Market Data.",
"text": "All of the Data Products you will want to visualize in your charts are kept in the Data Storage node. Let’s start by getting some practice finding where the data we want is stored. Remember, we want to connect our chart to the Candles Data Mine. Accessing these products will let us visualize Indicators and other Market Data.",
"updated": 1619023429735
},
{
@@ -13,12 +13,12 @@
"paragraphs": [
{
"style": "Text",
"text": "Out of the three Data Mine Products nodes available, we are going to link our chart to the Masters Data Mine.",
"text": "Out of the three Data Mine Products nodes available, we are going to link our chart to the Candles Data Mine.",
"updated": 1620047769383
},
{
"style": "Callout",
"text": "Find the Layer Manager under the Timeline Chart you added earlier. Then establish a reference from it to the Masters Data Mine Products node.",
"text": "Find the Layer Manager under the Timeline Chart you added earlier. Then establish a reference from it to the Candles Data Mine Products node.",
"updated": 1620556116868
},
{
@@ -3,7 +3,7 @@
"pageNumber": 30,
"type": "Tutorial Step - Verify the Layers",
"definition": {
"text": "As you may have noticed, the layers that were added match the Bot Products under the Masters Data Mine Products node.",
"text": "As you may have noticed, the layers that were added match the Bot Products under the Candles Data Mine Products node.",
"updated": 1620048469797,
"icon": {
"name": "layer",
@@ -22,7 +22,7 @@
},
{
"style": "Success",
"text": "If you hooked it up correctly, the name Masters should appear over the layer manager."
"text": "If you hooked it up correctly, the name Candles should appear over the layer manager."
},
{
"style": "Text",
@@ -7,7 +7,7 @@
"project": "Superalgos",
"name": "binance"
},
"text": "Before we start data mining, I have a little question for you: are you trading at binance.com or binance.us?",
"text": "Before we start data mining, I have a little question for you: are you trading at binance.com, binance.us, or neither?",
"translations": [
{
"language": "IT",
@@ -27,7 +27,8 @@
"updated": 1618434029175,
"style": "Definition"
}
]
],
"updated": 1622189667210
},
"paragraphs": [
{
@@ -81,8 +82,8 @@
},
{
"style": "List",
"text": "Open the configuration and change the codeName to binanceus. Move the mouse pointer out of the configuration bubble and it will close and save automatically.",
"updated": 1616414675945,
"text": "Access the configuration and change the codeName to \"binanceus\". Move the mouse pointer out of the configuration bubble and it will close and save automatically.",
"updated": 1622189775201,
"translations": [
{
"language": "IT",
@@ -106,8 +107,8 @@
},
{
"style": "List",
"text": "Edit the label of the node to read Binanceus.",
"updated": 1616414681256,
"text": "Edit the label of the node to read \"Binanceus\".",
"updated": 1622189798374,
"translations": [
{
"language": "IT",
@@ -7,8 +7,8 @@
"project": "Superalgos",
"name": "run"
},
"text": "Open the Data Tasks node menu and find the Run All Project Data Tasks button on the top-right corner...",
"updated": 1611076262685,
"text": "Access the Data Tasks node menu and find the \"Run all project data tasks\" button on the top-right corner...",
"updated": 1622189956451,
"translations": [
{
"language": "IT",
@@ -25,15 +25,16 @@
{
"language": "ES",
"text": "Abra el menú del nodo Data Tasks y busque el botón Run All Project Data Tasks en la esquina superior derecha...",
"updated": 1618434308521
"updated": 1618434308521,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click the Run All Project Data Tasks button!",
"updated": 1611076332667,
"text": "Click the \"Run all project data tasks\" button! Confirm the request by clicking the button a second time.",
"updated": 1622190007548,
"translations": [
{
"language": "IT",
@@ -50,13 +51,14 @@
{
"language": "ES",
"text": "Haz click en el botón Run All Project Data Tasks!",
"updated": 1618434334439
"updated": 1618434334439,
"style": "Callout"
}
]
},
{
"style": "Text",
"text": "Confirm the request by clicking the button a second time. In about 30 seconds, you should see a status notice below the Data Mining node indicating that 1 out of 1 Exchange Data Tasks node is running.",
"text": "In about 30 seconds, you should see a status notice below the Data Tasks node indicating that 1 out of 1 Exchange Data Tasks node is running.",
"translations": [
{
"language": "IT",
@@ -73,9 +75,11 @@
{
"language": "ES",
"text": "Confirme la solicitud haciendo clic en el botón por segunda vez. En unos 30 segundos, debería ver un aviso de estado bajo el nodo Data Mining que indica que se está ejecutando 1 out of 1 Exchange Data Tasks.",
"updated": 1618434426749
"updated": 1618434426749,
"style": "Text"
}
]
],
"updated": 1622190035816
},
{
"style": "Note",
@@ -96,7 +100,8 @@
{
"language": "ES",
"text": "Tu aplicación de consola, deberia mostrar algo similar a lo que aparece en el video, a continuación",
"updated": 1618434455552
"updated": 1618434455552,
"style": "Note"
}
]
}
@@ -24,7 +24,8 @@
{
"language": "ES",
"text": "En este punto, probablemente esté saturando tu hipocampo! Pero no te preocupes... ¡puedes volver a cualquier paso anterior!",
"updated": 1618436677513
"updated": 1618436677513,
"style": "Definition"
}
]
},
@@ -48,7 +49,8 @@
{
"language": "ES",
"text": "Si alguna vez necesitas un recordatorio sobre estos temas...",
"updated": 1618436771239
"updated": 1618436771239,
"style": "Text"
}
]
},
@@ -71,14 +73,15 @@
{
"language": "ES",
"text": "Busque el Tutorial Topic y reprodúzcalo! Puede encontrarme en la esquina inferior izquierda del Desing Space, expandirme, navegar por la jerarquía de temas y pasos, y hacer clic en Play en cualquiera de ellos. Los temas están ordenados en el sentido de las agujas del reloj, empezando por la derecha del nodo principal de Tutorial.",
"updated": 1618436934915
"updated": 1618436934915,
"style": "List"
}
]
},
{
"style": "Callout",
"text": "Need a Quick Reminder? Find the step under the Tutorials & Help topic below. Then click Stop, and restart by clicking Play on the said Tutorial Step!",
"updated": 1611076850328,
"text": "\"Need a Quick Reminder?\" Find this step under the \"Tutorials & Help\" topic below. Then click Stop, and restart by clicking Play on the said Tutorial Step!",
"updated": 1622192045886,
"translations": [
{
"language": "IT",
@@ -95,7 +98,8 @@
{
"language": "ES",
"text": "Necesitas refrescar tu memoria? Busque el paso en el tema de Tutorials & Help. A continuación, haga clic en Stop y reinicie haciendo clic en Play en dicho paso del tutorial.",
"updated": 1618437112467
"updated": 1618437112467,
"style": "Callout"
}
]
}
@@ -24,14 +24,15 @@
{
"language": "ES",
"text": "Si alguna vez rompes algo -como borrar un nodo por error o cambiar la configuración- y no sabes cómo afrontar el resultado...",
"updated": 1618438157553
"updated": 1618438157553,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "... there is an easy way to start over with a brand new workspace!",
"text": "... you may easily start over with the original Getting Started Tutorials Plugin Workspace!",
"translations": [
{
"language": "IT",
@@ -48,13 +49,15 @@
{
"language": "ES",
"text": "Hay una manera facil de empezar con un espacio de trabajo como nuevo",
"updated": 1618438101054
"updated": 1618438101054,
"style": "Callout"
}
]
],
"updated": 1622196973760
},
{
"style": "Text",
"text": "All you need to do is pull the tab on the left-hand side of the screen and click on the Getting-Started plugin workspace.",
"text": "All you need to do is pull the tab on the left-hand side of the screen, scroll and find the Getting Started Tutorials plugin workspace and click it!",
"translations": [
{
"language": "IT",
@@ -71,13 +74,15 @@
{
"language": "ES",
"text": "Todo lo que tienes que hacer es tirar de la pestaña de la izquierda de la pantalla y hacer clic en Getting-Started plugin workspace.",
"updated": 1618438234984
"updated": 1618438234984,
"style": "Text"
}
]
],
"updated": 1622193846331
},
{
"style": "Success",
"text": "A brand new Getting Started workspace will load and I will show up again, fresh from the start!",
"text": "The original Plugin Workspace will load and the tutorial will show up again, fresh from the start!",
"translations": [
{
"language": "IT",
@@ -94,9 +99,11 @@
{
"language": "ES",
"text": "Se cargará un nuevo espacio de trabajo de \"Getting Started\" y apareceré de nuevo, fresco desde el principio!",
"updated": 1618438286128
"updated": 1618438286128,
"style": "Success"
}
]
],
"updated": 1622193879709
}
]
}
@@ -7,7 +7,7 @@
"project": "Superalgos",
"name": "workspace"
},
"text": "Yes! Some of them are plugins shipping with the system and some are your own!",
"text": "Most are Plugin Workspaces shipping with the system! There should be one User Workspace at the end of the list too!",
"translations": [
{
"language": "IT",
@@ -24,15 +24,17 @@
{
"language": "ES",
"text": "Sí. Algunos de ellos son plugins que vienen con el sistema y otros son los tuyos propios! ",
"updated": 1618438936999
"updated": 1618438936999,
"style": "Definition"
}
]
],
"updated": 1622193005692
},
"paragraphs": [
{
"style": "Text",
"text": "As soon as you start using the system, the workspace is saved every minute. It is also saved before closing the browser or browser tab, and you may save it manually using the Ctrl + Shift + Key-S",
"updated": 1610614718976,
"text": "As soon as you launched the UI for the first time, the Getting Started Tutorials Plugin Workspace was loaded. The Workspace was saved as a new User Workspace after 60 seconds in the My-Workspaces folder.",
"updated": 1622193268470,
"translations": [
{
"language": "IT",
@@ -49,36 +51,19 @@
{
"language": "ES",
"text": "Tan pronto como empiezas a usar el sistema, el workspace es guardado cada minuto. También se guarda antes de cerrar el navegador o la pestaña del navegador, y puedes guardarlo manualmente utilizando las teclas Ctrl + Shift + Key-S",
"updated": 1618439054191
"updated": 1618439054191,
"style": "Text"
}
]
},
{
"style": "Callout",
"text": "When a plugin workspace is modified in any way, a copy is stored in your My-Workspaces folder.",
"translations": [
{
"language": "IT",
"text": "Quando un plugin workspace viene modificato in qualunque modo, una copia viene salvata su disco nella tua cartella My-Workspaces.",
"updated": 1614791526653,
"style": "Callout"
},
{
"language": "ID",
"text": "Saat workspace plugin dimodifikasi dalam cara apapun, salinan akan tersimpan di folder My-Workspaces.",
"updated": 1616770626561,
"style": "Callout"
},
{
"language": "ES",
"text": "Cuando un plugin workspace se modifica de alguna manera, se almacena una copia en la carpeta My-Workspaces.",
"updated": 1618439039856
}
]
"style": "Success",
"text": "The Workspace is saved automatically every minute. It is also saved before closing the browser or browser tab, and you may save it manually using the Ctrl + Shift + Key-S",
"updated": 1622193961757
},
{
"style": "Important",
"text": "Plugin files may not be modified from within the system!",
"text": "Changes is Plugins Workspaces don't persist in the plugin. They do in the User Workspace",
"translations": [
{
"language": "IT",
@@ -95,9 +80,11 @@
{
"language": "ES",
"text": "Los archivos de los plugins no pueden ser modificados desde el sistema!",
"updated": 1618439194749
"updated": 1618439194749,
"style": "Important"
}
]
],
"updated": 1622193520113
}
]
}
@@ -7,7 +7,7 @@
"project": "Superalgos",
"name": "data-tasks"
},
"text": "Now that you're comfortable moving around, I want you to go on a little tour exploring the Data Tasks section of the hierarchy.",
"text": "Now that you're comfortable moving around, I want you to go on a little tour exploring the Data Tasks section of the Network Node.",
"translations": [
{
"language": "IT",
@@ -24,9 +24,11 @@
{
"language": "ES",
"text": "Ahora que te sientes cómodo por aqui, quiero que hagas un pequeño recorrido explorando la sección Data Tasks de la jerarquía.",
"updated": 1618439383864
"updated": 1618439383864,
"style": "Definition"
}
]
],
"updated": 1622194034630
},
"paragraphs": [
{
@@ -48,7 +50,8 @@
{
"language": "ES",
"text": "Fijate en lo siguiente",
"updated": 1618439399867
"updated": 1618439399867,
"style": "Text"
}
]
},
@@ -71,7 +74,8 @@
{
"language": "ES",
"text": "La sección está organizada, en primer lugar, por proyecto, exchage y mercado. Esto le ayudará a trabajar con varios exchanges y mercados de forma ordenada.",
"updated": 1618439477366
"updated": 1618439477366,
"style": "List"
}
]
},
@@ -94,7 +98,8 @@
{
"language": "ES",
"text": "Los nodos de Exchange Data Tasks y Market Data Tasks pueden controlar todas las tareas del exchange y del mercado respectivamente.",
"updated": 1618439583481
"updated": 1618439583481,
"style": "List"
}
]
},
@@ -117,7 +122,8 @@
{
"language": "ES",
"text": "Salga y explore esos nodos y sus menús.",
"updated": 1618439650404
"updated": 1618439650404,
"style": "Callout"
}
]
}
@@ -18,7 +18,8 @@
{
"language": "ID",
"text": "Disetiap market, operasi diorganisasi melalui Data Mine. Superlagos berkerjasama dengan beberapa data mine open-source, dan setiap darinya memiliki banyak indicator.",
"updated": 1616771187052
"updated": 1616771187052,
"style": "Definition"
}
]
},
@@ -36,13 +37,14 @@
{
"language": "ID",
"text": "Pikirkan data mine sebagai plugin yang developer akan buat untuk memperpanjang kapasitas analisis data dari sistem. Indicator Bot akan memproses data, indikator lain akan membuatnya, sehingga menambah nilai dan menghasilkan analisis yang lebih dalam dan lebih kaya.",
"updated": 1616771335447
"updated": 1616771335447,
"style": "Text"
}
]
},
{
"style": "Callout",
"text": "If you have a basic understanding of JavaScript, you may create indicators too!",
"text": "If you have a basic understanding of JavaScript, you may create indicators too! If you contribute a Data Mine, you earn Superalgos (SA) Tokens!",
"translations": [
{
"language": "IT",
@@ -53,9 +55,11 @@
{
"language": "ID",
"text": "Jika kamu memiliki pemahaman dasar tentang JavaScript, kamu juga dapat membuat indikator!",
"updated": 1616771371122
"updated": 1616771371122,
"style": "Callout"
}
]
],
"updated": 1622196189467
},
{
"style": "Text",
@@ -70,7 +74,8 @@
{
"language": "ID",
"text": "Tapi aku terlalu terburu-buru berbicara tentang membangun data mine pada saat ini! Ayo kembali ke jalurnya!",
"updated": 1616771422206
"updated": 1616771422206,
"style": "Text"
}
]
}
@@ -83,7 +83,7 @@
},
{
"style": "Callout",
"text": "If all processes are up to date, then select Stop All Tasks in the Masters Task Manager. If not, wait a bit longer!",
"text": "When all processes are up to date, select \"Stop All Tasks\" in the Market Data Tasks node. Notice that we can stop the tasks from a different node than the one we used to start them!",
"translations": [
{
"language": "IT",
@@ -98,7 +98,7 @@
"style": "Callout"
}
],
"updated": 1616415772977
"updated": 1622197433719
}
]
}
@@ -70,8 +70,8 @@
},
{
"style": "List",
"text": "When all tasks stop may you close the console app.",
"updated": 1616416111891,
"text": "When all tasks stop you may close the console app or stop the process with Ctrl + Key-C.",
"updated": 1622197535990,
"translations": [
{
"language": "ID",
@@ -26,8 +26,8 @@
"paragraphs": [
{
"style": "Text",
"text": "The charting space lives on top of the design space, separated by a turquoise slider. As you will come to expect from Superalgos, the charting space is configurable and highly flexible. Everything that happens there is defined on the Charting Space.",
"updated": 1616416243162,
"text": "The charting space lives on top of the design space, separated by a turquoise slider. As you will come to expect from Superalgos, the charting space is configurable and highly flexible. Everything that happens there is defined on the Charting Space hierarchy.",
"updated": 1622197696958,
"translations": [
{
"language": "IT",
@@ -18,7 +18,8 @@
{
"language": "ID",
"text": "Aku akan mempercepat gerakmu dalam berkeliling dan menelusuri charting space dengan cepat... Mari coba slider duluan!",
"updated": 1616932890422
"updated": 1616932890422,
"style": "Definition"
}
]
},
@@ -36,12 +37,13 @@
{
"language": "ID",
"text": "Click disana dan drag kebawah untuk menutup design space dan membuka charting space. Lakukan sebaliknya untuk bertukar posisi. Dari keyboard gunakan Ctrl + Shift + ↓. Coba juga ↑ ← →",
"updated": 1616932984437
"updated": 1616932984437,
"style": "Callout"
}
]
},
{
"style": "Note",
"style": "Success",
"text": "Unless you need both spaces to be partially open, it's always a good idea to fully close either of them to save computing resources in your machine.",
"translations": [
{
@@ -53,7 +55,8 @@
{
"language": "ID",
"text": "Kecuali jika kamu memerlukan kedua ruang untuk dibuka sebagian, sebaiknya tutup salah satunya untuk menghemat sumber daya komputasi di Perangkat-mu.",
"updated": 1616933049943
"updated": 1616933049943,
"style": "Note"
}
]
}
@@ -26,8 +26,8 @@
"paragraphs": [
{
"style": "Text",
"text": "To keep things simple for newcomers, there are only two charts in this Getting Started Workspace. Advanced users monitor charts from multiple exchanges and multiple markets.",
"updated": 1616416713126,
"text": "To keep things simple for newcomers, there are only two charts in this Getting Started Tutorials workspace. Advanced users monitor charts from multiple exchanges and multiple markets.",
"updated": 1622198114561,
"translations": [
{
"language": "IT",
@@ -45,7 +45,7 @@
},
{
"style": "Callout",
"text": "To move around the charting space, click and drag using your mouse. <br/><br/>The keyboard combination is Shift plus the arrow keys ↑ ← → ↓",
"text": "To move around the Viewport, click and drag on the blank area using your mouse. <br/><br/>The keyboard combination is Shift plus the arrow keys ↑ ← → ↓",
"translations": [
{
"language": "IT",
@@ -59,7 +59,8 @@
"updated": 1616935011038,
"style": "Callout"
}
]
],
"updated": 1622198195729
}
]
}
@@ -18,14 +18,15 @@
{
"language": "ID",
"text": "Bagaimana membuat time machine menjadi sesuai dengan aspect ratio dari layar?",
"updated": 1616936505798
"updated": 1616936505798,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Matching the aspect ratio of your time machines to the aspect ratio of your screen is crucial for charts to fit your screen tightly!",
"text": "Matching the aspect ratio of your time machines to the aspect ratio of your screen is crucial for charts to fit your screen tightly while zooming in!",
"translations": [
{
"language": "IT",
@@ -36,14 +37,16 @@
{
"language": "ID",
"text": "Mencocokkan rasio aspek time machine kamu dengan rasio aspek laya sangat penting agar bagan pas dengan layarmu!",
"updated": 1616936545221
"updated": 1616936545221,
"style": "Text"
}
]
],
"updated": 1622198491208
},
{
"style": "Callout",
"text": "Point your mouse at one of the time machines and hit Ctrl + Shift + Key-A. Do the same with the other one!",
"updated": 1610134929741,
"text": "Direct your mouse at one of the time machines and hit Ctrl + Shift + Key-A. Do the same with the other one!",
"updated": 1622198768797,
"translations": [
{
"language": "IT",
@@ -54,7 +57,8 @@
{
"language": "ID",
"text": "Point mousemu ke satu dari time machines dan tekan Ctrl + Shift + Key-A. Lakukan dengan yang satunya juga!",
"updated": 1616936593204
"updated": 1616936593204,
"style": "Callout"
}
]
},
@@ -72,7 +76,8 @@
{
"language": "ID",
"text": "Biarkan dua time machine cocok dengan rasio aspek layarmu. dari sekarang!",
"updated": 1616936619368
"updated": 1616936619368,
"style": "Success"
}
]
}
@@ -27,8 +27,8 @@
"paragraphs": [
{
"style": "List",
"text": "Adjust the aspect ratio: Point your mouse to the chart and hit Ctrl + Shift + Key-A",
"updated": 1616418151629,
"text": "Adjust the aspect ratio: Point your mouse to the Backtesting Session chart (the one on top) and hit Ctrl + Shift + Key-A",
"updated": 1622198971565,
"translations": [
{
"language": "ID",
@@ -71,7 +71,7 @@
},
{
"style": "List",
"text": "Double-click again: this takes you further in the chart, to the zoom level in which the chart perfectly fits the screen and layer managers emerge.",
"text": "Double-click again: this takes you further in the chart, to the zoom level in which the chart perfectly fits the screen and Layer Managers emerge.",
"translations": [
{
"language": "IT",
@@ -86,7 +86,7 @@
"style": "List"
}
],
"updated": 1616418383322
"updated": 1622198926988
}
]
}
@@ -32,7 +32,7 @@
},
{
"style": "Callout",
"text": "To toggle between the various automatic modes and manual mode, hit Shift and make a gentle one-step roll with the wheel of your mouse on top of the time scale box. Alternatively, you can also place the mouse pointer over the scale box and hit the up and down arrow keys ↑ ↓. ",
"text": "To toggle between the various automatic modes and manual mode, hit Shift and make a gentle one-step roll with the wheel of your mouse on top of the time scale box. Alternatively, you can also place the mouse pointer over the scale box and hit the up and down arrow keys ↑ ↓.",
"translations": [
{
"language": "IT",
@@ -41,7 +41,7 @@
"style": "Callout"
}
],
"updated": 1616495659408
"updated": 1622199287763
},
{
"style": "Text",
@@ -51,7 +51,8 @@
{
"language": "IT",
"text": "Dovresti poterti muovere liberamente sull'asse X del grafico, ossia quella del tempo.",
"updated": 1618647843971
"updated": 1618647843971,
"style": "Text"
}
]
}
@@ -32,8 +32,8 @@
},
{
"style": "Text",
"text": "I hope the structure of nodes is intuitive enough to grasp how powerful the concept of the Design Space is. You set up a time machine by adding Timeline Chart nodes and the desired scales. Then set up layer managers and layers referencing the corresponding Data Mine Products so that the desired data becomes available on a particular layer manager on the charts. It's like the Legoland® of trading charts!",
"updated": 1616427563290,
"text": "I hope the structure of nodes is intuitive enough to grasp how powerful the concept of the Design Space is. You set up a time machine by adding Timeline Chart nodes and the desired scales. Then set up layer managers and layers referencing the corresponding Data Mine Products so that the desired data becomes available on a particular layer manager on the charts. It's like the Legoland® of trading charts! You'll learn to cutomize charts later on!",
"updated": 1622200261142,
"translations": [
{
"language": "IT",
@@ -7,14 +7,16 @@
"project": "Superalgos",
"name": "network-node"
},
"text": "Picture an army of bots working with multiple exchanges, markets, and strategies, running on a network ala trading farm.",
"text": "Picture an army of bots working with multiple exchanges, markets, and strategies, running on a network <i>à la</i> trading farm.",
"translations": [
{
"language": "IT",
"text": "Immagina un esercito di bots che lavorano con vari exchange, mercati e strategie, coordinati da un network che fa da trading farm.",
"updated": 1618057758985
"updated": 1618057758985,
"style": "Definition"
}
]
],
"updated": 1622200549490
},
"paragraphs": [
{
@@ -25,7 +27,8 @@
{
"language": "IT",
"text": "Il Network Node fa esattamente questo. I processi che hai visto finora girano su una singola macchina. Però...",
"updated": 1618057806513
"updated": 1618057806513,
"style": "Text"
}
]
},
@@ -37,7 +40,8 @@
{
"language": "IT",
"text": "Superalgos permette di distribuire e coordinare tasks attraverso una rete di macchine che eseguono il Client! Questo permette di eseguire operazioni avanzate e scalabili. Qualsiasi macchina che esegue la GUI può controllare il tutto!",
"updated": 1618057957707
"updated": 1618057957707,
"style": "Callout"
}
]
},
@@ -48,7 +52,8 @@
{
"language": "IT",
"text": "Puoi creare network arbitrariamente complessi che vanno da qualche Raspberry Pi a un datacenter industriale.",
"updated": 1618058007870
"updated": 1618058007870,
"style": "Text"
}
]
}
@@ -7,14 +7,16 @@
"project": "Superalgos",
"name": "under-construction"
},
"text": "Please, do not be surprised to find an under construction sign here and there...",
"text": "Don't be surprised if you find an under construction sign here and there...",
"translations": [
{
"language": "IT",
"text": "Non sorprenderti se trovi segnali di \"lavori in corso\" qua e là...",
"updated": 1618059716381
"updated": 1618059716381,
"style": "Definition"
}
]
],
"updated": 1622200773527
},
"paragraphs": [
{
@@ -24,7 +26,8 @@
{
"language": "IT",
"text": "Come detto prima, Superalgos è in continua evoluzione e gli sviluppi per la versione successiva potrebbero essere occasionalmente implementati nella versione corrente, per risolvere problemi o apportare piccole migliorie.",
"updated": 1618059772511
"updated": 1618059772511,
"style": "Text"
}
]
},
@@ -35,7 +38,8 @@
{
"language": "IT",
"text": "Se vuoi scoprire cosa bolle in pentola per la prossima release di Superalgos, unisciti al canale Telegram Superalgos Develop.",
"updated": 1618059823365
"updated": 1618059823365,
"style": "Callout"
}
]
}
@@ -12,7 +12,8 @@
{
"language": "IT",
"text": "Forza, iniziamo! Sarà comunque una cosa veloce, perchè stiamo testando dati di una sola giornata.",
"updated": 1618060660046
"updated": 1618060660046,
"style": "Definition"
}
]
},
@@ -24,7 +25,8 @@
{
"language": "IT",
"text": "Eseguire una task di trading è simile a eseguire una task di data mining. La differenza sta nel fatto che, dopo aver lanciato la task, devi anche lanciare la trading session.",
"updated": 1618060706178
"updated": 1618060706178,
"style": "Text"
}
]
},
@@ -36,20 +38,23 @@
{
"language": "IT",
"text": "Seleziona Run dal menu Task, e poi seleziona Run dal menu della Backtesting Session!",
"updated": 1618060790679
"updated": 1618060790679,
"style": "Callout"
}
]
},
{
"style": "Note",
"text": "When the progress notice of the Trading Process Instance get's to the 100% mark, stop the task and click Next.",
"text": "When the Backtesting Session indicates it finished processing, stop the Task and click Next.",
"translations": [
{
"language": "IT",
"text": "Quando la progress bar della Trading Process Instance raggiunge il 100%, ferma la task e clicca Next.",
"updated": 1618060849542
"updated": 1618060849542,
"style": "Note"
}
]
],
"updated": 1622201246283
}
]
}
@@ -12,7 +12,8 @@
{
"language": "IT",
"text": "Abbiamo lanciato un backtest ma non abbiamo discusso del Trading System che stiamo testando! Facciamolo ora!",
"updated": 1618061084694
"updated": 1618061084694,
"style": "Definition"
}
]
},
@@ -25,7 +26,8 @@
{
"language": "IT",
"text": "L'idea è comprare il \"falling knife\" e vendere il \"rebound\". La strategia piazza un Limit Buy Order al di sotto dell'attuale prezzo. Se l'ordine non viene evaso nel giro del minuto successivo, viene cancellato e ne viene creato uno nuovo, eventualmente a un prezzo migliore. Se il prezzo scende, è probabile che l'ordine venga evaso: a quel punto la strategia tenta di vendere a un prezzo maggiore.",
"updated": 1618061264322
"updated": 1618061264322,
"style": "Text"
}
]
},
@@ -35,13 +37,14 @@
},
{
"style": "Note",
"text": "Let's not discuss the merits of the trading idea but the implementation. This is just a demo to show off the capacities of the Trading Bot, not the strategy per se.",
"updated": 1610640921014,
"text": "Let's not discuss the merits of the trading idea but the implementation. This is just a demo to show off the capacities of the Trading Bot, not the strategy <i>per se</i>.",
"updated": 1622201574916,
"translations": [
{
"language": "IT",
"text": "Non discutiamo dell'efficacia del metodo, ma della sua implementazione. Questa è una demo per mostrare le capacità del Trading Bot, non la strategia in sè.",
"updated": 1618061327170
"updated": 1618061327170,
"style": "Note"
}
]
}
@@ -12,20 +12,22 @@
{
"language": "IT",
"text": "Il Trading Engine gestisce la complessità del trading automatico rendendo le informazioni accessibili agli utenti e ai sistemi di trading.",
"updated": 1618067277865
"updated": 1618067277865,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Rember my comments about granularity? Remember how the formula on the trading system fetched the value of the exit target rate? Here's a quick reminder:",
"updated": 1610536534720,
"text": "Remember my comments about granularity? Remember how the formula on the trading system fetched the value of the exit target rate? Here's a quick reminder:",
"updated": 1622228180200,
"translations": [
{
"language": "IT",
"text": "Ricordi i miei commenti sulla granularità? Ricordi come la formula del trading system prendeva il valore dell'Exit Target Rate? Ecco un promemoria:",
"updated": 1618067378217
"updated": 1618067378217,
"style": "Text"
}
]
},
@@ -41,7 +43,8 @@
{
"language": "IT",
"text": "Questa stringa contiene il percorso a quel dato nel contesto della struttura della gerarchia del Trading Engine! Riesci a trovare il nodo dell'Exit Target Rate? Espandi la gerarchia e seguila!",
"updated": 1618067490282
"updated": 1618067490282,
"style": "Callout"
}
]
}
@@ -12,7 +12,8 @@
{
"language": "IT",
"text": "Ok, amico mio...è ora di entrare in azione! Sei pronto a una piccola Live Trading Session?",
"updated": 1618068381473
"updated": 1618068381473,
"style": "Definition"
}
]
},
@@ -24,7 +25,8 @@
{
"language": "IT",
"text": "Ti aiuterò con i tre requisiti principali:",
"updated": 1618068402523
"updated": 1618068402523,
"style": "Text"
}
]
},
@@ -35,7 +37,8 @@
{
"language": "IT",
"text": "Controlla i parametri: in particolar modo decidi bene quanto capitale assegnare alla sessione",
"updated": 1618068548173
"updated": 1618068548173,
"style": "List"
}
]
},
@@ -46,7 +49,8 @@
{
"language": "IT",
"text": "Prepara un Exchange Account Key: necessaria perchè l'app possa accedere al tuo account sull'exchange.",
"updated": 1618068559526
"updated": 1618068559526,
"style": "List"
}
]
},
@@ -58,19 +62,21 @@
{
"language": "IT",
"text": "Garantisci un live data feed: l'operazione di data mining con gli indicatori richiesti dal Trading System deve essere attiva e aggiornata.",
"updated": 1618068565912
"updated": 1618068565912,
"style": "List"
}
]
},
{
"style": "Note",
"text": "If you are not ready to do some live trading for whatever reason, no worries, just keep going.",
"updated": 1610642653006,
"text": "If you are not ready to do some live trading for whatever reason, no worries, just keep going. You will at least learn how things work!",
"updated": 1622232287190,
"translations": [
{
"language": "IT",
"text": "Se per un qualunque motivo non sei pronto a fare live trading, non preccuparti! Prosegui pure.",
"updated": 1618068597799
"updated": 1618068597799,
"style": "Note"
}
]
}
@@ -12,7 +12,8 @@
{
"language": "IT",
"text": "Prima di lanciare la Live Trading Session, assicurati di avere abbastanza USDT nel tuo wallet spot sull'exchange.",
"updated": 1618070262891
"updated": 1618070262891,
"style": "Definition"
}
]
},
@@ -24,7 +25,8 @@
{
"language": "IT",
"text": "Controlla il tuo saldo sull'exchange e prepara abbastanza USDT per la sessione!",
"updated": 1618070327486
"updated": 1618070327486,
"style": "Callout"
}
]
},
@@ -35,19 +37,21 @@
{
"language": "IT",
"text": "Il Trading Bot inserirà un limit order del valore di initialBalance, e lo cancellerà il minuto successivo se non viene evaso, come spiegato prima.",
"updated": 1618070448288
"updated": 1618070448288,
"style": "Important"
}
]
},
{
"style": "Note",
"text": "Keep going even if you are not ready to trade. You'll learn a few more tricks before we finish.",
"updated": 1616431994687,
"text": "Keep going even if you are not ready to trade! It's important because there are more things to learn in the tutorial!",
"updated": 1622232501088,
"translations": [
{
"language": "IT",
"text": "Continua il tutorial anche se non sei pronto al live trading. Imparerai altri trucchi utili prima della fine.",
"updated": 1618070434600
"updated": 1618070434600,
"style": "Note"
}
]
}
@@ -13,7 +13,8 @@
{
"language": "IT",
"text": "Qui è dove configuro le Exchange Account Key per la Live Trading Session del Lightning Strike Trading System.",
"updated": 1618070825773
"updated": 1618070825773,
"style": "Definition"
}
]
},
@@ -26,7 +27,8 @@
{
"language": "IT",
"text": "Accedi alla configurazione e inserisci attentamente la API Public Key e la API Secret Key.",
"updated": 1618070869172
"updated": 1618070869172,
"style": "Callout"
}
]
},
@@ -37,19 +39,21 @@
{
"language": "IT",
"text": "Cancella prima la stringa di testo di default per ogni parametro, così da non rischiare errori inserendo le tue chiavi.",
"updated": 1618070932988
"updated": 1618070932988,
"style": "Text"
}
]
},
{
"style": "Note",
"text": "The Exchange Account Key is stored in the workspace file. It is used to authenticate with the exchange when the Trading Bot deals with orders. It is never sent or stored anywhere else.",
"updated": 1616435057411,
"style": "Warning",
"text": "The Exchange Account Key is stored in the User Workspace file, unencrypted. It is used to authenticate with the exchange. It's never sent or stored elsewhere. Don't share this workspace until you learn to how do it safely in the next tutorial.",
"updated": 1622233064100,
"translations": [
{
"language": "IT",
"text": "L'Exchange Account Key è salvata nel workspace file. È utilizzata dal Trading Bot per autenticarsi sull'exchange quando gestisce gli ordini. Non viene inviata nè salvata in nessun'altro luogo.",
"updated": 1618071006665
"updated": 1618071006665,
"style": "Note"
}
]
}
@@ -7,13 +7,14 @@
"project": "Superalgos",
"name": "indicator-process-instance"
},
"text": "Resistances and Supports Multi-Time-Frame-Daily to the left is the last of the processes to finish.",
"updated": 1610643083669,
"text": "Resistances and Supports Multi-Time-Frame-Daily to the left is the last of the processes to finish, so keep an eye on it!",
"updated": 1622233213694,
"translations": [
{
"language": "IT",
"text": "Resistances and Supports Multi-Time-Frame-Daily a sinistra è l'ultimo processo a terminare.",
"updated": 1618071215837
"updated": 1618071215837,
"style": "Definition"
}
]
},
@@ -25,7 +26,8 @@
{
"language": "IT",
"text": "Se il processo è a 100%, allora siamo pronti a iniziare.",
"updated": 1618071233196
"updated": 1618071233196,
"style": "Text"
}
]
},
@@ -36,7 +38,8 @@
{
"language": "IT",
"text": "Ad ogni modo, non succede niente di catastrofico se tenti di lanciare una Live Trading Session quando gl indicatori non sono pronti. Ti viene semplicemente notificato un errore. Nessun problema quindi!",
"updated": 1618071277306
"updated": 1618071277306,
"style": "Note"
}
]
},
@@ -48,7 +51,8 @@
{
"language": "IT",
"text": "Nel prossimo step ti chiederò di lanciare la Task e la Live Trading Session. Se non vuoi farlo, continua con il tutorial come se niente fosse.",
"updated": 1618071315670
"updated": 1618071315670,
"style": "Success"
}
]
}
@@ -12,32 +12,37 @@
{
"language": "IT",
"text": "Abbiamo completato tutti e tre i punti sulla nostra checklist e siamo pronti a partire!",
"updated": 1618071368189
"updated": 1618071368189,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Run the Lightning Strike Task, and then run the Lightning Strike Live Trading Session to the right!",
"text": "Run the Lightning Strike Task, and then run the Lightning Strike Live Trading Session further down the hierarchy!",
"translations": [
{
"language": "IT",
"text": "Lancia la Lightning Strike Task, e poi lancia la Lightning Strike Live Trading Session a destra!",
"updated": 1618071413222
"updated": 1618071413222,
"style": "Callout"
}
]
],
"updated": 1622233324259
},
{
"style": "Note",
"text": "Once you run the session, the trading bot may have to wait up to 60 seconds for the last indicator to finish processing. Once it does, you will see the current date and a 0% progress notice under the Trading Process Instance, which will remain like that throughout the run.",
"text": "Once you run the session, the trading bot may have to wait up to 60 seconds for the last indicator to finish processing. Once it does, you will see the current date and a 0% progress notice under the Trading Process Instance, which will remain like that throughout the run, because we are not setting a time limit for the session.",
"translations": [
{
"language": "IT",
"text": "Una volta lanciata la sessione, il trading bot può dover attendere fino a 60 secondi perchè gli ultimi indicatori terminino. Una volta completati, vedrai la data corrente e un progresso dello 0% sotto la Trading Process Instance, che rimarrà così per tutta la durata della sessione.",
"updated": 1618071515418
"updated": 1618071515418,
"style": "Note"
}
]
],
"updated": 1622233370311
}
]
}
@@ -386,10 +386,11 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
}
let separator = ""
pathString = '/'
parametersMap.forEach(addParameterToPath)
function addParameterToPath(value, key, map) {
if (pathString === "") { pathString = '/' }
let apiPathParameter = value
let parameterValue = key // This is the default value
if (apiPathParameter.config.replaceBy !== undefined) {
@@ -517,7 +518,7 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
Now that we have the endpointNode, the parameters and all the information
needed to place the call to the API.
*/
let httpClient = require('https')
const fetch = require('node-fetch')
let url = protocol + '://' +
hostName +
portNumber +
@@ -532,140 +533,192 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
This is how we call the API.
*/
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> startProcess -> fetchAPIData -> httpClient.get -> url = " + url)
"[INFO] start -> startProcess -> fetchAPIData -> url = " + url)
httpClient.get(url, (response) => {
fetch(url)
.then((response) => {
const chunks = []
let apiResponseSchemaNode
let errorCodeReceived
let apiResponseSchemaNode
let errorCodeReceived
/*
At this point we have received the first http reponse from the API server,
and from it we can extract the status code, which is the html code of the
response of our request.
With that code we can get the API Response Schema, which will tell us how
to extract data from the response.
*/
getApiResponseSchema(response.statusCode)
if (apiResponseSchemaNode === undefined) {
errorCodeReceived = true
TS.projects.superalgos.utilities.errorHandlingFunctions.throwHandledException(
processIndex,
MODULE_NAME,
'API Data Fetcher Bot',
{ resposeCodeReceived: response.statusCode, detais: 'The response code ' + response.statusCode + ' received is not associated with any API Query Response node.' },
'Unexpected API Response Code',
endpointNode
)
}
function getApiResponseSchema(responseCode) {
/*
The API Response Schema we will depend on the response code received from the
API server. Here we will locate the right Api Response Schema.
At this point we have received the first http reponse from the API server,
and from it we can extract the status code, which is the html code of the
response of our request.
With that code we can get the API Response Schema, which will tell us how
to extract data from the response.
*/
for (let j = 0; j < apiMap.apiVersions.length; j++) {
let version = apiMap.apiVersions[j]
for (let k = 0; k < version.apiEndpoints.length; k++) {
let endpoint = version.apiEndpoints[k]
if (endpointNode.id === endpoint.id) {
for (let i = 0; i < endpoint.apiQueryResponses.apiQueryResponses.length; i++) {
let apiQueryResponse = endpoint.apiQueryResponses.apiQueryResponses[i]
getApiResponseSchema(response.status)
if (Number(apiQueryResponse.config.codeName) === responseCode) {
apiResponseSchemaNode = apiQueryResponse.apiResponseSchema
if (apiResponseSchemaNode === undefined) {
errorCodeReceived = true
TS.projects.superalgos.utilities.errorHandlingFunctions.throwHandledException(
processIndex,
MODULE_NAME,
'API Data Fetcher Bot',
{ resposeCodeReceived: response.status, errorDetails: 'Calling the URL ' + url + '. The response code ' + response.status + ' received is not associated with any API Query Response node.' },
'Unexpected API Response Code',
endpointNode
)
} else {
getResponseBody()
}
/*
We will check that what we received is not an error code.
*/
if (apiQueryResponse.config.isError === true) {
errorCodeReceived = true
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> getApiResponseSchema -> API Response is an Error -> responseCode = " + responseCode)
function getApiResponseSchema(responseCode) {
/*
The API Response Schema we will depend on the response code received from the
API server. Here we will locate the right Api Response Schema.
*/
for (let j = 0; j < apiMap.apiVersions.length; j++) {
let version = apiMap.apiVersions[j]
for (let k = 0; k < version.apiEndpoints.length; k++) {
let endpoint = version.apiEndpoints[k]
if (endpointNode.id === endpoint.id) {
for (let i = 0; i < endpoint.apiQueryResponses.apiQueryResponses.length; i++) {
let apiQueryResponse = endpoint.apiQueryResponses.apiQueryResponses[i]
if (Number(apiQueryResponse.config.codeName) === responseCode) {
apiResponseSchemaNode = apiQueryResponse.apiResponseSchema
/*
We will check that what we received is not an error code.
*/
if (apiQueryResponse.config.isError === true) {
errorCodeReceived = true
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> getApiResponseSchema -> API Response is an Error -> responseCode = " + responseCode)
}
return
}
return
}
}
}
}
}
}
response.on('data', (chunk) => {
chunks.push(chunk)
});
response.on('end', (d) => {
apiResponseReceivedText = Buffer.concat(chunks).toString('utf8')
/*
If we received an errror code, we abort the processing at this point.
*/
if (errorCodeReceived === true) {
resolve('ERROR_CODE_RECEIVED')
return
}
/*
Here we will validate that the overall format is what we are expecting.
*/
switch (apiResponseSchemaNode.apiResponseFields.config.fieldType) {
case 'object': {
function getResponseBody() {
response.text().then(body => {
apiResponseReceivedText = body
/*
If we did not received an object, that probably means something is not
good, and we got an HTML with the reason inside.
If we received an errror code, we abort the processing at this point.
*/
if (apiResponseReceivedText.substring(0, 1) !== "{") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an JSON Object. -> apiResponseReceivedText = " + apiResponseReceivedText)
resolve('UNEXPECTED_API_RESPONSE')
if (errorCodeReceived === true) {
resolve('ERROR_CODE_RECEIVED')
return
}
break
}
case 'array': {
/*
If we did not received an array, that probably means something is not
good, and we got an HTML with the reason inside.
Here we will validate that the overall format is what we are expecting.
*/
if (apiResponseReceivedText.substring(0, 1) !== "[") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an Array with Data. -> apiResponseReceivedText = " + apiResponseReceivedText)
resolve('UNEXPECTED_API_RESPONSE')
switch (apiResponseSchemaNode.apiResponseFields.config.fieldType) {
case 'object': {
/*
If we did not received an object, that probably means something is not
good, and we got an HTML with the reason inside.
*/
if (apiResponseReceivedText.substring(0, 1) !== "{") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an JSON Object. -> apiResponseReceivedText = " + apiResponseReceivedText)
resolve('UNEXPECTED_API_RESPONSE')
return
}
break
}
case 'array': {
/*
If we did not received an array, that probably means something is not
good, and we got an HTML with the reason inside.
*/
if (apiResponseReceivedText.substring(0, 1) !== "[") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an Array with Data. -> apiResponseReceivedText = " + apiResponseReceivedText)
resolve('UNEXPECTED_API_RESPONSE')
return
}
break
}
}
/*
The actual data we need could be anywhere within the data structure received.
The exact place is configured at the apiResponseSchemaNode property nodePath.
We will eval the nodePath property (this assumes that the apiResponseReceivedObject is defined)
*/
apiResponseReceivedObject = JSON.parse(apiResponseReceivedText)
apiData = eval(apiResponseSchemaNode.config.nodePath)
/*
We will expect the apiData to be an Array. Depending if it has data or not we will return
NO_MORE_PAGES or PAGE_FETCHED so that pagination procedure knows when to stop.
*/
if (apiData.length === 0) {
resolve('NO_MORE_PAGES')
} else {
resolve('PAGE_FETCHED')
}
/*
If we received an errror code, we abort the processing at this point.
*/
if (errorCodeReceived === true) {
resolve('ERROR_CODE_RECEIVED')
return
}
break
}
/*
Here we will validate that the overall format is what we are expecting.
*/
switch (apiResponseSchemaNode.apiResponseFields.config.fieldType) {
case 'object': {
/*
If we did not received an object, that probably means something is not
good, and we got an HTML with the reason inside.
*/
if (apiResponseReceivedText.substring(0, 1) !== "{") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an JSON Object. -> apiResponseReceivedText = " + apiResponseReceivedText)
resolve('UNEXPECTED_API_RESPONSE')
return
}
break
}
case 'array': {
/*
If we did not received an array, that probably means something is not
good, and we got an HTML with the reason inside.
*/
if (apiResponseReceivedText.substring(0, 1) !== "[") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> startProcess -> fetchAllPages -> fetchAPIData -> onResponse -> onEnd -> Unexpected Response. Not an Array with Data. -> apiResponseReceivedText = " + apiResponseReceivedText)
resolve('UNEXPECTED_API_RESPONSE')
return
}
break
}
}
/*
The actual data we need could be anywhere within the data structure received.
The exact place is configured at the apiResponseSchemaNode property nodePath.
We will eval the nodePath property (this assumes that the apiResponseReceivedObject is defined)
*/
apiResponseReceivedObject = JSON.parse(apiResponseReceivedText)
apiData = eval(apiResponseSchemaNode.config.nodePath)
/*
We will expect the apiData to be an Array. Depending if it has data or not we will return
NO_MORE_PAGES or PAGE_FETCHED so that pagination procedure knows when to stop.
*/
if (apiData.length === 0) {
resolve('NO_MORE_PAGES')
} else {
resolve('PAGE_FETCHED')
}
})
}
/*
The actual data we need could be anywhere within the data structure received.
The exact place is configured at the apiResponseSchemaNode property nodePath.
We will eval the nodePath property (this assumes that the apiResponseReceivedObject is defined)
*/
apiResponseReceivedObject = JSON.parse(apiResponseReceivedText)
apiData = eval(apiResponseSchemaNode.config.nodePath)
/*
We will expect the apiData to be an Array. Depending if it has data or not we will return
NO_MORE_PAGES or PAGE_FETCHED so that pagination procedure knows when to stop.
*/
if (apiData.length === 0) {
resolve('NO_MORE_PAGES')
} else {
resolve('PAGE_FETCHED')
}
});
}).on('error', (err) => {
console.error(err);
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> httpClient.get -> err = " + err.stack)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> httpClient.get -> Connection to the API Server Failed. Maybe there is no Internet connection. Retrying later. ")
resolve('NO_CONNECTION')
});
})
.catch(err => {
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> fetch -> err = " + err.stack)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> fetch -> Connection to the API Server Failed. Maybe there is no Internet connection. Retrying later. ")
resolve('NO_CONNECTION')
})
}
)
@@ -947,7 +1000,7 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
/*
We will need to get the nodePath for this property, representing the path
to the value on the received data. There are 2 ways to get this nodePath.
1) It is explicitly declared at the node. If this exists then we will use it.
2) It was calculated automatically.
*/
@@ -1009,10 +1062,16 @@ exports.newSuperalgosBotModulesFetchingProcess = function (processIndex) {
thisReport.file = {
lastRun: (new Date()).toISOString(),
lastPage: lastPage,
lastFile: contextVariables.lastFile.toISOString(),
beginingOfMarket: contextVariables.beginingOfMarket
}
/*
For Single-File Datasets there is no lastFile defined.
*/
if (contextVariables.lastFile !== undefined) {
thisReport.file.lastFile = contextVariables.lastFile.toISOString()
}
if (thisReport.file.beginingOfMarket === undefined) {
thisReport.file.beginingOfMarket = (new Date()).toISOString()
}
@@ -0,0 +1,11 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
}
}
}
@@ -0,0 +1,10 @@
{
"name": "api-data-fetcher-bot",
"version": "1.0.0",
"description": "Api Fetcher Bot",
"main": "FetchingProcess.js",
"author": "Luis Molina, Harrellbm",
"dependencies": {
"node-fetch": "2.6.1"
}
}
@@ -329,7 +329,7 @@
'Project/' +
TS.projects.superalgos.globals.taskConstants.PROJECT_DEFINITION_NODE.config.codeName + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.type.replace(' ', '-') + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.config.codeName + "/" +
'Candles' + "/" +
"Candles-Volumes" + '/' + TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.codeName + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "-" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
@@ -375,7 +375,7 @@
'Project/' +
TS.projects.superalgos.globals.taskConstants.PROJECT_DEFINITION_NODE.config.codeName + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.type.replace(' ', '-') + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.config.codeName + "/" +
'Candles' + "/" +
"Candles-Volumes" + '/' + TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.codeName + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "-" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
@@ -69,7 +69,7 @@
let filePathRoot =
'Project/' + TS.projects.superalgos.globals.taskConstants.PROJECT_DEFINITION_NODE.config.codeName + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.type.replace(' ', '-') + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.config.codeName + "/" +
'Candles' + "/" +
"Candles-Volumes" + '/' + TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.codeName + "/" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "-" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName
@@ -12,7 +12,7 @@
let fileStorage = TS.projects.superalgos.taskModules.fileStorage.newFileStorage(processIndex)
let statusDependencies
let statusDependenciesModule
let dataDependenciesModule
let dataFiles = new Map
let indicatorOutputModule
@@ -21,9 +21,9 @@
return thisObject;
function initialize(pStatusDependencies, pDataDependencies, callBackFunction) {
statusDependencies = pStatusDependencies;
dataDependenciesModule = pDataDependencies;
function initialize(pStatusDependencies, pStatusDependenciesModule, callBackFunction) {
statusDependenciesModule = pStatusDependencies;
dataDependenciesModule = pStatusDependenciesModule;
indicatorOutputModule = TS.projects.superalgos.botModules.indicatorOutput.newSuperalgosBotModulesIndicatorOutput(processIndex)
indicatorOutputModule.initialize(callBackFunction)
@@ -31,7 +31,7 @@
function finalize() {
dataFiles = undefined
statusDependencies = undefined
statusDependenciesModule = undefined
dataDependenciesModule = undefined
indicatorOutputModule = undefined
fileStorage = undefined
@@ -60,7 +60,7 @@
/*
We look first for the bot who knows the begining of the market in order to get when the market starts.
*/
statusReport = statusDependencies.reportsByMainUtility.get("Market Starting Point")
statusReport = statusDependenciesModule.reportsByMainUtility.get("Market Starting Point")
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -112,7 +112,7 @@
/*
Here we get the status report from the bot who knows which is the end of the market.
*/
statusReport = statusDependencies.reportsByMainUtility.get("Market Ending Point")
statusReport = statusDependenciesModule.reportsByMainUtility.get("Market Ending Point")
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -147,7 +147,7 @@
contextVariables.dateEndOfMarket = new Date(thisReport.lastFile.valueOf())
/* Finally we get our own Status Report. */
statusReport = statusDependencies.reportsByMainUtility.get("Self Reference")
statusReport = statusDependenciesModule.reportsByMainUtility.get("Self Reference")
if (statusReport === undefined) { // This means the status report does not exist, that could happen for instance at the begining of a month.
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -229,9 +229,9 @@
"[ERROR] start -> getContextVariables -> err = " + err.stack)
if (err.message === "Cannot read property 'file' of undefined") {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[HINT] start -> getContextVariables -> Check the bot configuration to see if all of its statusDependencies declarations are correct. ")
"[HINT] start -> getContextVariables -> Check the bot configuration to see if all of its statusDependenciesModule declarations are correct. ")
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[HINT] start -> getContextVariables -> Dependencies loaded -> keys = " + JSON.stringify(statusDependencies.keys))
"[HINT] start -> getContextVariables -> Dependencies loaded -> keys = " + JSON.stringify(statusDependenciesModule.keys))
}
callBackFunction(TS.projects.superalgos.globals.standardResponses.DEFAULT_FAIL_RESPONSE)
}
@@ -610,9 +610,7 @@
}
function writeStatusReport(lastFileDate, callBack) {
let reportKey = TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.config.codeName + "-" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.config.codeName + "-" + "Multi-Time-Frame-Daily"
let thisReport = statusDependencies.statusReports.get(reportKey)
let thisReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
thisReport.file.lastFile = lastFileDate;
thisReport.file.interExecutionMemoryArray = interExecutionMemoryArray;
@@ -12,17 +12,17 @@
let fileStorage = TS.projects.superalgos.taskModules.fileStorage.newFileStorage(processIndex)
let statusDependencies
let statusDependenciesModule
let dataDependenciesModule
let dataFiles = new Map()
let indicatorOutputModule
return thisObject;
function initialize(pStatusDependencies, pDataDependencies, callBackFunction) {
function initialize(pStatusDependencies, pStatusDependenciesModule, callBackFunction) {
statusDependencies = pStatusDependencies
dataDependenciesModule = pDataDependencies
statusDependenciesModule = pStatusDependencies
dataDependenciesModule = pStatusDependenciesModule
indicatorOutputModule = TS.projects.superalgos.botModules.indicatorOutput.newSuperalgosBotModulesIndicatorOutput(processIndex)
indicatorOutputModule.initialize(callBackFunction)
@@ -31,7 +31,7 @@
function finalize() {
fileStorage = undefined
dataFiles = undefined
statusDependencies = undefined
statusDependenciesModule = undefined
dataDependenciesModule = undefined
indicatorOutputModule = undefined
thisObject = undefined
@@ -209,9 +209,7 @@
}
function writeStatusReport(callBack) {
let reportKey = TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.parentNode.config.codeName + "-" +
TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.processes[processIndex].referenceParent.parentNode.config.codeName + "-" + "Multi-Time-Frame-Market"
let thisReport = statusDependencies.statusReports.get(reportKey)
let thisReport = statusDependenciesModule.reportsByMainUtility.get('Self Reference')
thisReport.file.lastExecution = TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME;
if (TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.timeFramesFilter !== undefined) {
@@ -178,7 +178,7 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value = phase
}
function initialTargets(tradingSystemStageNode, tradingEngineStageNode) {
function initialTargets(tradingSystemStageNode, tradingEngineStageNode, stageName) {
if (tradingSystemStageNode.initialTargets === undefined) {
const message = 'Initial Targets Node Missing'
@@ -194,7 +194,7 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
}
setTargetRate()
setTargetSize()
return setTargetSize(stageName)
function setTargetRate() {
if (tradingSystemStageNode.initialTargets.targetRate === undefined) {
@@ -262,7 +262,7 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
}
}
function setTargetSize() {
function setTargetSize(stageName) {
/* Basic Validation */
if (
tradingSystemStageNode.initialTargets.targetSizeInBaseAsset !== undefined &&
@@ -298,6 +298,9 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
badDefinitionUnhandledException(undefined, message, tradingSystemStageNode.initialTargets.targetSizeInBaseAsset, docs)
}
if (value === 0) {
if (stageName === 'Close Stage') {
return false;
}
const message = 'Target Size Value Zero'
let docs = {
@@ -266,7 +266,8 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
function checkIfWeNeedToAbortTheStage() {
/* Abort Open Stage Check */
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Open' && tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Open') {
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Open' &&
(tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Opening' || tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Open') ){
/*
if the Close stage is opened while the open stage is still open that means that
we need to stop placing orders, check what happened to the orders already placed,
@@ -281,7 +282,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Opening') {
/*
The system allows the user not to define an Open Stage, because the Open Stage is optional.
Here we are going to see if that is the case and if it is, we will inmidiatelly consider
Here we are going to see if that is the case and if it is, we will immediately consider
the Open Stage as closed.
*/
if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].openStage === undefined) {
@@ -427,7 +428,9 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
*/
if (manageStage === undefined) {
changeStageStatus('Manage Stage', 'Closed', 'Manage Stage Undefined')
changeStageStatus('Close Stage', 'Opening')
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value !== 'Open' && tradingEngine.tradingCurrent.strategyOpenStage.status.value !== 'Opening') {
changeStageStatus('Close Stage', 'Opening');
}
return
}
@@ -766,7 +769,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
or our Take Profit were hit.
*/
/* Stop Loss condition: Here we verify if the Stop Loss was hitted or not. */
/* Stop Loss condition: Here we verify if the Stop Loss was hit or not. */
if (
(
tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Above' &&
@@ -838,7 +841,9 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
/* Exit Position size and rate */
tradingSystem.evalFormulas(tradingSystemStage, 'Initial Targets')
tradingPositionModuleObject.initialTargets(tradingSystemStage, tradingEngine.tradingCurrent.strategyCloseStage)
if (tradingPositionModuleObject.initialTargets(tradingSystemStage, tradingEngine.tradingCurrent.strategyCloseStage, 'Close Stage') === false) {
//console.log("No Close-Stage Target Asset to Trade: Strategy Closing.");
}
initializeStageTargetSize()
changeStageStatus('Close Stage', 'Open')
@@ -955,9 +960,9 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
function exitPositionValidation() {
/*
Exit Position Validation: we need al the previous stages to be either closed
or at their initial default value. The last is becasue after Closed objects are
initialized to their defualts.
Exit Position Validation: we need all the previous stages to be either closed
or at their initial default value. The last is because after Closed objects are
initialized to their defaults.
*/
if (tradingEngine.tradingCurrent.position.status.value !== 'Open' && tradingEngine.tradingCurrent.position.status.value !== 'Closing') { return }
if (tradingEngine.tradingCurrent.position.status.value !== 'Close' && tradingEngine.tradingCurrent.position.status.value !== 'Closing') { return }
@@ -1145,8 +1150,8 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
checkUserDefinedCode(stageName, 'Open')
}
if (stage.status.value === 'Closed') {
closeStage(stage)
checkUserDefinedCode(stageName, 'Closed')
closeStage(stage, stageName)
}
/*
@@ -1167,10 +1172,23 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
stage.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
function closeStage(stage) {
function closeStage(stage, stageName) {
/* Recording the closing at the Trading Engine Data Structure */
stage.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value
stage.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
if (stageName === 'Open Stage') {
if (tradingEngine.tradingCurrent.strategyCloseStage.status.value !== 'Opening' && tradingEngine.tradingCurrent.strategyCloseStage.status.value !== 'Open' &&
tradingEngine.tradingCurrent.strategyManageStage.status.value !== 'Opening' && tradingEngine.tradingCurrent.strategyManageStage.status.value !== 'Open') {
changeStageStatus('Close Stage', 'Opening');
}
}
if (stageName === 'Close Stage') {
if (tradingEngine.tradingCurrent.position.status.value === 'Open') {
tradingPositionModuleObject.closingPosition('Close Stage Closed')
/* NOTE:TODO: Announcement May need added Here */
}
}
}
}
Loaded 100 of 104 files, more files were not shown because too many files have changed in this diff. Show more