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

This commit is contained in:
cozed-gh committed 2021-03-08 00:40:15 +01:00
commit 1ab4856a6c
105 files changed
+3280 -322

No files matched your search

+15
View File
@@ -0,0 +1,15 @@
Data-Storage
Log-Files
My-Workspaces
debug.log
*.db
.git*
.vscode
README.md
LICENSE
CONTRIBUITING.md
CODE_OF_CONDUCT.md
./**/.vscode
Dockerfile
+38
View File
@@ -0,0 +1,38 @@
name: Publish Docker image
on:
push:
branches: [master, develop]
jobs:
publish:
name: Publish Image
runs-on: ubuntu-latest
steps:
- id: repository
uses: ASzc/change-string-case-action@v1
with:
string: "${{ github.repository }}/${{ github.event.repository.name }}"
- uses: actions/checkout@v2
- name: Preparation
id: prep
run: |
REGISTRY="ghcr.io"
IMAGE="${REGISTRY}/${{ steps.repository.outputs.lowercase }}"
TAGS="${IMAGE}:${{ github.sha }}"
if [[ $GITHUB_REF == ref/head/master ]]; then
TAGS="${TAGS},${IMAGE}:latest"
fi
echo ::set-output name=tags::${TAGS}
- name: Login in to registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Push to registry
uses: docker/build-push-action@v2
with:
push: true
file: ./Docker/Dockerfile
tags: ${{ steps.prep.outputs.tags }}
+9
View File
@@ -0,0 +1,9 @@
FROM node:15-alpine
WORKDIR /app
COPY . .
RUN adduser --disabled-password --no-create-home superalgos
RUN chown -R superalgos:superalgos /app
USER superalgos
EXPOSE 34248
EXPOSE 18041
ENTRYPOINT ["node", "run", "noBrowser"]
+16
View File
@@ -0,0 +1,16 @@
version: "3"
services:
superalgos:
build:
context: ..
dockerfile: ./Docker/Dockerfile
image: superalgos
command: ["minMemo"]
ports:
- '34248:34248'
- '18041:18041'
volumes:
- ../Data-Storage:/app/Data-Storage
- ../Log-Files:/app/Log-Files
- ../My-Workspaces:/app/My-Workspaces
restart: on-failure
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-703 270 512 512" style="enable-background:new -703 270 512 512;" xml:space="preserve">
<style type="text/css">
.st0{fill:#0295AA;}
.st1{fill:#365558;}
.st2{fill:none;stroke:#FFFFFF;stroke-width:13;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{fill:#F0353D;}
.st4{fill:#FD6A33;}
.st5{fill:#FF8C29;}
.st6{fill:#FFD1A9;}
.st7{fill:#4ACFD9;}
.st8{fill:#9BAAAB;}
.st9{fill:#CDD4D5;}
.st10{fill:#E6EAEA;}
.st11{fill:#FFFFFF;}
.st12{fill:#BCD643;}
</style>
<path class="st0" d="M-227.5,270H-447v512h219.5c20.1,0,36.5-16.4,36.5-36.5v-439C-191,286.4-207.4,270-227.5,270z"/>
<path class="st1" d="M-666.5,270c-20.1,0-36.5,16.4-36.5,36.5v439c0,20.1,16.4,36.5,36.5,36.5H-447V270H-666.5z"/>
<g>
<path class="st2" d="M-664,477.4c0,0,0,22,0,50.1c0,28.1,17.7,44.9,31.5,44.9s32.4,0,32.4,0"/>
<path class="st2" d="M-479.2,477.4c0,0,0,11.7,0,47.5s-20.3,49.7-40.6,49.7c-20.3,0-40.6-13.8-40.6-49.7s0-47.5,0-47.5"/>
<path class="st2" d="M-351.4,574.6c0,0,0-11.7,0-47.5s-20.3-49.7-40.6-49.7c-20.3,0-40.6,13.8-40.6,49.7s0,47.5,0,47.5"/>
<circle class="st2" cx="-258.5" cy="526" r="48.5"/>
</g>
<rect x="-1330.3" y="270" class="st3" width="128" height="128"/>
<rect x="-1202.3" y="270" class="st4" width="128" height="128"/>
<rect x="-1074.3" y="270" class="st5" width="128" height="128"/>
<rect x="-946.3" y="270" class="st6" width="128" height="128"/>
<rect x="-1330.3" y="398" class="st1" width="128" height="128"/>
<rect x="-1202.3" y="398" class="st0" width="128" height="128"/>
<rect x="-1074.3" y="398" class="st7" width="128" height="128"/>
<rect x="-1330.3" y="526" class="st8" width="128" height="128"/>
<rect x="-1202.3" y="526" class="st9" width="128" height="128"/>
<rect x="-1074.3" y="526" class="st10" width="128" height="128"/>
<rect x="-946.3" y="526" class="st11" width="128" height="128"/>
<rect x="-1330.3" y="654" class="st12" width="128" height="128"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="-703 270 512 512" style="enable-background:new -703 270 512 512;" xml:space="preserve">
<style type="text/css">
.st0{clip-path:url(#SVGID_2_);}
.st1{fill:#007640;}
.st2{fill:#FFFFFF;}
.st3{fill:#002A8A;}
.st4{fill:#D42422;}
.st5{fill:#FCB612;}
</style>
<g>
<defs>
<circle id="SVGID_1_" cx="-447" cy="526" r="256"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<g id="XMLID_1174_" class="st0">
<rect id="XMLID_1181_" x="-741.4" y="270" class="st1" width="768" height="512"/>
<polygon id="XMLID_1180_" class="st2" points="-649.2,782 -342,577.2 26.6,577.2 26.6,782 "/>
<polygon id="XMLID_1179_" class="st2" points="-649.2,270 -342,474.8 26.6,474.8 26.6,270 "/>
<polygon id="XMLID_1178_" class="st3" points="-587.8,782 -331.8,611.3 26.6,611.3 26.6,782 "/>
<polygon id="XMLID_1177_" class="st4" points="-587.8,270 -331.8,440.7 26.6,440.7 26.6,270 "/>
<polygon id="XMLID_1176_" class="st5" points="-741.4,720.6 -741.4,331.4 -449.6,526 "/>
<polygon id="XMLID_1175_" points="-741.4,679.6 -741.4,372.4 -511,526 "/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -1 +1 @@
{"type":"Trading Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Trading Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Trading Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Trading Episode Counters","project":"Superalgos","id":"739cf676-5ff9-4626-81bd-266b8e662ea7","savedPayload":{"position":{"x":24910.97457254189,"y":18457.46644293786},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"a57b7080-2b86-418d-88dc-8d8418f361e2"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Trading Episode Counters","project":"Superalgos","id":"a110cc47-5839-41a6-9022-20e1037db0b2","savedPayload":{"position":{"x":24834.601232363748,"y":18490.07023931273},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"f66581e7-4401-4fa9-8f75-daeaa38c3365"}}},{"type":"Output Dataset","name":"Multi-Period-Market Trading Episode Statistics","project":"Superalgos","id":"f175eae3-26fb-4f08-8b05-7b2679e9bc42","savedPayload":{"position":{"x":24753.53736157276,"y":18508.085329665024},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"0f4ae6fe-d330-42f4-b122-647372d738b4"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Trading Episode Statistics","project":"Superalgos","id":"4ea61d21-9c12-45b5-b3bf-7762ab7da3cb","savedPayload":{"position":{"x":24670.543493063306,"y":18510.89823169951},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"3eec72c3-2256-4270-8cf2-880e814d057f"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"b8876bc6-93f3-43b8-8b53-58fbe3f8ff54","savedPayload":{"position":{"x":24588.445883487308,"y":18498.413155411115},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"6cd81e99-8c92-4b63-975d-cbffeff47a06"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"06abb837-6c4d-4a62-b778-97039970816c","savedPayload":{"position":{"x":24510.040268473647,"y":18471.05526509864},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"ec83880d-bc04-4a7b-9fa4-9dd1759296ab"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"2fa552d7-66bf-4750-ade4-2cab1f3178b3","savedPayload":{"position":{"x":24437.996657204443,"y":18429.756200904503},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"8cca405e-2e5a-4528-ae0d-a17777b67dd1"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"6faa2af4-f239-4668-a0c4-5e2932c045af","savedPayload":{"position":{"x":24374.76840845468,"y":18375.922352927064},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"Line truncated
{"type":"Trading Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Trading Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Trading Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Trading Episode Counters","project":"Superalgos","id":"ec8d74ba-a4ad-417a-b479-6bae95b8a1fe","savedPayload":{"position":{"x":24910.97457254189,"y":18457.46644293786},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"3ed03a02-381d-43fe-9faa-761728c53bd8"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Trading Episode Counters","project":"Superalgos","id":"22b0af33-8c2f-4194-839b-affd18f298d5","savedPayload":{"position":{"x":24834.601232363748,"y":18490.07023931273},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"15f5b150-f1cf-403c-8cb9-2c7c4e1db8e8"}}},{"type":"Output Dataset","name":"Multi-Period-Market Trading Episode Statistics","project":"Superalgos","id":"23ab91ae-2e78-4993-bb69-855f69cef1ce","savedPayload":{"position":{"x":24753.53736157276,"y":18508.085329665024},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"fc9dc0f7-35e0-4548-bb91-f920825d694f"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Trading Episode Statistics","project":"Superalgos","id":"d0a4515a-279d-4c27-8de2-168108861242","savedPayload":{"position":{"x":24670.543493063306,"y":18510.89823169951},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"91953362-8751-4440-a898-21245cd47c15"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"7fc80977-5b37-413e-8107-0a89a16e08b0","savedPayload":{"position":{"x":24588.445883487308,"y":18498.413155411115},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"17fb41f5-61b5-4433-9a10-950ff8216a7e"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"a6888750-1043-420c-9253-633e1399c5e4","savedPayload":{"position":{"x":24510.040268473647,"y":18471.05526509864},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"bbc9467d-28bf-432b-9e49-582d1bcabfb9"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"0ad114df-f076-4a86-8c62-4c4a146da73c","savedPayload":{"position":{"x":24437.996657204443,"y":18429.756200904503},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"acddff59-b51b-4b45-b58f-71d4077755ee"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"04b51302-957d-4365-ad55-9f89d60e261c","savedPayload":{"position":{"x":24374.76840845468,"y":18375.922352927064},"targetPosition":{"x":24696.86240363471,"y":18061.668541066385},"Line truncated
@@ -1 +1 @@
{"type":"Trading System","name":"Lightning Strike","config":"{ \n\"codeName\": \"Lightning Strike\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"My Trading Strategy","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Trigger On","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"e2ea7ded-2be1-43a3-a7fa-de3d9b8eeec4","savedPayload":{"position":{"x":29614.345537114667,"y":29686.264363248512},"targetPosition":{"x":30059.096259318965,"y":29912.85964671243},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e693623c-e11f-49e3-99da-1897c7a47563","savedPayload":{"position":{"x":30059.096259318965,"y":29912.85964671243},"targetPosition":{"x":30503.948096117412,"y":30139.527093006473},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"9135663f-deeb-4b3f-8855-91750810a406","savedPayload":{"position":{"x":30503.948096117412,"y":30139.527093006473},"targetPosition":{"x":30949.606420886405,"y":30366.48888962723},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"05f2f6b7-15ab-4386-a299-91a949de634e","savedPayload":{"position":{"x":30949.606420886405,"y":30366.48888962723},"targetPosition":{"x":31395.222935590078,"y":30593.406010951592},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"triggerOff":{"type":"Trigger Off Event","project":"Superalgos","situations":[{"type":"Situation","name":"Never Trigger Off","project":"Superalgos","conditions":[{"type":"Condition","name":"Close Above MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"false","project":"Superalgos","id":"0eb59e3b-ccc8-4eab-a1f2-a7c8dea28949","savedPayload":{"position":{"x":30777.836612408217,"y":28692.647426362768},"targetPosition":{"x":30932.059454816794,"y":29167.31041310742},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"31ab47dd-fe2d-47ac-9a77-08ec8beee068","savedPayload":{"position":{"x":30932.059454816794,"y":29167.31041310742},"targetPosition":{"x":31086.31006690743,"y":29642.1636542021},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"fa93a965-e836-42b3-9784-79acda1468dd","savedPayload":{"position":{"x":31086.31006690743,"y":29642.1636542021},"targetPosition":{"x":31240.740280232243,"y":30117.847206458973},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"8a46ebed-4ed4-4b70-882b-416ffa1b37f6","savedPayload":{"position":{"x":31240.740280232243,"y":30117.847206458973},"targetPosition":{"x":31395.222935590078,"y":30593.406010951592},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"takePosition":{"type":"Take Position Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Take Position","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"90dda64b-17fd-469c-8066-3855596795ab","savedPayload":{"position":{"x":32310.303575265214,"y":28785.226973794255},"targetPosition":{"x":32083.882547130008,"y":29230.01160391372},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"4054a522-7863-4ac2-9eab-26db2a6f037f","savedPayload":{"position":{"x":32083.882547130008,"y":29230.01160391372},"targetPosition":{"x":31848.83631252263,"y":29702.20922965271},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"0b8d71ab-6430-4e3f-840a-162745ab8d22","savedPayload":{"position":{"x":31848.83631252263,"y":29702.20922965271},"targetPosition":{"x":31622.00489673196,"y":30147.8015863614},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollaLine truncated
{"type":"Trading System","name":"Lightning Strike","config":"{ \n\"codeName\": \"Lightning Strike\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"My Trading Strategy","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Trigger On","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"e2ea7ded-2be1-43a3-a7fa-de3d9b8eeec4","savedPayload":{"position":{"x":29614.345537114667,"y":29686.264363248512},"targetPosition":{"x":30059.096259318965,"y":29912.85964671243},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e693623c-e11f-49e3-99da-1897c7a47563","savedPayload":{"position":{"x":30059.096259318965,"y":29912.85964671243},"targetPosition":{"x":30503.948096117412,"y":30139.527093006473},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"9135663f-deeb-4b3f-8855-91750810a406","savedPayload":{"position":{"x":30503.948096117412,"y":30139.527093006473},"targetPosition":{"x":30949.606420886405,"y":30366.48888962723},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"05f2f6b7-15ab-4386-a299-91a949de634e","savedPayload":{"position":{"x":30949.606420886405,"y":30366.48888962723},"targetPosition":{"x":31395.222935590078,"y":30593.406010951592},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"triggerOff":{"type":"Trigger Off Event","project":"Superalgos","situations":[{"type":"Situation","name":"Never Trigger Off","project":"Superalgos","conditions":[{"type":"Condition","name":"Close Above MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"false","project":"Superalgos","id":"0eb59e3b-ccc8-4eab-a1f2-a7c8dea28949","savedPayload":{"position":{"x":30777.836612408217,"y":28692.647426362768},"targetPosition":{"x":30932.059454816794,"y":29167.31041310742},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"31ab47dd-fe2d-47ac-9a77-08ec8beee068","savedPayload":{"position":{"x":30932.059454816794,"y":29167.31041310742},"targetPosition":{"x":31086.31006690743,"y":29642.1636542021},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"fa93a965-e836-42b3-9784-79acda1468dd","savedPayload":{"position":{"x":31086.31006690743,"y":29642.1636542021},"targetPosition":{"x":31240.740280232243,"y":30117.847206458973},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"announcements":[],"id":"8a46ebed-4ed4-4b70-882b-416ffa1b37f6","savedPayload":{"position":{"x":31240.740280232243,"y":30117.847206458973},"targetPosition":{"x":31395.222935590078,"y":30593.406010951592},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"takePosition":{"type":"Take Position Event","project":"Superalgos","situations":[{"type":"Situation","name":"Inmediate Take Position","project":"Superalgos","conditions":[{"type":"Condition","name":"New Condition","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"true","project":"Superalgos","id":"90dda64b-17fd-469c-8066-3855596795ab","savedPayload":{"position":{"x":32310.303575265214,"y":28785.226973794255},"targetPosition":{"x":32083.882547130008,"y":29230.01160391372},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"4054a522-7863-4ac2-9eab-26db2a6f037f","savedPayload":{"position":{"x":32083.882547130008,"y":29230.01160391372},"targetPosition":{"x":31848.83631252263,"y":29702.20922965271},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"0b8d71ab-6430-4e3f-840a-162745ab8d22","savedPayload":{"position":{"x":31848.83631252263,"y":29702.20922965271},"targetPosition":{"x":31622.00489673196,"y":30147.8015863614},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollaLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Hello World Tutorial","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)","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Market","project":"Superalgos","id":"fde9aeb6-2b65-4ba5-a8b3-07f2b189a9ec","savedPayload":{"position":{"x":23969.74175100142,"y":29687.688294073963},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"456269f6-9849-4d5f-9c8c-7cd7d1eef297"}}},{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Daily","project":"Superalgos","id":"17d24742-6026-4fe5-b400-69df5a057aa1","savedPayload":{"position":{"x":24044.74175100142,"y":29557.784483506297},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"333ae5d7-7ec1-4f08-b206-91e3b4f2c99f"}}}],"id":"a773898a-8b8f-4654-b907-a4f0b988d59e","savedPayload":{"position":{"x":24119.74175100142,"y":29687.688294073963},"targetPosition":{"x":24249.645561569087,"y":29762.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a98d1697-98c9-44dc-a4b2-b777917ca292","savedPayload":{"position":{"x":24249.645561569087,"y":29762.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":"802f1ee2-1dba-4999-8b29-068b68aee9ef","savedPayload":{"position":{"x":24379.549372136753,"y":29837.688294073963},"targetPosition":{"x":24509.45318270442,"y":29912.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"d24c01eb-3d21-430e-a965-cbf645bb7853","savedPayload":{"position":{"x":24509.45318270442,"y":29912.688294073963},"targetPosition":{"x":24639.356993272086,"y":29987.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Data Mine","name":"Sparta","id":"9cfffc48-486a-48cb-b641-98c82e314d3a"}}},{"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":"9de8a5c8-7c2e-4625-afa4-176c43777eb3","savedPayload":{"position":{"x":24414.356993272086,"y":29297.976862370964},"targetPosition":{"x":24489.356993272086,"y":29427.88067293863},"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":"d96308e3-a9ae-4a87-ad7c-cf7948fe0939","savedPayload":{"position":{"x":24489.356993272086,"y":29427.88067293863},"targetPosition":{"x":24564.356993272086,"y":29557.784483506297},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"fa7991b3-e23e-4cLine truncated
{"type":"Workspace","name":"Hello World Tutorial","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)","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Market","project":"Superalgos","id":"fde9aeb6-2b65-4ba5-a8b3-07f2b189a9ec","savedPayload":{"position":{"x":23969.74175100142,"y":29687.688294073963},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"456269f6-9849-4d5f-9c8c-7cd7d1eef297"}}},{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Daily","project":"Superalgos","id":"17d24742-6026-4fe5-b400-69df5a057aa1","savedPayload":{"position":{"x":24044.74175100142,"y":29557.784483506297},"targetPosition":{"x":24119.74175100142,"y":29687.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"333ae5d7-7ec1-4f08-b206-91e3b4f2c99f"}}}],"id":"a773898a-8b8f-4654-b907-a4f0b988d59e","savedPayload":{"position":{"x":24119.74175100142,"y":29687.688294073963},"targetPosition":{"x":24249.645561569087,"y":29762.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a98d1697-98c9-44dc-a4b2-b777917ca292","savedPayload":{"position":{"x":24249.645561569087,"y":29762.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":"802f1ee2-1dba-4999-8b29-068b68aee9ef","savedPayload":{"position":{"x":24379.549372136753,"y":29837.688294073963},"targetPosition":{"x":24509.45318270442,"y":29912.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"d24c01eb-3d21-430e-a965-cbf645bb7853","savedPayload":{"position":{"x":24509.45318270442,"y":29912.688294073963},"targetPosition":{"x":24639.356993272086,"y":29987.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Data Mine","name":"Sparta","id":"9cfffc48-486a-48cb-b641-98c82e314d3a"}}},{"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":"9de8a5c8-7c2e-4625-afa4-176c43777eb3","savedPayload":{"position":{"x":24414.356993272086,"y":29297.976862370964},"targetPosition":{"x":24489.356993272086,"y":29427.88067293863},"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":"d96308e3-a9ae-4a87-ad7c-cf7948fe0939","savedPayload":{"position":{"x":24489.356993272086,"y":29427.88067293863},"targetPosition":{"x":24564.356993272086,"y":29557.784483506297},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"fa7991b3-e23e-4cLine truncated
@@ -13075,6 +13075,13 @@
{
"type": "Open Stage",
"menuItems": [
{
"action": "Configure",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure",
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
{
"action": "Add Missing Children",
"label": "Add Missing Items",
@@ -13097,6 +13104,12 @@
"actionFunction": "payload.executeAction"
}
],
"initialValues": {
"config": "{\n\"roundingErrorCorrectionFactor\": 1.01, \n\"absoluteDustInBaseAsset\": 0,\n\"absoluteDustInQuotedAsset\": 0 \n}"
},
"editors": {
"config": true
},
"addLeftIcons": true,
"level": 1,
"attachingRules": {
@@ -14337,6 +14350,13 @@
{
"type": "Close Stage",
"menuItems": [
{
"action": "Configure",
"actionFunction": "uiObject.configEditor.activate",
"label": "Configure",
"iconPathOn": "configuration",
"iconPathOff": "configuration"
},
{
"action": "Add Missing Children",
"label": "Add Missing Items",
@@ -14359,6 +14379,12 @@
"actionFunction": "payload.executeAction"
}
],
"initialValues": {
"config": "{\n\"roundingErrorCorrectionFactor\": 1.01, \n\"absoluteDustInBaseAsset\": 0,\n\"absoluteDustInQuotedAsset\": 0 \n}"
},
"editors": {
"config": true
},
"addLeftIcons": true,
"level": 2,
"attachingRules": {
@@ -14893,6 +14919,10 @@
{
"codeName": "hitbtc",
"iconName": "hitbtc"
},
{
"codeName": "luno",
"iconName": "luno"
}
]
},
@@ -15048,6 +15078,10 @@
{
"codeName": "USD",
"iconName": "us-dollar"
},
{
"codeName": "ZAR",
"iconName": "zar"
}
]
},
@@ -0,0 +1,13 @@
{
"type": "Action",
"definition": {
"text": "An Action is somthing that users of the system can triggeer via the UI, usually by clicking on a Menu Item of a Node. Actions can also be triggered by other actions enabling a resulable set of functionality to be available to users of the Design Space. Once triggered the action executes pre-defined code.",
"updated": 1614784762410
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,247 @@
{
"type": "App Schema",
"definition": {
"text": "A set of low level definitions placed at a JSON file that defines which types of nodes are made available by a certain Project to be used at the Design Space.",
"updated": 1614784939148
},
"paragraphs": [
{
"style": "Text",
"text": "The App Schema file is an array of objects, each objec defines a certain node type.",
"updated": 1614785082978
},
{
"style": "Title",
"text": "Example"
},
{
"style": "Json",
"text": " {\n \"type\": \"Plotter Panel\",\n \"level\": 4,\n \"propertyNameAtParent\": \"panels\",\n \"attachingRules\": {\n \"compatibleTypes\": \"->Plotter Module->\"\n },\n \"childrenNodesProperties\": [\n {\n \"name\": \"plotterPanelJavascriptCode\",\n \"type\": \"node\",\n \"childType\": \"Plotter Panel Javascript Code\"\n },\n {\n \"name\": \"panelData\",\n \"type\": \"array\",\n \"childType\": \"Panel Data\",\n \"autoAdd\": true\n }\n ],\n \"menuItems\": [\n {\n \"action\": \"Add UI Object\",\n \"disableIfPropertyIsDefined\": true,\n \"propertyToCheckFor\": \"plotterPanelJavascriptCode\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Add Javascript Code\",\n \"relatedUiObject\": \"Plotter Panel Javascript Code\"\n },\n {\n \"action\": \"Add UI Object\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Add Panel Data\",\n \"relatedUiObject\": \"Panel Data\"\n },\n {\n \"action\": \"Delete UI Object\",\n \"askConfirmation\": true,\n \"confirmationLabel\": \"Confirm to Delete\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Delete\",\n \"iconPathOn\": \"delete-entity\",\n \"iconPathOff\": \"delete-entity\"\n }\n ],\n \"addLeftIcons\": true\n }",
"updated": 1614785173292
},
{
"style": "Title",
"text": "Properties",
"updated": 1614785297833
},
{
"style": "Text",
"text": "Each object can have a pre-defined set of properties, which you can see here:"
},
{
"style": "Subtitle",
"text": "type"
},
{
"style": "Text",
"text": "The Type of the node is the key by which each node is identified within the context of a certain Project. The naming convention here is that all words must be capitalized.",
"updated": 1614785486944
},
{
"style": "Subtitle",
"text": "level"
},
{
"style": "Text",
"text": "It is an integer from 0 to 5, representing the importance of this type of node. 0 is the most important. The more important the node type, the bigger is rendered at the Design Space. The difference between level is barely noticable.",
"updated": 1614785595122
},
{
"style": "Subtitle",
"text": "propertyNameAtParent"
},
{
"style": "Text",
"text": "Nodes are usually child of other nodes. Each Node might also have children. At runtime children references are stored at some property of the Node object, but that property is not unique or pre-defined. Instead, each Node Type declares at its own definition at the App Schema, which will be the name of the property that will host it's own reference at it's parent node. "
},
{
"style": "Subtitle",
"text": "childrenNodesProperties",
"updated": 1614785903518
},
{
"style": "Text",
"text": "Nodes also declare an array of property names that will be used to define which type of children the node can have. For example:",
"updated": 1614786054299
},
{
"style": "Json",
"text": "\"childrenNodesProperties\": [\n {\n \"name\": \"dataFormula\",\n \"type\": \"node\",\n \"childType\": \"Data Formula\",\n \"autoAdd\": true\n },\n {\n \"name\": \"textStyle\",\n \"type\": \"node\",\n \"childType\": \"Text Style\",\n \"autoAdd\": true\n }\n ]",
"updated": 1614786383043
},
{
"style": "Text",
"text": "Each array item represent one type of children node this node can have. ",
"updated": 1614786149174
},
{
"style": "Text",
"text": "Each object can have 4 properties:"
},
{
"style": "List",
"text": "name: means name of the property that will hold the reference to the child node at runtime.",
"updated": 1614786293774
},
{
"style": "List",
"text": "type: possible values are node or array. See details below.",
"updated": 1614786239139
},
{
"style": "List",
"text": "childType: means the type of the child node."
},
{
"style": "List",
"text": "autoAdd: optional, menas if one instance of this children will be automatically created when this Node type is created."
},
{
"style": "Text",
"text": "The type property, can either be node or array, meaning:",
"updated": 1614786331079
},
{
"style": "List",
"text": "node: means that can have only one instance of this type of children."
},
{
"style": "List",
"text": "array: means that it can have more than one instance of this type of children."
},
{
"style": "Subtitle",
"text": "attachingRules"
},
{
"style": "Text",
"text": "This property defines to which nodes the current one being defined can attach to, considering those nodes as possible parents. The values are expresed in a string with a list of Node Types like in the following example:"
},
{
"style": "Json",
"text": "\"attachingRules\": {\n \"compatibleTypes\": \"->Procedure Initialization->Procedure Loop->\"\n }",
"updated": 1614786517182
},
{
"style": "Note",
"text": "incompatibleTypes property can also be used to explicitly define which nodes can not be parents.",
"updated": 1614786596412
},
{
"style": "Subtitle",
"text": "referencingRules"
},
{
"style": "Text",
"text": "This property defines to which nodes the current one being defined can reference to, considering those nodes as possible reference parents. The values are expresed in a string with a list of Node Types like in the following example:",
"updated": 1614786699311
},
{
"style": "Json",
"text": "\"referencingRules\": {\n \"compatibleTypes\": \"->Dashboard->Data Mines Data->Trading Mines Data->Data Tasks->Testing Trading Tasks->Production Trading Tasks->\"\n }",
"updated": 1614786660155
},
{
"style": "Note",
"text": "incompatibleTypes property can also be used to explicitly define which nodes can not be parents.",
"updated": 1614786714357
},
{
"style": "Subtitle",
"text": "menuItems"
},
{
"style": "Text",
"text": "This property allow you to define the menu of this Node Type at the Design Space. This menu will be an array of Menu Items objects like in the example below:"
},
{
"style": "Json",
"text": "\"menuItems\": [\n {\n \"action\": \"Configure\",\n \"label\": \"Configure\",\n \"iconPathOn\": \"configuration\",\n \"iconPathOff\": \"configuration\",\n \"actionFunction\": \"uiObject.configEditor.activate\"\n },\n {\n \"action\": \"Run Super Action\",\n \"label\": \"Run\",\n \"askConfirmation\": true,\n \"confirmationLabel\": \"Confirm to Run\",\n \"workDoneLabel\": \"Super Action Executed\",\n \"iconPathOn\": \"run\",\n \"iconPathOff\": \"run\",\n \"actionFunction\": \"payload.executeAction\"\n },\n {\n \"action\": \"Delete UI Object\",\n \"askConfirmation\": true,\n \"confirmationLabel\": \"Confirm to Delete\",\n \"label\": \"Delete\",\n \"iconPathOn\": \"delete-entity\",\n \"iconPathOff\": \"delete-entity\",\n \"actionFunction\": \"payload.executeAction\"\n }\n ]",
"updated": 1614787632953
},
{
"style": "Text",
"text": "Although you are free to add any menu item you like, there are a few that have already become standarized. These standard Menu Items are also placed at a certain position within the menu for consistency.",
"updated": 1614787035329
},
{
"style": "List",
"text": "configure: always go as the first item"
},
{
"style": "List",
"text": "run: after the configure if there is one"
},
{
"style": "List",
"text": "delete: it is always the last one"
},
{
"style": "Text",
"text": ""
},
{
"style": "Subtitle",
"text": "initialValues"
},
{
"style": "Text",
"text": "This property is needed when the Node Type being defined will have a configuration. In those cases this property will set the initial value for that config. Example:"
},
{
"style": "Json",
"text": "\"initialValues\": {\n \"config\": \"{ \\n\\\"username\\\": \\\"\\\", \\n\\\"token\\\": \\\"\\\"\\n}\"\n }",
"updated": 1614787265306
},
{
"style": "Subtitle",
"text": "editors"
},
{
"style": "Text",
"text": "This property will tell the system which editor will be available for this type of node. Example:"
},
{
"style": "Json",
"text": "\"editors\": {\n \"config\": true\n }",
"updated": 1614787433867
},
{
"style": "Text",
"text": "There are a few existing editors:"
},
{
"style": "List",
"text": "config: editor for node configurations."
},
{
"style": "List",
"text": "code: editor for javascript code."
},
{
"style": "List",
"text": "formula: formulas expressed in javascript."
},
{
"style": "List",
"text": "condition: conditions editor.",
"updated": 1614787624722
},
{
"style": "Note",
"text": "In order for the user to actually be able to open the editor configured here, there must be a Menu Item than has an action = \"Configure\"."
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,31 @@
{
"type": "Function Library",
"definition": {
"text": "It is a collection of functions related to a single topic. The topic is usuarlly expressed at the Function Libray's name.",
"updated": 1614787845534
},
"paragraphs": [
{
"style": "Text",
"text": "Each integrated project might have Function Libraries at the 3 different levels possible: Client, TS, and UI. In the case of Superalgos, at the UI it features, for instance, these Function Libraries:",
"updated": 1614788012945
},
{
"style": "List",
"text": "Charting Space Functions"
},
{
"style": "List",
"text": "Crypto Ecosystem Functions"
},
{
"style": "List",
"text": "Plugins Functions",
"updated": 1614788024303
},
{
"style": "Note",
"text": "Function Libraries are stateless by definition. "
}
]
}
@@ -0,0 +1,13 @@
{
"type": "Menu Item",
"definition": {
"text": "A Menu Item is each of the items listed at any given Node's menu.",
"updated": 1614784829380
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,13 @@
{
"type": "Project Schema File",
"definition": {
"text": "It is the most basic and low level system-wide configuration file. You will find it at the Projects folder. It contains a list of all integrated projects and for each one the list of javascript modules organized in different categories, like Function Libraries, Utilities, Spaces, Globals, etc; in turn organized into the broather categories UI, TS and CL.",
"updated": 1614939492529
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -0,0 +1,49 @@
{
"type": "Superalgos SA Token",
"definition": {
"text": "It is an Ethereum ERC20 token that will be used as the medium of exchange by Superalgos users while paying for products or services they buy and sell to each other.",
"updated": 1614853448838
},
"paragraphs": [
{
"style": "Title",
"text": "Properties",
"updated": 1614853617940
},
{
"style": "Text",
"text": "The SA Token has the following properties:"
},
{
"style": "List",
"text": "Name: Superalgos"
},
{
"style": "List",
"text": "Ticker: SA"
},
{
"style": "List",
"text": "Max Total Supply: 1,500,000,000"
},
{
"style": "List",
"text": "Contract Address: 0x4b1cab076C791b0e24a8560B7Ab4BF6b4C0652F0"
},
{
"style": "Title",
"text": "Distribution",
"updated": 1614853604174
},
{
"style": "Text",
"text": "After issuing the token in March 2021, the funds were deposited at the project's Treasury Account, from where it is distributed to each year's Budget Account, each Release Account and finally to contributors accounts.",
"updated": 1614853686491
},
{
"style": "List",
"text": "Treasury Account: 0x176E32e3f1b6D218CBf920e7852Bd13207A62711",
"updated": 1614853653856
}
]
}
@@ -0,0 +1,13 @@
{
"type": "UI Global Object",
"definition": {
"text": "It is a global object available at the browser, containing at runtime a structure of objects ranging from Utilities, Function Libraries, Spaces and others, ready to be accessed and their functions consumed from anywhere within the UI.",
"updated": 1614941411500
},
"paragraphs": [
{
"style": "Text",
"text": "Left click and Edit to enter edit mode and change this text. ENTER to write new paragraphs. ESC to exit edit mode. Then you can use doscs.save to save your changes and app.contribute to send it to the main repository."
}
]
}
@@ -8,9 +8,32 @@
"style": "Block",
"text": "Content"
},
{
"style": "Title",
"text": "Optionality",
"updated": 1615101975045
},
{
"style": "Note",
"text": "The Close Stage is optional. That means that if you don't need it you can just delete this node and everything should work just fine. "
},
{
"style": "Text",
"text": "The close stage is opened when either the stop loss or take profit targets are hit."
"text": "There are situations where users might want to execute both buy and sell orders from within the Open Stage. In those situations they might want to delete the Manage Stage and the Close Stage so that they don't execute at all. That is possible because both are optional. This is how optionality looks like at the code:",
"updated": 1615102048658
},
{
"style": "Javascript",
"text": "/*\nThe system allows the user not to define a close stage, because the close stage is optional.\nHere we are goint to see if that is the case and if it is, we will inmidiatelly consider \nthe close stage as closed.\n*/\nif (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].closeStage === undefined) {\n changeStageStatus('Close Stage', 'Closed', 'Close Stage Undefined')\n return\n}",
"updated": 1615102065680
},
{
"style": "Title",
"text": "Close Stage Concept"
},
{
"style": "Text",
"text": "The close stage is opened when either the stop loss or take profit targets are hit. It is also opened after the position is opened if the Manage Stage is undefined."
},
{
"style": "Text",
@@ -19,6 +42,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": "Include",
"text": "Superalgos->Topic->Why My Stage is not Closing?->The Stage Does Not Close",
"updated": 1615054694042
}
]
}
@@ -8,6 +8,34 @@
"style": "Block",
"text": "Content"
},
{
"style": "Title",
"text": "Optionality",
"updated": 1615101510181
},
{
"style": "Note",
"text": "This Stage is optional. That means that if you do not want to deal with Stop Loss or Take Profits at your strategy, you can just delete this node and everything will continue working just fine. If you do remove this node, what will happen at runtime is that as soon as the position is triggered, the system will detect that that the Manage Stage is undefined, and it will jump it by opening the Close Stage (if it exists, because it is also optional)"
},
{
"style": "Text",
"text": "This is how optionality looks like at the code:",
"updated": 1615101627343
},
{
"style": "Javascript",
"text": "/* Opening Status Procedure */\nif (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Opening') {\n /*\n The system allows the user not to define a Manage Stage, because the Manage Stage is optional.\n Here we are going to see if that is the case and if it is, we will inmidiatelly consider \n the Manage Stage as closed.\n */\n if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].manageStage === undefined) {\n changeStageStatus('Manage Stage', 'Closed', 'Manage Stage Undefined')\n changeStageStatus('Close Stage', 'Opening')\n return\n }\n\n /* Now we switch to the Open status. */\n changeStageStatus('Manage Stage', 'Open')\n}",
"updated": 1615101667889
},
{
"style": "Success",
"text": "If both the Manage Stage and the Close Stage are undefined, what will happen is that whenever the Open Stage gets closed, you will exit the position.",
"updated": 1615103161873
},
{
"style": "Title",
"text": "Manage Stage Concept"
},
{
"style": "Text",
"text": "The first and foremost rule of trading is to preserve capital and its main goal is to increase it."
@@ -35,6 +35,11 @@
{
"style": "List",
"text": "the take profit or stop loss targets are hit."
},
{
"style": "Include",
"text": "Superalgos->Topic->Why My Stage is not Closing?->The Stage Does Not Close",
"updated": 1615054619090
}
]
}
@@ -1,7 +1,8 @@
{
"type": "Size Filled",
"definition": {
"text": "Size filled is the amount of the order that has been filled at the exchange."
"text": "Size filled is the amount of the order that has been filled at the exchange. It can also represent the cumulative Size Filled of the Open or Close Stages.",
"updated": 1615100388371
},
"paragraphs": [
{
@@ -0,0 +1,20 @@
{
"review": "Superalgos Project Review",
"pageNumber": 2,
"type": "Superalgos Review - A GREAT PROJECT WITH AN EVEN GREATER POTENTIAL",
"definition": {
"text": "Hello, I'm 0xperez and this is my Superalgos review!",
"updated": 1614626208522
},
"paragraphs": [
{
"style": "Text",
"text": "The first time I tried Superalgos, I could not believe my eyes: ever since I am in the software developing field, primarily finance-oriented, I have never seen such a powerful platform gathering so much great functionalities in a single system. The data visualization capabilities are a unique feature which greatly enhance the understanding of the many processes and flows that Superalgos handles, and each piece of functionality shows the effort and the mastery that developers and all of the contributors put in creating and developing the software. Despite still being a beta, Superalgos surpasses many of the softwares in its category both in terms of complexity and features offered. The community is active, friendly and helpful, and immediately gave me a warm welcome and useful pointers. Cannot wait to dive deeper and start giving my contribution!",
"updated": 1614626306088
},
{
"style": "Text",
"text": "0xperez"
}
]
}
@@ -444,8 +444,13 @@
},
{
"style": "Text",
"text": "In the case of the Superalgos project, SVG source files are organized in subfolders, as follows:",
"updated": 1613730944769
"text": "In the case of the Superalgos project, SVG source files are organized in subfolders, under the following directory:",
"updated": 1614854522604
},
{
"style": "Json",
"text": "\\Projects\\Superalgos\\Icons-SVG-Sources\\",
"updated": 1614854467481
},
{
"style": "Table",
@@ -39,6 +39,23 @@
{
"style": "Javascript",
"text": "docs.repaginate Topic from Superalgos: Docs Commands"
},
{
"style": "Title",
"text": "Usage"
},
{
"style": "Text",
"text": "After you repaginate a Topic or Tutorial, the best way to proceed it to manually delete from disk all the files associated with that Topic / Tutorial. After you delete them, you execute the repaginate command and then the docs.save command. "
},
{
"style": "Text",
"text": "The repagination flags all of the files of that Topic / Tutorial as changed, so you don't need to worry about the deleted files since they will be all recreated.",
"updated": 1614942454596
},
{
"style": "Text",
"text": "After repagination, reload the UI to get into memory only the repaginated version."
}
]
}
@@ -9,7 +9,13 @@
{
"language": "ID",
"text": "Perintah docs.save telah selesai dan setiap perubahan telah tersimpan di Client Superalgos.",
"updated": 1613861161653
"updated": 1613861161653,
"style": "Definition"
},
{
"language": "IT",
"text": "L'istruzione docs.save é stata eseguita con successo e tutte le modifiche sono state salvate sul Client.",
"updated": 1614711069063
}
]
},
@@ -22,7 +28,13 @@
{
"language": "ID",
"text": "Setiap perubahan dari halaman node, concept, topic, tutorial, review, dan book sudah tersimpan kedalam perangkat.",
"updated": 1613861219116
"updated": 1613861219116,
"style": "Success"
},
{
"language": "IT",
"text": "Tutte le ultime modifiche a nodi, concetti, argomenti, tutorial, recensioni e pagine sono state salvate su disco.",
"updated": 1614713472019
}
]
}
@@ -4,21 +4,53 @@
"type": "Docs Message - Reindexing Started",
"definition": {
"text": "The docs.reindex command started the rebuilding of the Docs Search Engine Index.",
"updated": 1610972866423
"updated": 1610972866423,
"translations": [
{
"language": "IT",
"text": "Il comando docs.reindex ha avviato la ricostruzione del Docs Search Engine Index.",
"updated": 1614713649286,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Success",
"text": "Reindexing is a resource-intensive process. While the process is running, you will not be able to use the interface since all CPU resources are dedicated to recreating the index as fast as possible. ",
"updated": 1610973251479
"updated": 1610973251479,
"translations": [
{
"language": "IT",
"text": "La reindicizzazione é un processo dispendioso dal punto di vista computazionale. Mentre é in atto, non sarai in grado di usare l'interfaccia grafica perché tutte le risorse della CPU saranno impegnate a ricostruire l'indice il più velocemente possibile.",
"updated": 1614713781526,
"style": "Success"
}
]
},
{
"style": "Text",
"text": "The weight of your workspace impacts the time required to reindex the content since every node in the workspace must be scanned. All code and configurations are indexed. "
"text": "The weight of your workspace impacts the time required to reindex the content since every node in the workspace must be scanned. All code and configurations are indexed. ",
"translations": [
{
"language": "IT",
"text": "La dimensione del tuo Workspace ha influenza sul tempo richiesto per la reindicizzazione, perché ogni suo nodo deve essere scansionato. Tutto il codice e le varie configurazioni sono indicizzate.",
"updated": 1614714208819,
"style": "Text"
}
]
},
{
"style": "Text",
"text": "Hold on for a few seconds until the process finishes. You will receive a new message when it's over."
"text": "Hold on for a few seconds until the process finishes. You will receive a new message when it's over.",
"translations": [
{
"language": "IT",
"text": "Aspetta qualche secondo perché il processo finisca. Riceverai un messaggio quando questo avviene.",
"updated": 1614713939759,
"style": "Text"
}
]
}
]
}
@@ -4,13 +4,29 @@
"type": "Docs Message - Reindexing Done",
"definition": {
"text": "The docs.reindex command finished rebuilding the Docs Search Engine Index.",
"updated": 1610973361369
"updated": 1610973361369,
"translations": [
{
"language": "IT",
"text": "Il comando docs.reindex ha terminato di ricostruire il Docs Search Engine Index.",
"updated": 1614713976492,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Success",
"text": "The index was rebuilt and now includes all the latest changes you made since you open the UI or since the last time you run the docs.reindex command. That means that new content created is now searchable. Changes in the Workspace have been entered in the index too.",
"updated": 1610973446156
"updated": 1610973446156,
"translations": [
{
"language": "IT",
"text": "L'indice é stato ricostruito e ora include tutte le ultime modifiche fatte da quando hai aperto l'interfaccia grafica, o dall'ultima volta che hai lanciato il comando docs.reindex. Questo significa che i nuovi contenuti creati adesso possono essere cercati. Anche i cambiamenti del Workspace sono stati indicizzati.",
"updated": 1614714113459,
"style": "Success"
}
]
}
]
}
@@ -8,8 +8,9 @@
"translations": [
{
"language": "IT",
"text": "La guida di Superalgos è scritta interamente in inglese ma anche tu puoi aiutare a tradurre nella tua lingua preferita. Il sistema attualmente consente agli utenti di cercare o sfogliare la guida anche in altre lingue purché altri utenti contribuiscano alle traduzioni.",
"updated": 1610794887971
"text": "I Docs di Superalgos e degli altri progetti integrati sono scritti originariamente in inglese. Il sistema permette agli utenti di cercare e navigare tra le pagine anche in altri linguaggi, purché qualche collaboratore abbia precedentemente inserito le traduzioni corrispondenti.",
"updated": 1614709804639,
"style": "Definition"
}
]
},
@@ -21,18 +22,33 @@
"translations": [
{
"language": "IT",
"text": "Superalgos e gli altri progetti integrati sono scritti in inglese perchè considerata la lingua predefinita. Tipi di nodi, nomi di variabili, ecc., Tutto è originariamente in lingua inglese.",
"updated": 1610806159263
"text": "L'inglese é considerata la lingua predefinita. Quando si seleziona un linguaggio differente, il sistema cerca di mostrare il contenuto nel linguaggio selezionato. Se la traduzione non é disponibile, allora verrà mostrata comunque la versione in lingua inglese.",
"updated": 1614710023015,
"style": "Text"
}
]
},
{
"style": "Text",
"text": "Node types, variable names, the title of pages in the Docs, and a few more elements of Superalgos may not be translated, as they are unique identifiers of the said elements. You will always get those in English."
"text": "Node types, variable names, the title of pages in the Docs, and a few more elements of Superalgos may not be translated, as they are unique identifiers of the said elements. You will always get those in English.",
"translations": [
{
"language": "IT",
"text": "I tipi di nodo, i nomi di variabile, il titolo delle pagine dei Docs e alcuni altri elementi di Superalgos non vengono tradotti, in quanto sono identificatori unici di questi elementi all'interno del sistema. Verranno quindi sempre mostrati in inglese.",
"updated": 1614710301759
}
]
},
{
"style": "Success",
"text": "If you wish to contribute translations, read the How to Contribute Translations page."
"text": "If you wish to contribute translations, read the How to Contribute Translations page.",
"translations": [
{
"language": "IT",
"text": "Se vuoi contribuire alle traduzioni, leggi la pagina How to Contribute Translations.",
"updated": 1614710364389
}
]
},
{
"style": "Text",
@@ -41,8 +57,9 @@
"translations": [
{
"language": "IT",
"text": "Il contenuto della guida può essere tradotto da chiunque desideri contribuire! Così facendo aiuterai gli utenti a leggere i contenuti della guida nella loro lingua madre e tu potrai dare il tuo contributo.",
"updated": 1610806232380
"text": "Il contenuto dei Docs può essere tradotto da chiunque desideri contribuire. Ciò aiuta gli utenti a leggere il contenuto dei Docs nella loro lingua madre. ",
"updated": 1614710559720,
"style": "Text"
}
]
},
@@ -53,8 +70,9 @@
"translations": [
{
"language": "IT",
"text": "Gli utenti possono passare da una lingua all'altra utilizzando i collegamenti che si trovano nel footer di ogni pagina in questa guida.",
"updated": 1610806272356
"text": "Per cambiare la lingua, é sufficiente cliccare sulle bandiere che si trovano in fondo a ogni pagina dei Docs.",
"updated": 1614710684503,
"style": "Success"
}
]
},
@@ -65,8 +83,9 @@
"translations": [
{
"language": "IT",
"text": "Puoi aggiungere o eliminare le pagine della guida solo se stai navigando in inglese perché è la lingua predefinita e da lì le pagine possono essere tradotte in seguito.",
"updated": 1610806324698
"text": "É possible aggiungere o cancellare pagine dei Docs solamente quando la lingua di visualizzazione é in inglese.",
"updated": 1614710793433,
"style": "Note"
}
]
}
@@ -0,0 +1,81 @@
{
"topic": "Frequently Asked Questions",
"pageNumber": 1,
"type": "Why My Stage is not Closing?",
"definition": {
"text": "One of the most common questions asked by users is why the open or close stage are not closing after the order was filled.",
"updated": 1615100269026
},
"paragraphs": [
{
"style": "Note",
"text": "The shot answer is becasue the Stage Size Filled did not reach the value of the Stage Target Size.",
"updated": 1615100332173
},
{
"style": "Text",
"text": "There are many reason why this can happen, but they all have to do with syncronization between the system and the exchange, and dust getting accumulated in decimal places.",
"updated": 1615053796132
},
{
"style": "Block",
"text": "The Stage Does Not Close",
"updated": 1615054499809
},
{
"style": "Subtitle",
"text": "The Stage Does Not Close"
},
{
"style": "Text",
"text": "One common issue users have while dealing with stages is that they do not get closed after their orders get filled. This usually happens because there are several adjustments on rate that happens during trading, specially during live trading. The reason a Stage does not get closed automatically is because the total filled for the whole stage is not close enough to the Stage Target Size defined by users. In order to avoid this situation there are three configurations at the Stage node you can use:",
"updated": 1615053929853
},
{
"style": "List",
"text": "ROUNDING_ERROR_CORRECTION_FACTOR : is a configurable factor that can be applied to the stage filled at runtime in order to force it to reach the Stage Target Size. The default value for this factor is:"
},
{
"style": "Javascript",
"text": "ROUNDING_ERROR_CORRECTION_FACTOR = 1.001",
"updated": 1615053956943
},
{
"style": "Text",
"text": "This value is overwritten by whatever users config at the Stage node under the roundingErrorCorrectionFactor property."
},
{
"style": "Text",
"text": "A value of 1.01 would mean that when the Filled amount is at 1% distance from the Stage Target, the stage will be closed."
},
{
"style": "List",
"text": "ABSOLUTE_DUST_IN_BASE_ASSET: is a numeric value that represents the distance that you allow to be between the Size Filled and the Target Side for a stage, measured in Base Asset. It's default value is Zero and you can define it at the config of a Stage node using the absoluteDustInBaseAsset property.",
"updated": 1615054114048
},
{
"style": "List",
"text": "ABSOLUTE_DUST_IN_QUOTED_ASSET: is a numeric value that represents the distance that you allow to be between the Size Filled and the Target Side for a stage, measured in Base Asset. It's default value is Zero and you can define it at the config of a Stage node using the absoluteDustInQuotedAsset property.",
"updated": 1615054151393
},
{
"style": "Note",
"text": "The parameter that will actually be used from the two previous ones will depend on how you dedined your Target Size, either in Base Asset or Quoted Asset.",
"updated": 1615054261790
},
{
"style": "Subtitle",
"text": "Implementation",
"updated": 1615054281409
},
{
"style": "Text",
"text": "Here you can see how these parameters are implemented in the Low Frequency Trading Bot code:"
},
{
"style": "Javascript",
"text": "switch (tradingEngineStage.stageDefinedIn.value) {\n case 'Base Asset': {\n if (\n tradingEngineStage.stageBaseAsset.sizeFilled.value\n * \n ROUNDING_ERROR_CORRECTION_FACTOR\n +\n ABSOLUTE_DUST_IN_BASE_ASSET\n >=\n tradingEngineStage.stageBaseAsset.targetSize.value\n ) {\n positionFilled()\n } else {\n checkCloseStageEvent(tradingSystemStage)\n }\n break\n }\n case 'Quoted Asset': {\n if (\n tradingEngineStage.stageQuotedAsset.sizeFilled.value\n * \n ROUNDING_ERROR_CORRECTION_FACTOR\n +\n ABSOLUTE_DUST_IN_QUOTED_ASSET\n >=\n tradingEngineStage.stageQuotedAsset.targetSize.value\n ) {\n positionFilled()\n } else {\n checkCloseStageEvent(tradingSystemStage)\n }\n break\n }\n }",
"updated": 1615054391439
}
]
}
@@ -0,0 +1,50 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 1,
"type": "Automating Actions - What is an Action?",
"definition": {
"text": "An Action is what is executed when users picks something from the menu of a Node. ",
"updated": 1614941717428
},
"paragraphs": [
{
"style": "Title",
"text": "Why a New Action",
"updated": 1614939785554
},
{
"style": "Text",
"text": "Maybe you realized that you are doing repetitive actions at the Design Space and you can benefit from automating them. If your actions are constrained to manipulating the nodes at the workspace, by either creating new nodes, deleting existing ones, changing nodes configs, establishing references or some other similar stuff, then you might be able to create an Action function that can automate all this. This will allow you to stop doing those repetitive tasks youself and the ones that will come after you if you contribute these changes to the project.",
"updated": 1614940379811
},
{
"style": "Title",
"text": "Workflow"
},
{
"style": "Text",
"text": "New Actions are implemented as functions inside a Function Library. So the basic workflow to implement a new Action is the following:",
"updated": 1614940407806
},
{
"style": "List",
"text": "Add a Menu Item: First you need to add a Menu Item to the node type that will allow the user to execute your action.",
"updated": 1614940496055
},
{
"style": "List",
"text": "Locate a Function Library: Then you will need to locate the Function Library that is better suited to host the function that is going to be executed once the action is triggered.",
"updated": 1614926393154
},
{
"style": "List",
"text": "Add your Code: Then you will need to write the code for that function.",
"updated": 1614940528253
},
{
"style": "List",
"text": "Connect Menu Item to your Code: Finally you will connect the Menu Item to that function you wrote.",
"updated": 1614940545908
}
]
}
@@ -0,0 +1,95 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 2,
"type": "Automating Actions - Adding a Menu Item",
"definition": {
"text": "You need to add a new Menu Item at the node definition at the App Schema. ",
"updated": 1614941725823
},
"paragraphs": [
{
"style": "Title",
"text": "Locate App Schema",
"updated": 1614927344633
},
{
"style": "Text",
"text": "Check out the page of the App Schema concept. After that, locate the App Schema file you will need to edit at the Projects folder. There is one App Schema file for Project, pick the right one and edit it with VS Code."
},
{
"style": "Warning",
"text": "Be carefull not to damage anything in the App Schema file while editing it. You will get into trouble if you do so. It can not only produce the UI not to load, but it can also damage the workspace you are working at.",
"updated": 1614940590024
},
{
"style": "Success",
"text": "If you are not sure which project a certain node belongs to, there is a trick to find it out: close the Docs tab, and make focus on the node you want to add an Action to. While on focus, use Ctrl + Shift + Alt + F12 to log in the browser console the Node object. Inspect it to see the project property. Most likely it will be a Superalgos project's node.",
"updated": 1614940654950
},
{
"style": "Title",
"text": "Add Menu Item",
"updated": 1614927443573
},
{
"style": "Text",
"text": "Locate inside the file, the definition of the Node Type you want to add the new Action to. Once localted add a menu item object to the menuItems array, like in the following example:"
},
{
"style": "Json",
"text": "{\n \"action\": \"Add UI Object\",\n \"actionFunction\": \"payload.executeAction\",\n \"label\": \"Add Image\",\n \"relatedUiObject\": \"Image\"\n }",
"updated": 1614789262250
},
{
"style": "Text",
"text": "The example above is most likely what you need to add, except that you will need to type the right values for each of those 4 properties. For completeness, this is the list of properties this object can have:",
"updated": 1614940732785
},
{
"style": "List",
"text": "action: define a name for your action. Capitalize each first letter please. This won't be seen by users.",
"updated": 1614927479016
},
{
"style": "List",
"text": "actionFunction: use the standard \"payload.executeAction\" unless you are familiar with the system and would like to do some custom stuff."
},
{
"style": "List",
"text": "label: this is what is going to be read by users at the Node's menu.",
"updated": 1614927503634
},
{
"style": "List",
"text": "relatedUiObject: optional. You can define here a Node Type. The system will use for the Menu Item icon the image associated to the Node Type you define here.",
"updated": 1614927562326
},
{
"style": "List",
"text": "askConfirmation: true if you want users to confirm with an extra click.",
"updated": 1614927580831
},
{
"style": "List",
"text": "confirmationLabel: the text users will read when asked to confirm.",
"updated": 1614927596195
},
{
"style": "List",
"text": "iconPathOn: the name of the image to render when this Menu Item is ON (in cases that works as a toggle)"
},
{
"style": "List",
"text": "iconPathOff: the name of the image to render when this Menu Item is OFF (in cases that works as a toggle)"
},
{
"style": "List",
"text": "disableIfPropertyIsDefined: true when you want the Menu Item to be disabled if a certain property of the Node object is defined at runtime. This is used in conbination with the property propertyToCheckFor in the special situation that the Menu Item is used to create a child for this Node that is not part of a array of children and there can only be one child of that type.",
"updated": 1614789912636
},
{
"style": "List",
"text": "propertyToCheckFor: read the previous property."
}
]
}
@@ -0,0 +1,47 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 3,
"type": "Automating Actions - Locating the Right Function Library",
"definition": {
"text": "Actions are packed inside Function Libraries. Most likely there is a Function Library already created that is related to the Action you want to create. ",
"updated": 1614941736977
},
"paragraphs": [
{
"style": "Text",
"text": "The procedure to locate a suitable Function Library is very easy. Open the Projects folder, getting into the Project the Node where the action is going to be triggered at is defined. Inside that project Folder get into the UI folder and then into Function-Libraries folder.",
"updated": 1614940833232
},
{
"style": "Note",
"text": "Each file in there is a Function Library except for the one called ActionSwitch.js, which is the place where you connect the Action Function name you defined at the App Schema with the function that will host the code for the new Action.",
"updated": 1614928708817
},
{
"style": "Text",
"text": "Inspect each of these files and see at their header the functions they already implement. After a quick scan over all of them you can decide which one is where your action belongs to. If you believe that your Action should be placed at a new Function Library, then you can try to add a new one and set it up at the Project Schema file, but that is out of the scope of this guide.",
"updated": 1614928780531
},
{
"style": "Title",
"text": "Good Examples",
"updated": 1614929743894
},
{
"style": "Text",
"text": "Take a look at these Function Libraries that represent Hierarchies, because most likely your node belongs to a Hierarchy that already has a Function Library associated with it."
},
{
"style": "List",
"text": "ChartingSpaceFunctions"
},
{
"style": "List",
"text": "CryptoEcosystemFunctions"
},
{
"style": "List",
"text": "PluginsFunctions"
}
]
}
@@ -0,0 +1,51 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 4,
"type": "Automating Actions - Adding your Function",
"definition": {
"text": "Take a look at how other functions are implemented in the Function Library and try to follow that way.",
"updated": 1614941850917
},
"paragraphs": [
{
"style": "Text",
"text": "The basic procedure is quite straight forward. First add the function name to the thisObject and the write you function at the most appropiate place at the Function Library. ",
"updated": 1614941084806
},
{
"style": "Important",
"text": "Please document your function the best you can, even if you see the other functions implemented at the same library poorly documented. See if you can make your function the best documented in the whole library."
},
{
"style": "Title",
"text": "Example of thisObject"
},
{
"style": "Javascript",
"text": " thisObject = {\n addMissingExchanges: addMissingExchanges,\n addMissingAssets: addMissingAssets,\n addMissingMarkets: addMissingMarkets,\n installMarket: installMarket,\n uninstallMarket: uninstallMarket\n }",
"updated": 1614929327521
},
{
"style": "Title",
"text": "Function Parameters"
},
{
"style": "Text",
"text": "Your function will receive some parameters, including the Node object that hosted the Menu Item that triggered your Action. The exact list of parameters will be defined by yourself later at the step Automating Actions - Adding an Action Switch Case. Here is a short list of the most common parameters you might later include:",
"updated": 1614931548904
},
{
"style": "List",
"text": "node: the node object that hosted the Menu Item that triggered your Action"
},
{
"style": "List",
"text": "rootNodes: An array of nodes that are floating at the Design Space without parents. This includes all hierarchy heads.",
"updated": 1614931639516
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,66 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 5,
"type": "Automating Actions - Using Utilities",
"definition": {
"text": "Lower level functionality is packed in Utilities files by topic. There are already many utilities files with operations that will save you time while trying to implement your own Action. ",
"updated": 1614941756401
},
"paragraphs": [
{
"style": "Text",
"text": "It is a very good idea to invest some time at the Utilities folder, scaning the files in there to see what you already have available to use at your actions. You will see that other actions in Function Libraries heavily rely on utilities functions defined at one of the files at the Utilities folder.",
"updated": 1614930012933
},
{
"style": "Title",
"text": "How to Call an Utility Function?",
"updated": 1614942924609
},
{
"style": "Text",
"text": "At runtime, all utility objects will be already instantiated by the time your Action function code runs. You just need to get to the object that host the utility funtion you want to execute via the UI Global Object that is available to you. For exmaple:"
},
{
"style": "Javascript",
"text": "let allLayers = UI.projects.superalgos.utilities.branches.nodeBranchToArray(botLayers, 'Layer')",
"updated": 1614930217705
},
{
"style": "Text",
"text": "The way to find out which is the property name of a certain utility object is by reading the definitions at the Project Schema File. The utility object hosting the nodeBranchToArray function used in the example above, is defined at the Project Schema File in this way:",
"updated": 1614943148547
},
{
"style": "Json",
"text": "{\n \"name\": \"Branches\",\n \"propertyName\": \"branches\",\n \"functionName\": \"newSuperalgosUtilitiesBranches\"\n }",
"updated": 1614930415663
},
{
"style": "Text",
"text": "The propertyName is what you need to know in order to get to the runtime reference of the utility object and execute it's functions.",
"updated": 1614930462629
},
{
"style": "Title",
"text": "Example: Change a Node's Config",
"updated": 1614943976780
},
{
"style": "Text",
"text": "This is the way you programatically manipulate the config of a Node:"
},
{
"style": "Javascript",
"text": "UI.projects.superalgos.utilities.nodeConfig.savePropertyAtNodeConfig(node.payload,'showPanels', true)"
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,115 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 6,
"type": "Automating Actions - Using Function Libraries",
"definition": {
"text": "You might also as well other functions located at Function Libraries from within your Action Function. In order to do this, you just need to locate the instance of the Function Library Object and call any of it's functions.",
"updated": 1614942828678
},
"paragraphs": [
{
"style": "Text",
"text": "It is a very good idea to invest some time at the Function-Libraries folder, scaning the files in there to see what you already have available to use at your actions. You will see that other actions in Function Libraries heavily rely on functions defined at one of the files at the Function-Libraries folder.",
"updated": 1614942900881
},
{
"style": "Title",
"text": "How to Call an Function Library Function?",
"updated": 1614942916741
},
{
"style": "Text",
"text": "At runtime, all Funtion Library objects will be already instantiated by the time your Action function code runs. You just need to get to the object that host the Function Library funtion you want to execute via the UI Global Object that is available to you. For exmaple:",
"updated": 1614942976608
},
{
"style": "Javascript",
"text": "UI.projects.superalgos.functionLibraries.dataStorageFunctions.createSessionReference(marketLearningProducts, session, 'Learning Session Reference')",
"updated": 1614943049167
},
{
"style": "Text",
"text": "The way to find out which is the property name of a certain Function Library object is by reading the definitions at the Project Schema File. The Function Library object hosting the createSessionReference function used in the example above, is defined at the Project Schema File in this way:",
"updated": 1614943202556
},
{
"style": "Json",
"text": "{\n \"name\": \"Data Storage Functions\",\n \"propertyName\": \"dataStorageFunctions\",\n \"functionName\": \"newSuperalgosFunctionLibraryDataStorageFunctions\"\n }",
"updated": 1614943237559
},
{
"style": "Text",
"text": "The propertyName is what you need to know in order to get to the runtime reference of the Function Library object and execute it's functions.",
"updated": 1614943257490
},
{
"style": "Title",
"text": "Popular Functions"
},
{
"style": "Text",
"text": "At your own Action Function you might likely need to execute these functions, belonging to popular actions done at Action Functions:",
"updated": 1614943932540
},
{
"style": "Subtitle",
"text": "Add a New Node"
},
{
"style": "Text",
"text": "The following is an example on how to add a new children to an existing Node:"
},
{
"style": "Javascript",
"text": "dataStorage = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(networkNode, 'Data Storage')",
"updated": 1614943544233
},
{
"style": "Text",
"text": ""
},
{
"style": "Subtitle",
"text": "Delete an Existing Node"
},
{
"style": "Text",
"text": "This is an example on how to Delete an existing Node:"
},
{
"style": "Javascript",
"text": "UI.projects.superalgos.functionLibraries.nodeDeleter.deleteUIObject(projectReference, rootNodes)",
"updated": 1614943594904
},
{
"style": "Subtitle",
"text": "Establish a Reference Parent"
},
{
"style": "Text",
"text": "Example of how to set the Reference Parent of a Node (in this case no Function Library is needed):",
"updated": 1614944033214
},
{
"style": "Javascript",
"text": "node.payload.referenceParent = baseAsset\n",
"updated": 1614943688069
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
},
{
"style": "Text",
"text": ""
}
]
}
@@ -0,0 +1,66 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 7,
"type": "Automating Actions - Using the Workspace",
"definition": {
"text": "The workspace object will give you access to all the hierarchies of nodes, and once there you will be able to manipulate those structures at will.",
"updated": 1614941811976
},
"paragraphs": [
{
"style": "Text",
"text": "You can access to the workspace object in this way:",
"updated": 1614931075101
},
{
"style": "Javascript",
"text": "UI.projects.superalgos.spaces.designSpace.workspace",
"updated": 1614931100393
},
{
"style": "Text",
"text": "Check for the functions defined at thisObject what can be useful in your case. ",
"updated": 1614931205528
},
{
"style": "Text",
"text": "It is not very common to use the Workspace object from an Action, since you have access to the rootNodes array directly as a parameter of your Action function. Useful Workspace function for this use case might be:",
"updated": 1614931466216
},
{
"style": "List",
"text": "getProjectsHeads",
"updated": 1614931357766
},
{
"style": "List",
"text": "getHierarchyHeads",
"updated": 1614931364737
},
{
"style": "List",
"text": "getHierarchyHeadsById",
"updated": 1614931372173
},
{
"style": "List",
"text": "getHierarchyHeadsByType",
"updated": 1614931380751
},
{
"style": "List",
"text": "getNodeThatIsOnFocus",
"updated": 1614931389528
},
{
"style": "List",
"text": "getNodeByShortcutKey",
"updated": 1614931399849
},
{
"style": "List",
"text": "getNodeById",
"updated": 1614931406224
}
]
}
@@ -0,0 +1,58 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 8,
"type": "Automating Actions - Adding an Action Switch Case",
"definition": {
"text": "This steps create the mapping betwheen the actionFunction name you defined at the Menu Item of the node that can trigger your Action, and the function you coded inside a Function Library that will execute the code for the new Action. ",
"updated": 1614941772231
},
"paragraphs": [
{
"style": "Title",
"text": "Action Switch File",
"updated": 1614937860642
},
{
"style": "Text",
"text": "Locate the ActionSwitch.js file inside the Function-Libraries folder. There you will find a gigantic switch instruction with a case for each Action available at the current Project."
},
{
"style": "Text",
"text": "Find within the list of cases some of the cases pointint to the same Function Library your new Action is hosted at, so that you can add a new case together with the rest.",
"updated": 1614937904095
},
{
"style": "Title",
"text": "Add a New Case",
"updated": 1614938281975
},
{
"style": "Text",
"text": "The case string must match the actionFunction you defined at the Menu Item. Your function call should be something like this:"
},
{
"style": "Javascript",
"text": "UI.projects.superalgos.functionLibraries.pluginsFunctions.pluginMissingTradingEngines(action.node, action.rootNodes)\n",
"updated": 1614938043930
},
{
"style": "Success",
"text": "As you can see will you most likely be sending the node and rootNodes parameters into your Action function. You might want to also send other parameters from data you might find into the action object available to you at that point.",
"updated": 1614938157839
},
{
"style": "Text",
"text": "The property name needed to get to the reference of your Function Library object at runtime can be found at the definition of that Function Library located at the Project Schema File. The one corresponding to the example above is this one, for instance:"
},
{
"style": "Json",
"text": "{\n \"name\": \"Plugins Functions\",\n \"propertyName\": \"pluginsFunctions\",\n \"functionName\": \"newSuperalgosFunctionLibraryPluginsFunctions\"\n }",
"updated": 1614938194636
},
{
"style": "Text",
"text": "You can use whatever you find at propertyName to get to the Function Library object at runtime. With this, the mapping is complete.",
"updated": 1614938237127
}
]
}
@@ -0,0 +1,25 @@
{
"topic": "How to Automate Actions at The Design Space",
"pageNumber": 9,
"type": "Automating Actions - Testing your Action",
"definition": {
"text": "To test your new Action you just need to reload the UI, locate the node with the new Menu Item, and click on it...",
"updated": 1614941791574
},
"paragraphs": [
{
"style": "Title",
"text": "Debug",
"updated": 1614939140622
},
{
"style": "Text",
"text": "In order to debug your action, you will need to open the developer tool, and at the Sources tab, locate the Function Library file where you added your action, place a breakpoint at the begining of your function and go and click at the node Menu Item you added."
},
{
"style": "Success",
"text": "If you change the code of your function, reload the UI and you can debug it again with the new changes.",
"updated": 1614939195464
}
]
}
@@ -50,6 +50,33 @@
"style": "Text",
"text": "Over time some users tested Binanceus, which works with the same config as Binance and some other users ventured into others with unknown results. If you manage to put an exhange to work please let us know with which config so that we can move that exchange to the Tested Exchanges branch of the Crypto Ecosystem."
},
{
"style": "Title",
"text": "Your Favorite Exchange is not Listed"
},
{
"style": "Text",
"text": "There are many reasons why an exchange might not be listed even at the Untested Exchanges node. Hera are some of them:",
"updated": 1614949670526
},
{
"style": "Text",
"text": "1. When the list was created it did not exist (you can try Add Missing Exchanges menu item of the Crypto Exchanges node)"
},
{
"style": "Text",
"text": "2. It is not listed at the CCXT library included with Superalgos (an npm update would be needed at the right folder to update the library). If it appears after the update, please inform the team so as to update it for all.",
"updated": 1614949724133
},
{
"style": "Text",
"text": "3. The exchange does not support historical data at 1 min (you can check the exchange API docs). Escahnges that do not support this are filtered out while running Add Missing Exchanges command.",
"updated": 1614949756265
},
{
"style": "Text",
"text": "4. The exchange does not support the function to list it's markets. (Also check the exchange API docs)"
},
{
"style": "Title",
"text": "Getting Started"
@@ -0,0 +1,56 @@
{
"topic": "Tested Exchanges",
"pageNumber": "1",
"type": "Binance Test Status",
"definition": {
"text": "Binance is fully tested for data mining and trading.",
"updated": 1615141847424
},
"paragraphs": [
{
"style": "Title",
"text": "Properties",
"updated": 1615143100216
},
{
"style": "List",
"text": "1-min OHLCVs Capability [*]: Yes."
},
{
"style": "List",
"text": "Market History: Starting on September 2017.",
"updated": 1615142912901
},
{
"style": "List",
"text": "Trading Capability [**]: Yes.",
"updated": 1615143016205
},
{
"style": "List",
"text": "Comments: Fully tested. Starting with Binance is recommended as the experience is seamless.",
"updated": 1615142951363
},
{
"style": "Text",
"text": "[*] The ability to fetch historic data for backtesting purposes has been verified."
},
{
"style": "Text",
"text": "[**] The ability to run strategies in live-trading mode has been verified."
},
{
"style": "Title",
"text": "Configuration"
},
{
"style": "Json",
"text": "{\n \"codeName\": \"binance\",\n \"API\": [\n {\n \"method\": \"fetchTrades\",\n \"fetchType\": \"by Id\",\n \"fetchTradesMethod\": \"publicGetHistoricalTrades\",\n \"firstId\": \"f\"\n }\n ]\n}",
"updated": 1615143066280
},
{
"style": "Text",
"text": ""
}
]
}
@@ -12,11 +12,19 @@
{
"language": "ID",
"text": "Aku adalah tutorial yang interaktif, yang berkerja untuk memfasilitasi orientasi pemikiran kamu dan mengajari kamu semua dasar tentang Superalgos!",
"updated": 1614416780981
},{
"updated": 1614416780981,
"style": "Definition"
},
{
"language": "ES",
"text": "Soy un tutorial interactivo, el primero de una serie diseñada para facilitar tu llegada y enseñarte lo básico.",
"updated": 1613594456875
"updated": 1613594456875,
"style": "Definition"
},
{
"language": "IT",
"text": "Sono un tutorial interattivo, il primo di una serie progettata per rendere più facile la tua introduzione a Superalgos e per insegnarti tutti i concetti base!",
"updated": 1614711302828
}
]
},
@@ -28,11 +36,19 @@
{
"language": "ID",
"text": "Aku akan membantumu dalam memulai, dan menunjukkan alat yang akan membantumu bergerak dengan nyaman, dan menemukan semua hal keren yang akan dilakukan Superalgos untuk tradingmu.",
"updated": 1614416877222
},{
"updated": 1614416877222,
"style": "Text"
},
{
"language": "ES",
"text": "Te pondré en marcha, te mostraré las herramientas que te ayudarán a moverte cómodamente y te ayudaré a descubrir todas las cosas geniales que Superalgos puede hacer por ti.",
"updated": 1613594557989
"updated": 1613594557989,
"style": "Text"
},
{
"language": "IT",
"text": "Ti farò un'introduzione, mostrandoti gli strumenti che ti aiuteranno a prendere confidenza, e ti aiuterò a scoprire tutte le cose grandiose che Superalgos può fare per te.",
"updated": 1614711533001
}
]
},
@@ -43,12 +59,19 @@
{
"language": "ID",
"text": "Aku adalah tutorial orientasi Superalgos yang terbaik! Memulai Superalgos dengan cara yang tidak direkomendasikan sangatlah salah, karena tidak ada sumber lain yang dapat mempercepat kamu selain aku. Aku akan menjawab sebagian besar pertanyaan kamu!",
"updated": 1614417059937
},{
"updated": 1614417059937,
"style": "Callout"
},
{
"language": "ES",
"text": "Soy la herramienta definitiva para descubrir Superalgos. Empezar de cualquier otra manera es un error, ya que ningún otro medio te hará descubrir la herramienta más rápido. Intentaré aclarar todas tus dudas.",
"updated": 1613594779456
"updated": 1613594779456,
"style": "Callout"
},
{
"language": "IT",
"text": "Sono lo strumento definitivo per scoprire Superalgos! Avventurarti alla sua scoperta in qualsiasi altro modo é un errore: nessun altro strumento ti aiuterà a farlo più in fretta. Ti assicuro che risponderò alla maggior parte delle tue domande!",
"updated": 1614711851139
}
]
},
@@ -59,13 +82,21 @@
{
"language": "ID",
"text": "Mohon, klik Next untuk melanjutkan",
"updated": 1614417191759
},{
"updated": 1614417191759,
"style": "Success"
},
{
"language": "ES",
"text": "Porfavor, presiona siguiente para continuar",
"updated": 1613594696979
"updated": 1613594696979,
"style": "Success"
},
{
"language": "IT",
"text": "Premi sempre Next per continuare!",
"updated": 1614711933264
}
]
}
]
}
}
@@ -13,11 +13,20 @@
{
"language": "ID",
"text": "Saat menjalankan frontend ini, gunakan Chrome, atau Safari di Mac!. Kami developer tidak mencoba aplikasi ini di browser lain.",
"updated": 1614417282628
},{
"updated": 1614417282628,
"style": "Definition"
},
{
"language": "ES",
"text": "Cuando ejecute el frontend, utilice Chrome o Safari en Mac. No hemos testeado otros navegadores\n",
"updated": 1613594870172
"updated": 1613594870172,
"style": "Definition"
},
{
"language": "IT",
"text": "Quando esegui il front-end usa Chrome, oppure Safari sul Mac! Al momento non stiamo testando altri browser!",
"updated": 1614712122833,
"style": "Definition"
}
]
},
@@ -29,11 +38,20 @@
{
"language": "ID",
"text": "Sudah menjadi hal yang lumrah bahwa setiap browser berbeda, dan kami tentu saja tidak mengetahui fitur yang berfungsi di browser lain. Jika kamu menggunakan Chrome atau Safari, klik Next dan lanjutkan. Jika tidak, lakukan hal berikut:",
"updated": 1614417395532
},{
"updated": 1614417395532,
"style": "Text"
},
{
"language": "ES",
"text": "Sabemos que los navegadores se comportan de manera diferente, y sabemos de características que no funcionan en otros navegadores. Si está en Chrome o Safari, haga clic en Siguiente y continúe. Si no es así, haga lo siguiente:",
"updated": 1613594916732
"updated": 1613594916732,
"style": "Text"
},
{
"language": "IT",
"text": "É noto che i vari browsers presentano delle differenze tra loro, e siamo al corrente che alcuni di questi non supportano certe funzionalità. Se sei su Chrome o Safari, clicca Next per proseguire. Altrimenti:",
"updated": 1614712436380,
"style": "Text"
}
]
},
@@ -45,11 +63,20 @@
{
"language": "ID",
"text": "Copy url diatas",
"updated": 1614417516319
},{
"updated": 1614417516319,
"style": "List"
},
{
"language": "ES",
"text": "Copie la URL actual;",
"updated": 1613594931424
"updated": 1613594931424,
"style": "List"
},
{
"language": "IT",
"text": "copia l'URL;",
"updated": 1614712466087,
"style": "List"
}
]
},
@@ -61,11 +88,20 @@
{
"language": "ID",
"text": "Tutup browser ini dan jangan tutup tutorialnya",
"updated": 1614417498228
},{
"updated": 1614417498228,
"style": "List"
},
{
"language": "ES",
"text": "Cierre este navegador tal cual; no cierre el tutorial...",
"updated": 1613594962637
"updated": 1613594962637,
"style": "List"
},
{
"language": "IT",
"text": "chiudi il browser, ma senza chiudere il tutorial;",
"updated": 1614717123837,
"style": "List"
}
]
},
@@ -77,11 +113,20 @@
{
"language": "ID",
"text": "Buka Chrome/Safari dan salin url yang sudah dicopy. Kamu akan secepatnya kembali ke tutorial ini.",
"updated": 1614417589615
},{
"updated": 1614417589615,
"style": "List"
},
{
"language": "ES",
"text": "Abra Chrome/Safari y pega la URL; ¡El tutorial debería estar abierto en este paso cuando vuelvas!",
"updated": 1613595008059
"updated": 1613595008059,
"style": "List"
},
{
"language": "IT",
"text": "apri Chrome/Safari e incolla l'URL: il tutorial dovrebbe aprirsi su questo step!",
"updated": 1614717129520,
"style": "List"
}
]
},
@@ -92,13 +137,22 @@
{
"language": "ID",
"text": "Kami memberikan bantuan online, tetapi kami tidak bisa membantumu dengan browser berbeda!",
"updated": 1614417653352
},{
"updated": 1614417653352,
"style": "Warning"
},
{
"language": "ES",
"text": "Ofrecemos asistencia en línea, pero no podemos ayudarte otros navegadores.",
"updated": 1613595041161
"updated": 1613595041161,
"style": "Warning"
},
{
"language": "IT",
"text": "Offriamo supporto online, ma non possiamo aiutarti con altri browsers!",
"updated": 1614712645613,
"style": "Warning"
}
]
}
]
}
}
@@ -12,11 +12,20 @@
{
"language": "ID",
"text": "Tutorial ini dibuat oleh system, jadi kamu juga bisa membuat tutorial berbeda jika ingin! Tapi kita bahas hal besar itu nanti saja. Untuk sekarang fokus saja ke hal yang basic!",
"updated": 1614417905988
},{
"updated": 1614417905988,
"style": "Definition"
},
{
"language": "ES",
"text": "Los tutoriales se definen dentro del sistema, así que puedes crear más como yo si lo deseas. Pero ya hablaremos de ese poder divino más adelante. ¡Centrémonos primero en lo básico!",
"updated": 1613595123263
"updated": 1613595123263,
"style": "Definition"
},
{
"language": "IT",
"text": "I tutorial sono definiti all'interno del sistema, quindi puoi creare altri di noi se lo vuoi! Ma parleremo di questo potere divino più avanti. Prima concentriamoci sulle basi!",
"updated": 1614712747107,
"style": "Definition"
}
]
},
@@ -28,11 +37,20 @@
{
"language": "ID",
"text": "Superalgos merupakan data yang divisualisasikan. Dengan sistem yang merepresentasikan informasi berstruktur hirarki dari nodes yang tersambung (berbentuk icon). Apa yang kamu lihat disebelah bagian dari hirarki juga, secara detail tutorial yang dimaksud adalah Welcome to Superalgos!",
"updated": 1614418099585
},{
"updated": 1614418099585,
"style": "Text"
},
{
"language": "ES",
"text": "Superalgos es intrínsecamente una herramienta visual. El sistema representa la información en estructuras jerárquicas de nodos interconectados, representados por iconos. Lo que ve a su derecha es una de estas jerarquías, en concreto, una jerarquía de Tutorial con una etiqueta que dice Welcome to Superalgos!",
"updated": 1613595175809
"updated": 1613595175809,
"style": "Text"
},
{
"language": "IT",
"text": "Superalgos é per natura uno strumento visivo. Il sistema rappresenta le informazioni in una struttura gerarchica di nodi interconnessi, rappresentati da icone. Alla tua destra c'é una di queste gerarchie: più precisamente, una gerarchia Tutorial con la didascalia \"Welcome to Superalgos!\".",
"updated": 1614713100480,
"style": "Text"
}
]
},
@@ -44,9 +62,16 @@
{
"language": "ID",
"text": "Dekatkan pointer mousemu ke node Tutorial dan lihat apa yang terjadi!, Keren bukan? Banyak sekali tombol disana!",
"updated": 1614424765045
"updated": 1614424765045,
"style": "Callout"
},
{
"language": "IT",
"text": "Sposta il cursore del mouse sul nodo Tutorial e guarda cosa succede! Wow! Forte, vero? Ci sono un sacco di pulsanti!",
"updated": 1614717176134,
"style": "Callout"
}
]
}
]
}
}
@@ -12,11 +12,20 @@
{
"language": "ID",
"text": "Setiap node memiliki menunya sendiri. Tombol dikiri bawah bisa membesar dan mengecilkan struktur dari sekumpulan nodes lainnya yang masih berada di node yang sekarang.",
"updated": 1614424892833
},{
"updated": 1614424892833,
"style": "Definition"
},
{
"language": "ES",
"text": "Cada nodo cuenta con un menú. El botón de la parte inferior izquierda expande y colapsa la estructura de los nodos por debajo del nodo actual.",
"updated": 1613595237180
"updated": 1613595237180,
"style": "Definition"
},
{
"language": "IT",
"text": "Ogni nodo ha un menu. Il bottone in basso a sinistra espande o comprime la struttura dei nodi sotto il nodo corrente.",
"updated": 1614713202090,
"style": "Definition"
}
]
},
@@ -28,11 +37,20 @@
{
"language": "ID",
"text": "Ayo coba dengan men-click tombol expand tersebut!",
"updated": 1614424924865
},{
"updated": 1614424924865,
"style": "Callout"
},
{
"language": "ES",
"text": "Adelante, haz clic en el botón de expansión.",
"updated": 1613595248682
"updated": 1613595248682,
"style": "Callout"
},
{
"language": "IT",
"text": "Prova a cliccare il bottone per espandere!",
"updated": 1614713217883,
"style": "Callout"
}
]
},
@@ -43,11 +61,20 @@
{
"language": "ID",
"text": "Node Tutorial memiliki beberapa turunan, dan setiap turunan mempunyai turunannya lagi. Itulah hirarki!",
"updated": 1614425111632
},{
"updated": 1614425111632,
"style": "Text"
},
{
"language": "ES",
"text": "El nodo Tutorial tiene varios subnodos, y éstos tienen varios subnodos más. ¡Por eso es una jerarquía!",
"updated": 1613595290969
"updated": 1613595290969,
"style": "Text"
},
{
"language": "IT",
"text": "Il nodo Tutorial ha diversi discendenti, e questi ne hanno altri a loro volta. Ecco perché é una gerarchia!",
"updated": 1614713286305,
"style": "Text"
}
]
},
@@ -58,13 +85,22 @@
{
"language": "ID",
"text": "Representasi visual terstruktur dari informasi merupakan inti dari cara Superalgos mengelola kompleksitas di balik aplikasi trading yang fleksibel dan dapat dikembangkan.",
"updated": 1614425276894
},{
"updated": 1614425276894,
"style": "Note"
},
{
"language": "ES",
"text": "Las representaciones visuales estructuradas de la información son el núcleo de la forma en que Superalgos administra la complejidad de las operaciones de trading flexibles y escalables.",
"updated": 1613595317733
"updated": 1613595317733,
"style": "Note"
},
{
"language": "IT",
"text": "Le rappresentazioni visive strutturate di informazioni sono la chiave di come Superalgos gestisce operazioni di trading complesse, flessibili e scalabili.",
"updated": 1614717222097,
"style": "Note"
}
]
}
]
}
}
@@ -12,11 +12,19 @@
{
"language": "ID",
"text": "Sebelum aku memperlihatkan bagian lain dari menu, ayo kebeberapa hirarki lain seperti Network.",
"updated": 1614425404268
},{
"updated": 1614425404268,
"style": "Definition"
},
{
"language": "ES",
"text": "Antes de mostrarte el resto del menú, vamos a echar un vistazo a otra jerarquía: la Network.",
"updated": 1613595345116
"updated": 1613595345116,
"style": "Definition"
},
{
"language": "IT",
"text": "Prima che ti mostri il resto del menu, diamo un'occhiata un'altra gerarchia: il Network.",
"updated": 1614717275389
}
]
},
@@ -28,11 +36,19 @@
{
"language": "ID",
"text": "Network merupakan hirarki yang mengatur ruang kendali sistem. Di sinilah kamu bisa mengontrol Data Tasks, Testing Trading Tasks, dan Production Trading Tasks.",
"updated": 1614425530127
},{
"updated": 1614425530127,
"style": "Text"
},
{
"language": "ES",
"text": "La jerarquía de la red es la sala de control del sistema. Aquí es donde usted controla sus Data Tasks, Testing Trading Tasks, y Production Trading Tasks.",
"updated": 1613595453982
"updated": 1613595453982,
"style": "Text"
},
{
"language": "IT",
"text": "La gerarchia Network é il centro di controllo del sistema. Qui puoi controllare i Data Tasks, i Testing Trading Tasks e i Production Trading Tasks.",
"updated": 1614717446087
}
]
},
@@ -43,11 +59,19 @@
{
"language": "ID",
"text": "Besarkan hirarki ini dan lihat didalamnya!",
"updated": 1614425575929
},{
"updated": 1614425575929,
"style": "Callout"
},
{
"language": "ES",
"text": "Amplíe la jerarquía y eche un vistazo al interior.",
"updated": 1613595398384
"updated": 1613595398384,
"style": "Callout"
},
{
"language": "IT",
"text": "Espandi la gerarchia e dacci un occhiata!",
"updated": 1614717504312
}
]
},
@@ -59,13 +83,21 @@
{
"language": "ID",
"text": "Lihat nodes yang telah yang sudah kuberitahu sebelumnya? Keren! Kita disini untuk memulai pertama kali mengoperasikan data mining. Tapi, aku punya pertanyaan kepadamu: Apakah kamu mengakses Client secara remote ?",
"updated": 1614426192898
},{
"updated": 1614426192898,
"style": "Text"
},
{
"language": "ES",
"text": "¿Ves los nodos que he mencionado antes? Genial. Estamos aquí para iniciar tu primera operación de minería de datos. Pero antes de empezar, tengo una pregunta rápida para ti: ¿estás accediendo al Cliente de forma remota?",
"updated": 1613595481110
"updated": 1613595481110,
"style": "Text"
},
{
"language": "IT",
"text": "Hai visto i nodi di cui parlavo prima? Forte! Siamo qui per iniziare la nostra prima operazione di data mining. Ma prima di partire, ho una domanda al volo per te: stai utilizzando il Client da remoto?",
"updated": 1614717611211
}
]
}
]
}
}
@@ -12,11 +12,19 @@
{
"language": "ID",
"text": "Superalgos bisa dijalankan secara Clients, melalui mesin dan mengakses dengan Chrome dengan mesin dari jaringan yang berbeda.",
"updated": 1614426387929
},{
"updated": 1614426387929,
"style": "Definition"
},
{
"language": "ES",
"text": "Superalgos permite ejecutar el Cliente en una máquina y acceder a él a través de Chrome desde otra máquina de la red.",
"updated": 1613595518833
"updated": 1613595518833,
"style": "Definition"
},
{
"language": "IT",
"text": "Superalgos permette di accedere al Client in esecuzione su un dispositivo collegandosi attraverso il browser da un'altra macchina della rete.",
"updated": 1614717921223
}
]
},
@@ -28,11 +36,19 @@
{
"language": "ID",
"text": "Banyak pengguna memilih untuk menjalankan Client di cloud, juga di mesin single-board seperti Raspberry Pi, atau di PC khusus yang dapat mereka tinggalkan setiap saat dengan trading tetap berlangsung. Node My Computer Network merepresentasikan Client yang dijalankan sekarang.",
"updated": 1614426753535
},{
"updated": 1614426753535,
"style": "Text"
},
{
"language": "ES",
"text": "Muchos usuarios optan por ejecutar el Cliente en la nube, en máquinas sencillas como la Raspberry Pi, o en un PC dedicado que pueden dejar encendido en todo momento cuando operan en live. El nodo de red de My Computer Network representa la máquina en la que se ejecuta el Cliente.",
"updated": 1613595575444
"updated": 1613595575444,
"style": "Text"
},
{
"language": "IT",
"text": "Molti utenti scelgono di eseguire il Client sul cloud, su computer a scheda singola come il Raspberry Pi o su PC dedicati che possono lasciare sempre attivi quando fanno trading live. Il Network Node My Computer rappresenta la macchina su cui il Client é in esecuzione.",
"updated": 1614717893341
}
]
},
@@ -44,13 +60,21 @@
{
"language": "ID",
"text": "Saat ini, Superalgos tidak menerapkan keamanan dalam bentuk apa pun. Kamu harus menggunakan sistem dalam konteks Jaringan Restricted Local Area Network saja. Jika kamu memilih untuk menjalankan Client di cloud, Kamu harus mensetup keamanan kamu sendiri.",
"updated": 1614426920839
},{
"updated": 1614426920839,
"style": "Warning"
},
{
"language": "ES",
"text": "En este momento, Superalgos no implementa ninguna forma de seguridad. Debe utilizar el sistema únicamente en el contexto de una red de área local restringida. Si decide ejecutar el Cliente en la nube, deberá implementar su propia seguridad.",
"updated": 1613595591178
"updated": 1613595591178,
"style": "Warning"
},
{
"language": "IT",
"text": "Al momento, Superalgos non implementa alcuna forma di sicurezza. Dovresti usarlo soltanto in un contesto sicuro, come una LAN riservata. Se scegli di eseguire il Client nel cloud, devi implementare da te i meccanismi di sicurezza.",
"updated": 1614718058273
}
]
}
]
}
}
@@ -12,7 +12,13 @@
{
"language": "ID",
"text": "Jika kamu menjalankan Client ini di mesin yang sama, saranku click Next dan skip step ini segera!",
"updated": 1614426991691
"updated": 1614426991691,
"style": "Definition"
},
{
"language": "IT",
"text": "Se sei collegato al Client dalla stessa macchina, puoi cliccare Next e saltare questo step!",
"updated": 1614718112355
}
]
},
@@ -24,7 +30,13 @@
{
"language": "ID",
"text": "Jika kamu menjalankan Client dari mesin remote, kamu harus mengkonfigurasi node Network sebelum melanjutkannya.",
"updated": 1614427153780
"updated": 1614427153780,
"style": "Text"
},
{
"language": "IT",
"text": "Se ti stai collegando al Client da remoto, devi configurare il Network Node prima di proseguire.",
"updated": 1614718136636
}
]
},
@@ -36,7 +48,13 @@
{
"language": "ID",
"text": "Click Configure disebelah kanan atas dari node menu Network.",
"updated": 1614427190110
"updated": 1614427190110,
"style": "List"
},
{
"language": "IT",
"text": "Clicca Configure nell'angolo in alto a destra del menu del Network Node.",
"updated": 1614718181211
}
]
},
@@ -47,7 +65,13 @@
{
"language": "ID",
"text": "Ubah host parameter IP Address dari mesin yang berjalan di backend.",
"updated": 1614429595918
"updated": 1614429595918,
"style": "List"
},
{
"language": "IT",
"text": "Inserisci nel parametro host l'indirizzo IP della macchina su cui é in esecuzione il backend.",
"updated": 1614718382791
}
]
},
@@ -58,7 +82,13 @@
{
"language": "ID",
"text": "Keluar dari konfigurasi dengan mengeluarkan pointer mouse dari gelembung konfigurasi!. JIka konfigurasi benar, pesan error di Network Node akan hilang dalam beberapa menit!",
"updated": 1614429527142
"updated": 1614429527142,
"style": "List"
},
{
"language": "IT",
"text": "Esci dalla configurazione spostando il puntatore del mouse dalla bolla! Se i parametri sono corretti, il messaggio di errore nel Network Node dovrebbe scomparire nel giro di un minuto!",
"updated": 1614718314979
}
]
}
@@ -8,18 +8,39 @@
"icon": {
"name": "bullet-warning",
"project": "Superalgos"
}
},
"translations": [
{
"language": "IT",
"text": "Anche se dispositivi embedded come il Raspberry Pi possono gestire il Client Superalgos per eseguire sia le task relative ai dati che quelle relative al trading, alcuni potrebbero non essere abbastanza potenti.",
"updated": 1614718975756
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The core idea behind running the client in small physical or virtual hardware is to maximize cost efficiency in production deployments. In such contexts, the UI is used to a minimum.",
"updated": 1610616659750
"updated": 1610616659750,
"translations": [
{
"language": "IT",
"text": "Eseguire il Client in hardware fisici o virtuali dalle dimensioni ridotte ha l'obiettivo di massimizzare l'efficienza dei costi in un ambiente di produzione. In questi contesti, l'utilizzo della UI é ridotto al minimo.",
"updated": 1614718792202
}
]
},
{
"style": "Success",
"text": "If you notice your small hardware is too slow during this tutorial, you may want to consider installing in regular hardware until you learn Superalgos, build your first strategies, and are ready to deploy. Otherwise, it may be frustrating.",
"updated": 1610616740275
"updated": 1610616740275,
"translations": [
{
"language": "IT",
"text": "Se durante questo tutorial ti accorgi che il tuo sistema embedded é troppo lento, considera l'idea di installarlo su un sistema con un hardware normale finché non impari le basi, costruisci le tue prime strategie e sei pronto a rilasciarle. Altrimenti può essere frustrante.",
"updated": 1614719047421
}
]
}
]
}
@@ -7,28 +7,70 @@
"project": "Superalgos",
"name": "data-tasks"
},
"text": "The Data Tasks node controls all the data mining tasks defined for this Network Node."
"text": "The Data Tasks node controls all the data mining tasks defined for this Network Node.",
"translations": [
{
"language": "IT",
"text": "Il nodo Data Task controlla tutte le task di data mining definite per questo Network Node.",
"updated": 1614719093819
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "You are about to start the first of the following activities that we'll cover in the next few minutes:"
"text": "You are about to start the first of the following activities that we'll cover in the next few minutes:",
"translations": [
{
"language": "IT",
"text": "Stai per cominciare la prima delle seguenti attività che copriremo nei prossimi minuti:",
"updated": 1614719131672
}
]
},
{
"style": "List",
"text": "1. Run a data mining operation to get data for the BTC/USDT Market from Binance."
"text": "1. Run a data mining operation to get data for the BTC/USDT Market from Binance.",
"translations": [
{
"language": "IT",
"text": "1. <i> Eseguire </i> un operazione di data mining per ottenere i dati per il Market BTC/USDT da Binance.",
"updated": 1614719245405
}
]
},
{
"style": "List",
"text": "2. Run a Backtesting Session with an existing open-source strategy."
"text": "2. Run a Backtesting Session with an existing open-source strategy.",
"translations": [
{
"language": "IT",
"text": "2. <i>Eseguire</i> una Backtesting Session con una strategia open-source già esistente.",
"updated": 1614719466297
}
]
},
{
"style": "List",
"text": "3. Run a Live Trading Session with minimal funds, to test the critical aspects of the system."
"text": "3. Run a Live Trading Session with minimal funds, to test the critical aspects of the system.",
"translations": [
{
"language": "IT",
"text": "3. <i>Eseguire</i> una Live Trading Session con una minima quantità di fondi, per testare gli aspetti più critici del sistema.",
"updated": 1614719396162
}
]
},
{
"style": "Callout",
"text": "Are you cool with this? Shall we start?"
"text": "Are you cool with this? Shall we start?",
"translations": [
{
"language": "IT",
"text": "Che ne dici, sei d'accordo? Possiamo incominciare?",
"updated": 1614719416134
}
]
}
]
}
@@ -7,27 +7,62 @@
"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 or binance.us?",
"translations": [
{
"language": "IT",
"text": "Prima di cominciare con il data mining, ho una piccola domanda per te: fai trading su binance.com o binance.us ?",
"updated": 1614719701294
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "If you trade at binance.com or don't trade with Binance at all, then you may skip this step and the next!"
"text": "If you trade at binance.com or don't trade with Binance at all, then you may skip this step and the next!",
"translations": [
{
"language": "IT",
"text": "Se fai trading su binance.com o non usi proprio Binance, puoi saltare questo step e anche il prossimo!",
"updated": 1614719681526
}
]
},
{
"style": "Callout",
"text": "If you trade at binance.us you need to configure the Binance node to the right! The video on the next step shows you how!",
"updated": 1611076107190
"updated": 1611076107190,
"translations": [
{
"language": "IT",
"text": "Se fai trading su binance.us allora devi configurare il nodo Binance qui a destra! Il video nel prossimo step ti mostrerà come!",
"updated": 1614719789690
}
]
},
{
"style": "List",
"text": "1. 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": 1610612932151
"updated": 1610612932151,
"translations": [
{
"language": "IT",
"text": "1. <i>Apri</i> la configurazione e cambia il codeName in binanceus. Sposta il cursore del mouse dalla bolla di configurazione e questa si chiuderà, salvando automaticamente le modifiche.",
"updated": 1614719935190
}
]
},
{
"style": "List",
"text": "2. Edit the label of the node to read Binanceus.",
"updated": 1610537864275
"updated": 1610537864275,
"translations": [
{
"language": "IT",
"text": "2. Modifica la label del nodo in Binanceus.",
"updated": 1614719998652
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 11,
"type": "Tutorial Step - Welcome Binanceus",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà il video in modalità schermo intero.",
"updated": 1614720025789
}
]
},
"paragraphs": [
{
@@ -8,21 +8,49 @@
"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
"updated": 1611076262685,
"translations": [
{
"language": "IT",
"text": "Apri il menu del nodo Data Tasks e cerca il pulsante Run All Project Data Tasks nell'angolo in alto a destra...",
"updated": 1614720124109
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click the Run All Project Data Tasks button!",
"updated": 1611076332667
"updated": 1611076332667,
"translations": [
{
"language": "IT",
"text": "Clicca sul pulsante Run All Project Data Tasks!",
"updated": 1614720129427
}
]
},
{
"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": "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.",
"translations": [
{
"language": "IT",
"text": "Conferma la richiesta cliccando il pulsante una seconda volta. In circa 30 secondi, dovresti vedere un messaggio di stato sotto il nodo Data Mining che ti indica che é in corso 1 Exchange Data Tasks su 1. ",
"updated": 1614720224584
}
]
},
{
"style": "Note",
"text": "Your console app should show something similar to the video on the next step."
"text": "Your console app should show something similar to the video on the next step.",
"translations": [
{
"language": "IT",
"text": "La tua console app dovrebbe mostrarti qualcosa di simile al video nello step successivo.",
"updated": 1614720247842
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "sensor-bot-instance"
},
"text": "I just dragged you deep into the confines of the Data Mining operation. See the progress of the Sensor Bot Instance to your right!"
"text": "I just dragged you deep into the confines of the Data Mining operation. See the progress of the Sensor Bot Instance to your right!",
"translations": [
{
"language": "IT",
"text": "Sei stato appena trascinato dentro i confini dell'operazione di Data Mining. Controlla i progressi della Sensor Bot Instance alla tua destra!",
"updated": 1614720420362
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The sensor bot is currently extracting data from the exchange. As soon as she completes the extraction for the defined datetime range something really cool will happen... automatically!"
"text": "The sensor bot is currently extracting data from the exchange. As soon as she completes the extraction for the defined datetime range something really cool will happen... automatically!",
"translations": [
{
"language": "IT",
"text": "Il sensor bot sta estraendo dati dal mercato. Appena avrà finito l'estrazione per l'intervallo di tempo selezionato, qualcosa di veramente forte accadrà...automaticamente!",
"updated": 1614720508108
}
]
},
{
"style": "Callout",
"text": "Can you guess what that may be?"
"text": "Can you guess what that may be?",
"translations": [
{
"language": "IT",
"text": "Riesci a immaginare cosa possa essere?",
"updated": 1614720522523
}
]
},
{
"style": "Text",
"text": "I won't tell you! You'll find out soon. . . be patient! It should take no longer than 3 to 5 minutes to extract the data from Binance, or a bit longer, depending on your hardware. Can't wait? Fine! Click Next for a quick hint!",
"updated": 1610613730092
"updated": 1610613730092,
"translations": [
{
"language": "IT",
"text": "Non te lo dirò! Lo scoprirai presto...sii paziente! Ci dovrebbero volere soltanto dai 3 ai 5 minuti per estrarre i dati da Binance, o un pò di più, in base al tuo hardware. Non puoi proprio aspettare? Va bene! Clicca su Next per un anticipo!",
"updated": 1614720621816
}
]
}
]
}
@@ -7,21 +7,53 @@
"project": "Superalgos",
"name": "indicator-bot-instance"
},
"text": "That's right! Indicators will start working as soon as the sensor bot finishes her job!"
"text": "That's right! Indicators will start working as soon as the sensor bot finishes her job!",
"translations": [
{
"language": "IT",
"text": "Esatto! Gli indicatori cominceranno a lavorare non appena il sensor bot avrà finito il suo lavoro!",
"updated": 1614720705287,
"style": "Definition"
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "You're watching the processes of Candles Volumes. She turns the one-minute candles the sensor bot downloads from the exchange into candles for all time frames."
"text": "You're watching the processes of Candles Volumes. She turns the one-minute candles the sensor bot downloads from the exchange into candles for all time frames.",
"translations": [
{
"language": "IT",
"text": "Ciò che vedi é il processo del Candles Volumes: trasforma le candele sul periodo di un minuto che il sensor bot scarica dall'exchange in candele per tutti i periodi temporali.",
"updated": 1614721117562,
"style": "Text"
}
]
},
{
"style": "Callout",
"text": "What happens after she finishes?",
"updated": 1611076432059
"updated": 1611076432059,
"translations": [
{
"language": "IT",
"text": "Che succede dopo che ha terminato?",
"updated": 1614720863282,
"style": "Callout"
}
]
},
{
"style": "Text",
"text": "Other bots need Candles Volumes to finish her work so that they may start doing theirs. Imagine a bot needs to calculate a 20-periods Simple Moving Average for all time frames. She needs the Data Product produced by Candles Volumes as input for the SMA calculation. We call such a need a Data Dependency."
"text": "Other bots need Candles Volumes to finish her work so that they may start doing theirs. Imagine a bot needs to calculate a 20-periods Simple Moving Average for all time frames. She needs the Data Product produced by Candles Volumes as input for the SMA calculation. We call such a need a Data Dependency.",
"translations": [
{
"language": "IT",
"text": "Altri bot hanno bisogno che la Candles Volumes termini, prima di iniziare il loro compito. Immagina un bot che calcoli SMA-20 su tutti i time-frame: ha bisogno di un Data Product come input, risultato del Candles Volumes. Questo rapporto si chiama Data Dependency.",
"updated": 1614788007733,
"style": "Text"
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "hand-drag"
},
"text": "I want to show you something while the data mining operation progresses. I'll teach you how to walk... in two seconds!"
"text": "I want to show you something while the data mining operation progresses. I'll teach you how to walk... in two seconds!",
"translations": [
{
"language": "IT",
"text": "Voglio mostrarti qualcosa, mentre l'operazione di data mining è in corso. Ti insegnerò a camminare nel giro di un attimo!",
"updated": 1614788444726
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Just click and drag with your mouse!"
"text": "Just click and drag with your mouse!",
"translations": [
{
"language": "IT",
"text": "É facile: clicca e trascina usando il mouse!",
"updated": 1614788236203
}
]
},
{
"style": "Text",
"text": "Easy, right? Great! However, the design space is a huge place and I wouldn't want you to get tendinitis dragging your way around like this.",
"updated": 1610613840200
"updated": 1610613840200,
"translations": [
{
"language": "IT",
"text": "Semplice, no? Ad ogni modo, il Design Space è molto esteso e non vorrai farti venire la tendinite cliccando e trascinando in giro in questo modo.",
"updated": 1614789321190
}
]
},
{
"style": "Success",
"text": "I'll teach you a couple more tricks in the next couple of steps."
"text": "I'll teach you a couple more tricks in the next couple of steps.",
"translations": [
{
"language": "IT",
"text": "Nei prossimi step ti insegnerò un altro paio di trucchetti.",
"updated": 1614788431318
}
]
}
]
}
@@ -7,23 +7,51 @@
"project": "Superalgos",
"name": "key-ctrl"
},
"text": "Yes! You may use your keyboard too! You are going to love this for long-distance travel on the design space!"
"text": "Yes! You may use your keyboard too! You are going to love this for long-distance travel on the design space!",
"translations": [
{
"language": "IT",
"text": "Oh sì! Puoi usare anche la tastiera! Fidati, la adorerai per gli spostamenti a lunga distanza nel Design Space!",
"updated": 1614789336258
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Regular folks may use the Ctrl key plus arrow keys: ← → ↑ ↓",
"updated": 1610614017276
"updated": 1610614017276,
"translations": [
{
"language": "IT",
"text": "Puoi usare il tasto Ctrl più i quattro tasti freccia: ← → ↑ ↓",
"updated": 1614788584746
}
]
},
{
"style": "Note",
"text": "Notice that keeping the keys pressed makes you fly!",
"updated": 1610614056593
"updated": 1610614056593,
"translations": [
{
"language": "IT",
"text": "Tenere premuti i tasti ti farà volare!",
"updated": 1614788606698
}
]
},
{
"style": "Success",
"text": "Of course Mac fanboys and girls must replace Ctrl with Cmd",
"updated": 1610614224444
"updated": 1610614224444,
"translations": [
{
"language": "IT",
"text": "Ovviamente i fan della Apple devono sostituire Ctrl con Cmd",
"updated": 1614788677478
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "mouse-right-click"
},
"text": "Ok, you're not actually going to be teleporting, nor will you bend spacetime, but it almost feels like it! It's time to learn to use the design space map."
"text": "Ok, you're not actually going to be teleporting, nor will you bend spacetime, but it almost feels like it! It's time to learn to use the design space map.",
"translations": [
{
"language": "IT",
"text": "Okay, non ti teletrasporterai davvero nè piegherai lo spazio-tempo, ma la sensazione sarà la stessa! È il momento di utilizzare la mappa del Design Space.",
"updated": 1614789351031
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "I said earlier that the design space is huge, and I meant it! Going from one corner to the opposite would take hundreds of clicks and drags. While using the keyboard allows you to develop neck-breaking speeds, it's not as cool as teleporting! This is how it works:"
"text": "I said earlier that the design space is huge, and I meant it! Going from one corner to the opposite would take hundreds of clicks and drags. While using the keyboard allows you to develop neck-breaking speeds, it's not as cool as teleporting! This is how it works:",
"translations": [
{
"language": "IT",
"text": "Come detto prima, il Design Space è veramente grande: andare da un angolo all'altro richiederebbe centinaia di click. Usare la tastiera ti permette di spostarti a grandi velocità, ma non è forte come teletrasportarsi! Ora ti spiego come si fa:",
"updated": 1614789460112
}
]
},
{
"style": "Callout",
"text": "Right-click to open the map and left-click anywhere to go to that specific spot!",
"updated": 1611076477382
"updated": 1611076477382,
"translations": [
{
"language": "IT",
"text": "Fai click con il tasto destro del mouse per aprire la mappa e clicca un punto qualsiasi con il tasto sinistro per raggiungerlo!",
"updated": 1614788954113
}
]
},
{
"style": "Text",
"text": "Look at me on the bottom-left corner of the design space? Now you know where to find me!"
"text": "Look at me on the bottom-left corner of the design space? Now you know where to find me!",
"translations": [
{
"language": "IT",
"text": "Mi vedi nell'angolo in basso a sinistra del Design Space? Ora sai dove trovarmi!",
"updated": 1614789481521
}
]
}
]
}
@@ -7,18 +7,39 @@
"project": "Superalgos",
"name": "mouse-wheel-down"
},
"text": "There's one more tool that you may find useful to manipulate spacetime! The native browser zoom function!"
"text": "There's one more tool that you may find useful to manipulate spacetime! The native browser zoom function!",
"translations": [
{
"language": "IT",
"text": "C'è ancora uno strumento utile per manipolare lo spazio-tempo: la funzione zoom del tuo browser!",
"updated": 1614789109029
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Sometimes you may wish to visualize larger sections of the Design Space than your screen allows.",
"updated": 1611314074367
"updated": 1611314074367,
"translations": [
{
"language": "IT",
"text": "A volte potresti voler visualizzare porzioni del Design Space più ampie di quanto permesso dal tuo schermo.",
"updated": 1614789154147
}
]
},
{
"style": "Callout",
"text": "Hit Ctrl and scroll the mouse wheel on Windows or <kbd>⌘</kbd> and <kbd>-</kbd> or <kbd>+</kbd> in Mac.",
"updated": 1611314352825
"updated": 1611314352825,
"translations": [
{
"language": "IT",
"text": "Clicca Ctrl e scorri con la rotella del mouse su Windows o usa ⌘ e - oppure + su Mac.",
"updated": 1614789231899
}
]
},
{
"style": "Text",
@@ -27,7 +48,14 @@
{
"style": "Success",
"text": "Chrome indicates the level of zoom on the top-right corner. When zooming in or out, the design space gets centered on the screen. Use the design space map to go back where you were.",
"updated": 1611314381796
"updated": 1611314381796,
"translations": [
{
"language": "IT",
"text": "Chrome ti mostra il livello di zoom nell'angolo in alto a destra. Quando zoommi, il Design Space viene centrato sullo schermo. Usa la mappa per tornare dove eri prima.",
"updated": 1614789306337
}
]
}
]
}
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "tutorial"
},
"text": "Before we get back to business, let me tell you a few things about how we&mdash;tutorials&mdash;work."
"text": "Before we get back to business, let me tell you a few things about how we&mdash;tutorials&mdash;work.",
"translations": [
{
"language": "IT",
"text": "Prima di tornare al lavoro, lascia che ti spieghi un paio di cose su come funzioniamo noi tutorial.",
"updated": 1614790205512
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "This is likely the most important bit: you are the boss! You may stop a tutorial and skip steps—or entire topics—at any point. Once you're ready to pick up the lesson again, find us on the bottom-left corner of the design space. Select Resume on the menu to start where you left, or on the first step skipped. Select Play to start from the beginning!",
"updated": 1611076579955
"updated": 1611076579955,
"translations": [
{
"language": "IT",
"text": "Questo è il concetto più importante: sei tu il boss! Puoi stoppare un tutorial e saltare step o interi capitoli in qualsiasi momento. Una volta che sei pronto a riprendere, ci trovi nell'angolo in basso a sinistra del Design Space. Seleziona Resume nel menu per riprendere da dove ti sei fermato, o dal primo step saltato. Oppure seleziona Play per ricominciare da capo!",
"updated": 1614789696848
}
]
},
{
"style": "Callout",
"text": "Let's try that! Click the Stop button below, and once I'm gone, open my menu and select Resume."
"text": "Let's try that! Click the Stop button below, and once I'm gone, open my menu and select Resume.",
"translations": [
{
"language": "IT",
"text": "Provaci! Premi il pulsante Stop qui sotto, e una volta che sono sparito apri il mio menu e seleziona Resume.",
"updated": 1614790103478
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "key-left"
},
"text": "At this point, I'm probably overflowing your hippocampus! But don't worry... you may go back to any previous step!"
"text": "At this point, I'm probably overflowing your hippocampus! But don't worry... you may go back to any previous step!",
"translations": [
{
"language": "IT",
"text": "Tutte queste informazioni ti avranno sovraccaricato l'ippocampo! Ma non preccuparti, puoi tornare indietro a qualunque step precedente.",
"updated": 1614790380193
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "If you ever need a reminder about any of these topics..."
"text": "If you ever need a reminder about any of these topics...",
"translations": [
{
"language": "IT",
"text": "Se mai ti servirà un ripasso su uno di quesi topic...",
"updated": 1614790424338
}
]
},
{
"style": "List",
"text": "Find a Tutorial Topic and replay it! You may find me on the bottom-left corner of the design space, expand me, browse through the hierarchy of topics and steps, and click Play on any of them. Topics are arranged in a clockwise direction, starting from the right-hand side of the main Tutorial node."
"text": "Find a Tutorial Topic and replay it! You may find me on the bottom-left corner of the design space, expand me, browse through the hierarchy of topics and steps, and click Play on any of them. Topics are arranged in a clockwise direction, starting from the right-hand side of the main Tutorial node.",
"translations": [
{
"language": "IT",
"text": "Cerca un Tutorial Topic e ri-eseguilo! Puoi trovarmi nell'angolo in basso a sinistra del Design Space. Espandimi, naviga nella gerarchia dei topics e degli steps e clicca Play su uno qualsiasi di questi. I topics sono strutturati in senso orario, a partire dal lato destro del nodo Tutorial principale.",
"updated": 1614790602319
}
]
},
{
"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
"updated": 1611076850328,
"translations": [
{
"language": "IT",
"text": "Hai bisogno di un ripasso veloce? Trova lo step sotto il topic Tutorial & Help. Poi clicca Stop, e ricomincia cliccando Play su quel Tutorial Step!",
"updated": 1614790783510
}
]
}
]
}
@@ -7,34 +7,83 @@
"project": "Superalgos",
"name": "help"
},
"text": "I won't go into every detail as we move along, but if you need more info on a node, the help button on the menu takes you straight to its documentation."
"text": "I won't go into every detail as we move along, but if you need more info on a node, the help button on the menu takes you straight to its documentation.",
"translations": [
{
"language": "IT",
"text": "Non mi addentrerò in ogni dettaglio mentre proseguiamo, ma se hai bisogno di più info su un nodo il pulsante di help sul menu ti porta direttamente alla relativa documentazione.",
"updated": 1614790878931
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The documentation of a node may include one or more of the following sections:"
"text": "The documentation of a node may include one or more of the following sections:",
"translations": [
{
"language": "IT",
"text": "La documentazione di un nodo può includere una o più delle seguenti sezioni:",
"updated": 1614790910243
}
]
},
{
"style": "List",
"text": "Definition: describes what the node is or does."
"text": "Definition: describes what the node is or does.",
"translations": [
{
"language": "IT",
"text": "<b>Definizione</b>: descrive il nodo o la sua funzione",
"updated": 1614790956373
}
]
},
{
"style": "List",
"text": "Content: describes how the node works."
"text": "Content: describes how the node works.",
"translations": [
{
"language": "IT",
"text": "<b>Contenuto:</b> descrive come funziona il nodo",
"updated": 1614791022017
}
]
},
{
"style": "List",
"text": "Configuration: some node may have one.",
"updated": 1610614516774
"updated": 1610614516774,
"translations": [
{
"language": "IT",
"text": "<b>Configurazione:</b> alcuni nodi ne hanno una",
"updated": 1614791040416
}
]
},
{
"style": "List",
"text": "Technical: the rest of the infor is usually of a technical nature, oriented to developers.",
"updated": 1610614574015
"updated": 1610614574015,
"translations": [
{
"language": "IT",
"text": "<b>Info tecniche:</b> il resto delle informazioni sono solitamente di natura tecnica, principalmente per gli sviluppatori.",
"updated": 1614791106174
}
]
},
{
"style": "Callout",
"text": "Click the help button on the Data Tasks node!"
"text": "Click the help button on the Data Tasks node!",
"translations": [
{
"language": "IT",
"text": "Clicca il pulsante di help sul nodo Data Tasks!",
"updated": 1614791129195
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "workspace"
},
"text": "If you ever break something&mdash;like deleting a node or changing a configuration&mdash;and don't know how to deal with the outcome..."
"text": "If you ever break something&mdash;like deleting a node or changing a configuration&mdash;and don't know how to deal with the outcome...",
"translations": [
{
"language": "IT",
"text": "Se ti capiterà mai di rompere qualcosa (per esempio cancellare un nodo o cambiare una configurazione) e non sai come sistemare...",
"updated": 1614791180230
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "... there is an easy way to start over with a brand new workspace!"
"text": "... there is an easy way to start over with a brand new workspace!",
"translations": [
{
"language": "IT",
"text": "...c'è un modo semplice di ricominciare con un nuovo workspace!",
"updated": 1614791206441
}
]
},
{
"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 and click on the Getting-Started plugin workspace.",
"translations": [
{
"language": "IT",
"text": "Tutto ciò che devi fare è tirare la tab sul lato sinistro dello schermo e cliccare sul plugin workspace Getting-Started.",
"updated": 1614791245119
}
]
},
{
"style": "Success",
"text": "A brand new Getting Started workspace will load and I will show up again, fresh from the start!"
"text": "A brand new Getting Started workspace will load and I will show up again, fresh from the start!",
"translations": [
{
"language": "IT",
"text": "Un workspace Getting-Started nuovo e pulito verrà caricato e lanciato dall'inizio!",
"updated": 1614791287049
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "workspace"
},
"text": "Yes! Some of them are plugins shipping with the system and some are your own!"
"text": "Yes! Some of them are plugins shipping with the system and some are your own!",
"translations": [
{
"language": "IT",
"text": "Oh sì! Alcuni di quelli sono plugin nativi del sistema, e altri sono i tuoi!",
"updated": 1614791394697
}
]
},
"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
"updated": 1610614718976,
"translations": [
{
"language": "IT",
"text": "Mentre usi il sistema, il workspace viene salvato automaticamente ogni minuto. Viene salvato anche quando chiudi il browser o la tab, e puoi salvarlo manualmente usando Ctrl + Shift + Key-S",
"updated": 1614791481642
}
]
},
{
"style": "Callout",
"text": "When a plugin workspace is modified in any way, a copy is stored in your My-Workspaces folder."
"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": "Important",
"text": "Plugin files may not be modified from within the system!"
"text": "Plugin files may not be modified from within the system!",
"translations": [
{
"language": "IT",
"text": "I file plugin non devono essere modificati in altro modo!",
"updated": 1614791561359
}
]
}
]
}
@@ -7,24 +7,59 @@
"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 hierarchy.",
"translations": [
{
"language": "IT",
"text": "Ora che sei più a tuo agio nel muoverti, ti suggerirei un piccolo tour di esplorazione della sezione Data Tasks della gerarchia.",
"updated": 1614791644655
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Notice the following:"
"text": "Notice the following:",
"translations": [
{
"language": "IT",
"text": "Puoi notare che:",
"updated": 1614791668620
}
]
},
{
"style": "List",
"text": "The section is organized&mdash;first and foremost&mdash;by project, exchange, and market. This will help you work with multiple exchanges and multiple markets in an orderly fashion."
"text": "The section is organized&mdash;first and foremost&mdash;by project, exchange, and market. This will help you work with multiple exchanges and multiple markets in an orderly fashion.",
"translations": [
{
"language": "IT",
"text": "La sezione è organizzata innanzitutto per progetto, exchange e market. Questa struttura ti aiuta a lavorare con exchange multipli e markets multipli in modo ordinato.",
"updated": 1614791724096
}
]
},
{
"style": "List",
"text": "The Exchange Data Tasks and Market Data Tasks nodes may control all tasks in the exchange and market respectively."
"text": "The Exchange Data Tasks and Market Data Tasks nodes may control all tasks in the exchange and market respectively.",
"translations": [
{
"language": "IT",
"text": "I nodi Exchange Data Tasks e Market Data Tasks controllano tutte le tasks rispettivamente in un exchange e in un market.",
"updated": 1614791806588
}
]
},
{
"style": "Callout",
"text": "Go out and check those nodes and their menus!"
"text": "Go out and check those nodes and their menus!",
"translations": [
{
"language": "IT",
"text": "Dai un'occhiata a quei nodi e ai loro menu!",
"updated": 1614791842750
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "data-mine-tasks"
},
"text": "Within each market, the operation is organized by Data Mine. Superalgos ships with several open-source data mines, each with multiple indicators."
"text": "Within each market, the operation is organized by Data Mine. Superalgos ships with several open-source data mines, each with multiple indicators.",
"translations": [
{
"language": "IT",
"text": "All'interno di ogni market i processi sono organizzati dal Data Mine. Superalgos è equipaggiato con alcuni data mines open-source, ognuno dei quali ha diversi indicatori.",
"updated": 1614845425485
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Think of data mines as plugins that developers may create to extend the data analysis capacity of the system. An Indicator Bot may process data other indicators produce, hence adding value and producing deeper and richer analysis."
"text": "Think of data mines as plugins that developers may create to extend the data analysis capacity of the system. An Indicator Bot may process data other indicators produce, hence adding value and producing deeper and richer analysis.",
"translations": [
{
"language": "IT",
"text": "Puoi vedere i data mines come plugins che gli sviluppatori possono creare per ampliare la capacità di analisi del sistema. Un Indicator Bot può processare dati che altri indicatori producono, producendo così analisi più ricche e approfondite.",
"updated": 1614845409717
}
]
},
{
"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!",
"translations": [
{
"language": "IT",
"text": "Se hai una conoscenza base di JavaScript, puoi creare indicatori anche tu!",
"updated": 1614845457577
}
]
},
{
"style": "Text",
"text": "But I'm getting ahead of myself talking about building data mines at this point! Let's get back on track!"
"text": "But I'm getting ahead of myself talking about building data mines at this point! Let's get back on track!",
"translations": [
{
"language": "IT",
"text": "Ma sto correndo troppo parlando di costruire data mines a questo punto! Torniamo dove eravamo rimasti!",
"updated": 1614845542277
}
]
}
]
}
@@ -7,22 +7,50 @@
"project": "Superalgos",
"name": "task"
},
"text": "The core of a data mining operation are tasks running bots. One Task controls one bot, and a Task Manager may control multiple tasks."
"text": "The core of a data mining operation are tasks running bots. One Task controls one bot, and a Task Manager may control multiple tasks.",
"translations": [
{
"language": "IT",
"text": "Il cuore di un'operazione di data mining è composto da tasks che eseguono vari bots. Una Task controlla un bot, e un Task Manager controlla varie tasks.",
"updated": 1614845644365
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "By now you've learned about six different devices that you may use to control each bot in your data mining operation. At the highest level, the Data Tasks node controls all data mining bots in the Network Node.",
"updated": 1610614923203
"updated": 1610614923203,
"translations": [
{
"language": "IT",
"text": "Finora hai imparato di sei differenti strumenti che puoi usare per controllare i bot nella tua operazione di data mining. A un livello superiore, il nodo Data Tasks controlla tutti i data mining bots nel Network Node.",
"updated": 1614845713171
}
]
},
{
"style": "Callout",
"text": "We'll talk about network nodes in a minute..."
"text": "We'll talk about network nodes in a minute...",
"translations": [
{
"language": "IT",
"text": "Parleremo dei network nodes tra un attimo...",
"updated": 1614845732408
}
]
},
{
"style": "Text",
"text": "At the lowest level, an individual Task controls a single bot. The nodes in between are organizational nodes that help keep the operation in order, and allow granular control over the different sections.",
"updated": 1610614976513
"updated": 1610614976513,
"translations": [
{
"language": "IT",
"text": "Al livello più basso, una singola Task controlla un singolo bot. I nodi nel mezzo hanno scopo organizzativo e aiutano a mantenere un ordine tra le operazioni, permettendo un controllo granulare sulle differenti fasi.",
"updated": 1614845793674
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "indicator-process-instance"
},
"text": "By now, all processes should be at 100%. When that happens, we refer to the data mining operation as being up to date."
"text": "By now, all processes should be at 100%. When that happens, we refer to the data mining operation as being up to date.",
"translations": [
{
"language": "IT",
"text": "Ormai tutti i processi dovrebbero essere al 100%. Quando ciò accade, diciamo che l`operazione di data mining è up to date.",
"updated": 1614845999951
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "When all processes are up to date, the bots keep running, processing information in realtime as it is produced at the exchange. That is, the data mining operation doesn't stop unless you stop it!"
"text": "When all processes are up to date, the bots keep running, processing information in realtime as it is produced at the exchange. That is, the data mining operation doesn't stop unless you stop it!",
"translations": [
{
"language": "IT",
"text": "Quando i processi sono up to date, i bots continuano a lavorare e processare dati in tempo reale man mano che sono prodotti dall'exchange. Quindi l'operazione di mining non si ferma a meno che non la stoppi tu!",
"updated": 1614845991321
}
]
},
{
"style": "Callout",
"text": "Look around and see if all processes are at 100%"
"text": "Look around and see if all processes are at 100%",
"translations": [
{
"language": "IT",
"text": "Controlla se tutti i processi sono al 100%",
"updated": 1614846041698
}
]
},
{
"style": "Text",
"text": "To run a Live Trading Session, you need a constant feed of information from the exchange, being processed in realtime, so that the Trading Bot may apply the rules of your Trading System to make live trading decisions."
"text": "To run a Live Trading Session, you need a constant feed of information from the exchange, being processed in realtime, so that the Trading Bot may apply the rules of your Trading System to make live trading decisions.",
"translations": [
{
"language": "IT",
"text": "Per una Live Trading Session hai bisogno di un feed costante di dati dall'exchange che vengono processae in tempo realte, cosicchè il Trading Bot possa applicare le regole del tuo Trading System per prendere decisioni.",
"updated": 1614846102542
}
]
}
]
}
@@ -7,27 +7,62 @@
"project": "Superalgos",
"name": "stop"
},
"text": "We are not going to run a Live Trading Session just yet, so there is no point in keeping our data mining running at this point."
"text": "We are not going to run a Live Trading Session just yet, so there is no point in keeping our data mining running at this point.",
"translations": [
{
"language": "IT",
"text": "Non ci lanceremo subito in una Live Trading Session, quindi non c'è motivo di mantenere attivo il data mining.",
"updated": 1614846160007
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "There are two main reasons to run Data Tasks:",
"updated": 1610616990837
"updated": 1610616990837,
"translations": [
{
"language": "IT",
"text": "Ci sono due motivi principali per eseguire Data Tasks:",
"updated": 1614846176409
}
]
},
{
"style": "List",
"text": "To process historic data: You may want to process a datetime range of any given Market to run a Backtesting Session, or to process new indicators.",
"updated": 1610617009486
"updated": 1610617009486,
"translations": [
{
"language": "IT",
"text": "<b>Per processare dati storici:</b> potresti voler elaborare un intervallo di tempo di un Market per una Backtesting Session, o per generare nuovi indicatori.",
"updated": 1614846254449
}
]
},
{
"style": "List",
"text": "To run a live session: Live sessions of different types, like Paper Trading Session, Forward Testing Session, and Live Trading Session, all need a live market feed.",
"updated": 1610619757862
"updated": 1610619757862,
"translations": [
{
"language": "IT",
"text": "<b>Per eseguire una live session:</b> live session di tipo diverso, come Paper Trading Session, Forward Testing Session e Live Trading Session, hanno tutte bisogno di un market feed live.",
"updated": 1614846320422
}
]
},
{
"style": "Callout",
"text": "If all processes are up to date, then select Stop All Tasks in the Masters Task Manager"
"text": "If all processes are up to date, then select Stop All Tasks in the Masters Task Manager",
"translations": [
{
"language": "IT",
"text": "Se tutti i processi sono up to date, seleziona Stop All Tasks nel Task Manager.",
"updated": 1614846354737
}
]
}
]
}
@@ -7,16 +7,37 @@
"project": "Superalgos",
"name": "dataset-definition"
},
"text": "It may take up to one minute for all tasks to come to a halt. You should never close the system before all tasks stop."
"text": "It may take up to one minute for all tasks to come to a halt. You should never close the system before all tasks stop.",
"translations": [
{
"language": "IT",
"text": "Può volerci fino a un minuto perchè tutte le tasks si fermino. Il sistema non deve assolutamente essere chiuso prima che ciò accada.",
"updated": 1614846504651
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Take another quick look at the console app to see how tasks get stopped!"
"text": "Take another quick look at the console app to see how tasks get stopped!",
"translations": [
{
"language": "IT",
"text": "Dai un'occhiata alla console app per vedere come le tasks ricevono il segnale di stop!",
"updated": 1614846474138
}
]
},
{
"style": "Warning",
"text": "Closing the Client before tasks stop may cause your data to become corrupt."
"text": "Closing the Client before tasks stop may cause your data to become corrupt.",
"translations": [
{
"language": "IT",
"text": "Chiudere il Client prima che le tasks si fermino può corromperne i dati.",
"updated": 1614846530784
}
]
}
]
}
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "charting-space"
},
"text": "So far, you've been confined to the dark side of Superalgos. Get ready to be exposed to the bright side: the Charting Space."
"text": "So far, you've been confined to the dark side of Superalgos. Get ready to be exposed to the bright side: the Charting Space.",
"translations": [
{
"language": "IT",
"text": "Finora sei rimasto confinato nel lato oscuro di Superalgos. Preparati a incontrare il lato chiaro: il Charting Space.",
"updated": 1614846601940
}
]
},
"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 hierarchy.",
"updated": 1610538092491
"updated": 1610538092491,
"translations": [
{
"language": "IT",
"text": "Il Charting Space si trova al di sopra del Design Space, separato da uno slider turchese. Come imparerai ad aspettarti da Superalgos, il Charting Space è configurabile e molto flessibile. Tutto ciò che accade al suo interno è definito nella gerarchia del Charting Space.",
"updated": 1614846709741
}
]
},
{
"style": "Warning",
"text": "The charting space is known for blowing people's minds. Please, refrain from continuing with this tutorial if you are currently under the influence of psychoactive substances."
"text": "The charting space is known for blowing people's minds. Please, refrain from continuing with this tutorial if you are currently under the influence of psychoactive substances.",
"translations": [
{
"language": "IT",
"text": "Il Charting Space può sbalordire al punto da far girare la testa. Non proseguire questo tutorial se sei sotto l'effetto di sostanze psicoattive.",
"updated": 1614846855335
}
]
}
]
}
@@ -7,16 +7,37 @@
"project": "Superalgos",
"name": "full-board"
},
"text": "I'll get you up to speed with moving around and browsing the charting space in no time... Let's deal with the slider first!"
"text": "I'll get you up to speed with moving around and browsing the charting space in no time... Let's deal with the slider first!",
"translations": [
{
"language": "IT",
"text": "Ti insegnerò a muoverti e navigare nel Charting Space in un attimo...occupiamoci prima dello slider!",
"updated": 1614846929188
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "Click it and drag it down to close the design space and open the charting space. Do the opposite for the reversed effect. To do it with the keyboard, hit Ctrl + Shift + ↓. Try ↑ ← → too!"
"text": "Click it and drag it down to close the design space and open the charting space. Do the opposite for the reversed effect. To do it with the keyboard, hit Ctrl + Shift + ↓. Try ↑ ← → too!",
"translations": [
{
"language": "IT",
"text": "Clicca lo slider e trascinalo verso il basso per chiudere il design space e aprire lo charting space. Trascinalo verso l'alto per ottenere il risultato opposto. Per farlo con la tastiera, usa Ctrl + Shift + ↓. Prova anche con ↑ ← → !",
"updated": 1614847060275
}
]
},
{
"style": "Note",
"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."
"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": [
{
"language": "IT",
"text": "A meno che tu non abbia bisogno di tenere parzialmente aperti entrambi gli spazi, è sempre una buona idea chiudere del tutto uno dei due per non consumare troppe risorse sul tuo computer.",
"updated": 1614847125222
}
]
}
]
}
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "mouse-right-click"
},
"text": "Just like the design space, the charting space features a huge area where you may set up charts... as many as your hardware can cope with!"
"text": "Just like the design space, the charting space features a huge area where you may set up charts... as many as your hardware can cope with!",
"translations": [
{
"language": "IT",
"text": "Proprio come il Design Space, il Charting Space ha un'enorme area dove puoi inserire grafici...tanti quanti il tuo hardware ne riesce a gestire!",
"updated": 1614847190845
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "There are only two charts in this Getting Started Workspace, to keep things simple for newcomers. Advanced users monitor charts from multiple exchanges and multiple markets.",
"updated": 1610619913827
"updated": 1610619913827,
"translations": [
{
"language": "IT",
"text": "Ci sono solo due charts in questo Workspace Getting Started, per mantenere le cose semplici per i novellini. Utenti avanzati confrontano diversi grafici di diversi exchanges e diversi market.",
"updated": 1614847284524
}
]
},
{
"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 charting space, click and drag using your mouse. <br/><br/>The keyboard combination is Shift plus the arrow keys ↑ ← → ↓",
"translations": [
{
"language": "IT",
"text": "Per muoverti nel Charting Space, clicca e trascina usando il tuo mouse. La combinazione di tasti è Shift più i tasti freccia ↑ ← → ↓",
"updated": 1614847340001
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "time-machine"
},
"text": "I mentioned earlier there are two charts in this workspace. In Superalgos, we call each of these a Time Machine."
"text": "I mentioned earlier there are two charts in this workspace. In Superalgos, we call each of these a Time Machine.",
"translations": [
{
"language": "IT",
"text": "Poco fa ho detto che ci sono due grafici in questo workspace. In Superalgos, chiamiamo ognuno di questi grafici una Time Machine.",
"updated": 1614847393489
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "A time machine may hold one Timeline Chart or more. We call them time machines because all timeline charts within a time machine are synchronized in time. This feature of time machines allows to superimpose different layers of data sharing the same Time Scale."
"text": "A time machine may hold one Timeline Chart or more. We call them time machines because all timeline charts within a time machine are synchronized in time. This feature of time machines allows to superimpose different layers of data sharing the same Time Scale.",
"translations": [
{
"language": "IT",
"text": "Una Time Machine può contenere una o più Timeline Chart. Le chiamiamo così perchè tutti i Timeline Chart in una Time Machine sono sincronizzati nel tempo. Ciò permette di sovrapporre differenti livelli di dati che usano la stessa Time Scale.",
"updated": 1614847651838
}
]
},
{
"style": "Callout",
"text": "Hover your mouse pointer over the time machines!"
"text": "Hover your mouse pointer over the time machines!",
"translations": [
{
"language": "IT",
"text": "Sposta il puntatore del mouse sopra le Time Machine!",
"updated": 1614847549742
}
]
},
{
"style": "Text",
"text": "Notice the label emerging on the left-hand side showing which exchanges and markets the data is associated with. A single time machine may hold data from multiple markets and multiple exchanges!",
"updated": 1610622145377
"updated": 1610622145377,
"translations": [
{
"language": "IT",
"text": "Le label che spuntano da sinistra mostrano a quale exchange e market si riferiscono i dati. Una singola Time Machine può contenere dati da diversi markets e exchanges!",
"updated": 1614847670664
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "time-machine"
},
"text": "Ok... maybe it's not actually like bending, but, bear with me... You'll love how you can shape time machines to whatever format you wish."
"text": "Ok... maybe it's not actually like bending, but, bear with me... You'll love how you can shape time machines to whatever format you wish.",
"translations": [
{
"language": "IT",
"text": "Ok...forse non è proprio come controllare il tempo, ma facciamo finta... Adorerai come puoi configurare le Time Machine in qualsiasi modo tu desideri.",
"updated": 1614847760593
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Hover your mouse pointer over any of the edges of the turquoise frame defining the time machine and see what happens. See how the edge is highlighted in yellow?"
"text": "Hover your mouse pointer over any of the edges of the turquoise frame defining the time machine and see what happens. See how the edge is highlighted in yellow?",
"translations": [
{
"language": "IT",
"text": "Sposta il puntatore su uno qualsiasi dei lati della cornice turchese che definisce la Time Machine, e osserva cosa succede. Vedi come il lato si evidenzia in giallo?",
"updated": 1614847838157
}
]
},
{
"style": "Callout",
"text": "Cool! Now, left-click the frame and pull!"
"text": "Cool! Now, left-click the frame and pull!",
"translations": [
{
"language": "IT",
"text": "Forte! Ora cliccalo con il tasto sinistro e tira!",
"updated": 1614847870184
}
]
},
{
"style": "Note",
"text": "This is how you may shape time machines to your liking."
"text": "This is how you may shape time machines to your liking.",
"translations": [
{
"language": "IT",
"text": "In questo modo puoi dare alle tue time machines la forma e aspetto che preferisci.",
"updated": 1614847900032
}
]
}
]
}
@@ -7,22 +7,50 @@
"project": "Superalgos",
"name": "time-machine"
},
"text": "How about shaping the time machine to the exact aspect ratio of your screen?"
"text": "How about shaping the time machine to the exact aspect ratio of your screen?",
"translations": [
{
"language": "IT",
"text": "Che ne dici di adattare perfettamente la Time Machine al formato del tuo schermo?",
"updated": 1614848136114
}
]
},
"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!",
"translations": [
{
"language": "IT",
"text": "Dare alle tue time machines lo stesso aspect ratio del tuo schermo è importante perchè si adattino perfettamente ad esso.",
"updated": 1614848156397
}
]
},
{
"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
"updated": 1610134929741,
"translations": [
{
"language": "IT",
"text": "Sposta il mouse su una delle time machines e premi Ctrl + Shift + Key-A. Fai lo stesso con l'altra.",
"updated": 1614848104941
}
]
},
{
"style": "Success",
"text": "Leave the two time machines matching the aspect ratio of your screen. from now on!",
"updated": 1610622263656
"updated": 1610622263656,
"translations": [
{
"language": "IT",
"text": "D'ora in poi, lascia le due time machines con lo stesso aspect ratio del tuo schermo!",
"updated": 1614848186502
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "hand-drag"
},
"text": "One more thing before we dive into the charts. You need to know how to put the house in order!"
"text": "One more thing before we dive into the charts. You need to know how to put the house in order!",
"translations": [
{
"language": "IT",
"text": "Un'ultima cosa prima di tuffarci nei grafici. Devi sapere come tenere il tuo regno in ordine!",
"updated": 1614848223577
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The time will come in which you may be working with tens of charts. You already know how to change their format... Now you need to know how to move them around, so that you may create whatever arrangements you require. It's quite easy:"
"text": "The time will come in which you may be working with tens of charts. You already know how to change their format... Now you need to know how to move them around, so that you may create whatever arrangements you require. It's quite easy:",
"translations": [
{
"language": "IT",
"text": "Arriverà il momento in cui potresti dover lavorare con decine di grafici contemporaneamente. Sai già come modificare il loro formato, ma devi sapere come spostarli in modo da configurarli esattamente come vuoi tu. Tranquillo, è facile:",
"updated": 1614848290495
}
]
},
{
"style": "Callout",
"text": "Hit Shift, left-click, and drag!",
"updated": 1610622311803
"updated": 1610622311803,
"translations": [
{
"language": "IT",
"text": "Premi Shift, clicca con il tasto sinistro e trascina!",
"updated": 1614848320456
}
]
},
{
"style": "Text",
"text": "I believe we've covered everything about how to manage the charting space. It's time to dive into the charts!"
"text": "I believe we've covered everything about how to manage the charting space. It's time to dive into the charts!",
"translations": [
{
"language": "IT",
"text": "Bene, direi che abbiamo coperto tutto ciò che serve per configurare il Charting Space. È ora di tuffarci tra i grafici!",
"updated": 1614848393942
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "mouse-wheel-up"
},
"text": "It's time to dive into a Time Machine and see what happens! Are you ready for a full-on immersive experience?"
"text": "It's time to dive into a Time Machine and see what happens! Are you ready for a full-on immersive experience?",
"translations": [
{
"language": "IT",
"text": "È il momento di tuffarci in una Time Machine e vedere che succede! Sei pronto per questa esperienza?",
"updated": 1614892693632
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "The charting space is like the Google Maps of market charts. As you already know, you left-click and drag to move around the landscape... but, how do you zoom in to see the details?"
"text": "The charting space is like the Google Maps of market charts. As you already know, you left-click and drag to move around the landscape... but, how do you zoom in to see the details?",
"translations": [
{
"language": "IT",
"text": "Il Charting Space è un po'come il Google Maps dei grafici di mercato. Come sai già, si clicca e si trascina per spostarsi al suo interno...ma come si zoomma per vedere i dettagli?",
"updated": 1614892771662
}
]
},
{
"style": "Callout",
"text": "With the wheel of the mouse! Try it!"
"text": "With the wheel of the mouse! Try it!",
"translations": [
{
"language": "IT",
"text": "Con la rotella del mouse! Provaci!",
"updated": 1614892781701
}
]
},
{
"style": "Text",
"text": "Exactly! Just like in Google Maps! Point the mouse to the area of interest, then roll the wheel of the mouse forwards to zoom in, and backwards to zoom out!",
"updated": 1610622413974
"updated": 1610622413974,
"translations": [
{
"language": "IT",
"text": "Esatto! Proprio come su Google Maps! Posiziona il mouse su un'area di interesse e gira la rotella in avanti per aumentare lo zoom, e all'indietro per diminuirlo!",
"updated": 1614892836540
}
]
}
]
}
@@ -7,21 +7,49 @@
"project": "Superalgos",
"name": "mouse-pointer"
},
"text": "I know! Zooming into a random spot is unlikely to position the chart squared with your screen, right? No worries..."
"text": "I know! Zooming into a random spot is unlikely to position the chart squared with your screen, right? No worries...",
"translations": [
{
"language": "IT",
"text": "Lo so, zoommare su un punto a caso difficilmente farà sì che il grafico si adatti al tuo schermo, vero? No problem...",
"updated": 1614893061080
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "I'll show you how to get into a chart so that everything fits nicely. First, use the Ctrl + Shift + Key-A keys to adjust the aspect ratio to fit your screen. Then, zoom out fully with your mouse. From this position...",
"updated": 1610134957920
"updated": 1610134957920,
"translations": [
{
"language": "IT",
"text": "Ti mostro come entrare in un grafico lasciando tutto in ordine. Usa Ctrl + Shift + Key-A per adattarlo all'aspect ratio del tuo schermo. Poi, zoomma all'indietro con il mouse. Da qui...",
"updated": 1614893079786
}
]
},
{
"style": "Callout",
"text": "Double-click on the time machine on top! Twice!"
"text": "Double-click on the time machine on top! Twice!",
"translations": [
{
"language": "IT",
"text": "Fai doppio click sulla Time Machine in cima! Due volte!",
"updated": 1614893194631
}
]
},
{
"style": "Text",
"text": "The first double-click centers the chart, and takes you to a certain level of zoom; some margin is left to fit the name of the chart and the tab on the top-left corner. The second double-click takes you all the way in, to the zoom level on which layer managers emerge."
"text": "The first double-click centers the chart, and takes you to a certain level of zoom; some margin is left to fit the name of the chart and the tab on the top-left corner. The second double-click takes you all the way in, to the zoom level on which layer managers emerge.",
"translations": [
{
"language": "IT",
"text": "Il primo doppio click centra il grafico e lo zoomma, lasciando un po' di margine per mostrare il nome e la tab in alto a sinistra. Il secondo doppio-click ti trasporta al suo interno, al livello di zoom dove emergono i layer managers.",
"updated": 1614893166373
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "mouse-left-click"
},
"text": "So, you are finally inside a chart. The first thing you'll want to do is move around and learn what these charts may do for you."
"text": "So, you are finally inside a chart. The first thing you'll want to do is move around and learn what these charts may do for you.",
"translations": [
{
"language": "IT",
"text": "Ecco, sei finalmente dentro un grafico. La prima cosa che vorrai fare sarà farci un giro e imparare cosa può fare per te.",
"updated": 1614893263479
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Let's get on with that! Like in the design space&mdash;when inside a time machine&mdash;you move by using your mouse and your keyboard. This is how:"
"text": "Let's get on with that! Like in the design space&mdash;when inside a time machine&mdash;you move by using your mouse and your keyboard. This is how:",
"translations": [
{
"language": "IT",
"text": "Facciamolo subito! Proprio come nel Design Space, puoi muoverti usando mouse e tastiera. Ecco come:",
"updated": 1614893324158
}
]
},
{
"style": "Callout",
"text": "With the mouse, left-click and drag. With the keyboard, use the arrow keys: ← → ↑ ↓"
"text": "With the mouse, left-click and drag. With the keyboard, use the arrow keys: ← → ↑ ↓",
"translations": [
{
"language": "IT",
"text": "Con il mouse, fai click con il tasto sinistro e trascina. Con la tastiera, usa le frecce: ← → ↑ ↓",
"updated": 1614893357947
}
]
},
{
"style": "Note",
"text": "What? It's not working? Are you stuck with a frozen chart? Like in the video on the next step? Don't worry! I know what's going on..."
"text": "What? It's not working? Are you stuck with a frozen chart? Like in the video on the next step? Don't worry! I know what's going on...",
"translations": [
{
"language": "IT",
"text": "Come? Non funziona? Il grafico resta fermo? Proprio come nel video nel prossimo step? Ah, non preoccuparti! Lo so io cosa sta succedendo...",
"updated": 1614893399468
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 41,
"type": "Tutorial Step - Welcome Charts Scales Auto Locked",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà un video in modalità schermo intero.",
"updated": 1614893428433
}
]
},
"paragraphs": [
{
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "time-scale"
},
"text": "The reason why you can't move is that scales are locked in the automatic mode so that you may easily find the data after your first data mining operation."
"text": "The reason why you can't move is that scales are locked in the automatic mode so that you may easily find the data after your first data mining operation.",
"translations": [
{
"language": "IT",
"text": "Il motivo per cui non ti puoi muovere è che le scale sono bloccate in modalità automatica, così puoi trovare facilmente i dati dopo la tua prima operazione di mining.",
"updated": 1614893522639
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Setting the Time Scale in automatic mode forces the whole datetime range of available data into the chart."
"text": "Setting the Time Scale in automatic mode forces the whole datetime range of available data into the chart.",
"translations": [
{
"language": "IT",
"text": "Settare la Time Scale in modalità automatica fa sì che i dati sull'intera scala temporale vengano mostrati insieme sul grafico.",
"updated": 1614893577134
}
]
},
{
"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."
"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.",
"translations": [
{
"language": "IT",
"text": "Per cambiare tra automatico e manuale, premi Shift e ruota una volta la rotella del mouse sopra a una time scale box.",
"updated": 1614893644877
}
]
},
{
"style": "Text",
"text": "Once you've taken care of that, you should be able to move freely on the X-axis, that is, the time axis of the chart. See the video on the next step for clarity."
"text": "Once you've taken care of that, you should be able to move freely on the X-axis, that is, the time axis of the chart. See the video on the next step for clarity.",
"translations": [
{
"language": "IT",
"text": "Fatto questo, dovresti essere libero di muoverti liberamente sull'asse X, quello del tempo. Guarda il prossimo video per maggiori dettagli.",
"updated": 1614893688199
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 43,
"type": "Tutorial Step - Welcome Charts Scales Unlock Time Scale",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà il video in modalità schermo intero.",
"updated": 1614893704588
}
]
},
"paragraphs": [
{
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "time-scale"
},
"text": "Did you pick up the trick to scale time from the previous video? If not, go to the previous step and watch attentively!"
"text": "Did you pick up the trick to scale time from the previous video? If not, go to the previous step and watch attentively!",
"translations": [
{
"language": "IT",
"text": "Sei riuscito a mettere in pratica il trucchetto nel video precedente? Se non ce l'hai fatta, torna all'ultimo step e guarda bene!",
"updated": 1614893781372
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "That's it! Scroll it, my friend!"
"text": "That's it! Scroll it, my friend!",
"translations": [
{
"language": "IT",
"text": "Esatto! Ruota quella rotella, amico!",
"updated": 1614893806439
}
]
},
{
"style": "Callout",
"text": "Scrolling the wheel of the mouse on top of the time scale box shrinks and expands time!"
"text": "Scrolling the wheel of the mouse on top of the time scale box shrinks and expands time!",
"translations": [
{
"language": "IT",
"text": "Ruotare la rotella del mouse su una time scale box espande e comprime il tempo!",
"updated": 1614893833795
}
]
},
{
"style": "Note",
"text": "There's one more interesting detail worth noting in the previous video: when the time scale exits the automatic mode, the two tiny green triangles indicating each end of the automatic scale disappear!"
"text": "There's one more interesting detail worth noting in the previous video: when the time scale exits the automatic mode, the two tiny green triangles indicating each end of the automatic scale disappear!",
"translations": [
{
"language": "IT",
"text": "C'è un dettaglio interessante nel video precedente: quando la time scale esce dalla modalità automatica, i due piccoli triangoli verdi che indicano gli estremi della scala automatica scompaiono!",
"updated": 1614893892461
}
]
}
]
}
@@ -7,20 +7,48 @@
"project": "Superalgos",
"name": "rate-scale"
},
"text": "Do I need to tell you how the Rate Scale works or can you figure it out on your own? Ok... I'll give you a hint..."
"text": "Do I need to tell you how the Rate Scale works or can you figure it out on your own? Ok... I'll give you a hint...",
"translations": [
{
"language": "IT",
"text": "Vuoi che ti spieghi come funziona il Rate Scale, o lo immagini già? Ok, ti darò un suggerimento...",
"updated": 1614893948589
}
]
},
"paragraphs": [
{
"style": "Callout",
"text": "The rate scale works like the time scale! Check the video coming next for clarity!"
"text": "The rate scale works like the time scale! Check the video coming next for clarity!",
"translations": [
{
"language": "IT",
"text": "Funziona esattamente come il Time Scale! Guarda il video al prossimo step per i dettagli.",
"updated": 1614893978290
}
]
},
{
"style": "Note",
"text": "There's one more scale to work with. I'll tell you all about it after the video."
"text": "There's one more scale to work with. I'll tell you all about it after the video.",
"translations": [
{
"language": "IT",
"text": "C'è ancora una scala con cui lavorare. Te ne parlerò meglio dopo il video.",
"updated": 1614893999920
}
]
},
{
"style": "Success",
"text": "Play with the semi-automatic scale modes too! You know, when a single tiny triangle remains visible after a few flicks of the mouse wheel."
"text": "Play with the semi-automatic scale modes too! You know, when a single tiny triangle remains visible after a few flicks of the mouse wheel.",
"translations": [
{
"language": "IT",
"text": "Prova anche la modalità semi-automatica per le differenti scale! Ruota la rotella del mouse finchè non vedi un singolo triangolino verde.",
"updated": 1614894098439
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 46,
"type": "Tutorial Step - Welcome Charts Scales Unlock Rate Scale",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà un video in modalità schermo intero.",
"updated": 1614894117992
}
]
},
"paragraphs": [
{
@@ -7,16 +7,37 @@
"project": "Superalgos",
"name": "time-frame-scale"
},
"text": "News-flash about the Time Frame Scale: there is no automatic mode!"
"text": "News-flash about the Time Frame Scale: there is no automatic mode!",
"translations": [
{
"language": "IT",
"text": "Notizia lampo sulla Time Frame Scale: non esiste una modalità automatica!",
"updated": 1614894147285
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "You may freely toggle through all available time frames! In descending order: 24, 8, 6, 4, 3, 2, and 1 hours, and 45, 40, 30, 20, 15, 10, 5, 4, 3, 2, and 1 minutes."
"text": "You may freely toggle through all available time frames! In descending order: 24, 8, 6, 4, 3, 2, and 1 hours, and 45, 40, 30, 20, 15, 10, 5, 4, 3, 2, and 1 minutes.",
"translations": [
{
"language": "IT",
"text": "Puoi scegliere liberamente tra tutti i time frame disponibili! In ordine decrescente: 24, 8, 6, 4, 3, 2, e 1 ore, e 45, 40, 30, 20, 15, 10, 5, 4, 3, 2, e 1 minuti.",
"updated": 1614894203571
}
]
},
{
"style": "Important",
"text": "Beware when you switch the time frame scale to lower time frames! Dropping time frames too fast and without adjusting the time scale may cause too much information to be rendered on-screen at a time, slowing down your computer. How much information density your hardware may handle depends on its CPU and GPU performance."
"text": "Beware when you switch the time frame scale to lower time frames! Dropping time frames too fast and without adjusting the time scale may cause too much information to be rendered on-screen at a time, slowing down your computer. How much information density your hardware may handle depends on its CPU and GPU performance.",
"translations": [
{
"language": "IT",
"text": "Fai attenzione quando selezioni time frame con intervalli di tempo più brevi! Scalare i time frame verso il basso troppo rapidamente può causare il rendering sullo schermo di troppi dati contemporanamente e ciò può rallentare il computer. I limiti a questo proposito dipendono dal tuo hardware.",
"updated": 1614894385185
}
]
}
]
}
@@ -3,7 +3,14 @@
"pageNumber": 48,
"type": "Tutorial Step - Welcome Charts Scales Time Frame Scale",
"definition": {
"text": "This step will play a video in full screen mode."
"text": "This step will play a video in full screen mode.",
"translations": [
{
"language": "IT",
"text": "Questo step eseguirà un video in modalità schermo intero.",
"updated": 1614894425390
}
]
},
"paragraphs": [
{
@@ -7,17 +7,38 @@
"project": "Superalgos",
"name": "balance"
},
"text": "You just learned the basics about the three scales governing the charts, but there's more!"
"text": "You just learned the basics about the three scales governing the charts, but there's more!",
"translations": [
{
"language": "IT",
"text": "Hai imparato le basi delle tre scale che governano i grafici, ma c'è di più!",
"updated": 1614894499111
}
]
},
"paragraphs": [
{
"style": "Text",
"text": "Remember I mentioned that a Time Machine may feature multiple charts from multiple exchanges and markets? There is no limit as to how you may visualize data in Superalgos, and scales play a major role in more complex configurations than the ones we are exploring at this point."
"text": "Remember I mentioned that a Time Machine may feature multiple charts from multiple exchanges and markets? There is no limit as to how you may visualize data in Superalgos, and scales play a major role in more complex configurations than the ones we are exploring at this point.",
"translations": [
{
"language": "IT",
"text": "Ricordi quando ti ho detto che una Time Machine può contenere più grafici provenienti da molteplici exchange e markets? Non c'è limite al numero di modi in cui puoi visualizzare i dati in Superalgos, e le scale giocano un ruolo chiave in configurazioni più complesse di quelle che abbiamo esplorato finora.",
"updated": 1614894601856
}
]
},
{
"style": "Callout",
"text": "If you wish to learn all the details, feel free to go through the Scales section of the documentation.",
"updated": 1610539789707
"updated": 1610539789707,
"translations": [
{
"language": "IT",
"text": "Se vuoi imparare tutti i dettagli, consulta la sezione Scales nella documentazione completa.",
"updated": 1614894588673
}
]
}
]
}
@@ -4,6 +4,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
const MODULE_NAME = "Historic OHLCVs";
const CANDLES_FOLDER_NAME = "Candles/One-Min";
const VOLUMES_FOLDER_NAME = "Volumes/One-Min";
const OHLCVS_FOLDER_NAME = "OHLCVs/One-Min";
thisObject = {
initialize: initialize,
@@ -16,6 +17,11 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
const MAX_OHLCVs_PER_EXECUTION = 10000000
const symbol = 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
const ccxt = require('ccxt')
/*
This next is required when using an exchange that uses fetchTrades in place of fetchOHLCVs
in order to be able to access the method that builds the OHLCVs, and this method is inside the CCTX library.
*/
const ccxtMisc = require('./node_modules/ccxt/js/base/functions/misc')
let fetchType = "by Time"
let lastId
@@ -30,10 +36,29 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
let rateLimit = 500
let exchange
let uiStartDate = new Date(TS.projects.superalgos.globals.taskConstants.TASK_NODE.bot.config.startDate)
let fisrtTimeThisProcessRun = false
let firstTimeThisProcessRun = false
let limit = 1000 // This is the default value
let hostname
let lastCandleOfTheDay
/*
The following variables are used for exchanges that do not provide any method in their API to retrieve OHLCV data.
In the CCTX library, such exchanges have the fetchOHLCV method as being "emulated", and as such, you can only
retrieve raw trade data using the fetchTrades method, and then you have to manually aggregate the received trades
into OHLCV data.
An example of such an exchange is Luno (codeName:luno).
To ensure that the code for other exchanges is not impacted, it is necessary to add into the desired exchange's
UI API settings, the two items shown below. It is also important to set the "rateLimit" in the API correctly to
match what the exchange is prepared to offer when fetching trades. Furthermore, the "limit" in the API also needs
to be set to a value that allows the UI to update at regular intervals (e.g. 200). Finally, do not forget to put
in the UI API settings the "method": "fetch_ohlcv", otherwise none of these other settings will work !
useFetchTradesForFetchOHLCVs - this must be set to true to indicate that the code will be using fetchTrades instead
of fetchOHLCVs (or similar exchange-specific method).
maxTradesPerFetch - this is set to a number that indicates the maximum number of trades the exchange will return in
the fetchTrades method (e.g. for the Luno exchange, this number is 100).
*/
let useFetchTradesForFetchOHLCVs = false
let maxTradesPerFetch = 100
return thisObject;
@@ -48,8 +73,8 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
/* Applying the parameters defined by the user at the Exchange Node Config */
if (TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.API !== undefined) {
/*
The config all ow us to define for the API different parameters for different
methods calls. At this point we are only interested of the parameters for the
The config allows us to define for the API different parameters for different
methods calls. At this point we are only interested in the parameters for the
fetch_ohlcv method, so we ignore the rest.
*/
for (let i = 0; i < TS.projects.superalgos.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.API.length; i++) {
@@ -78,6 +103,12 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
if (API.limit !== undefined) {
limit = API.limit
}
if (API.useFetchTradesForFetchOHLCVs !== undefined) {
useFetchTradesForFetchOHLCVs = API.useFetchTradesForFetchOHLCVs
if (API.maxTradesPerFetch !== undefined) {
maxTradesPerFetch = API.maxTradesPerFetch
}
}
}
}
}
@@ -129,6 +160,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
data from the exchange.
*/
let rawDataArray = []
let mustLoadRawData = false
if (TS.projects.superalgos.globals.taskVariables.IS_TASK_STOPPING === true) {
callBackFunction(TS.projects.superalgos.globals.standardResponses.DEFAULT_OK_RESPONSE);
@@ -155,7 +187,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
function getContextVariables() {
try {
let reportKey;
let reportKey
reportKey = "Masters" + "-" + "Exchange-Raw-Data" + "-" + "Historic-OHLCVs"
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
@@ -170,13 +202,13 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
thisReport = statusDependencies.statusReports.get(reportKey)
if (thisReport.file.beginingOfMarket !== undefined) { // This means this is not the first time this process run.
if (thisReport.file.beginingOfMarket !== undefined) { // This means this is not the first time this process has run.
beginingOfMarket = new Date(thisReport.file.beginingOfMarket.year + "-" + thisReport.file.beginingOfMarket.month + "-" + thisReport.file.beginingOfMarket.days + " " + thisReport.file.beginingOfMarket.hours + ":" + thisReport.file.beginingOfMarket.minutes + TS.projects.superalgos.globals.timeConstants.GMT_SECONDS);
lastFile = new Date(thisReport.file.lastFile.year + "-" + thisReport.file.lastFile.month + "-" + thisReport.file.lastFile.days + " " + thisReport.file.lastFile.hours + ":" + thisReport.file.lastFile.minutes + TS.projects.superalgos.globals.timeConstants.GMT_SECONDS);
lastId = thisReport.file.lastId
lastCandleOfTheDay = thisReport.file.lastCandleOfTheDay
} else { // This means this is the first time this process run.
fisrtTimeThisProcessRun = true
} else { // This means this is the first time this process has run.
firstTimeThisProcessRun = true
beginingOfMarket = new Date(uiStartDate.valueOf())
}
@@ -187,23 +219,85 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
} else {
thisReport.file.uiStartDate = new Date(thisReport.file.uiStartDate)
}
if (uiStartDate.valueOf() !== thisReport.file.uiStartDate.valueOf()) {
since = uiStartDate.valueOf()
initialProcessTimestamp = since
fisrtTimeThisProcessRun = true
firstTimeThisProcessRun = true
beginingOfMarket = new Date(uiStartDate.valueOf())
} else {
if (lastFile !== undefined) {
since = lastFile.valueOf()
initialProcessTimestamp = lastFile.valueOf()
if (thisReport.file.mustLoadRawData !== undefined) {
mustLoadRawData = thisReport.file.mustLoadRawData
}
} else {
since = uiStartDate.valueOf()
initialProcessTimestamp = uiStartDate.valueOf()
}
}
}
if (mustLoadRawData) { // there is raw data to load
getRawDataArray() // so fetch it from the file wehere it was saved on the last run of this process
}
function getRawDataArray() {
mustLoadRawData = false
let fileName = "Data.json"
let datetime = new Date(lastFile.valueOf())
let dateForPath = datetime.getUTCFullYear() + '/' +
TS.projects.superalgos.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' +
TS.projects.superalgos.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2)
let filePath = TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + OHLCVS_FOLDER_NAME + '/' + dateForPath;
let fullFileName = filePath + '/' + fileName
fileStorage.getTextFile(fullFileName, onFileReceived)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getRawDataArray -> from file = " + fullFileName)
function onFileReceived(err, text) {
try {
if (err.result === TS.projects.superalgos.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
try {
rawDataArray = JSON.parse(text);
let dataLength = rawDataArray.length
if (dataLength > 1) {
let lastData = rawDataArray[dataLength - 1]
let lastTimeStamp = lastData[0]
rawDataArray.pop() // ditch the last ohlcv since it may be incomplete
dataLength = rawDataArray.length
since = lastTimeStamp // we will now start again from the last full ohlvc we had (instead of the beginning of the day)
} else {
rawDataArrayFile = [] // we got less than two ohlcvs so we might as well start again from the beginning of the day
}
} catch (err) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getRawDataArray -> onFileReceived -> Error Parsing JSON -> err = " + err.stack)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getRawDataArray -> onFileReceived -> Falling back to default start with empty rawDataArray.");
return
}
} else {
if (err.message === 'File does not exist.' || err.code === 'The specified key does not exist.') {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getRawDataArray -> onFileReceived -> File not found -> err = " + err.stack)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[WARN] start -> getRawDataArray -> onFileReceived -> Falling back to default start with empty rawDataArray.");
return
} else {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> getRawDataArray -> onFileReceived -> Error Received -> err = " + err.stack)
callBackFunction(err);
return
}
}
} 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 -> getRawDataArray -> onFileReceived -> err = " + err.stack);
callBackFunction(TS.projects.superalgos.globals.standardResponses.DEFAULT_FAIL_RESPONSE);
}
}
}
}
} 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,
@@ -288,7 +382,9 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
/* Fetching the OHLCVs from the exchange.*/
await new Promise(resolve => setTimeout(resolve, rateLimit)) // rate limit
const OHLCVs = await exchange.fetchOHLCV(symbol, '1m', since, limit, params)
const OHLCVs = useFetchTradesForFetchOHLCVs ?
await fetchTradesForOHLCV(symbol, '1m', since, limit, params) :
await exchange.fetchOHLCV(symbol, '1m', since, limit, params)
/*
OHLCV Structure
@@ -310,20 +406,20 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getOHLCVs -> OHLCVs Fetched = " + OHLCVs.length)
if (OHLCVs.length > 0) {
let beginDate = new Date(OHLCVs[0].timestamp)
let endDate = new Date(OHLCVs[OHLCVs.length - 1].timestamp)
let beginDate = new Date(OHLCVs[0][0])
let endDate = new Date(OHLCVs[OHLCVs.length - 1][0])
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getOHLCVs -> OHLCVs Fetched From " + beginDate + " -> timestamp = " + OHLCVs[0].timestamp)
"[INFO] start -> getOHLCVs -> OHLCVs Fetched From " + beginDate + " -> timestamp = " + OHLCVs[0][0])
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[INFO] start -> getOHLCVs -> OHLCVs Fetched to " + endDate + " -> timestamp = " + OHLCVs[OHLCVs.length - 1].timestamp)
"[INFO] start -> getOHLCVs -> OHLCVs Fetched to " + endDate + " -> timestamp = " + OHLCVs[OHLCVs.length - 1][0])
if (fisrtTimeThisProcessRun === true) {
if (firstTimeThisProcessRun === true) {
let OHLCV = OHLCVs[0]
initialProcessTimestamp = OHLCV[0] // 'timestamp'
beginingOfMarket = new Date(Math.trunc(OHLCV[0] / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) // 'timestamp'
fromDate = new Date(beginingOfMarket.valueOf())
fisrtTimeThisProcessRun = false
firstTimeThisProcessRun = false
}
}
@@ -331,7 +427,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
previousSince = since
since = OHLCVs[OHLCVs.length - 1][0] // 'timestamp'
if (since === previousSince) {
since++ // this prevents requesting in a loop OHLCVs with the same timestamp, that can happen when all the records fetched comes with exactly the same timestamp.
since++ // this prevents requesting in a loop OHLCVs with the same timestamp, that can happen when all the records fetched come with exactly the same timestamp.
}
@@ -386,16 +482,53 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
}
}
async function fetchTradesForOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
let ohlcvcArray = [] // the array where the trades will be accumulated into ohlcvs
let startOfFetchTrades = since
let endOfFetchTrades
if (lastFile === undefined) {
endOfFetchTrades = (Math.trunc(since / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
} else {
endOfFetchTrades = lastFile.valueOf()
}
endOfFetchTrades += TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
while (TS.projects.superalgos.globals.taskVariables.IS_TASK_STOPPING !== true) {
var trades = await exchange.fetchTrades(symbol, startOfFetchTrades, limit, params)
if (trades.length > 0) {
let lastRetrievedTrade = trades[trades.length - 1]
startOfFetchTrades = lastRetrievedTrade.timestamp + 1
const ohlcvc = ccxtMisc.buildOHLCVC (trades, timeframe, since, limit)
ohlcvcArray = ohlcvcArray.concat(ohlcvc) // add the latest ohlcvs to the accumulation array
if (startOfFetchTrades > endOfFetchTrades) {
break // end of the day
} else {
if (trades.length < maxTradesPerFetch) {
break // end of the market
} else {
if (ohlcvcArray.length > limit) {
break // get enough ohlcvs for this process loop
} else {
await new Promise(resolve => setTimeout(resolve, rateLimit)) // wait for exchanges rateLimit before requesting again
}
}
}
} else {
break // exchange has no more trades
}
}
return ohlcvcArray.map ((c) => c.slice (0, -1))
}
async function saveOHLCVs() {
/*
What we are going to do in this function is to save all the candles
received from the exchage. We need to partition the batch of candles
received from the exchange. We need to partition the batch of candles
into 1 day files. At the same time we need to take care of the situation
that some exchanges send inconsitent data. We have detected some cases
where candles do not begin at second 0 of the minute but are a little
bit shifted. We will try to detectthis and fix it as we go.
bit shifted. We will try to detect this and fix it as we go.
We have the data received from the exchage at the arrary rawDataArray
We have the data received from the exchange at the arrary rawDataArray
*/
try {
@@ -448,10 +581,10 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
let filesCreated = 0
/*
We will loop aroud all the possible 1 minute candles that be found
We will loop around all the possible 1 minute candles that have been found
on a single day. For each minute of the day, we will try to find
the matching OHLCV. This would be an easy task if the exchanges
would allways return consistent data, but that is not the case.
would always return consistent data, but that is not the case.
Sometimes, some candles are missing. We have seen also candles that
do not start at an UTC minute, they are shifted in time some seconds.
In order to address all these inconsistencies the process gets a little
@@ -463,7 +596,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
We initialize our candle and volume objecs positioning them
at the current minute of the day of the current day. We also
initialize them with the last candle and volume property values.
The reason we do this last thing is because we don't knwo if
The reason we do this last thing is because we don't know if
we are going to find or not a matching OHLCV. If we do find one
these property values will be overwritten, and if not, they will
hold at least the last know value.
@@ -512,13 +645,13 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
*/
logAndHeartBeat()
/* We exit the loop and we aint comming back*/
/* We exit the loop and we ain't coming back*/
return
}
/*
We initialize here the OHLCV object. These initial
values should be overrided unless there are no
values should be overridden unless there are no
OHLVCs fetched from the exchange. We need the
timestamp in order to calculate OHLCVMinute.
*/
@@ -672,7 +805,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
}
function logAndHeartBeat() {
/* We need thi processing date for logging purposes only */
/* We need the processing date for logging purposes only */
let processingDate = new Date(candle.begin)
processingDate =
processingDate.getUTCFullYear() + '-' +
@@ -703,6 +836,7 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
function saveFile(day) {
candlesFileContent = candlesFileContent + ']'
volumesFileContent = volumesFileContent + ']'
ohlcvsFileContent = getRawDataToSave(day)
let fileName = 'Data.json'
@@ -712,16 +846,60 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
filesToCreate++
fileStorage.createTextFile(getFilePath(day * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS, VOLUMES_FOLDER_NAME) + '/' + fileName, volumesFileContent + '\n', onFileCreated);
if (ohlcvsFileContent !== undefined) {
filesToCreate++
fileStorage.createTextFile(getFilePath(day * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS, OHLCVS_FOLDER_NAME) + '/' + fileName, ohlcvsFileContent + '\n', onFileCreated);
mustLoadRawData = true
} else {
mustLoadRawData = false
}
candlesFileContent = '['
volumesFileContent = '['
needSeparator = false
}
function getRawDataToSave(day) {
/*
What we are doing here is determining whether the currently accumulated raw OHCLV's should be saved or not,
so that the next time the bot process runs, it must continue from where the raw OHLCV's ended.
If the current end of the array contains elements beyond the day being processed, it means that the full
day has been successfully downloaded, so it is not necessary to save this data.
*/
let rawDataFileData
let dataLength = rawDataArray.length
if (dataLength > 0) {
// first get the start of the day after this day we are checking
let timestamp = (day * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) +
TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
if (rawDataArray[dataLength - 1][0] < timestamp) {
// there is no data for the next day, so now trim this day's data to remove anything before it
timestamp -= TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
let dataIndex = 0
while (dataIndex < dataLength - 1) {
if (rawDataArray[dataIndex][0] < timestamp) { // this data is from a previous day
dataIndex++
} else {
break // found the beginning of this day's data
}
}
if (dataIndex > 0) {
rawDataArray = rawDataArray.slice(dataIndex, dataLength) // remove data from previous days
dataLength = rawDataArray.length
}
if (dataLength > 0) {
rawDataFileData = JSON.stringify(rawDataArray) // finally we have what we need to save
}
}
}
return rawDataFileData
}
function onFileCreated(err) {
if (err.result !== TS.projects.superalgos.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
"[ERROR] start -> OHLCVsReadyToBeSaved -> onFileBCreated -> err = " + JSON.stringify(err));
error = err // This allows the loop to be breaked.
error = err // This allows the loop to be broken.
return;
}
filesCreated++
@@ -826,7 +1004,8 @@ exports.newSuperalgosBotModulesHistoricOHLCVs = function (processIndex) {
minutes: beginingOfMarket.getUTCMinutes()
},
uiStartDate: uiStartDate.toUTCString(),
lastCandleOfTheDay: lastCandleOfTheDay
lastCandleOfTheDay: lastCandleOfTheDay,
mustLoadRawData: mustLoadRawData
};
if (fetchType === "by Id") {
@@ -410,7 +410,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
if (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Opening') {
/*
The system allows the user not to define a Manage Stage, because the Manage Stage is optional.
Here we are goint 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 inmidiatelly consider
the Manage Stage as closed.
*/
if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].manageStage === undefined) {
@@ -955,15 +955,34 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
reach the target size, so we introduce a rounding factor so that when it is close
enough we will consider the target to have been reached.
*/
const ROUNDING_ERROR_CORRECTION_FACTOR = 1.001
let ROUNDING_ERROR_CORRECTION_FACTOR = 1.001
/*
Overwrite the default with the config at the Stage node, if exists.
*/
if (tradingSystemStage.config.roundingErrorCorrectionFactor !== undefined) {
ROUNDING_ERROR_CORRECTION_FACTOR = tradingSystemStage.config.roundingErrorCorrectionFactor
}
/*
We will also implement a mechanism to allow users declare an absolute value to add
to the Size Filled before checking it againt the Stage Target Size.
*/
let ABSOLUTE_DUST_IN_BASE_ASSET = 0
if (tradingSystemStage.config.absoluteDustInBaseAsset !== undefined) {
ABSOLUTE_DUST_IN_BASE_ASSET = tradingSystemStage.config.absoluteDustInBaseAsset
}
let ABSOLUTE_DUST_IN_QUOTED_ASSET = 0
if (tradingSystemStage.config.absoluteDustInQuotedAsset !== undefined) {
ABSOLUTE_DUST_IN_QUOTED_ASSET = tradingSystemStage.config.absoluteDustInQuotedAsset
}
switch (tradingEngineStage.stageDefinedIn.value) {
case 'Base Asset': {
if (
(
tradingEngineStage.stageBaseAsset.sizeFilled.value
)
* ROUNDING_ERROR_CORRECTION_FACTOR
tradingEngineStage.stageBaseAsset.sizeFilled.value
*
ROUNDING_ERROR_CORRECTION_FACTOR
+
ABSOLUTE_DUST_IN_BASE_ASSET
>=
tradingEngineStage.stageBaseAsset.targetSize.value
) {
@@ -975,10 +994,11 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
}
case 'Quoted Asset': {
if (
(
tradingEngineStage.stageQuotedAsset.sizeFilled.value
)
* ROUNDING_ERROR_CORRECTION_FACTOR
tradingEngineStage.stageQuotedAsset.sizeFilled.value
*
ROUNDING_ERROR_CORRECTION_FACTOR
+
ABSOLUTE_DUST_IN_QUOTED_ASSET
>=
tradingEngineStage.stageQuotedAsset.targetSize.value
) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Loaded 100 of 105 files, more files were not shown because too many files have changed in this diff. Show more