Massive Refactoring of Episode for Trading Episode done

This commit is contained in:
Luis Fernando Molina committed 2021-02-07 17:39:36 +01:00
1 parent 92f6f4f303
commit c75fc91211
53 files changed
+544 -541

No files matched your search

@@ -1 +1 @@
{"type":"Workspace","name":"Ethereum Integration Demo","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"New Project Definition","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"790c56a4-deba-499f-9756-115fdb8cab44","savedPayload":{"position":{"x":25276.356993272086,"y":30604.11115747996},"targetPosition":{"x":25218.356993272086,"y":30630.11115747996},"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":"8a5bbe7c-4a5c-4c4a-ad2b-38cf489c859a","savedPayload":{"position":{"x":25218.356993272086,"y":30630.11115747996},"targetPosition":{"x":25145.356993272086,"y":30724.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"56ceaef5-290c-4512-94c9-2f5fd13486d1","savedPayload":{"position":{"x":25145.356993272086,"y":30724.11115747996},"targetPosition":{"x":25092.356993272086,"y":30693.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Webhooks","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Webhooks","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Webhooks Check-Webhook","project":"Superalgos","id":"0a8d8265-e0f8-4f3a-96d0-bfe4bbbd3224","savedPayload":{"position":{"x":25136.356993272086,"y":30684.11115747996},"targetPosition":{"x":25152.356993272086,"y":30784.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Check-Webhook","id":"69f37820-ab16-4e19-bfd8-386dd6e249a3"}}}],"id":"718a49a9-deae-4849-a796-714feb1e08bc","savedPayload":{"position":{"x":25152.356993272086,"y":30784.11115747996},"targetPosition":{"x":25081.356993272086,"y":30703.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"31747cdc-3783-40be-860f-92e381003ffe","savedPayload":{"position":{"x":25081.356993272086,"y":30703.11115747996},"targetPosition":{"x":25092.356993272086,"y":30693.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1daa3ec2-c891-44ab-997a-f427a8586716","savedPayload":{"position":{"x":25041.356993272086,"y":30670.11115747996},"targetPosition":{"x":25039.356993272086,"y":30732.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"8225345d-7cd7-4889-99b0-af692402d269","savedPayload":{"position":{"x":24989.356993272086,"y":30689.11115747996},"targetPosition":{"x":25039.356993272086,"y":30732.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":Line truncated
{"type":"Workspace","name":"Ethereum Integration Demo","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"New Project Definition","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"790c56a4-deba-499f-9756-115fdb8cab44","savedPayload":{"position":{"x":25276.356993272086,"y":30604.11115747996},"targetPosition":{"x":25218.356993272086,"y":30630.11115747996},"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":"8a5bbe7c-4a5c-4c4a-ad2b-38cf489c859a","savedPayload":{"position":{"x":25218.356993272086,"y":30630.11115747996},"targetPosition":{"x":25145.356993272086,"y":30724.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"56ceaef5-290c-4512-94c9-2f5fd13486d1","savedPayload":{"position":{"x":25145.356993272086,"y":30724.11115747996},"targetPosition":{"x":25092.356993272086,"y":30693.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Webhooks","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Webhooks","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Webhooks Check-Webhook","project":"Superalgos","id":"0a8d8265-e0f8-4f3a-96d0-bfe4bbbd3224","savedPayload":{"position":{"x":25136.356993272086,"y":30684.11115747996},"targetPosition":{"x":25152.356993272086,"y":30784.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Check-Webhook","id":"69f37820-ab16-4e19-bfd8-386dd6e249a3"}}}],"id":"718a49a9-deae-4849-a796-714feb1e08bc","savedPayload":{"position":{"x":25152.356993272086,"y":30784.11115747996},"targetPosition":{"x":25081.356993272086,"y":30703.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"31747cdc-3783-40be-860f-92e381003ffe","savedPayload":{"position":{"x":25081.356993272086,"y":30703.11115747996},"targetPosition":{"x":25092.356993272086,"y":30693.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1daa3ec2-c891-44ab-997a-f427a8586716","savedPayload":{"position":{"x":25041.356993272086,"y":30670.11115747996},"targetPosition":{"x":25039.356993272086,"y":30732.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"8225345d-7cd7-4889-99b0-af692402d269","savedPayload":{"position":{"x":24989.356993272086,"y":30689.11115747996},"targetPosition":{"x":25039.356993272086,"y":30732.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":Line truncated
@@ -1 +1 @@
{"type":"Learning Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","learningBots":[{"type":"Learning Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Learning","config":"{\n \"codeName\": \"Learning\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Learning-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Learning Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","project":"Superalgos","id":"c0de6b69-60e2-4574-890a-35743f75c569","savedPayload":{"position":{"x":11131.109355831457,"y":18399.62641535906},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ac1bc967-9c9f-47f0-8815-535abd7cb777"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","project":"Superalgos","id":"da23a8ff-8b3d-4caa-a27c-f59352911212","savedPayload":{"position":{"x":11054.736015653314,"y":18432.230211733928},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"6881069e-a4d1-4b41-892f-557d2031adea"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","project":"Superalgos","id":"dfdcb71e-c123-429e-bc2d-cf33963378d6","savedPayload":{"position":{"x":10973.672144862325,"y":18450.245302086223},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"8408c316-e04d-4b0d-8c81-1bf3b4126894"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Statistics","project":"Superalgos","id":"fa9e000d-199c-4ed4-b10f-6c586bfc2fa5","savedPayload":{"position":{"x":10890.678276352872,"y":18453.05820412071},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"553a0b49-2a61-41c4-ac95-f762051c1cab"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"a9a7b1fe-ecff-4d08-bd3b-297e4263c703","savedPayload":{"position":{"x":10808.580666776874,"y":18440.573127832315},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"a08a3974-75ac-4a2b-bc09-f80547a61381"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"d80bea92-bca6-4826-aa32-34bc7c13f952","savedPayload":{"position":{"x":10730.175051763214,"y":18413.21523751984},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"46221186-fff7-4333-a087-a32a649e9ce8"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"7f1463e2-38f8-4850-8198-bf9cee6507df","savedPayload":{"position":{"x":10658.13144049401,"y":18371.916173325702},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ee987e46-ed3c-4ade-8ab8-e6e503f46963"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"3651b117-ece2-4a25-b2a4-21a54a737d50","savedPayload":{"position":{"x":10594.903191744248,"y":18318.082325348263},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPiLine truncated
{"type":"Learning Mine","name":"Masters","config":"{ \n\"codeName\": \"Masters\"\n}","project":"Superalgos","learningBots":[{"type":"Learning Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Learning","config":"{\n \"codeName\": \"Learning\",\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Learning-Process\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Learning Engine","project":"Superalgos","outputDatasets":[],"outputDatasetFolders":[{"type":"Output Dataset Folder","name":"Trading Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","project":"Superalgos","id":"c0de6b69-60e2-4574-890a-35743f75c569","savedPayload":{"position":{"x":11131.109355831457,"y":18399.62641535906},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ac1bc967-9c9f-47f0-8815-535abd7cb777"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","project":"Superalgos","id":"da23a8ff-8b3d-4caa-a27c-f59352911212","savedPayload":{"position":{"x":11054.736015653314,"y":18432.230211733928},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"6881069e-a4d1-4b41-892f-557d2031adea"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","project":"Superalgos","id":"dfdcb71e-c123-429e-bc2d-cf33963378d6","savedPayload":{"position":{"x":10973.672144862325,"y":18450.245302086223},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"8408c316-e04d-4b0d-8c81-1bf3b4126894"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Statistics","project":"Superalgos","id":"fa9e000d-199c-4ed4-b10f-6c586bfc2fa5","savedPayload":{"position":{"x":10890.678276352872,"y":18453.05820412071},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"553a0b49-2a61-41c4-ac95-f762051c1cab"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Candle","project":"Superalgos","id":"a9a7b1fe-ecff-4d08-bd3b-297e4263c703","savedPayload":{"position":{"x":10808.580666776874,"y":18440.573127832315},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"a08a3974-75ac-4a2b-bc09-f80547a61381"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Candle","project":"Superalgos","id":"d80bea92-bca6-4826-aa32-34bc7c13f952","savedPayload":{"position":{"x":10730.175051763214,"y":18413.21523751984},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"46221186-fff7-4333-a087-a32a649e9ce8"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Balances","project":"Superalgos","id":"7f1463e2-38f8-4850-8198-bf9cee6507df","savedPayload":{"position":{"x":10658.13144049401,"y":18371.916173325702},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"ee987e46-ed3c-4ade-8ab8-e6e503f46963"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Balances","project":"Superalgos","id":"3651b117-ece2-4a25-b2a4-21a54a737d50","savedPayload":{"position":{"x":10594.903191744248,"y":18318.082325348263},"targetPosition":{"x":10916.997186924276,"y":18003.828513487584},"floatingObjectLine truncated
@@ -1 +1 @@
{"type":"Trading Engine","name":"Low-Frequency","project":"Superalgos","tradingCurrent":{"type":"Trading Current","name":"New Trading Current","project":"Superalgos","episode":{"type":"Episode","name":"New Episode","project":"Superalgos","serialNumber":{"type":"Serial Number","name":"New Serial Number","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"5eb83933-432a-4029-8a3e-e4d8d760dd27","savedPayload":{"position":{"x":31062.57302866531,"y":23980.75347206287},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"identifier":{"type":"Identifier","name":"New Identifier","config":"{\n\"initialValue\": \"\"\n}","project":"Superalgos","id":"8ba7fe0c-c5df-408e-be8a-ebde90f2a50d","savedPayload":{"position":{"x":31134.200052242173,"y":23887.407317556397},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"begin":{"type":"Begin","name":"New Begin","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d7faf864-3fa8-4280-b7d3-a022338b0dfe","savedPayload":{"position":{"x":31220.94829000812,"y":23807.91720300039},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"end":{"type":"End","name":"New End","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"f6722d05-77f9-4a68-ba69-38f56cdc7e91","savedPayload":{"position":{"x":31320.18194065536,"y":23744.698395301668},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"beginRate":{"type":"Begin Rate","name":"New Begin Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"613903ae-45e4-4eee-a178-d6ec049490ec","savedPayload":{"position":{"x":31428.885839923623,"y":23699.671765941916},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"endRate":{"type":"End Rate","name":"New End Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"b2bfb20d-64d5-4c98-b0cd-a466654c1e6a","savedPayload":{"position":{"x":31543.757074840472,"y":23674.205426269647},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"status":{"type":"Status","name":"New Status","config":"{\n\"initialValue\": \"Not Open\"\n}","project":"Superalgos","id":"2615490b-e968-4607-a6e5-009c3ae78957","savedPayload":{"position":{"x":31661.305341060608,"y":23669.07315812922},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"exitType":{"type":"Exit Type","name":"New Exit Type","config":"{\n\"initialValue\": \"No Exit\"\n}","project":"Superalgos","id":"6bcc264b-a189-4aca-8397-d3520bdf4078","savedPayload":{"position":{"x":31777.958993997225,"y":23684.430902891014},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"headOfTheMarket":{"type":"Head Of The Market","name":"New Head Of The Market","config":"{\n\"initialValue\": false\n}","project":"Superalgos","id":"f7e00135-13b1-4265-95da-dd3a2c763b6f","savedPayload":{"position":{"x":31890.173571435444,"y":23719.812023251856},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"processDate":{"type":"Process Date","name":"New Process Date","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d9163f6e-0d50-4ddd-b13b-14f7b4124ec8","savedPayload":{"position":{"x":31994.539490223113,"y":23774.141481773273},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"episodeBaseAsset":{"type":"Episode Base Asset","name":"New Episode Base Asset","project":"Superalgos","balance":{"type":"Balance","name":"Base Asset","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"72f6a6b6-f35b-4d80-b8ad-4a4ed55f2387","savedPaylLine truncated
{"type":"Trading Engine","name":"Low-Frequency","project":"Superalgos","tradingCurrent":{"type":"Trading Current","name":"New Trading Current","project":"Superalgos","tradingEpisode":{"type":"Trading Episode","name":"New Trading Episode","project":"Superalgos","serialNumber":{"type":"Serial Number","name":"New Serial Number","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"5eb83933-432a-4029-8a3e-e4d8d760dd27","savedPayload":{"position":{"x":31062.57302866531,"y":23980.75347206287},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"identifier":{"type":"Identifier","name":"New Identifier","config":"{\n\"initialValue\": \"\"\n}","project":"Superalgos","id":"8ba7fe0c-c5df-408e-be8a-ebde90f2a50d","savedPayload":{"position":{"x":31134.200052242173,"y":23887.407317556397},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"begin":{"type":"Begin","name":"New Begin","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d7faf864-3fa8-4280-b7d3-a022338b0dfe","savedPayload":{"position":{"x":31220.94829000812,"y":23807.91720300039},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"end":{"type":"End","name":"New End","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"f6722d05-77f9-4a68-ba69-38f56cdc7e91","savedPayload":{"position":{"x":31320.18194065536,"y":23744.698395301668},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"beginRate":{"type":"Begin Rate","name":"New Begin Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"613903ae-45e4-4eee-a178-d6ec049490ec","savedPayload":{"position":{"x":31428.885839923623,"y":23699.671765941916},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"endRate":{"type":"End Rate","name":"New End Rate","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"b2bfb20d-64d5-4c98-b0cd-a466654c1e6a","savedPayload":{"position":{"x":31543.757074840472,"y":23674.205426269647},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"status":{"type":"Status","name":"New Status","config":"{\n\"initialValue\": \"Not Open\"\n}","project":"Superalgos","id":"2615490b-e968-4607-a6e5-009c3ae78957","savedPayload":{"position":{"x":31661.305341060608,"y":23669.07315812922},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"exitType":{"type":"Exit Type","name":"New Exit Type","config":"{\n\"initialValue\": \"No Exit\"\n}","project":"Superalgos","id":"6bcc264b-a189-4aca-8397-d3520bdf4078","savedPayload":{"position":{"x":31777.958993997225,"y":23684.430902891014},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"headOfTheMarket":{"type":"Head Of The Market","name":"New Head Of The Market","config":"{\n\"initialValue\": false\n}","project":"Superalgos","id":"f7e00135-13b1-4265-95da-dd3a2c763b6f","savedPayload":{"position":{"x":31890.173571435444,"y":23719.812023251856},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"processDate":{"type":"Process Date","name":"New Process Date","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"d9163f6e-0d50-4ddd-b13b-14f7b4124ec8","savedPayload":{"position":{"x":31994.539490223113,"y":23774.141481773273},"targetPosition":{"x":31631.862254589007,"y":24343.43070769697},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"episodeBaseAsset":{"type":"Episode Base Asset","name":"New Episode Base Asset","project":"Superalgos","balance":{"type":"Balance","name":"Base Asset","config":"{\n\"initialValue\": 0\n}","project":"Superalgos","id":"72f6a6b6-f35b-4d80-b8ad-4Line truncated
@@ -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":"Episode","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market 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 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 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 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},"floatingObject":{"isPinned":false,"isFroLine 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 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 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 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 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},"floatingObject":{"isPinned":falsLine truncated
@@ -1 +1 @@
{"type":"Trading System","name":"BB Top Bounce","config":"{ \n\"codeName\": \"\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"S1 - 3H Down","project":"Superalgos","triggerStage":{"type":"Trigger Stage","name":"New Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","name":"New Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"New Situation","project":"Superalgos","conditions":[{"type":"Condition","name":"Previous Breakup","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.previous.close > chart.at01hs.bollingerBand.previous.movingAverage + chart.at01hs.bollingerBand.previous.deviation","project":"Superalgos","id":"99948a6e-e866-4339-86ba-eac367226312","savedPayload":{"position":{"x":30780.386277758334,"y":30051.498744389715},"targetPosition":{"x":31072.097253877637,"y":30121.53235354649},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"f0534c68-ab47-4370-b1fd-b3be4c1c262f","savedPayload":{"position":{"x":31072.097253877637,"y":30121.53235354649},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Close In","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage + chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"d3bd1690-1f94-484b-ac3c-7be2c7be85ed","savedPayload":{"position":{"x":30878.398033371974,"y":29838.894811327777},"targetPosition":{"x":31121.103131684456,"y":30015.23038701552},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e2d7334d-cf52-44d9-a20e-5be201ca6799","savedPayload":{"position":{"x":31121.103131684456,"y":30015.23038701552},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Red Candle","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.candle.open","project":"Superalgos","id":"d1fa707f-eb75-4b1c-8117-688b9b94e539","savedPayload":{"position":{"x":31050.30909116737,"y":29679.98186409081},"targetPosition":{"x":31207.058660582155,"y":29935.773913397035},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"fb71bcfb-2a40-4e8a-b8e8-b492128350a0","savedPayload":{"position":{"x":31207.058660582155,"y":29935.773913397035},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Down","code":"chart.at03hs.bollingerChannel.direction * chart.atAnyTimeFrame.externalSignal.timestamp > chart.atAnyTimeFrame.externalSignal.timestamp","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"8c8c5128-b88b-44a5-8e36-d5c61127404f","savedPayload":{"position":{"x":31269.9475509728,"y":29598.95295834618},"targetPosition":{"x":31316.87789048487,"y":29895.25946052472},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"22246178-a8f9-4ec8-b55b-36cf7a24fbff","savedPayload":{"position":{"x":31316.87789048487,"y":29895.25946052472},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Medium, Steep or Extreme","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerSubChannel.slope === \"Medium\" || chart.at03hs.bollingerSubChannel.slope === \"Steep\" || chart.at03hs.bollingerSubChannel.slope === \"Extreme\" ","project":"Superalgos","id":"bf8df41c-c62f-4cd6-840e-1dd538359c3b","savedPayload":{"position":{"x":31503.875448310486,"y":29608.144010464657},"targetPosition":{"x":31433.841839153712,"y":29899.85498658396},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"diLine truncated
{"type":"Trading System","name":"BB Top Bounce","config":"{ \n\"codeName\": \"\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"S1 - 3H Down","project":"Superalgos","triggerStage":{"type":"Trigger Stage","name":"New Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","name":"New Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"New Situation","project":"Superalgos","conditions":[{"type":"Condition","name":"Previous Breakup","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.previous.close > chart.at01hs.bollingerBand.previous.movingAverage + chart.at01hs.bollingerBand.previous.deviation","project":"Superalgos","id":"99948a6e-e866-4339-86ba-eac367226312","savedPayload":{"position":{"x":30780.386277758334,"y":30051.498744389715},"targetPosition":{"x":31072.097253877637,"y":30121.53235354649},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"f0534c68-ab47-4370-b1fd-b3be4c1c262f","savedPayload":{"position":{"x":31072.097253877637,"y":30121.53235354649},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Close In","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage + chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"d3bd1690-1f94-484b-ac3c-7be2c7be85ed","savedPayload":{"position":{"x":30878.398033371974,"y":29838.894811327777},"targetPosition":{"x":31121.103131684456,"y":30015.23038701552},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e2d7334d-cf52-44d9-a20e-5be201ca6799","savedPayload":{"position":{"x":31121.103131684456,"y":30015.23038701552},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Current Red Candle","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.candle.open","project":"Superalgos","id":"d1fa707f-eb75-4b1c-8117-688b9b94e539","savedPayload":{"position":{"x":31050.30909116737,"y":29679.98186409081},"targetPosition":{"x":31207.058660582155,"y":29935.773913397035},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"fb71bcfb-2a40-4e8a-b8e8-b492128350a0","savedPayload":{"position":{"x":31207.058660582155,"y":29935.773913397035},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Down","code":"chart.at03hs.bollingerChannel.direction * chart.atAnyTimeFrame.externalSignal.timestamp > chart.atAnyTimeFrame.externalSignal.timestamp","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"8c8c5128-b88b-44a5-8e36-d5c61127404f","savedPayload":{"position":{"x":31269.9475509728,"y":29598.95295834618},"targetPosition":{"x":31316.87789048487,"y":29895.25946052472},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"22246178-a8f9-4ec8-b55b-36cf7a24fbff","savedPayload":{"position":{"x":31316.87789048487,"y":29895.25946052472},"targetPosition":{"x":31363.80822999694,"y":30191.565962703262},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"3H Medium, Steep or Extreme","project":"Superalgos","javascriptCode":{"type":"Javascript Code","name":"New Javascript Code","code":"chart.at03hs.bollingerSubChannel.slope === \"Medium\" || chart.at03hs.bollingerSubChannel.slope === \"Steep\" || chart.at03hs.bollingerSubChannel.slope === \"Extreme\" ","project":"Superalgos","id":"bf8df41c-c62f-4cd6-840e-1dd538359c3b","savedPayload":{"position":{"x":31503.875448310486,"y":29608.144010464657},"targetPosition":{"x":31433.841839153712,"y":29899.85498658396},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"diLine 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":30914.345537114667,"y":38604.01436324851},"targetPosition":{"x":31359.096259318965,"y":38830.60964671243},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e693623c-e11f-49e3-99da-1897c7a47563","savedPayload":{"position":{"x":31359.096259318965,"y":38830.60964671243},"targetPosition":{"x":31803.948096117412,"y":39057.27709300647},"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":31803.948096117412,"y":39057.27709300647},"targetPosition":{"x":32249.606420886405,"y":39284.23888962723},"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":32249.606420886405,"y":39284.23888962723},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"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":32077.836612408217,"y":37610.39742636277},"targetPosition":{"x":32232.059454816794,"y":38085.06041310742},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"31ab47dd-fe2d-47ac-9a77-08ec8beee068","savedPayload":{"position":{"x":32232.059454816794,"y":38085.06041310742},"targetPosition":{"x":32386.31006690743,"y":38559.9136542021},"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":32386.31006690743,"y":38559.9136542021},"targetPosition":{"x":32540.740280232243,"y":39035.59720645897},"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":32540.740280232243,"y":39035.59720645897},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"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":33610.303575265214,"y":37702.976973794255},"targetPosition":{"x":33383.88254713001,"y":38147.76160391372},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"4054a522-7863-4ac2-9eab-26db2a6f037f","savedPayload":{"position":{"x":33383.88254713001,"y":38147.76160391372},"targetPosition":{"x":33148.83631252263,"y":38619.95922965271},"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":33148.83631252263,"y":38619.95922965271},"targetPosition":{"x":32922.00489673196,"y":39065.5515863614},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":falsLine 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":30914.345537114667,"y":38604.01436324851},"targetPosition":{"x":31359.096259318965,"y":38830.60964671243},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"e693623c-e11f-49e3-99da-1897c7a47563","savedPayload":{"position":{"x":31359.096259318965,"y":38830.60964671243},"targetPosition":{"x":31803.948096117412,"y":39057.27709300647},"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":31803.948096117412,"y":39057.27709300647},"targetPosition":{"x":32249.606420886405,"y":39284.23888962723},"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":32249.606420886405,"y":39284.23888962723},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"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":32077.836612408217,"y":37610.39742636277},"targetPosition":{"x":32232.059454816794,"y":38085.06041310742},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"31ab47dd-fe2d-47ac-9a77-08ec8beee068","savedPayload":{"position":{"x":32232.059454816794,"y":38085.06041310742},"targetPosition":{"x":32386.31006690743,"y":38559.9136542021},"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":32386.31006690743,"y":38559.9136542021},"targetPosition":{"x":32540.740280232243,"y":39035.59720645897},"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":32540.740280232243,"y":39035.59720645897},"targetPosition":{"x":32695.222935590078,"y":39511.15601095159},"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":33610.303575265214,"y":37702.976973794255},"targetPosition":{"x":33383.88254713001,"y":38147.76160391372},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"id":"4054a522-7863-4ac2-9eab-26db2a6f037f","savedPayload":{"position":{"x":33383.88254713001,"y":38147.76160391372},"targetPosition":{"x":33148.83631252263,"y":38619.95922965271},"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":33148.83631252263,"y":38619.95922965271},"targetPosition":{"x":32922.00489673196,"y":39065.5515863614},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":falsLine truncated
@@ -1 +1 @@
{"type":"Trading System","name":"WHB v2","config":"{ \n\"codeName\": \"Sparta-WHB-BTC-USDT\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"Steep","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Steep","project":"Superalgos","conditions":[{"type":"Condition","name":"3 Closes Below MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage && \nchart.at01hs.candle.previous.close < chart.at01hs.bollingerBand.previous.movingAverage && \nchart.at01hs.candle.previous.previous.close < chart.at01hs.bollingerBand.previous.previous.movingAverage","project":"Superalgos","id":"123b1af6-9639-4b6d-a4c3-7a8a9287169c","savedPayload":{"position":{"x":31075.323254310468,"y":29934.630604067414},"targetPosition":{"x":31240.97284151726,"y":29966.829622037207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"427da1e1-cc4a-4c78-88f6-c254d87cc88f","savedPayload":{"position":{"x":31240.97284151726,"y":29966.829622037207},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Breakdown","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage - chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"1b9e755e-eefe-4b0d-addd-1e19b6a597b6","savedPayload":{"position":{"x":31138.331069950404,"y":29770.489632553574},"targetPosition":{"x":31282.978051943886,"y":29857.402307694647},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"55bf7721-7fb2-42f0-8a3c-c2b97e278a29","savedPayload":{"position":{"x":31282.978051943886,"y":29857.402307694647},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"2H Down","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at02hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"e8db5fac-2f00-47fe-ac57-dc93ad15f2b5","savedPayload":{"position":{"x":31253.678567961866,"y":29637.797514989197},"targetPosition":{"x":31359.876383951527,"y":29768.940895985063},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"11e00b31-e7eb-4fe9-b006-dcd640dbbd3b","savedPayload":{"position":{"x":31359.876383951527,"y":29768.940895985063},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Deviation > 200","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.bollingerBand.deviation > 200","project":"Superalgos","id":"7671ca91-4b4c-40c5-b0c2-199169b013e8","savedPayload":{"position":{"x":31407.45313773691,"y":29552.558879079636},"targetPosition":{"x":31462.392763801556,"y":29712.11513871202},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"dd938286-61b3-41e4-bfbb-db34971ffa47","savedPayload":{"position":{"x":31462.392763801556,"y":29712.11513871202},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Candle Size < 750","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.max - chart.at01hs.candle.min < 750","project":"Superalgos","id":"19b7edeb-b180-429f-9adf-61bf47262033","savedPayload":{"position":{"x":31581.107296689723,"y":29525.054762303866},"targetPosition":{"x":31578.16220310343,"y":29693.779060861507},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"8f94ab97-1574-4136-9404-b66dfc1e3b9f","savedPayload":{"position":{"x":31578.16220310343,"y":29693.779060861507},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrLine truncated
{"type":"Trading System","name":"WHB v2","config":"{ \n\"codeName\": \"Sparta-WHB-BTC-USDT\"\n}","project":"Superalgos","tradingStrategies":[{"type":"Trading Strategy","name":"Steep","project":"Superalgos","triggerStage":{"type":"Trigger Stage","project":"Superalgos","triggerOn":{"type":"Trigger On Event","project":"Superalgos","situations":[{"type":"Situation","name":"Steep","project":"Superalgos","conditions":[{"type":"Condition","name":"3 Closes Below MA","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage && \nchart.at01hs.candle.previous.close < chart.at01hs.bollingerBand.previous.movingAverage && \nchart.at01hs.candle.previous.previous.close < chart.at01hs.bollingerBand.previous.previous.movingAverage","project":"Superalgos","id":"123b1af6-9639-4b6d-a4c3-7a8a9287169c","savedPayload":{"position":{"x":31075.323254310468,"y":29934.630604067414},"targetPosition":{"x":31240.97284151726,"y":29966.829622037207},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"427da1e1-cc4a-4c78-88f6-c254d87cc88f","savedPayload":{"position":{"x":31240.97284151726,"y":29966.829622037207},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Breakdown","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.close < chart.at01hs.bollingerBand.movingAverage - chart.at01hs.bollingerBand.deviation","project":"Superalgos","id":"1b9e755e-eefe-4b0d-addd-1e19b6a597b6","savedPayload":{"position":{"x":31138.331069950404,"y":29770.489632553574},"targetPosition":{"x":31282.978051943886,"y":29857.402307694647},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"55bf7721-7fb2-42f0-8a3c-c2b97e278a29","savedPayload":{"position":{"x":31282.978051943886,"y":29857.402307694647},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"2H Down","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at02hs.bollingerChannel.direction === \"Down\"","project":"Superalgos","id":"e8db5fac-2f00-47fe-ac57-dc93ad15f2b5","savedPayload":{"position":{"x":31253.678567961866,"y":29637.797514989197},"targetPosition":{"x":31359.876383951527,"y":29768.940895985063},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"11e00b31-e7eb-4fe9-b006-dcd640dbbd3b","savedPayload":{"position":{"x":31359.876383951527,"y":29768.940895985063},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Deviation > 200","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.bollingerBand.deviation > 200","project":"Superalgos","id":"7671ca91-4b4c-40c5-b0c2-199169b013e8","savedPayload":{"position":{"x":31407.45313773691,"y":29552.558879079636},"targetPosition":{"x":31462.392763801556,"y":29712.11513871202},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"dd938286-61b3-41e4-bfbb-db34971ffa47","savedPayload":{"position":{"x":31462.392763801556,"y":29712.11513871202},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Condition","name":"Candle Size < 750","project":"Superalgos","javascriptCode":{"type":"Javascript Code","code":"chart.at01hs.candle.max - chart.at01hs.candle.min < 750","project":"Superalgos","id":"19b7edeb-b180-429f-9adf-61bf47262033","savedPayload":{"position":{"x":31581.107296689723,"y":29525.054762303866},"targetPosition":{"x":31578.16220310343,"y":29693.779060861507},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":2,"arrangementStyle":0},"uiObject":{}}},"id":"8f94ab97-1574-4136-9404-b66dfc1e3b9f","savedPayload":{"position":{"x":31578.16220310343,"y":29693.779060861507},"targetPosition":{"x":31572.27201593085,"y":30031.22765797679},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"BB Top Bounce","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Sparta","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Sparta","project":"Superalgos","tasks":[{"type":"Task","name":"Simple Moving Average (SMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Simple Moving Average (SMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Market","project":"Superalgos","id":"64a0f312-b72e-494c-8802-70ebb6238c8b","savedPayload":{"position":{"x":24860.356993272086,"y":30929.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"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":"7a44ff20-1251-4157-9741-a4c2881b179e","savedPayload":{"position":{"x":24962.356993272086,"y":31086.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"333ae5d7-7ec1-4f08-b206-91e3b4f2c99f"}}}],"id":"ef39e485-c27d-443b-aa74-b10b8f8d10ad","savedPayload":{"position":{"x":24927.356993272086,"y":31018.11115747996},"targetPosition":{"x":24963.356993272086,"y":31085.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"01a5f038-ab20-44fe-99b0-0d5d3c0d4bcb","savedPayload":{"position":{"x":24963.356993272086,"y":31085.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Exponential Moving Average (EMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Exponential Moving Average (EMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Market","project":"Superalgos","id":"c95597e5-5d5c-4dd7-9510-99874a022eac","savedPayload":{"position":{"x":24816.356993272086,"y":31085.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"278c34a7-199d-400e-8a06-087149e3d391"}}},{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Daily","project":"Superalgos","id":"e588dc58-d99c-4938-aaab-747d23408301","savedPayload":{"position":{"x":24833.356993272086,"y":31119.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"943ea24f-ee24-4eae-9b4b-e8a73122b1c2"}}}],"id":"44fefa5e-341a-43c7-8967-7545a6e229ad","savedPayload":{"position":{"x":24789.356993272086,"y":31068.11115747996},"targetPosition":{"x":24874.356993272086,"y":31135.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"1e55a456-ff9c-48bf-b9ea-01082495fcc9","savedPayload":{"position":{"x":24874.356993272086,"y":31135.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task"Line truncated
{"type":"Workspace","name":"BB Top Bounce","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Sparta","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Sparta","project":"Superalgos","tasks":[{"type":"Task","name":"Simple Moving Average (SMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Simple Moving Average (SMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Simple Moving Average (SMA) Multi-Period-Market","project":"Superalgos","id":"64a0f312-b72e-494c-8802-70ebb6238c8b","savedPayload":{"position":{"x":24860.356993272086,"y":30929.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"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":"7a44ff20-1251-4157-9741-a4c2881b179e","savedPayload":{"position":{"x":24962.356993272086,"y":31086.11115747996},"targetPosition":{"x":24927.356993272086,"y":31018.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"333ae5d7-7ec1-4f08-b206-91e3b4f2c99f"}}}],"id":"ef39e485-c27d-443b-aa74-b10b8f8d10ad","savedPayload":{"position":{"x":24927.356993272086,"y":31018.11115747996},"targetPosition":{"x":24963.356993272086,"y":31085.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"01a5f038-ab20-44fe-99b0-0d5d3c0d4bcb","savedPayload":{"position":{"x":24963.356993272086,"y":31085.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Exponential Moving Average (EMA)","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Exponential Moving Average (EMA)","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Market","project":"Superalgos","id":"c95597e5-5d5c-4dd7-9510-99874a022eac","savedPayload":{"position":{"x":24816.356993272086,"y":31085.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"278c34a7-199d-400e-8a06-087149e3d391"}}},{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Daily","project":"Superalgos","id":"e588dc58-d99c-4938-aaab-747d23408301","savedPayload":{"position":{"x":24833.356993272086,"y":31119.11115747996},"targetPosition":{"x":24789.356993272086,"y":31068.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"943ea24f-ee24-4eae-9b4b-e8a73122b1c2"}}}],"id":"44fefa5e-341a-43c7-8967-7545a6e229ad","savedPayload":{"position":{"x":24789.356993272086,"y":31068.11115747996},"targetPosition":{"x":24874.356993272086,"y":31135.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"1e55a456-ff9c-48bf-b9ea-01082495fcc9","savedPayload":{"position":{"x":24874.356993272086,"y":31135.11115747996},"targetPosition":{"x":24878.356993272086,"y":31053.11115747996},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task"Line truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Exchange Keys Tests","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2017-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"f17f9567-af83-4292-a0dc-7c1c9dbf53b8","savedPayload":{"position":{"x":23148.696821492267,"y":29710.450985700143},"targetPosition":{"x":23448.696821492267,"y":29710.450985700143},"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":"9eaa4440-c8bc-4daa-b858-efa1845087de","savedPayload":{"position":{"x":23448.696821492267,"y":29710.450985700143},"targetPosition":{"x":23748.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"97e5a05e-9463-41a4-8255-a9487df56496","savedPayload":{"position":{"x":23748.696821492267,"y":29710.450985700143},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1ef6762d-a20c-46e0-8183-6aac6dd9073a","savedPayload":{"position":{"x":23364.625131645007,"y":29136.186916988216},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7b44275e-9446-4807-b9c2-4ba1107a5295","savedPayload":{"position":{"x":23474.43275278034,"y":29026.379295852883},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"78c835ef-be5b-4e74-8b0c-610afbbef304","savedPayload":{"position":{"x":23624.43275278034,"y":29286.186916988216},"targetPosition":{"x":23836.564787136303,"y":29498.31895134418},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"b4da2db7-fcae-4918-b38a-5e6966a9994b","savedPayload":{"position":{"x":23836.564787136303,"y":29498.31895134418},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"22a8694f-078e-4f1f-8470-7a7b25237397","savedPayload":{"position":{"x":23971.05110796151,"y":28820.673237813422},"targetPosition":{"x":24048.696821492267,"y":29110.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"ProcLine truncated
{"type":"Workspace","name":"Exchange Keys Tests","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2017-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"f17f9567-af83-4292-a0dc-7c1c9dbf53b8","savedPayload":{"position":{"x":23148.696821492267,"y":29710.450985700143},"targetPosition":{"x":23448.696821492267,"y":29710.450985700143},"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":"9eaa4440-c8bc-4daa-b858-efa1845087de","savedPayload":{"position":{"x":23448.696821492267,"y":29710.450985700143},"targetPosition":{"x":23748.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"97e5a05e-9463-41a4-8255-a9487df56496","savedPayload":{"position":{"x":23748.696821492267,"y":29710.450985700143},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"1ef6762d-a20c-46e0-8183-6aac6dd9073a","savedPayload":{"position":{"x":23364.625131645007,"y":29136.186916988216},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7b44275e-9446-4807-b9c2-4ba1107a5295","savedPayload":{"position":{"x":23474.43275278034,"y":29026.379295852883},"targetPosition":{"x":23624.43275278034,"y":29286.186916988216},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"78c835ef-be5b-4e74-8b0c-610afbbef304","savedPayload":{"position":{"x":23624.43275278034,"y":29286.186916988216},"targetPosition":{"x":23836.564787136303,"y":29498.31895134418},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"b4da2db7-fcae-4918-b38a-5e6966a9994b","savedPayload":{"position":{"x":23836.564787136303,"y":29498.31895134418},"targetPosition":{"x":24048.696821492267,"y":29710.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"22a8694f-078e-4f1f-8470-7a7b25237397","savedPayload":{"position":{"x":23971.05110796151,"y":28820.673237813422},"targetPosition":{"x":24048.696821492267,"y":29110.450985700143},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"ProcLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Getting Started","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d244c564-4e86-43c7-9796-dc3b6294ec8b","savedPayload":{"position":{"x":23490.023749611923,"y":29239.135911211026},"targetPosition":{"x":23779.801497498644,"y":29316.781624741783},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"343313ae-5705-484d-8bf8-aed25ba61cfa","savedPayload":{"position":{"x":23779.801497498644,"y":29316.781624741783},"targetPosition":{"x":24069.579245385365,"y":29394.42733827254},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a8f38508-1cac-4ab1-815f-d338fc813377","savedPayload":{"position":{"x":24069.579245385365,"y":29394.42733827254},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"f0ef12ed-f0fd-4b88-8e15-27cf24265a5f","savedPayload":{"position":{"x":23799.549372136753,"y":28802.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7c8b312c-09bf-4c59-853f-1592391a9c57","savedPayload":{"position":{"x":24059.356993272086,"y":28652.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"8d58e84b-d7ef-464f-8079-0ec0887e3da3","savedPayload":{"position":{"x":24059.356993272086,"y":28952.457809532632},"targetPosition":{"x":24209.356993272086,"y":29212.265430667965},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"bf29e3bd-9386-408b-9091-042da0c53e81","savedPayload":{"position":{"x":24209.356993272086,"y":29212.265430667965},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Period-Market","project":"Superalgos","id":"a707814e-b81b-4102-9b5b-4e2fe969324f","savedPayload":{"position":{"x":24437.002706802843,"y":28602.739808143135},"targetPosition":{"x":24514.6484203336,"y":28892.517556029856},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"refeLine truncated
{"type":"Workspace","name":"Getting Started","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d244c564-4e86-43c7-9796-dc3b6294ec8b","savedPayload":{"position":{"x":23490.023749611923,"y":29239.135911211026},"targetPosition":{"x":23779.801497498644,"y":29316.781624741783},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"343313ae-5705-484d-8bf8-aed25ba61cfa","savedPayload":{"position":{"x":23779.801497498644,"y":29316.781624741783},"targetPosition":{"x":24069.579245385365,"y":29394.42733827254},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"a8f38508-1cac-4ab1-815f-d338fc813377","savedPayload":{"position":{"x":24069.579245385365,"y":29394.42733827254},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"f0ef12ed-f0fd-4b88-8e15-27cf24265a5f","savedPayload":{"position":{"x":23799.549372136753,"y":28802.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"7c8b312c-09bf-4c59-853f-1592391a9c57","savedPayload":{"position":{"x":24059.356993272086,"y":28652.457809532632},"targetPosition":{"x":24059.356993272086,"y":28952.457809532632},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"8d58e84b-d7ef-464f-8079-0ec0887e3da3","savedPayload":{"position":{"x":24059.356993272086,"y":28952.457809532632},"targetPosition":{"x":24209.356993272086,"y":29212.265430667965},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"bf29e3bd-9386-408b-9091-042da0c53e81","savedPayload":{"position":{"x":24209.356993272086,"y":29212.265430667965},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Resistances and Supports","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Resistances and Supports","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Resistances and Supports Multi-Period-Market","project":"Superalgos","id":"a707814e-b81b-4102-9b5b-4e2fe969324f","savedPayload":{"position":{"x":24437.002706802843,"y":28602.739808143135},"targetPosition":{"x":24514.6484203336,"y":28892.517556029856},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"refeLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Trading System Design Tutorials","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d0ff77d8-76de-4d50-840a-e50a55ad7d1b","savedPayload":{"position":{"x":23464.287287440642,"y":29377.997434862405},"targetPosition":{"x":23762.643856051123,"y":29409.355973842703},"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":"b4e33f51-f9ff-4ef3-a9b7-ccb904163cae","savedPayload":{"position":{"x":23762.643856051123,"y":29409.355973842703},"targetPosition":{"x":24061.000424661604,"y":29440.714512823},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"23ae53f9-b478-4eb4-96e7-12d07d7ae4f0","savedPayload":{"position":{"x":24061.000424661604,"y":29440.714512823},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"dcf3d790-5362-4a95-b977-82d0cf0e07f1","savedPayload":{"position":{"x":23646.16814072914,"y":28934.397538066118},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"775fadbd-5b55-41b2-81ac-454f5e52dca6","savedPayload":{"position":{"x":23750.078387481142,"y":28818.993517604355},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"fc478301-77ac-4396-bd3b-915b4c681fa0","savedPayload":{"position":{"x":23913.47009798565,"y":29070.59468798798},"targetPosition":{"x":24136.413545628868,"y":29271.33386989564},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"30054a4b-7c93-4a3a-a6db-2e0d38507b2e","savedPayload":{"position":{"x":24136.413545628868,"y":29271.33386989564},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"bf0f739f-98b7-4c73-ae06-8d3fe83147ce","savedPayload":{"position":{"x":24098.412828859568,"y":28617.882534106506},"targetPosition":{"x":24234.60997878143,"y":28885.184491363016},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"PLine truncated
{"type":"Workspace","name":"Trading System Design Tutorials","rootNodes":[{"type":"Network","name":"My Network","project":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"18041\"\n}","project":"Superalgos","dataTasks":{"type":"Data Tasks","name":"New Data Tasks","project":"Superalgos","projectDataTasks":[{"type":"Project Data Tasks","name":"Superalgos","project":"Superalgos","exchangeDataTasks":[{"type":"Exchange Data Tasks","name":"Binance","project":"Superalgos","marketDataTasks":[{"type":"Market Data Tasks","name":"Binance BTC/USDT","project":"Superalgos","dataMineTasks":[{"type":"Data Mine Tasks","name":"Masters","project":"Superalgos","taskManagers":[{"type":"Task Manager","name":"Masters","project":"Superalgos","tasks":[{"type":"Task","name":"Exchange Raw Data","project":"Superalgos","bot":{"type":"Sensor Bot Instance","name":"Exchange Raw Data","config":"{ \n\"startDate\": \"2020-01-01\"\n}","project":"Superalgos","processes":[{"type":"Sensor Process Instance","name":"Exchange Raw Data Historic-OHLCVs","project":"Superalgos","id":"d0ff77d8-76de-4d50-840a-e50a55ad7d1b","savedPayload":{"position":{"x":23464.287287440642,"y":29377.997434862405},"targetPosition":{"x":23762.643856051123,"y":29409.355973842703},"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":"b4e33f51-f9ff-4ef3-a9b7-ccb904163cae","savedPayload":{"position":{"x":23762.643856051123,"y":29409.355973842703},"targetPosition":{"x":24061.000424661604,"y":29440.714512823},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"23ae53f9-b478-4eb4-96e7-12d07d7ae4f0","savedPayload":{"position":{"x":24061.000424661604,"y":29440.714512823},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Candles Volumes","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Candles Volumes","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Market","project":"Superalgos","id":"dcf3d790-5362-4a95-b977-82d0cf0e07f1","savedPayload":{"position":{"x":23646.16814072914,"y":28934.397538066118},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Market","id":"9f683143-a33f-42c1-9fa8-c601f01ee4e1"}}},{"type":"Indicator Process Instance","name":"Candles Volumes Multi-Period-Daily","project":"Superalgos","id":"775fadbd-5b55-41b2-81ac-454f5e52dca6","savedPayload":{"position":{"x":23750.078387481142,"y":28818.993517604355},"targetPosition":{"x":23913.47009798565,"y":29070.59468798798},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Multi-Period-Daily","id":"980ceb1d-7be6-454f-90d9-01ba1fd4a65d"}}}],"id":"fc478301-77ac-4396-bd3b-915b4c681fa0","savedPayload":{"position":{"x":23913.47009798565,"y":29070.59468798798},"targetPosition":{"x":24136.413545628868,"y":29271.33386989564},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"30054a4b-7c93-4a3a-a6db-2e0d38507b2e","savedPayload":{"position":{"x":24136.413545628868,"y":29271.33386989564},"targetPosition":{"x":24359.356993272086,"y":29472.073051803298},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},{"type":"Task","name":"Bollinger Bands","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"Bollinger Bands","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Bollinger Bands Multi-Period-Market","project":"Superalgos","id":"bf0f739f-98b7-4c73-ae06-8d3fe83147ce","savedPayload":{"position":{"x":24098.412828859568,"y":28617.882534106506},"targetPosition":{"x":24234.60997878143,"y":28885.184491363016},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":3,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"PLine truncated
@@ -1 +1 @@
{"type":"Workspace","name":"Weak-hands Buster v2","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":"EMA","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"EMA","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Market","project":"Superalgos","id":"9adffd60-8756-44f0-9290-692711f43349","savedPayload":{"position":{"x":23320.126508730755,"y":29392.688294073963},"targetPosition":{"x":23620.126508730755,"y":29392.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":"278c34a7-199d-400e-8a06-087149e3d391"}}},{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Daily","project":"Superalgos","id":"559fc728-018a-4e8e-a5fa-1e37958e4f6c","savedPayload":{"position":{"x":23470.126508730755,"y":29132.88067293863},"targetPosition":{"x":23620.126508730755,"y":29392.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":"943ea24f-ee24-4eae-9b4b-e8a73122b1c2"}}}],"id":"82a8c05f-a6f6-4728-8271-7b327c2b72ee","savedPayload":{"position":{"x":23620.126508730755,"y":29392.688294073963},"targetPosition":{"x":23879.934129866087,"y":29542.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"8ae4fc50-8c1f-4e45-9ffd-fad368816b9a","savedPayload":{"position":{"x":23879.934129866087,"y":29542.688294073963},"targetPosition":{"x":24139.74175100142,"y":29692.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"51b49b9d-cb97-4d98-ad8f-9f691320bac2","savedPayload":{"position":{"x":24139.74175100142,"y":29692.688294073963},"targetPosition":{"x":24399.549372136753,"y":29842.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"63728769-73e4-474e-8aa3-0d82bedca08e","savedPayload":{"position":{"x":24399.549372136753,"y":29842.688294073963},"targetPosition":{"x":24659.356993272086,"y":29992.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"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":"149bc037-9762-4737-b1b8-945b5ccee230","savedPayload":{"position":{"x":23931.241698334637,"y":28863.681567010735},"targetPosition":{"x":24173.94679664712,"y":29040.017142698478},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"507bc325-1cbd-40f4-85eb-cfe77b78000e","savedPayload":{"position":{"x":24173.94679664712,"y":29040.017142698478},"targetPosition":{"x":24416.651894959603,"y":29216.35271838622},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"7c28a4a4-86da-43be-9e89-d01b202f27eb","sLine truncated
{"type":"Workspace","name":"Weak-hands Buster v2","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":"EMA","project":"Superalgos","bot":{"type":"Indicator Bot Instance","name":"EMA","config":"{}","project":"Superalgos","processes":[{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Market","project":"Superalgos","id":"9adffd60-8756-44f0-9290-692711f43349","savedPayload":{"position":{"x":23320.126508730755,"y":29392.688294073963},"targetPosition":{"x":23620.126508730755,"y":29392.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":"278c34a7-199d-400e-8a06-087149e3d391"}}},{"type":"Indicator Process Instance","name":"Exponential Moving Average (EMA) Multi-Period-Daily","project":"Superalgos","id":"559fc728-018a-4e8e-a5fa-1e37958e4f6c","savedPayload":{"position":{"x":23470.126508730755,"y":29132.88067293863},"targetPosition":{"x":23620.126508730755,"y":29392.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":"943ea24f-ee24-4eae-9b4b-e8a73122b1c2"}}}],"id":"82a8c05f-a6f6-4728-8271-7b327c2b72ee","savedPayload":{"position":{"x":23620.126508730755,"y":29392.688294073963},"targetPosition":{"x":23879.934129866087,"y":29542.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"8ae4fc50-8c1f-4e45-9ffd-fad368816b9a","savedPayload":{"position":{"x":23879.934129866087,"y":29542.688294073963},"targetPosition":{"x":24139.74175100142,"y":29692.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"51b49b9d-cb97-4d98-ad8f-9f691320bac2","savedPayload":{"position":{"x":24139.74175100142,"y":29692.688294073963},"targetPosition":{"x":24399.549372136753,"y":29842.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}}],"id":"63728769-73e4-474e-8aa3-0d82bedca08e","savedPayload":{"position":{"x":24399.549372136753,"y":29842.688294073963},"targetPosition":{"x":24659.356993272086,"y":29992.688294073963},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"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":"149bc037-9762-4737-b1b8-945b5ccee230","savedPayload":{"position":{"x":23931.241698334637,"y":28863.681567010735},"targetPosition":{"x":24173.94679664712,"y":29040.017142698478},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Process Definition","name":"Historic-OHLCVs","id":"5eb11d6a-022e-4f60-97c4-d6cf90b249dc"}}}],"id":"507bc325-1cbd-40f4-85eb-cfe77b78000e","savedPayload":{"position":{"x":24173.94679664712,"y":29040.017142698478},"targetPosition":{"x":24416.651894959603,"y":29216.35271838622},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"id":"7c28a4a4-86da-43be-9e89-d01b202f27eb","sLine truncated
+22 -22
View File
@@ -3117,7 +3117,7 @@
]
},
{
"type": "Episode",
"type": "Trading Episode",
"menuItems": [
{
"action": "Add Missing Children",
@@ -3140,7 +3140,7 @@
"attachingRules": {
"compatibleTypes": "->Trading Current->"
},
"propertyNameAtParent": "episode",
"propertyNameAtParent": "tradingEpisode",
"childrenNodesProperties": [
{
"name": "serialNumber",
@@ -3274,7 +3274,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "episodeCounters",
"childrenNodesProperties": [
@@ -3872,7 +3872,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "episodeStatistics",
"childrenNodesProperties": [
@@ -4624,7 +4624,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "episodeBaseAsset",
"childrenNodesProperties": [
@@ -4712,7 +4712,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "episodeQuotedAsset",
"childrenNodesProperties": [
@@ -5741,9 +5741,9 @@
"propertyNameAtParent": "tradingCurrent",
"childrenNodesProperties": [
{
"name": "episode",
"name": "tradingEpisode",
"type": "node",
"childType": "Episode",
"childType": "Trading Episode",
"autoAdd": true
},
{
@@ -5834,7 +5834,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "balance"
},
@@ -5968,7 +5968,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "distanceToEvent",
"childrenNodesProperties": [
@@ -7064,7 +7064,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->Position->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
"compatibleTypes": "->Trading Episode->Strategy->Position->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
},
"propertyNameAtParent": "status"
},
@@ -7280,7 +7280,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->Position->Market Order->Limit Order->"
"compatibleTypes": "->Trading Episode->Strategy->Position->Market Order->Limit Order->"
},
"propertyNameAtParent": "serialNumber"
},
@@ -7334,7 +7334,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->Position->Market Order->Limit Order->"
"compatibleTypes": "->Trading Episode->Strategy->Position->Market Order->Limit Order->"
},
"propertyNameAtParent": "identifier"
},
@@ -7496,7 +7496,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->Position->Candle->Cycle->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->Stop Loss->Take Profit->"
"compatibleTypes": "->Trading Episode->Strategy->Position->Candle->Cycle->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->Stop Loss->Take Profit->"
},
"propertyNameAtParent": "begin"
},
@@ -7550,7 +7550,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->Position->Candle->Cycle->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->Stop Loss->Take Profit->"
"compatibleTypes": "->Trading Episode->Strategy->Position->Candle->Cycle->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->Stop Loss->Take Profit->"
},
"propertyNameAtParent": "end"
},
@@ -7876,7 +7876,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->Position->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
"compatibleTypes": "->Trading Episode->Strategy->Position->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
},
"propertyNameAtParent": "beginRate"
},
@@ -7930,7 +7930,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->Position->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
"compatibleTypes": "->Trading Episode->Strategy->Position->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
},
"propertyNameAtParent": "endRate"
},
@@ -8762,7 +8762,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->Strategy->->Position->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
"compatibleTypes": "->Trading Episode->Strategy->->Position->Market Order->Limit Order->Strategy Trigger Stage->Strategy Open Stage->Strategy Manage Stage->Strategy Close Stage->"
},
"propertyNameAtParent": "exitType"
},
@@ -8816,7 +8816,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "processDate"
},
@@ -8870,7 +8870,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "headOfTheMarket"
},
@@ -8948,7 +8948,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "candle",
"childrenNodesProperties": [
@@ -9039,7 +9039,7 @@
"addLeftIcons": true,
"level": 3,
"attachingRules": {
"compatibleTypes": "->Episode->"
"compatibleTypes": "->Trading Episode->"
},
"propertyNameAtParent": "cycle",
"childrenNodesProperties": [
@@ -31,7 +31,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = \n((( tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value +\ntradingEngine.current.episode.episodeBaseAsset.profitLoss.value ) / \ntradingEngine.current.episode.episodeBaseAsset.beginBalance.value) ^\n(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)) - 1\n\ntradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = \n((( tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +\ntradingEngine.current.episode.episodeQuotedAsset.profitLoss.value ) / \ntradingEngine.current.episode.episodeQuotedAsset.beginBalance.value) ^\n(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)) - 1",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.annualizedRateOfReturn.value = \n((( tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value +\ntradingEngine.current.tradingEpisode.episodeBaseAsset.profitLoss.value ) / \ntradingEngine.current.tradingEpisode.episodeBaseAsset.beginBalance.value) ^\n(365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value)) - 1\n\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.annualizedRateOfReturn.value = \n((( tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value +\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.profitLoss.value ) / \ntradingEngine.current.tradingEpisode.episodeQuotedAsset.beginBalance.value) ^\n(365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value)) - 1",
"updated": 1609925166406
},
{
@@ -40,7 +40,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value +\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value ) / \n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value\n , \n (365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)\n ) - 1\n\ntradingEngine.current.episode.episodeQuotedAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value ) / \n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value\n , \n (365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)\n ) - 1",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value ) / \n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value\n , \n (365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value)\n ) - 1\n\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.annualizedRateOfReturn.value = \nMath.pow(\n ( tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value ) / \n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value\n , \n (365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value)\n ) - 1",
"updated": 1609925205928
},
{
@@ -57,7 +57,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value =\nMath.pow(\n (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.episode.beginRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value\n ) / \n (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.episode.beginRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value \n ) \n , \n (\n 365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value\n ) \n ) - 1",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.annualizedRateOfReturn.value =\nMath.pow(\n (\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.tradingEpisode.beginRate.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value\n ) / \n (\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.tradingEpisode.beginRate.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value \n ) \n , \n (\n 365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value\n ) \n ) - 1",
"updated": 1609925262959
},
{
@@ -82,7 +82,7 @@
},
{
"style": "Javascript",
"text": "function orderRate() {\nconst ORDER_STEP_NUMBER = 1 // Secuential step number, starting with 1 from the closest to the price.\nconst BUY_SELL_SIGN = -1 // 1 for buy orders, -1 for sell orders.\nconst STEP_SEPARATION = 0.15 // % of separation of stair steps between them.\nconst BASE_FACTOR = 0.2 // % above or below bollinger band without bias.\nconst BIAS_FACTOR = 0.3 // % to move the whole stair of orders up or down depending on the bias.\nconst BAND_RATE = chart.at01min.bollingerBand.lowerBand // Upper Bollinger Band for sell orders, and Lower for buy orders.\nlet inbalance = tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value - tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value\nlet BIAS_SIGN\nif (inbalance === 0) {\nBIAS_SIGN = 0\n}\nif (inbalance < 0) {\nBIAS_SIGN = + 1\n}\nif (inbalance > 0) {\nBIAS_SIGN = - 1\n}\nlet rate = BAND_RATE + BUY_SELL_SIGN BAND_RATE (BASE_FACTOR + ORDER_STEP_NUMBER STEP_SEPARATION + BIAS_SIGN BIAS_FACTOR) / 100\nreturn rate\n}\norderRate()",
"text": "function orderRate() {\nconst ORDER_STEP_NUMBER = 1 // Secuential step number, starting with 1 from the closest to the price.\nconst BUY_SELL_SIGN = -1 // 1 for buy orders, -1 for sell orders.\nconst STEP_SEPARATION = 0.15 // % of separation of stair steps between them.\nconst BASE_FACTOR = 0.2 // % above or below bollinger band without bias.\nconst BIAS_FACTOR = 0.3 // % to move the whole stair of orders up or down depending on the bias.\nconst BAND_RATE = chart.at01min.bollingerBand.lowerBand // Upper Bollinger Band for sell orders, and Lower for buy orders.\nlet inbalance = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value - tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value\nlet BIAS_SIGN\nif (inbalance === 0) {\nBIAS_SIGN = 0\n}\nif (inbalance < 0) {\nBIAS_SIGN = + 1\n}\nif (inbalance > 0) {\nBIAS_SIGN = - 1\n}\nlet rate = BAND_RATE + BUY_SELL_SIGN BAND_RATE (BASE_FACTOR + ORDER_STEP_NUMBER STEP_SEPARATION + BIAS_SIGN BIAS_FACTOR) / 100\nreturn rate\n}\norderRate()",
"updated": 1609346807464
}
]
@@ -31,7 +31,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -\n sessionParameters.sessionBaseAsset.config.initialBalance\n \ntradingEngine.current.episode.episodeQuotedAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -\n sessionParameters.sessionQuotedAsset.config.initialBalance",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value -\n sessionParameters.sessionBaseAsset.config.initialBalance\n \ntradingEngine.current.tradingEpisode.episodeQuotedAsset.profitLoss.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value -\n sessionParameters.sessionQuotedAsset.config.initialBalance",
"updated": 1609880593226
},
{
@@ -45,7 +45,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -\n tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance\n \ntradingEngine.current.position.positionQuotedAsset.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -\n tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance",
"text": "tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value -\n tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance\n \ntradingEngine.current.position.positionQuotedAsset.profitLoss.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value -\n tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance",
"updated": 1609880668611
},
{
@@ -66,7 +66,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.episode.candle.close.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.profitLoss.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.tradingEpisode.candle.close.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value",
"updated": 1609880717964
},
{
@@ -75,7 +75,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.position.endRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value",
"text": "tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.position.endRate.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value",
"updated": 1609880790493
},
{
@@ -35,7 +35,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value =\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value /\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * 100 \n \ntradingEngine.current.episode.episodeQuotedAsset.ROI.value =\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value /\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value * 100",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.ROI.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value /\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * 100 \n \ntradingEngine.current.tradingEpisode.episodeQuotedAsset.ROI.value =\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value /\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value * 100",
"updated": 1611332768337
},
{
@@ -71,7 +71,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value =\n (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.episode.endRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value\n ) / (\n tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.episode.beginRate.value +\n tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value\n ) * 100",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.ROI.value =\n (\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value * \n tradingEngine.tradingCurrent.tradingEpisode.endRate.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value\n ) / (\n tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * \n tradingEngine.tradingCurrent.tradingEpisode.beginRate.value +\n tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value\n ) * 100",
"updated": 1611332824026
},
{
@@ -72,7 +72,7 @@
},
{
"style": "Text",
"text": "The horizontal segment marks the target rate defined at the open stage. If you are using market orders to take the position, then using tradingEngine.tradingCurrent.episode.candle.close.value may offer a good representation of the rate of market orders. If you are using limit orders, then you may decide at which rate you wish to take the position, and the horizontal segment of the triangle will match the chosen rate."
"text": "The horizontal segment marks the target rate defined at the open stage. If you are using market orders to take the position, then using tradingEngine.tradingCurrent.tradingEpisode.candle.close.value may offer a good representation of the rate of market orders. If you are using limit orders, then you may decide at which rate you wish to take the position, and the horizontal segment of the triangle will match the chosen rate."
},
{
"style": "Text",
@@ -105,7 +105,7 @@
},
{
"style": "Text",
"text": "The difference in rate between the moment in time the target is hit and the time the 1-hour candle closes may be significant. As a result, if the close stage target rate is defined as tradingEngine.tradingCurrent.episode.candle.close.value, the resulting simulation may show significant slippage, and diverge from what the trade would look like if running on the 1-minute time frame, like you would when trading live."
"text": "The difference in rate between the moment in time the target is hit and the time the 1-hour candle closes may be significant. As a result, if the close stage target rate is defined as tradingEngine.tradingCurrent.tradingEpisode.candle.close.value, the resulting simulation may show significant slippage, and diverge from what the trade would look like if running on the 1-minute time frame, like you would when trading live."
},
{
"style": "Text",
@@ -113,7 +113,7 @@
},
{
"style": "Javascript",
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.tradingCurrent.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.tradingCurrent.episode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.tradingCurrent.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.tradingCurrent.position.stopLoss.finalValue.value\n break\n }\n }\n}",
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.tradingCurrent.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.tradingCurrent.tradingEpisode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.tradingCurrent.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.tradingCurrent.position.stopLoss.finalValue.value\n break\n }\n }\n}",
"updated": 1609596984516
},
{
@@ -50,7 +50,7 @@
},
{
"style": "Text",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value"
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value"
},
{
"style": "Text",
@@ -58,7 +58,7 @@
},
{
"style": "Text",
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value"
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value"
},
{
"style": "Text",
@@ -75,7 +75,7 @@
},
{
"style": "Javascript",
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.tradingCurrent.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.tradingCurrent.episode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.tradingCurrent.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.tradingCurrent.position.stopLoss.finalValue.value\n break\n }\n }\n}",
"text": "targetRate()\n\nfunction targetRate() {\n switch (tradingEngine.tradingCurrent.position.exitType.value) {\n case 'No Exit': {\n return tradingEngine.tradingCurrent.tradingEpisode.candle.close.value\n break\n }\n case 'Take Profit': {\n return tradingEngine.tradingCurrent.position.takeProfit.finalValue.value\n break\n }\n case 'Stop Loss': {\n return tradingEngine.tradingCurrent.position.stopLoss.finalValue.value\n break\n }\n }\n}",
"updated": 1611866140829
},
{
@@ -1,5 +1,5 @@
{
"type": "Episode",
"type": "Trading Episode",
"definition": {
"text": "Episode is the object that handles the information corresponding to the whole run of the trading bot&mdash;beginning to end&mdash;between the specified initial datetime and final datetime, in the time range parameter of the trading session."
},
@@ -36,7 +36,7 @@
},
{
"style": "Javascript",
"text": "(tradingEngine.tradingCurrent.episode.cycle.value === 'First')"
"text": "(tradingEngine.tradingCurrent.tradingEpisode.cycle.value === 'First')"
},
{
"style": "List",
@@ -78,7 +78,7 @@
},
{
"style": "Javascript",
"text": "(tradingEngine.tradingCurrent.episode.cycle.value === 'Second')"
"text": "(tradingEngine.tradingCurrent.tradingEpisode.cycle.value === 'Second')"
},
{
"style": "List",
@@ -60,7 +60,7 @@
},
{
"style": "Javascript",
"text": "tradingEngineOrder.rate.value = tradingEngine.tradingCurrent.episode.candle.close.value",
"text": "tradingEngineOrder.rate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value",
"updated": 1610220056132
},
{
@@ -209,7 +209,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.size.value => 0",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.size.value => 0",
"updated": 1610220335526
},
{
@@ -218,7 +218,7 @@
},
{
"style": "Javascript",
"text": "tradingEngineOrder.orderQuotedAsset.size.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value",
"text": "tradingEngineOrder.orderQuotedAsset.size.value =\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.balance.value",
"updated": 1610220358264
},
{
@@ -190,7 +190,7 @@
},
{
"style": "Javascript",
"text": "tradingEngineOrder.orderStatistics.actualRate.value =\ntradingEngine.current.episode.candle.max.value",
"text": "tradingEngineOrder.orderStatistics.actualRate.value =\ntradingEngine.current.tradingEpisode.candle.max.value",
"updated": 1610223027648
},
{
@@ -211,7 +211,7 @@
},
{
"style": "Javascript",
"text": "tradingEngineOrder.orderStatistics.actualRate.value =\ntradingEngine.current.episode.candle.min.value",
"text": "tradingEngineOrder.orderStatistics.actualRate.value =\ntradingEngine.current.tradingEpisode.candle.min.value",
"updated": 1610223044937
},
{
@@ -270,7 +270,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.candle.min.value <=\ntradingEngineOrder.actualRate.value",
"text": "tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <=\ntradingEngineOrder.actualRate.value",
"updated": 1610223130690
},
{
@@ -279,7 +279,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.candle.max.value >=\ntradingEngineOrder.actualRate.value",
"text": "tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >=\ntradingEngineOrder.actualRate.value",
"updated": 1610223149566
},
{
@@ -82,7 +82,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value +\npreviousBaseAssetSizeFilled",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeBaseAsset.balance.value +\npreviousBaseAssetSizeFilled",
"updated": 1610224035951
},
{
@@ -92,7 +92,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value -\ntradingEngineOrder.orderBaseAsset.sizeFilled.value",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeBaseAsset.balance.value -\ntradingEngineOrder.orderBaseAsset.sizeFilled.value",
"updated": 1610224081072
},
{
@@ -102,7 +102,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value -\npreviousQuotedAssetSizeFilled +\npreviousQuotedAssetFeesPaid",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.balance.value -\npreviousQuotedAssetSizeFilled +\npreviousQuotedAssetFeesPaid",
"updated": 1610224107848
},
{
@@ -112,7 +112,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value +\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value -\ntradingEngineOrder.orderQuotedAsset.feesPaid.value",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.balance.value +\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value -\ntradingEngineOrder.orderQuotedAsset.feesPaid.value",
"updated": 1610224148958
},
{
@@ -126,7 +126,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value -\npreviousBaseAssetSizeFilled +\npreviousBaseAssetFeesPaid",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeBaseAsset.balance.value -\npreviousBaseAssetSizeFilled +\npreviousBaseAssetFeesPaid",
"updated": 1610224182969
},
{
@@ -136,7 +136,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =\ntradingEngine.current.episode.episodeBaseAsset.balance.value +\ntradingEngineOrder.orderBaseAsset.sizeFilled.value -\ntradingEngineOrder.orderBaseAsset.feesPaid.value",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeBaseAsset.balance.value +\ntradingEngineOrder.orderBaseAsset.sizeFilled.value -\ntradingEngineOrder.orderBaseAsset.feesPaid.value",
"updated": 1610224202075
},
{
@@ -146,7 +146,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value +\npreviousQuotedAssetSizeFilled",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.balance.value +\npreviousQuotedAssetSizeFilled",
"updated": 1610224219415
},
{
@@ -156,7 +156,7 @@
},
{
"style": "Javascript",
"text": "tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =\ntradingEngine.current.episode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value",
"text": "tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =\ntradingEngine.current.tradingEpisode.episodeQuotedAsset.balance.value -\ntradingEngineOrder.orderQuotedAsset.sizeFilled.value",
"updated": 1610224237924
},
{
@@ -31,17 +31,17 @@
},
{
"style": "Title",
"text": "Episode",
"text": "Trading Episode",
"updated": 1611257045974
},
{
"style": "Include",
"text": "Superalgos->Node->Episode->Definition",
"text": "Superalgos->Node->Trading Episode->Definition",
"updated": 1611257060021
},
{
"style": "Include",
"text": "Superalgos->Node->Episode->Content",
"text": "Superalgos->Node->Trading Episode->Content",
"updated": 1611257063548
},
{
@@ -50,7 +50,7 @@
},
{
"style": "Hierarchy",
"text": "Superalgos->Episode->2",
"text": "Superalgos->Trading Episode->2",
"updated": 1611257076886
},
{
@@ -16,7 +16,7 @@
},
{
"style": "Text",
"text": "The following string should end up in your clipboard:<br/>tradingEngine.tradingCurrent.episode.<br/>episodeBaseAsset.balance.value"
"text": "The following string should end up in your clipboard:<br/>tradingEngine.tradingCurrent.tradingEpisode.<br/>episodeBaseAsset.balance.value"
},
{
"style": "Note",
@@ -5,7 +5,7 @@
"definition": {
"icon": {
"project": "Superalgos",
"name": "episode"
"name": "trading-episode"
},
"text": "Now, why don't the nodes further to the left show their values too? Say, Exit Type, Status, End Rate, Begin Rate, and so on?"
},
@@ -5,7 +5,7 @@
"definition": {
"icon": {
"project": "Superalgos",
"name": "episode"
"name": "trading-episode"
},
"text": "There's one layer left... Episode!. It marks the duration of the episode and features several plotter panels..."
},
@@ -56,36 +56,36 @@ exports.newSuperalgosBotModulesLearningEngine = function (processIndex) {
}
function setCurrentCandle(candle) {
learningEngine.learningCurrent.episode.candle.begin.value = candle.begin
learningEngine.learningCurrent.episode.candle.end.value = candle.end
learningEngine.learningCurrent.episode.candle.open.value = candle.open
learningEngine.learningCurrent.episode.candle.close.value = candle.close
learningEngine.learningCurrent.episode.candle.min.value = candle.min
learningEngine.learningCurrent.episode.candle.max.value = candle.max
learningEngine.learningCurrent.learningEpisode.candle.begin.value = candle.begin
learningEngine.learningCurrent.learningEpisode.candle.end.value = candle.end
learningEngine.learningCurrent.learningEpisode.candle.open.value = candle.open
learningEngine.learningCurrent.learningEpisode.candle.close.value = candle.close
learningEngine.learningCurrent.learningEpisode.candle.min.value = candle.min
learningEngine.learningCurrent.learningEpisode.candle.max.value = candle.max
}
function setCurrentCycle(cycle) {
learningEngine.learningCurrent.episode.cycle.value = cycle
learningEngine.learningCurrent.episode.cycle.lastBegin.value = learningEngine.learningCurrent.episode.cycle.begin.value
learningEngine.learningCurrent.episode.cycle.lastEnd.value = learningEngine.learningCurrent.episode.cycle.end.value
learningEngine.learningCurrent.learningEpisode.cycle.value = cycle
learningEngine.learningCurrent.learningEpisode.cycle.lastBegin.value = learningEngine.learningCurrent.learningEpisode.cycle.begin.value
learningEngine.learningCurrent.learningEpisode.cycle.lastEnd.value = learningEngine.learningCurrent.learningEpisode.cycle.end.value
switch (cycle) {
case 'First': {
learningEngine.learningCurrent.episode.cycle.begin.value =
learningEngine.learningCurrent.episode.candle.begin.value +
learningEngine.learningCurrent.learningEpisode.cycle.begin.value =
learningEngine.learningCurrent.learningEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value
learningEngine.learningCurrent.episode.cycle.end.value =
learningEngine.learningCurrent.episode.candle.begin.value +
learningEngine.learningCurrent.learningEpisode.cycle.end.value =
learningEngine.learningCurrent.learningEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value +
sessionParameters.timeFrame.config.value / 2 - 1
break
}
case 'Second': {
learningEngine.learningCurrent.episode.cycle.begin.value =
learningEngine.learningCurrent.episode.candle.begin.value +
learningEngine.learningCurrent.learningEpisode.cycle.begin.value =
learningEngine.learningCurrent.learningEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value +
sessionParameters.timeFrame.config.value / 2
learningEngine.learningCurrent.episode.cycle.end.value =
learningEngine.learningCurrent.episode.candle.begin.value +
learningEngine.learningCurrent.learningEpisode.cycle.end.value =
learningEngine.learningCurrent.learningEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value +
sessionParameters.timeFrame.config.value * 4 / 4 - 1
break
@@ -96,11 +96,11 @@ exports.newSuperalgosBotModulesLearningEngine = function (processIndex) {
objects starting with lastBegin in zero to being saved on file. For that reason
we will do this:
*/
if (learningEngine.learningCurrent.episode.cycle.lastBegin.value === 0) {
learningEngine.learningCurrent.episode.cycle.lastBegin.value = learningEngine.learningCurrent.episode.cycle.begin.value
if (learningEngine.learningCurrent.learningEpisode.cycle.lastBegin.value === 0) {
learningEngine.learningCurrent.learningEpisode.cycle.lastBegin.value = learningEngine.learningCurrent.learningEpisode.cycle.begin.value
}
if (learningEngine.learningCurrent.episode.cycle.lastEnd.value === 0) {
learningEngine.learningCurrent.episode.cycle.lastEnd.value = learningEngine.learningCurrent.episode.cycle.end.value
if (learningEngine.learningCurrent.learningEpisode.cycle.lastEnd.value === 0) {
learningEngine.learningCurrent.learningEpisode.cycle.lastEnd.value = learningEngine.learningCurrent.learningEpisode.cycle.end.value
}
}
@@ -49,69 +49,69 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
must be opened there, since it might happen that it is looping at the end of the market
or the task / session was restarted. We will only execute if the episode was never opened before.
*/
if (learningEngine.learningCurrent.episode.begin.value !== learningEngine.learningCurrent.episode.begin.config.initialValue) { return }
if (learningEngine.learningCurrent.learningEpisode.begin.value !== learningEngine.learningCurrent.learningEpisode.begin.config.initialValue) { return }
/* Starting begin and end */
learningEngine.learningCurrent.episode.begin.value = learningEngine.learningCurrent.episode.candle.begin.value
learningEngine.learningCurrent.episode.end.value = learningEngine.learningCurrent.episode.candle.end.value
learningEngine.learningCurrent.learningEpisode.begin.value = learningEngine.learningCurrent.learningEpisode.candle.begin.value
learningEngine.learningCurrent.learningEpisode.end.value = learningEngine.learningCurrent.learningEpisode.candle.end.value
/* Getting the begin Balance from the session configuration */
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
/* The current balance is also the begin balance, that is how this starts. */
learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
/* Recording the opening at the Learning Engine Data Structure */
learningEngine.learningCurrent.episode.status.value = 'Open'
learningEngine.learningCurrent.episode.serialNumber.value = 1
learningEngine.learningCurrent.episode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
learningEngine.learningCurrent.episode.beginRate.value = learningEngine.learningCurrent.episode.candle.close.value
learningEngine.learningCurrent.learningEpisode.status.value = 'Open'
learningEngine.learningCurrent.learningEpisode.serialNumber.value = 1
learningEngine.learningCurrent.learningEpisode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
learningEngine.learningCurrent.learningEpisode.beginRate.value = learningEngine.learningCurrent.learningEpisode.candle.close.value
}
function updateExitType(exitType) {
learningEngine.learningCurrent.episode.exitType.value = exitType
learningEngine.learningCurrent.learningEpisode.exitType.value = exitType
}
function closeEpisode() {
learningEngine.learningCurrent.episode.status.value = 'Closed'
learningEngine.learningCurrent.episode.end.value = learningEngine.learningCurrent.episode.candle.end.value
learningEngine.learningCurrent.episode.endRate.value = learningEngine.learningCurrent.episode.candle.close.value
learningEngine.learningCurrent.episode.episodeBaseAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value
learningEngine.learningCurrent.episode.episodeQuotedAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value
learningEngine.learningCurrent.learningEpisode.status.value = 'Closed'
learningEngine.learningCurrent.learningEpisode.end.value = learningEngine.learningCurrent.learningEpisode.candle.end.value
learningEngine.learningCurrent.learningEpisode.endRate.value = learningEngine.learningCurrent.learningEpisode.candle.close.value
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.endBalance.value = learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.endBalance.value = learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value
}
function resetEpisode() {
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(learningEngine.learningCurrent.episode)
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(learningEngine.learningCurrent.learningEpisode)
}
function updateEnds() {
if (learningEngine.learningCurrent.episode.status.value === 'Open') {
learningEngine.learningCurrent.episode.end.value = learningEngine.learningCurrent.episode.end.value + sessionParameters.timeFrame.config.value
learningEngine.learningCurrent.episode.endRate.value = learningEngine.learningCurrent.episode.candle.close.value
learningEngine.learningCurrent.episode.episodeBaseAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value
learningEngine.learningCurrent.episode.episodeQuotedAsset.endBalance.value = learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value
if (learningEngine.learningCurrent.learningEpisode.status.value === 'Open') {
learningEngine.learningCurrent.learningEpisode.end.value = learningEngine.learningCurrent.learningEpisode.end.value + sessionParameters.timeFrame.config.value
learningEngine.learningCurrent.learningEpisode.endRate.value = learningEngine.learningCurrent.learningEpisode.candle.close.value
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.endBalance.value = learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.endBalance.value = learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value
}
}
function resetLearningEngineDataStructure() {
if (learningEngine.learningCurrent.episode.status.value === 'Closed') {
if (learningEngine.learningCurrent.learningEpisode.status.value === 'Closed') {
resetEpisode()
}
}
function updateCounters() {
if (learningEngine.learningCurrent.episode.status.value === 'Open') {
learningEngine.learningCurrent.episode.episodeCounters.periods.value++
if (learningEngine.learningCurrent.learningEpisode.status.value === 'Open') {
learningEngine.learningCurrent.learningEpisode.episodeCounters.periods.value++
}
}
function updateStatistics() {
/* Daus Calculation */
learningEngine.learningCurrent.episode.episodeStatistics.days.value =
learningEngine.learningCurrent.episode.episodeCounters.periods.value *
learningEngine.learningCurrent.learningEpisode.episodeStatistics.days.value =
learningEngine.learningCurrent.learningEpisode.episodeCounters.periods.value *
sessionParameters.timeFrame.config.value /
TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
}
@@ -123,45 +123,45 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
function calculateAssetsStatistics() {
/* Updating Profit Loss */
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value =
learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value -
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value =
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value -
sessionParameters.sessionBaseAsset.config.initialBalance
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value =
learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value -
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value =
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value -
sessionParameters.sessionQuotedAsset.config.initialBalance
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value, 10)
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value, 10)
/*
Updating ROI
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
*/
learningEngine.learningCurrent.episode.episodeBaseAsset.ROI.value =
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value /
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * 100
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.ROI.value =
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value /
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.beginBalance.value * 100
learningEngine.learningCurrent.episode.episodeQuotedAsset.ROI.value =
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value /
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value * 100
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.ROI.value =
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value /
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.beginBalance.value * 100
learningEngine.learningCurrent.episode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.ROI.value, 10)
learningEngine.learningCurrent.episode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.ROI.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.ROI.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.ROI.value, 10)
/* Updating Hit Ratio */
if (learningEngine.learningCurrent.episode.episodeCounters.positions.value > 0) {
learningEngine.learningCurrent.episode.episodeBaseAsset.hitRatio.value =
learningEngine.learningCurrent.episode.episodeBaseAsset.hits.value /
learningEngine.learningCurrent.episode.episodeCounters.positions.value
if (learningEngine.learningCurrent.learningEpisode.episodeCounters.positions.value > 0) {
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.hitRatio.value =
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.hits.value /
learningEngine.learningCurrent.learningEpisode.episodeCounters.positions.value
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitRatio.value =
learningEngine.learningCurrent.episode.episodeQuotedAsset.hits.value /
learningEngine.learningCurrent.episode.episodeCounters.positions.value
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.hitRatio.value =
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.hits.value /
learningEngine.learningCurrent.learningEpisode.episodeCounters.positions.value
learningEngine.learningCurrent.episode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.hitRatio.value, 10)
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.hitRatio.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.hitRatio.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.hitRatio.value, 10)
}
/*
@@ -169,94 +169,94 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
https://www.investopedia.com/terms/a/annualized-rate.asp
*/
learningEngine.learningCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value =
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.annualizedRateOfReturn.value =
Math.pow(
(
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value +
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value
) / learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.beginBalance.value +
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value
) / learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.beginBalance.value
,
(365 / learningEngine.learningCurrent.episode.episodeStatistics.days.value)
(365 / learningEngine.learningCurrent.learningEpisode.episodeStatistics.days.value)
) - 1
learningEngine.learningCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value =
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.annualizedRateOfReturn.value =
Math.pow(
(
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value +
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
) / learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.beginBalance.value +
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value
) / learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.beginBalance.value
,
(365 / learningEngine.learningCurrent.episode.episodeStatistics.days.value)
(365 / learningEngine.learningCurrent.learningEpisode.episodeStatistics.days.value)
) - 1
learningEngine.learningCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
learningEngine.learningCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
/* Updating Hit or Fail */
if (learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value > 0) {
learningEngine.learningCurrent.episode.episodeBaseAsset.hitFail.value = 'Hit'
if (learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value > 0) {
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.hitFail.value = 'Hit'
} else {
learningEngine.learningCurrent.episode.episodeBaseAsset.hitFail.value = 'Fail'
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.hitFail.value = 'Fail'
}
if (learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value > 0) {
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitFail.value = 'Hit'
if (learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value > 0) {
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.hitFail.value = 'Hit'
} else {
learningEngine.learningCurrent.episode.episodeQuotedAsset.hitFail.value = 'Fail'
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.hitFail.value = 'Fail'
}
}
function calculateEpisodeStatistics() {
/* Updating Profit Loss */
learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value =
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value * learningEngine.learningCurrent.episode.candle.close.value +
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
learningEngine.learningCurrent.learningEpisode.episodeStatistics.profitLoss.value =
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value * learningEngine.learningCurrent.learningEpisode.candle.close.value +
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value
learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeStatistics.profitLoss.value, 10)
/*
Updating ROI
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
*/
learningEngine.learningCurrent.episode.episodeStatistics.ROI.value =
learningEngine.learningCurrent.learningEpisode.episodeStatistics.ROI.value =
(
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value * learningEngine.learningCurrent.episode.endRate.value +
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value * learningEngine.learningCurrent.learningEpisode.endRate.value +
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value
) / (
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.episode.beginRate.value +
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.learningEpisode.beginRate.value +
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.beginBalance.value
) * 100
learningEngine.learningCurrent.episode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeStatistics.ROI.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeStatistics.ROI.value, 10)
/*
Updating Annualized Rate Of Return
https://www.investopedia.com/terms/a/annualized-rate.asp
*/
learningEngine.learningCurrent.episode.episodeStatistics.annualizedRateOfReturn.value =
learningEngine.learningCurrent.learningEpisode.episodeStatistics.annualizedRateOfReturn.value =
Math.pow(
(
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.episode.beginRate.value +
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value +
learningEngine.learningCurrent.episode.episodeBaseAsset.profitLoss.value +
learningEngine.learningCurrent.episode.episodeQuotedAsset.profitLoss.value
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.learningEpisode.beginRate.value +
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.beginBalance.value +
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.profitLoss.value +
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.profitLoss.value
) /
(
learningEngine.learningCurrent.episode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.episode.beginRate.value +
learningEngine.learningCurrent.episode.episodeQuotedAsset.beginBalance.value
learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.beginBalance.value * learningEngine.learningCurrent.learningEpisode.beginRate.value +
learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.beginBalance.value
)
,
(365 / learningEngine.learningCurrent.episode.episodeStatistics.days.value)
(365 / learningEngine.learningCurrent.learningEpisode.episodeStatistics.days.value)
) - 1
learningEngine.learningCurrent.episode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.episode.episodeStatistics.annualizedRateOfReturn.value, 10)
learningEngine.learningCurrent.learningEpisode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(learningEngine.learningCurrent.learningEpisode.episodeStatistics.annualizedRateOfReturn.value, 10)
/* Updating Hit or Fail */
if (learningEngine.learningCurrent.episode.episodeStatistics.profitLoss.value > 0) {
learningEngine.learningCurrent.episode.episodeStatistics.hitFail.value = 'Hit'
if (learningEngine.learningCurrent.learningEpisode.episodeStatistics.profitLoss.value > 0) {
learningEngine.learningCurrent.learningEpisode.episodeStatistics.hitFail.value = 'Hit'
} else {
learningEngine.learningCurrent.episode.episodeStatistics.hitFail.value = 'Fail'
learningEngine.learningCurrent.learningEpisode.episodeStatistics.hitFail.value = 'Fail'
}
}
}
@@ -264,57 +264,57 @@ exports.newSuperalgosBotModulesLearningEpisode = function (processIndex) {
function updateDistanceToEventsCounters() {
/* Keeping Distance Counters Up-to-date while avoinding counting before the first event happens. */
if (
learningEngine.learningCurrent.episode.distanceToEvent.triggerOn.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.triggerOn.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.triggerOn.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.triggerOn.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.triggerOff.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.triggerOff.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.triggerOff.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.triggerOff.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.takePosition.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.takePosition.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.takePosition.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.takePosition.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.closePosition.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.closePosition.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.closePosition.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.closePosition.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.nextPhase.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.nextPhase.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.nextPhase.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.nextPhase.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.moveToPhase.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.moveToPhase.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.moveToPhase.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.moveToPhase.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.createOrder.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.createOrder.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.createOrder.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.createOrder.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.cancelOrder.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.cancelOrder.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.cancelOrder.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.cancelOrder.value++
}
if (
learningEngine.learningCurrent.episode.distanceToEvent.closeOrder.value > 0
learningEngine.learningCurrent.learningEpisode.distanceToEvent.closeOrder.value > 0
) {
learningEngine.learningCurrent.episode.distanceToEvent.closeOrder.value++
learningEngine.learningCurrent.learningEpisode.distanceToEvent.closeOrder.value++
}
}
}
@@ -40,7 +40,8 @@ exports.newSuperalgosBotModulesLearningOutput = function (processIndex) {
outputDatasetsMap,
timeFrameLabel,
learningProcessDate,
fileStorage
fileStorage,
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.tradingCurrent.learningEpisode.headOfTheMarket.value
)
await learningSimulationModuleObject.runSimulation(
@@ -57,7 +57,7 @@
This variable tell us which day we are standing at, specially while working
with Daily Files. From this Date is that we are going to load the Daily Files.
*/
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value =
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.learningEpisode.processDate.value =
TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.learningParameters.timeRange.config.initialDatetime).valueOf()
}
@@ -70,7 +70,7 @@
the simulation loop, once we discover that all candles from a certain date have benn processed.
Here is the point where we sync one and the other.
*/
let learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value)
let learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.learningEpisode.processDate.value)
if (
await TS.projects.superalgos.functionLibraries.dataDependenciesFunctions.processSingleFiles(
@@ -151,7 +151,7 @@
use it to save Output Files and later the Data Ranges. This is the point where
the date calculated by the Simulation is applied at the Learning Process Level.
*/
learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value)
learningProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.learningEpisode.processDate.value)
if (checkStopTaskGracefully() === false) { break }
if (checkStopProcessing() === false) { break }
@@ -240,7 +240,7 @@
indicators to be built and continue the processing once this process is called
again.
*/
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.headOfTheMarket.value === true) {
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.learningEpisode.headOfTheMarket.value === true) {
return false
}
}
@@ -58,13 +58,13 @@ exports.newSuperalgosBotModulesLearningRecords = function (processIndex) {
There are a few products configured to be saved only at an specific cycle.
*/
if (product.config.saveAtCycle !== undefined) {
if (learningEngine.learningCurrent.episode.cycle.value !== product.config.saveAtCycle) {
if (learningEngine.learningCurrent.learningEpisode.cycle.value !== product.config.saveAtCycle) {
return
}
}
/* Clean the file from information of previous executions */
//pruneOutputFile(product, outputDatasetArray, learningEngine.learningCurrent.episode.candle.end.value)
//pruneOutputFile(product, outputDatasetArray, learningEngine.learningCurrent.learningEpisode.candle.end.value)
/* Clean Open Records */
if (product.config.saveAsObjects === true) {
@@ -256,8 +256,8 @@ exports.newSuperalgosBotModulesLearningRecords = function (processIndex) {
of the day? Easy: the end of the candle must be 1 millisecod before the next day. That happens at any
time frame.
*/
let currentDay = new Date(learningEngine.learningCurrent.episode.candle.end.value)
let nextDay = new Date(learningEngine.learningCurrent.episode.candle.end.value + 1)
let currentDay = new Date(learningEngine.learningCurrent.learningEpisode.candle.end.value)
let nextDay = new Date(learningEngine.learningCurrent.learningEpisode.candle.end.value + 1)
if (currentDay.getUTCDate() !== nextDay.getUTCDate()) {
/*
We will save the object only if it is closed, becasuse we are at the last candle of the day.
@@ -55,7 +55,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
let dailyCandles = []
for (let i = 0; i < candles.length; i++) {
let candle = candles[i]
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.episode.processDate.value) {
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.learningEngine.learningCurrent.learningEpisode.processDate.value) {
dailyCandles.push(candle)
}
}
@@ -99,7 +99,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
In this case we already have at the last candle index the next candle to be
processed. We will just continue with this candle.
*/
initialCandle = learningEngine.learningCurrent.episode.candle.index.value
initialCandle = learningEngine.learningCurrent.learningEpisode.candle.index.value
}
/*
Main Simulation Loop
@@ -113,7 +113,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
loop is not empty, then the lascCandle() check will override this value
depending on if we really are at the head of the market or not.
*/
learningEngine.learningCurrent.episode.headOfTheMarket.value = true
learningEngine.learningCurrent.learningEpisode.headOfTheMarket.value = true
/*
This is the main simulation loop. It will go through the initial candle
until one less than the last candle available. We will never process the last
@@ -121,10 +121,10 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
that still can change. So effectively will be processing all closed candles.
*/
for (let i = initialCandle; i < candles.length - 1; i++) {
learningEngine.learningCurrent.episode.candle.index.value = i
learningEngine.learningCurrent.learningEpisode.candle.index.value = i
/* This is the current candle the Simulation is working at. */
let candle = candles[learningEngine.learningCurrent.episode.candle.index.value]
let candle = candles[learningEngine.learningCurrent.learningEpisode.candle.index.value]
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> Candle Begin @ ' + (new Date(candle.begin)).toUTCString())
@@ -210,7 +210,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
learningEpisodeModuleObject.reset()
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.reset()
let infoMessage = 'Processing candle # ' + learningEngine.learningCurrent.episode.candle.index.value + ' @ the ' + learningEngine.learningCurrent.episode.cycle.value + ' cycle.'
let infoMessage = 'Processing candle # ' + learningEngine.learningCurrent.learningEpisode.candle.index.value + ' @ the ' + learningEngine.learningCurrent.learningEpisode.cycle.value + ' cycle.'
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> ' + infoMessage)
@@ -222,8 +222,8 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
}
contextInfo = {
candleIndex: learningEngine.learningCurrent.episode.candle.index.value,
cycle: learningEngine.learningCurrent.episode.cycle.value
candleIndex: learningEngine.learningCurrent.learningEpisode.candle.index.value,
cycle: learningEngine.learningCurrent.learningEpisode.cycle.value
}
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
@@ -302,7 +302,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
if (sessionParameters.heartbeats.config.date === true || sessionParameters.heartbeats.config.candleIndex === true) {
/* We will produce a simulation level heartbeat in order to inform the user this is running. */
heartBeatDate = new Date(Math.trunc(learningEngine.learningCurrent.episode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
heartBeatDate = new Date(Math.trunc(learningEngine.learningCurrent.learningEpisode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime)
let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime)
@@ -320,7 +320,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + learningEngine.learningCurrent.episode.candle.index.value + ' @ ' + processingDate)
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + learningEngine.learningCurrent.learningEpisode.candle.index.value + ' @ ' + processingDate)
/* Logging to console and disk */
if (TS.projects.superalgos.utilities.dateTimeFunctions.areTheseDatesEqual(currentDate, new Date()) === false) {
@@ -344,7 +344,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
if (sessionParameters.heartbeats.config.date === true) {
hartbeatText = hartbeatText + currentDateString
}
hartbeatText = hartbeatText + ' Candle # ' + learningEngine.learningCurrent.episode.candle.index.value
hartbeatText = hartbeatText + ' Candle # ' + learningEngine.learningCurrent.learningEpisode.candle.index.value
TS.projects.superalgos.functionLibraries.processFunctions.processHeartBeat(processIndex, hartbeatText, percentage)
}
}
@@ -448,15 +448,15 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
for (let i = 0; i < pArray.length; i++) {
element = pArray[i]
if (learningEngine.learningCurrent.episode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
if (learningEngine.learningCurrent.learningEpisode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
return element
} else {
if (
i > 0 &&
element.end > learningEngine.learningCurrent.episode.candle.end.value
element.end > learningEngine.learningCurrent.learningEpisode.candle.end.value
) {
let previousElement = pArray[i - 1]
if (previousElement.end < learningEngine.learningCurrent.episode.candle.end.value) {
if (previousElement.end < learningEngine.learningCurrent.learningEpisode.candle.end.value) {
return previousElement // If one elements goes into the future of currentCandle, then we stop and take the previous element.
} else {
return
@@ -485,7 +485,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
The second +1 is because we need to compare the next candle (remember that the loops allways avoid the
last candle of the dataset available.)
*/
if (learningEngine.learningCurrent.episode.candle.index.value + 1 + 1 === candles.length) {
if (learningEngine.learningCurrent.learningEpisode.candle.index.value + 1 + 1 === candles.length) {
/*
When processing daily files, we need a mechanism to turn from one day to the next one.
That mechanism is the one implemented here. If we detect that the next candle is the last candle of
@@ -495,7 +495,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
let candlesPerDay = TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS / sessionParameters.timeFrame.config.value
if (
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_PROCESSING_DAILY_FILES &&
learningEngine.learningCurrent.episode.candle.index.value + 1 + 1 === candlesPerDay
learningEngine.learningCurrent.learningEpisode.candle.index.value + 1 + 1 === candlesPerDay
) {
/*
Here we found that the next candle of the dataset is the last candle of the day.
@@ -504,9 +504,9 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
the first candle of the new dataset we shall receive. The first candle of the next day starts
at index 0, so we will position the index now at zero.
*/
learningEngine.learningCurrent.episode.candle.index.value = 0
learningEngine.learningCurrent.episode.processDate.value =
learningEngine.learningCurrent.episode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
learningEngine.learningCurrent.learningEpisode.candle.index.value = 0
learningEngine.learningCurrent.learningEpisode.processDate.value =
learningEngine.learningCurrent.learningEpisode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
return false
}
@@ -516,21 +516,21 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
next execution it will likely have more candles at the dataset. And if it does not,
it will just wait there until it does.
*/
learningEngine.learningCurrent.episode.headOfTheMarket.value = true
learningEngine.learningCurrent.episode.candle.index.value++
learningEngine.learningCurrent.learningEpisode.headOfTheMarket.value = true
learningEngine.learningCurrent.learningEpisode.candle.index.value++
return false
} else {
/* Wd did not reach the head of the market */
learningEngine.learningCurrent.episode.headOfTheMarket.value = false
learningEngine.learningCurrent.episode.candle.index.value++
learningEngine.learningCurrent.learningEpisode.headOfTheMarket.value = false
learningEngine.learningCurrent.learningEpisode.candle.index.value++
return true
}
}
function checkInitialDatetime() {
/* Here we check that the current candle is not before the initial datetime defined at the session parameters.*/
if (learningEngine.learningCurrent.episode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
if (learningEngine.learningCurrent.learningEpisode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle before the sessionParameters.timeRange.config.initialDatetime.')
return false
@@ -540,7 +540,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
function checkFinalDatetime() {
/* Here we check that the next candle is not after of the user-defined final datetime at the session parameters.*/
if (learningEngine.learningCurrent.episode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
if (learningEngine.learningCurrent.learningEpisode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle after the sessionParameters.timeRange.config.finalDatetime.')
return false
@@ -558,10 +558,10 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
because there the balances have shifted from their resting position.
*/
let stopRunningDate = (new Date(learningEngine.learningCurrent.episode.candle.begin.value)).toUTCString()
let stopRunningDate = (new Date(learningEngine.learningCurrent.learningEpisode.candle.begin.value)).toUTCString()
if (sessionParameters.sessionBaseAsset.config.minimumBalance !== undefined) {
if (learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
if (learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
let docs = {
@@ -573,7 +573,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeBaseAssetBalance: learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value,
episodeBaseAssetBalance: learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value,
sessionBaseAssetMinimumBalance: sessionParameters.sessionBaseAsset.config.minimumBalance
}
@@ -587,7 +587,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
}
if (sessionParameters.sessionBaseAsset.config.maximumBalance !== undefined) {
if (learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
if (learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
let docs = {
@@ -599,7 +599,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeBaseAssetBalance: learningEngine.learningCurrent.episode.episodeBaseAsset.balance.value,
episodeBaseAssetBalance: learningEngine.learningCurrent.learningEpisode.episodeBaseAsset.balance.value,
sessionBaseAssetMaximumBalance: sessionParameters.sessionBaseAsset.config.maximumBalance
}
@@ -613,7 +613,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
}
if (sessionParameters.sessionQuotedAsset.config.minimumBalance !== undefined) {
if (learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
if (learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
let docs = {
@@ -625,7 +625,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeQuotedAssetBalance: learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value,
episodeQuotedAssetBalance: learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value,
sessionQuotedAssetMinimumBalance: sessionParameters.sessionQuotedAsset.config.minimumBalance
}
@@ -639,7 +639,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
}
if (sessionParameters.sessionQuotedAsset.config.maximumBalance !== undefined) {
if (learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
if (learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
let docs = {
@@ -651,7 +651,7 @@ exports.newSuperalgosBotModulesLearningSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeQuotedAssetBalance: learningEngine.learningCurrent.episode.episodeQuotedAsset.balance.value,
episodeQuotedAssetBalance: learningEngine.learningCurrent.learningEpisode.episodeQuotedAsset.balance.value,
sessionQuotedAssetMaximumBalance: sessionParameters.sessionQuotedAsset.config.maximumBalance
}
@@ -75,7 +75,7 @@ exports.newSuperalgosBotModulesLearningSystem = function (processIndex) {
This rate will later help plotting the error at the
charts.
*/
let rate = learningEngine.learningCurrent.episode.candle.close.value
let rate = learningEngine.learningCurrent.learningEpisode.candle.close.value
errorDataArray.push(rate)
learningSystem.errors.push(errorDataArray)
}
@@ -86,7 +86,7 @@ exports.newSuperalgosBotModulesLearningSystem = function (processIndex) {
This rate will later help plotting the warning at the
charts.
*/
let rate = learningEngine.learningCurrent.episode.candle.close.value
let rate = learningEngine.learningCurrent.learningEpisode.candle.close.value
warningDataArray.push(rate)
learningSystem.warnings.push(warningDataArray)
}
@@ -97,7 +97,7 @@ exports.newSuperalgosBotModulesLearningSystem = function (processIndex) {
This rate will later help plotting the warning at the
charts.
*/
let rate = learningEngine.learningCurrent.episode.candle.close.value
let rate = learningEngine.learningCurrent.learningEpisode.candle.close.value
infoDataArray.push(rate)
learningSystem.infos.push(infoDataArray)
}
@@ -207,7 +207,7 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
*/
switch (true) {
case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': {
if (tradingEngineOrder.orderStatistics.actualRate.value > tradingEngine.tradingCurrent.episode.candle.max.value) {
if (tradingEngineOrder.orderStatistics.actualRate.value > tradingEngine.tradingCurrent.tradingEpisode.candle.max.value) {
const message = 'Simulating - Actual Rate Too Hight'
let docs = {
@@ -218,23 +218,23 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
}
contextInfo = {
previousActualRate: tradingEngineOrder.orderStatistics.actualRate.value,
recalculatedActualRate: tradingEngine.tradingCurrent.episode.candle.max.value
recalculatedActualRate: tradingEngine.tradingCurrent.tradingEpisode.candle.max.value
}
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
tradingSystem.addWarning(
[
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.tradingCurrent.episode.candle.max.id],
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.tradingCurrent.tradingEpisode.candle.max.id],
message,
docs
]
)
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.tradingCurrent.episode.candle.max.value
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.max.value
}
break
}
case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': {
if (tradingEngineOrder.orderStatistics.actualRate.value < tradingEngine.tradingCurrent.episode.candle.min.value) {
if (tradingEngineOrder.orderStatistics.actualRate.value < tradingEngine.tradingCurrent.tradingEpisode.candle.min.value) {
const message = 'Simulating - Actual Rate Too Low'
let docs = {
@@ -245,18 +245,18 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
}
contextInfo = {
previousActualRate: tradingEngineOrder.orderStatistics.actualRate.value,
recalculatedActualRate: tradingEngine.tradingCurrent.episode.candle.max.value
recalculatedActualRate: tradingEngine.tradingCurrent.tradingEpisode.candle.max.value
}
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
tradingSystem.addWarning(
[
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.tradingCurrent.episode.candle.min.id],
[tradingEngineOrder.orderStatistics.actualRate.id, tradingEngine.tradingCurrent.tradingEpisode.candle.min.id],
message,
docs
]
)
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.tradingCurrent.episode.candle.min.value
tradingEngineOrder.orderStatistics.actualRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.min.value
}
break
}
@@ -390,13 +390,13 @@ exports.newSuperalgosBotModulesOrdersSimulations = function (processIndex) {
let orderWasHit
switch (tradingSystemOrder.type) {
case 'Limit Buy Order': {
if (tradingEngine.tradingCurrent.episode.candle.min.value <= tradingEngineOrder.orderStatistics.actualRate.value) {
if (tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <= tradingEngineOrder.orderStatistics.actualRate.value) {
orderWasHit = true
}
break
}
case 'Limit Sell Order': {
if (tradingEngine.tradingCurrent.episode.candle.max.value >= tradingEngineOrder.orderStatistics.actualRate.value) {
if (tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >= tradingEngineOrder.orderStatistics.actualRate.value) {
orderWasHit = true
}
break
@@ -294,7 +294,7 @@ exports.newSuperalgosBotModulesSnapshots = function (processIndex) {
let closeHeaders = ['Trade Number', 'Open Datetime', 'Close Datetime', 'Strategy Name', 'Trigger On Situation', 'Take Position Situation', 'Result In Base Asset', 'Result In Quoted Asset', 'ROI in Base Asset', 'ROI in Quoted Asset', 'Exit Type']
closeValues = [
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value, // Position Number
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.positions.value, // Position Number
(new Date(openDatetime)).toISOString(), // Open Datetime
(new Date(closeDatetime)).toISOString(), // Open Datetime
tradingEngine.tradingCurrent.strategy.strategyName.value, // Strategy Name
@@ -56,36 +56,36 @@ exports.newSuperalgosBotModulesTradingEngine = function (processIndex) {
}
function setCurrentCandle(candle) {
tradingEngine.tradingCurrent.episode.candle.begin.value = candle.begin
tradingEngine.tradingCurrent.episode.candle.end.value = candle.end
tradingEngine.tradingCurrent.episode.candle.open.value = candle.open
tradingEngine.tradingCurrent.episode.candle.close.value = candle.close
tradingEngine.tradingCurrent.episode.candle.min.value = candle.min
tradingEngine.tradingCurrent.episode.candle.max.value = candle.max
tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value = candle.begin
tradingEngine.tradingCurrent.tradingEpisode.candle.end.value = candle.end
tradingEngine.tradingCurrent.tradingEpisode.candle.open.value = candle.open
tradingEngine.tradingCurrent.tradingEpisode.candle.close.value = candle.close
tradingEngine.tradingCurrent.tradingEpisode.candle.min.value = candle.min
tradingEngine.tradingCurrent.tradingEpisode.candle.max.value = candle.max
}
function setCurrentCycle(cycle) {
tradingEngine.tradingCurrent.episode.cycle.value = cycle
tradingEngine.tradingCurrent.episode.cycle.lastBegin.value = tradingEngine.tradingCurrent.episode.cycle.begin.value
tradingEngine.tradingCurrent.episode.cycle.lastEnd.value = tradingEngine.tradingCurrent.episode.cycle.end.value
tradingEngine.tradingCurrent.tradingEpisode.cycle.value = cycle
tradingEngine.tradingCurrent.tradingEpisode.cycle.lastBegin.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.begin.value
tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.end.value
switch (cycle) {
case 'First': {
tradingEngine.tradingCurrent.episode.cycle.begin.value =
tradingEngine.tradingCurrent.episode.candle.begin.value +
tradingEngine.tradingCurrent.tradingEpisode.cycle.begin.value =
tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.episode.cycle.end.value =
tradingEngine.tradingCurrent.episode.candle.begin.value +
tradingEngine.tradingCurrent.tradingEpisode.cycle.end.value =
tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value +
sessionParameters.timeFrame.config.value / 2 - 1
break
}
case 'Second': {
tradingEngine.tradingCurrent.episode.cycle.begin.value =
tradingEngine.tradingCurrent.episode.candle.begin.value +
tradingEngine.tradingCurrent.tradingEpisode.cycle.begin.value =
tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value +
sessionParameters.timeFrame.config.value / 2
tradingEngine.tradingCurrent.episode.cycle.end.value =
tradingEngine.tradingCurrent.episode.candle.begin.value +
tradingEngine.tradingCurrent.tradingEpisode.cycle.end.value =
tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value +
sessionParameters.timeFrame.config.value * 4 / 4 - 1
break
@@ -96,11 +96,11 @@ exports.newSuperalgosBotModulesTradingEngine = function (processIndex) {
objects starting with lastBegin in zero to being saved on file. For that reason
we will do this:
*/
if (tradingEngine.tradingCurrent.episode.cycle.lastBegin.value === 0) {
tradingEngine.tradingCurrent.episode.cycle.lastBegin.value = tradingEngine.tradingCurrent.episode.cycle.begin.value
if (tradingEngine.tradingCurrent.tradingEpisode.cycle.lastBegin.value === 0) {
tradingEngine.tradingCurrent.tradingEpisode.cycle.lastBegin.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.begin.value
}
if (tradingEngine.tradingCurrent.episode.cycle.lastEnd.value === 0) {
tradingEngine.tradingCurrent.episode.cycle.lastEnd.value = tradingEngine.tradingCurrent.episode.cycle.end.value
if (tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value === 0) {
tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.end.value
}
}
@@ -49,69 +49,69 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
must be opened there, since it might happen that it is looping at the end of the market
or the task / session was restarted. We will only execute if the episode was never opened before.
*/
if (tradingEngine.tradingCurrent.episode.begin.value !== tradingEngine.tradingCurrent.episode.begin.config.initialValue) { return }
if (tradingEngine.tradingCurrent.tradingEpisode.begin.value !== tradingEngine.tradingCurrent.tradingEpisode.begin.config.initialValue) { return }
/* Starting begin and end */
tradingEngine.tradingCurrent.episode.begin.value = tradingEngine.tradingCurrent.episode.candle.begin.value
tradingEngine.tradingCurrent.episode.end.value = tradingEngine.tradingCurrent.episode.candle.end.value
tradingEngine.tradingCurrent.tradingEpisode.begin.value = tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value
tradingEngine.tradingCurrent.tradingEpisode.end.value = tradingEngine.tradingCurrent.tradingEpisode.candle.end.value
/* Getting the begin Balance from the session configuration */
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value = sessionParameters.sessionBaseAsset.config.initialBalance
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
/* The current balance is also the begin balance, that is how this starts. */
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value = sessionParameters.sessionBaseAsset.config.initialBalance
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value = sessionParameters.sessionQuotedAsset.config.initialBalance
/* Recording the opening at the Trading Engine Data Structure */
tradingEngine.tradingCurrent.episode.status.value = 'Open'
tradingEngine.tradingCurrent.episode.serialNumber.value = 1
tradingEngine.tradingCurrent.episode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngine.tradingCurrent.episode.beginRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.tradingEpisode.status.value = 'Open'
tradingEngine.tradingCurrent.tradingEpisode.serialNumber.value = 1
tradingEngine.tradingCurrent.tradingEpisode.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngine.tradingCurrent.tradingEpisode.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
function updateExitType(exitType) {
tradingEngine.tradingCurrent.episode.exitType.value = exitType
tradingEngine.tradingCurrent.tradingEpisode.exitType.value = exitType
}
function closeEpisode() {
tradingEngine.tradingCurrent.episode.status.value = 'Closed'
tradingEngine.tradingCurrent.episode.end.value = tradingEngine.tradingCurrent.episode.candle.end.value
tradingEngine.tradingCurrent.episode.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.episode.episodeBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
tradingEngine.tradingCurrent.tradingEpisode.status.value = 'Closed'
tradingEngine.tradingCurrent.tradingEpisode.end.value = tradingEngine.tradingCurrent.tradingEpisode.candle.end.value
tradingEngine.tradingCurrent.tradingEpisode.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
}
function resetEpisode() {
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.tradingCurrent.episode)
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.initializeNode(tradingEngine.tradingCurrent.learningEpisode)
}
function updateEnds() {
if (tradingEngine.tradingCurrent.episode.status.value === 'Open') {
tradingEngine.tradingCurrent.episode.end.value = tradingEngine.tradingCurrent.episode.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.episode.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.episode.episodeBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
if (tradingEngine.tradingCurrent.tradingEpisode.status.value === 'Open') {
tradingEngine.tradingCurrent.tradingEpisode.end.value = tradingEngine.tradingCurrent.tradingEpisode.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.tradingEpisode.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
}
}
function resetTradingEngineDataStructure() {
if (tradingEngine.tradingCurrent.episode.status.value === 'Closed') {
if (tradingEngine.tradingCurrent.tradingEpisode.status.value === 'Closed') {
resetEpisode()
}
}
function updateCounters() {
if (tradingEngine.tradingCurrent.episode.status.value === 'Open') {
tradingEngine.tradingCurrent.episode.episodeCounters.periods.value++
if (tradingEngine.tradingCurrent.tradingEpisode.status.value === 'Open') {
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.periods.value++
}
}
function updateStatistics() {
/* Daus Calculation */
tradingEngine.tradingCurrent.episode.episodeStatistics.days.value =
tradingEngine.tradingCurrent.episode.episodeCounters.periods.value *
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.periods.value *
sessionParameters.timeFrame.config.value /
TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
}
@@ -123,45 +123,45 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
function calculateAssetsStatistics() {
/* Updating Profit Loss */
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value -
sessionParameters.sessionBaseAsset.config.initialBalance
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value -
sessionParameters.sessionQuotedAsset.config.initialBalance
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value, 10)
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value, 10)
/*
Updating ROI
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
*/
tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value /
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * 100
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.ROI.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value /
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * 100
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.ROI.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value /
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value * 100
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.ROI.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value /
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value * 100
tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.ROI.value, 10)
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.ROI.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.ROI.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.ROI.value, 10)
/* Updating Hit Ratio */
if (tradingEngine.tradingCurrent.episode.episodeCounters.positions.value > 0) {
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitRatio.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hits.value /
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value
if (tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.positions.value > 0) {
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.hitRatio.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.hits.value /
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.positions.value
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitRatio.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hits.value /
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.hitRatio.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.hits.value /
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.positions.value
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitRatio.value, 10)
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitRatio.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.hitRatio.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.hitRatio.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.hitRatio.value, 10)
}
/*
@@ -169,94 +169,94 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
https://www.investopedia.com/terms/a/annualized-rate.asp
*/
tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.annualizedRateOfReturn.value =
Math.pow(
(
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value +
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value
) / tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value
) / tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value
,
(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)
(365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value)
) - 1
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.annualizedRateOfReturn.value =
Math.pow(
(
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
) / tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value
) / tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value
,
(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)
(365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value)
) - 1
tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.annualizedRateOfReturn.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.annualizedRateOfReturn.value, 10)
/* Updating Hit or Fail */
if (tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value > 0) {
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitFail.value = 'Hit'
if (tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value > 0) {
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.hitFail.value = 'Hit'
} else {
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hitFail.value = 'Fail'
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.hitFail.value = 'Fail'
}
if (tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value > 0) {
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitFail.value = 'Hit'
if (tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value > 0) {
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.hitFail.value = 'Hit'
} else {
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hitFail.value = 'Fail'
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.hitFail.value = 'Fail'
}
}
function calculateEpisodeStatistics() {
/* Updating Profit Loss */
tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.episode.candle.close.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.profitLoss.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.tradingEpisode.candle.close.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value
tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.profitLoss.value, 10)
/*
Updating ROI
https://www.investopedia.com/articles/basics/10/guide-to-calculating-roi.asp
*/
tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.ROI.value =
(
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.episode.endRate.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.tradingEpisode.endRate.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value
) / (
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.episode.beginRate.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.tradingEpisode.beginRate.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value
) * 100
tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeStatistics.ROI.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.ROI.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.ROI.value, 10)
/*
Updating Annualized Rate Of Return
https://www.investopedia.com/terms/a/annualized-rate.asp
*/
tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.annualizedRateOfReturn.value =
Math.pow(
(
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.episode.beginRate.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value +
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.tradingEpisode.beginRate.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value
) /
(
tradingEngine.tradingCurrent.episode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.episode.beginRate.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.beginBalance.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.beginBalance.value * tradingEngine.tradingCurrent.tradingEpisode.beginRate.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.beginBalance.value
)
,
(365 / tradingEngine.tradingCurrent.episode.episodeStatistics.days.value)
(365 / tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.days.value)
) - 1
tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeStatistics.annualizedRateOfReturn.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.annualizedRateOfReturn.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.annualizedRateOfReturn.value, 10)
/* Updating Hit or Fail */
if (tradingEngine.tradingCurrent.episode.episodeStatistics.profitLoss.value > 0) {
tradingEngine.tradingCurrent.episode.episodeStatistics.hitFail.value = 'Hit'
if (tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.profitLoss.value > 0) {
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.hitFail.value = 'Hit'
} else {
tradingEngine.tradingCurrent.episode.episodeStatistics.hitFail.value = 'Fail'
tradingEngine.tradingCurrent.tradingEpisode.episodeStatistics.hitFail.value = 'Fail'
}
}
}
@@ -264,57 +264,57 @@ exports.newSuperalgosBotModulesTradingEpisode = function (processIndex) {
function updateDistanceToEventsCounters() {
/* Keeping Distance Counters Up-to-date while avoinding counting before the first event happens. */
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOn.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.triggerOn.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOn.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.triggerOn.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.triggerOff.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.triggerOff.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.takePosition.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.takePosition.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.takePosition.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.takePosition.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.closePosition.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closePosition.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.closePosition.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closePosition.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.nextPhase.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.nextPhase.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.moveToPhase.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.moveToPhase.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.createOrder.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.createOrder.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.createOrder.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.createOrder.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.cancelOrder.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.cancelOrder.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.cancelOrder.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.cancelOrder.value++
}
if (
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value > 0
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value > 0
) {
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value++
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value++
}
}
}
@@ -121,7 +121,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
case 'Not Open': {
{
/* During the First cycle we can not create new orders. That is reserved for the Second cycle. */
if (tradingEngine.tradingCurrent.episode.cycle.value === 'First') { continue }
if (tradingEngine.tradingCurrent.tradingEpisode.cycle.value === 'First') { continue }
/* When the stage is closing we can not create new orders */
if (tradingEngineStage.status.value === 'Closing') { continue }
/*
@@ -156,7 +156,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
}
case 'Open': {
/* During the Second cycle we can not cancel orders. That is reserved for the First cycle. */
if (tradingEngine.tradingCurrent.episode.cycle.value === 'Second') { continue }
if (tradingEngine.tradingCurrent.tradingEpisode.cycle.value === 'Second') { continue }
/* Simulate Events that happens at the Exchange, if needed. */
simulateCheckExchangeEvents(tradingEngineStage, tradingSystemOrder, tradingEngineOrder)
@@ -354,17 +354,17 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
tradingEngineStage.stageQuotedAsset.sizePlaced.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngineStage.stageQuotedAsset.sizePlaced.value, 10)
/* Updating Episode Counters */
tradingEngine.tradingCurrent.episode.episodeCounters.orders.value++
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.orders.value++
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.createOrder.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.createOrder.value = 1
/* Create Order Procedure */
tradingEngineOrder.status.value = 'Open'
tradingEngineOrder.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngineOrder.begin.value = tradingEngine.tradingCurrent.episode.cycle.begin.value
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.episode.cycle.end.value
tradingEngineOrder.serialNumber.value = tradingEngine.tradingCurrent.episode.episodeCounters.orders.value
tradingEngineOrder.begin.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.begin.value
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.end.value
tradingEngineOrder.serialNumber.value = tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.orders.value
tradingEngineOrder.orderName.value = tradingSystemOrder.name
tradingEngineOrder.algorithmName.value = executionAlgorithm.name
tradingEngineOrder.situationName.value = situationName
@@ -390,7 +390,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
For Market Orders, the rate is irrelevant, since it is not sent to the Exchange.
We store at this field the last know price as a reference.
*/
tradingEngineOrder.rate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngineOrder.rate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
}
@@ -529,7 +529,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
switch (true) {
case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': {
if (
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value - tradingEngineOrder.orderQuotedAsset.size.value < 0
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value - tradingEngineOrder.orderQuotedAsset.size.value < 0
) {
const message = 'Possible Negative Balance'
let docs = {
@@ -540,26 +540,26 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
}
contextInfo = {
orderQuotedAssetSize: tradingEngineOrder.orderQuotedAsset.size.value,
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
}
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
tradingSystem.addWarning(
[
[tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.id, tradingEngineOrder.orderQuotedAsset.size.id],
[tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.id, tradingEngineOrder.orderQuotedAsset.size.id],
message,
docs
]
)
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
tradingEngineOrder.orderBaseAsset.size.value = tradingEngineOrder.orderQuotedAsset.size.value / tradingEngineOrder.rate.value
}
break
}
case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': {
if (
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value - tradingEngineOrder.orderBaseAsset.size.value < 0
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value - tradingEngineOrder.orderBaseAsset.size.value < 0
) {
const message = 'Possible Negative Balance'
let docs = {
@@ -570,19 +570,19 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
}
contextInfo = {
orderBaseAssetSize: tradingEngineOrder.orderBaseAsset.size.value,
episodeBaseAssetBalance: tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
episodeBaseAssetBalance: tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
}
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
tradingSystem.addWarning(
[
[tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.id, tradingEngineOrder.orderBaseAsset.size.id],
[tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.id, tradingEngineOrder.orderBaseAsset.size.id],
message,
docs
]
)
tradingEngineOrder.orderBaseAsset.size.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
tradingEngineOrder.orderBaseAsset.size.value = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngineOrder.orderBaseAsset.size.value * tradingEngineOrder.rate.value
}
break
@@ -674,7 +674,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
tradingEngineOrder.exitType.value = 'Filled'
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value = 1
await updateEndsWithCycle(tradingEngineOrder)
@@ -701,7 +701,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
tradingEngineOrder.status.value = 'Closed'
tradingEngineOrder.exitType.value = 'Closed at the Exchange'
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value = 1
await updateEndsWithCycle(tradingEngineOrder)
@@ -737,7 +737,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
tradingEngineOrder.exitType.value = 'Cancelled at the Exchange'
}
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value = 1
await updateEndsWithCycle(tradingEngineOrder)
@@ -808,7 +808,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
tradingEngineOrder.exitType.value = 'Filled'
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value = 1
updateEndsWithCycle(tradingEngineOrder)
@@ -961,24 +961,24 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': {
/* Balance Base Asset: Undo the previous accounting */
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value +
previousBaseAssetSizeFilled
/* Balance Base Asset: Account the current filling and fees */
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value -
tradingEngineOrder.orderBaseAsset.sizeFilled.value
/* Balance Quoted Asset: Undo the previous accounting */
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value -
previousQuotedAssetSizeFilled +
previousQuotedAssetFeesPaid
/* Balance Quoted Asset: Account the current filling and fees */
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value +
tradingEngineOrder.orderQuotedAsset.sizeFilled.value -
tradingEngineOrder.orderQuotedAsset.feesPaid.value
break
@@ -989,31 +989,31 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': {
/* Balance Base Asset: Undo the previous accounting */
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value -
previousBaseAssetSizeFilled +
previousBaseAssetFeesPaid
/* Balance Base Asset: Account the current filling and fees */
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value +
tradingEngineOrder.orderBaseAsset.sizeFilled.value -
tradingEngineOrder.orderBaseAsset.feesPaid.value
/* Balance Quoted Asset: Undo the previous accounting */
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value +
previousQuotedAssetSizeFilled
/* Balance Quoted Asset: Account the current filling and fees */
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value =
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value -
tradingEngineOrder.orderQuotedAsset.sizeFilled.value
break
}
}
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value, 10)
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value, 10)
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value, 10)
}
}
@@ -1040,7 +1040,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
tradingEngineOrder.exitType.value = exitType
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value = 1
updateEndsWithCycle(tradingEngineOrder)
@@ -1122,7 +1122,7 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
tradingEngineOrder.status.value = 'Closed'
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.closeOrder.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closeOrder.value = 1
await updateEndsWithCycle(tradingEngineOrder)
@@ -1238,12 +1238,12 @@ exports.newSuperalgosBotModulesTradingOrders = function (processIndex) {
function updateEnds(tradingEngineOrder) {
if (tradingEngineOrder.status.value === 'Open') {
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.episode.candle.end.value
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.tradingEpisode.candle.end.value
}
}
async function updateEndsWithCycle(tradingEngineOrder) {
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.episode.cycle.end.value
tradingEngineOrder.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.end.value
}
function updateCounters(tradingEngineOrder) {
@@ -40,7 +40,8 @@ exports.newSuperalgosBotModulesTradingOutput = function (processIndex) {
outputDatasetsMap,
timeFrameLabel,
tradingProcessDate,
fileStorage
fileStorage,
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.tradingEpisode.headOfTheMarket.value
)
await tradingSimulationModuleObject.runSimulation(
@@ -52,16 +52,16 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
function openPosition(situationName) {
/* Starting begin and end */
tradingEngine.tradingCurrent.position.begin.value = tradingEngine.tradingCurrent.episode.cycle.lastBegin.value
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
tradingEngine.tradingCurrent.position.begin.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastBegin.value
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value
/* Recording the opening at the Trading Engine Data Structure */
tradingEngine.tradingCurrent.position.status.value = 'Open'
tradingEngine.tradingCurrent.position.serialNumber.value = tradingEngine.tradingCurrent.episode.episodeCounters.positions.value + 1
tradingEngine.tradingCurrent.position.serialNumber.value = tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.positions.value + 1
tradingEngine.tradingCurrent.position.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngine.tradingCurrent.position.beginRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
tradingEngine.tradingCurrent.position.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
tradingEngine.tradingCurrent.position.situationName.value = situationName
/* Initializing Stop and Take Phase */
@@ -69,14 +69,14 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPhase.value = 1
/* Updating Episode Counters */
tradingEngine.tradingCurrent.episode.episodeCounters.positions.value++
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.positions.value++
/* Inicializing this counter */
tradingEngine.tradingCurrent.episode.distanceToEvent.takePosition.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.takePosition.value = 1
/* Remember the balance we had before taking the position to later calculate profit or loss */
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
}
function closingPosition(exitType) {
@@ -95,10 +95,10 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
function closePosition() {
tradingEngine.tradingCurrent.position.status.value = 'Closed'
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
tradingEngine.tradingCurrent.position.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.position.positionBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value
tradingEngine.tradingCurrent.position.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
tradingEngine.tradingCurrent.position.positionBaseAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
/*
Now that the position is closed, it is the right time to move this position from current to last at the Trading Engine data structure.
@@ -109,16 +109,16 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
/* Updating Hits & Fails */
if (tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value > 0) {
tradingEngine.tradingCurrent.episode.episodeBaseAsset.hits.value++
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.hits.value++
}
if (tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value < 0) {
tradingEngine.tradingCurrent.episode.episodeBaseAsset.fails.value++
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.fails.value++
}
if (tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value > 0) {
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.hits.value++
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.hits.value++
}
if (tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value < 0) {
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.fails.value++
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.fails.value++
}
}
@@ -163,10 +163,10 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
end of the position itself.
*/
node.begin.value =
tradingEngine.tradingCurrent.episode.candle.begin.value +
tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value +
sessionParameters.timeFrame.config.value
node.end.value =
tradingEngine.tradingCurrent.episode.candle.end.value +
tradingEngine.tradingCurrent.tradingEpisode.candle.end.value +
sessionParameters.timeFrame.config.value
}
@@ -405,9 +405,9 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
function updateEnds() {
if (tradingEngine.tradingCurrent.position.status.value === 'Open') {
tradingEngine.tradingCurrent.position.end.value = tradingEngine.tradingCurrent.position.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.position.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.position.positionBaseAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value
tradingEngine.tradingCurrent.position.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
tradingEngine.tradingCurrent.position.positionBaseAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value
tradingEngine.tradingCurrent.position.positionQuotedAsset.endBalance.value = tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value
}
}
@@ -431,11 +431,11 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
function calculateAssetsStatistics() {
/* Profit Loss Calculation */
tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value =
tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value -
tradingEngine.tradingCurrent.position.positionBaseAsset.beginBalance
tradingEngine.tradingCurrent.position.positionQuotedAsset.profitLoss.value =
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value -
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value -
tradingEngine.tradingCurrent.position.positionQuotedAsset.beginBalance
tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionBaseAsset.profitLoss.value, 10)
@@ -478,8 +478,8 @@ exports.newSuperalgosBotModulesTradingPosition = function (processIndex) {
/* Profit Loss Calculation */
tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value =
(
tradingEngine.tradingCurrent.episode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.position.endRate.value +
tradingEngine.tradingCurrent.episode.episodeQuotedAsset.profitLoss.value
tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.profitLoss.value * tradingEngine.tradingCurrent.position.endRate.value +
tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.profitLoss.value
)
tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value = TS.projects.superalgos.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngine.tradingCurrent.position.positionStatistics.profitLoss.value, 10)
@@ -57,7 +57,7 @@
This variable tell us which day we are standing at, specially while working
with Daily Files. From this Date is that we are going to load the Daily Files.
*/
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value =
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.tradingEpisode.processDate.value =
TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.tradingParameters.timeRange.config.initialDatetime).valueOf()
}
@@ -70,7 +70,7 @@
the simulation loop, once we discover that all candles from a certain date have benn processed.
Here is the point where we sync one and the other.
*/
let tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value)
let tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.tradingEpisode.processDate.value)
if (
await TS.projects.superalgos.functionLibraries.dataDependenciesFunctions.processSingleFiles(
@@ -151,7 +151,7 @@
use it to save Output Files and later the Data Ranges. This is the point where
the date calculated by the Simulation is applied at the Trading Process Level.
*/
tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value)
tradingProcessDate = TS.projects.superalgos.utilities.dateTimeFunctions.removeTime(TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.tradingEpisode.processDate.value)
if (checkStopTaskGracefully() === false) { break }
if (checkStopProcessing() === false) { break }
@@ -240,7 +240,7 @@
indicators to be built and continue the processing once this process is called
again.
*/
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.headOfTheMarket.value === true) {
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.tradingEpisode.headOfTheMarket.value === true) {
return false
}
}
@@ -58,13 +58,13 @@ exports.newSuperalgosBotModulesTradingRecords = function (processIndex) {
There are a few products configured to be saved only at an specific cycle.
*/
if (product.config.saveAtCycle !== undefined) {
if (tradingEngine.tradingCurrent.episode.cycle.value !== product.config.saveAtCycle) {
if (tradingEngine.tradingCurrent.tradingEpisode.cycle.value !== product.config.saveAtCycle) {
return
}
}
/* Clean the file from information of previous executions */
//pruneOutputFile(product, outputDatasetArray, tradingEngine.tradingCurrent.episode.candle.end.value)
//pruneOutputFile(product, outputDatasetArray, tradingEngine.tradingCurrent.tradingEpisode.candle.end.value)
/* Clean Open Records */
if (product.config.saveAsObjects === true) {
@@ -256,8 +256,8 @@ exports.newSuperalgosBotModulesTradingRecords = function (processIndex) {
of the day? Easy: the end of the candle must be 1 millisecod before the next day. That happens at any
time frame.
*/
let currentDay = new Date(tradingEngine.tradingCurrent.episode.candle.end.value)
let nextDay = new Date(tradingEngine.tradingCurrent.episode.candle.end.value + 1)
let currentDay = new Date(tradingEngine.tradingCurrent.tradingEpisode.candle.end.value)
let nextDay = new Date(tradingEngine.tradingCurrent.tradingEpisode.candle.end.value + 1)
if (currentDay.getUTCDate() !== nextDay.getUTCDate()) {
/*
We will save the object only if it is closed, becasuse we are at the last candle of the day.
@@ -55,7 +55,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
let dailyCandles = []
for (let i = 0; i < candles.length; i++) {
let candle = candles[i]
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.processDate.value) {
if (candle.begin >= TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.tradingEpisode.processDate.value) {
dailyCandles.push(candle)
}
}
@@ -99,7 +99,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
In this case we already have at the last candle index the next candle to be
processed. We will just continue with this candle.
*/
initialCandle = tradingEngine.tradingCurrent.episode.candle.index.value
initialCandle = tradingEngine.tradingCurrent.tradingEpisode.candle.index.value
}
/*
Main Simulation Loop
@@ -113,7 +113,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
loop is not empty, then the lascCandle() check will override this value
depending on if we really are at the head of the market or not.
*/
tradingEngine.tradingCurrent.episode.headOfTheMarket.value = true
tradingEngine.tradingCurrent.tradingEpisode.headOfTheMarket.value = true
/*
This is the main simulation loop. It will go through the initial candle
until one less than the last candle available. We will never process the last
@@ -121,10 +121,10 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
that still can change. So effectively will be processing all closed candles.
*/
for (let i = initialCandle; i < candles.length - 1; i++) {
tradingEngine.tradingCurrent.episode.candle.index.value = i
tradingEngine.tradingCurrent.tradingEpisode.candle.index.value = i
/* This is the current candle the Simulation is working at. */
let candle = candles[tradingEngine.tradingCurrent.episode.candle.index.value]
let candle = candles[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value]
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> Candle Begin @ ' + (new Date(candle.begin)).toUTCString())
@@ -210,7 +210,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
tradingEpisodeModuleObject.reset()
TS.projects.superalgos.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.reset()
let infoMessage = 'Processing candle # ' + tradingEngine.tradingCurrent.episode.candle.index.value + ' @ the ' + tradingEngine.tradingCurrent.episode.cycle.value + ' cycle.'
let infoMessage = 'Processing candle # ' + tradingEngine.tradingCurrent.tradingEpisode.candle.index.value + ' @ the ' + tradingEngine.tradingCurrent.tradingEpisode.cycle.value + ' cycle.'
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> ' + infoMessage)
@@ -222,8 +222,8 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
}
contextInfo = {
candleIndex: tradingEngine.tradingCurrent.episode.candle.index.value,
cycle: tradingEngine.tradingCurrent.episode.cycle.value
candleIndex: tradingEngine.tradingCurrent.tradingEpisode.candle.index.value,
cycle: tradingEngine.tradingCurrent.tradingEpisode.cycle.value
}
TS.projects.superalgos.utilities.docsFunctions.buildPlaceholder(docs, undefined, undefined, undefined, undefined, undefined, contextInfo)
@@ -302,7 +302,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
if (sessionParameters.heartbeats.config.date === true || sessionParameters.heartbeats.config.candleIndex === true) {
/* We will produce a simulation level heartbeat in order to inform the user this is running. */
heartBeatDate = new Date(Math.trunc(tradingEngine.tradingCurrent.episode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
heartBeatDate = new Date(Math.trunc(tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value / TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS) * TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS)
let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime)
let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime)
@@ -320,7 +320,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.superalgos.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2)
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + tradingEngine.tradingCurrent.episode.candle.index.value + ' @ ' + processingDate)
'[INFO] runSimulation -> loop -> Simulation ' + TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + tradingEngine.tradingCurrent.tradingEpisode.candle.index.value + ' @ ' + processingDate)
/* Logging to console and disk */
if (TS.projects.superalgos.utilities.dateTimeFunctions.areTheseDatesEqual(currentDate, new Date()) === false) {
@@ -344,7 +344,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
if (sessionParameters.heartbeats.config.date === true) {
hartbeatText = hartbeatText + currentDateString
}
hartbeatText = hartbeatText + ' Candle # ' + tradingEngine.tradingCurrent.episode.candle.index.value
hartbeatText = hartbeatText + ' Candle # ' + tradingEngine.tradingCurrent.tradingEpisode.candle.index.value
TS.projects.superalgos.functionLibraries.processFunctions.processHeartBeat(processIndex, hartbeatText, percentage)
}
}
@@ -448,15 +448,15 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
for (let i = 0; i < pArray.length; i++) {
element = pArray[i]
if (tradingEngine.tradingCurrent.episode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
if (tradingEngine.tradingCurrent.tradingEpisode.candle.end.value === element.end) { // when there is an exact match at the end we take that element
return element
} else {
if (
i > 0 &&
element.end > tradingEngine.tradingCurrent.episode.candle.end.value
element.end > tradingEngine.tradingCurrent.tradingEpisode.candle.end.value
) {
let previousElement = pArray[i - 1]
if (previousElement.end < tradingEngine.tradingCurrent.episode.candle.end.value) {
if (previousElement.end < tradingEngine.tradingCurrent.tradingEpisode.candle.end.value) {
return previousElement // If one elements goes into the future of currentCandle, then we stop and take the previous element.
} else {
return
@@ -485,7 +485,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
The second +1 is because we need to compare the next candle (remember that the loops allways avoid the
last candle of the dataset available.)
*/
if (tradingEngine.tradingCurrent.episode.candle.index.value + 1 + 1 === candles.length) {
if (tradingEngine.tradingCurrent.tradingEpisode.candle.index.value + 1 + 1 === candles.length) {
/*
When processing daily files, we need a mechanism to turn from one day to the next one.
That mechanism is the one implemented here. If we detect that the next candle is the last candle of
@@ -495,7 +495,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
let candlesPerDay = TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS / sessionParameters.timeFrame.config.value
if (
TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_PROCESSING_DAILY_FILES &&
tradingEngine.tradingCurrent.episode.candle.index.value + 1 + 1 === candlesPerDay
tradingEngine.tradingCurrent.tradingEpisode.candle.index.value + 1 + 1 === candlesPerDay
) {
/*
Here we found that the next candle of the dataset is the last candle of the day.
@@ -504,9 +504,9 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
the first candle of the new dataset we shall receive. The first candle of the next day starts
at index 0, so we will position the index now at zero.
*/
tradingEngine.tradingCurrent.episode.candle.index.value = 0
tradingEngine.tradingCurrent.episode.processDate.value =
tradingEngine.tradingCurrent.episode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
tradingEngine.tradingCurrent.tradingEpisode.candle.index.value = 0
tradingEngine.tradingCurrent.tradingEpisode.processDate.value =
tradingEngine.tradingCurrent.tradingEpisode.processDate.value + TS.projects.superalgos.globals.timeConstants.ONE_DAY_IN_MILISECONDS
return false
}
@@ -516,21 +516,21 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
next execution it will likely have more candles at the dataset. And if it does not,
it will just wait there until it does.
*/
tradingEngine.tradingCurrent.episode.headOfTheMarket.value = true
tradingEngine.tradingCurrent.episode.candle.index.value++
tradingEngine.tradingCurrent.tradingEpisode.headOfTheMarket.value = true
tradingEngine.tradingCurrent.tradingEpisode.candle.index.value++
return false
} else {
/* Wd did not reach the head of the market */
tradingEngine.tradingCurrent.episode.headOfTheMarket.value = false
tradingEngine.tradingCurrent.episode.candle.index.value++
tradingEngine.tradingCurrent.tradingEpisode.headOfTheMarket.value = false
tradingEngine.tradingCurrent.tradingEpisode.candle.index.value++
return true
}
}
function checkInitialDatetime() {
/* Here we check that the current candle is not before the initial datetime defined at the session parameters.*/
if (tradingEngine.tradingCurrent.episode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
if (tradingEngine.tradingCurrent.tradingEpisode.candle.end.value < sessionParameters.timeRange.config.initialDatetime) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle before the sessionParameters.timeRange.config.initialDatetime.')
return false
@@ -540,7 +540,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
function checkFinalDatetime() {
/* Here we check that the next candle is not after of the user-defined final datetime at the session parameters.*/
if (tradingEngine.tradingCurrent.episode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
if (tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value + sessionParameters.timeFrame.config.value > sessionParameters.timeRange.config.finalDatetime) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME,
'[INFO] runSimulation -> checkInitialAndFinalDatetime -> Skipping Candle after the sessionParameters.timeRange.config.finalDatetime.')
return false
@@ -558,10 +558,10 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
because there the balances have shifted from their resting position.
*/
let stopRunningDate = (new Date(tradingEngine.tradingCurrent.episode.candle.begin.value)).toUTCString()
let stopRunningDate = (new Date(tradingEngine.tradingCurrent.tradingEpisode.candle.begin.value)).toUTCString()
if (sessionParameters.sessionBaseAsset.config.minimumBalance !== undefined) {
if (tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
if (tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
let docs = {
@@ -573,7 +573,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeBaseAssetBalance: tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value,
episodeBaseAssetBalance: tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value,
sessionBaseAssetMinimumBalance: sessionParameters.sessionBaseAsset.config.minimumBalance
}
@@ -587,7 +587,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
}
if (sessionParameters.sessionBaseAsset.config.maximumBalance !== undefined) {
if (tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
if (tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
let docs = {
@@ -599,7 +599,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeBaseAssetBalance: tradingEngine.tradingCurrent.episode.episodeBaseAsset.balance.value,
episodeBaseAssetBalance: tradingEngine.tradingCurrent.tradingEpisode.episodeBaseAsset.balance.value,
sessionBaseAssetMaximumBalance: sessionParameters.sessionBaseAsset.config.maximumBalance
}
@@ -613,7 +613,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
}
if (sessionParameters.sessionQuotedAsset.config.minimumBalance !== undefined) {
if (tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
if (tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
let docs = {
@@ -625,7 +625,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value,
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value,
sessionQuotedAssetMinimumBalance: sessionParameters.sessionQuotedAsset.config.minimumBalance
}
@@ -639,7 +639,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
}
if (sessionParameters.sessionQuotedAsset.config.maximumBalance !== undefined) {
if (tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
if (tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
let docs = {
@@ -651,7 +651,7 @@ exports.newSuperalgosBotModulesTradingSimulation = function (processIndex) {
let contextInfo = {
timestamp: stopRunningDate,
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.episode.episodeQuotedAsset.balance.value,
episodeQuotedAssetBalance: tradingEngine.tradingCurrent.tradingEpisode.episodeQuotedAsset.balance.value,
sessionQuotedAssetMaximumBalance: sessionParameters.sessionQuotedAsset.config.maximumBalance
}
@@ -145,7 +145,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
tradingStrategyModuleObject.openStrategy(j, situation.name, strategy.name)
/* Initialize this */
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOn.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.triggerOn.value = 1
announcementsModuleObject.makeAnnoucements(triggerStage.triggerOn)
announcementsModuleObject.makeAnnoucements(triggerStage)
@@ -192,7 +192,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
tradingSystem.highlights.push(triggerStage.triggerOff.id)
tradingSystem.highlights.push(triggerStage.id)
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.triggerOff.value = 1
announcementsModuleObject.makeAnnoucements(triggerStage.triggerOff)
changeStageStatus('Trigger Stage', 'Closed', 'Trigger Off Event')
tradingStrategyModuleObject.closeStrategy('Trigger Off')
@@ -400,7 +400,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
function runManageStage() {
if (tradingEngine.tradingCurrent.episode.cycle.value !== 'First') { return }
if (tradingEngine.tradingCurrent.tradingEpisode.cycle.value !== 'First') { return }
runWhenStatusIsOpening()
runWhenStatusIsOpen()
@@ -572,7 +572,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
announcementsModuleObject.makeAnnoucements(nextPhaseEvent)
/* Reset this counter */
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.nextPhase.value = 1
return // only one event can pass at the time
}
}
@@ -623,7 +623,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
announcementsModuleObject.makeAnnoucements(moveToPhaseEvent)
/* Reset this counter */
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.moveToPhase.value = 1
return // only one event can pass at the time
}
}
@@ -679,7 +679,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
announcementsModuleObject.makeAnnoucements(nextPhaseEvent)
/* Reset this counter */
tradingEngine.tradingCurrent.episode.distanceToEvent.nextPhase.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.nextPhase.value = 1
return // only one event can pass at the time
}
}
@@ -730,7 +730,7 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
announcementsModuleObject.makeAnnoucements(moveToPhaseEvent)
/* Reset this counter */
tradingEngine.tradingCurrent.episode.distanceToEvent.moveToPhase.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.moveToPhase.value = 1
return // only one event can pass at the time
}
}
@@ -751,11 +751,11 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
if (
(
tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Above' &&
tradingEngine.tradingCurrent.episode.candle.max.value >= tradingEngine.tradingCurrent.position.stopLoss.value
tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >= tradingEngine.tradingCurrent.position.stopLoss.value
) ||
(
tradingEngine.tradingCurrent.position.stopLoss.stopLossPosition.value === 'Below' &&
tradingEngine.tradingCurrent.episode.candle.min.value <= tradingEngine.tradingCurrent.position.stopLoss.value
tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <= tradingEngine.tradingCurrent.position.stopLoss.value
)
) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Stop Loss was hit.')
@@ -771,11 +771,11 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
if (
(
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Below' &&
tradingEngine.tradingCurrent.episode.candle.min.value <= tradingEngine.tradingCurrent.position.takeProfit.value
tradingEngine.tradingCurrent.tradingEpisode.candle.min.value <= tradingEngine.tradingCurrent.position.takeProfit.value
) ||
(
tradingEngine.tradingCurrent.position.takeProfit.takeProfitPosition.value === 'Above' &&
tradingEngine.tradingCurrent.episode.candle.max.value >= tradingEngine.tradingCurrent.position.takeProfit.value
tradingEngine.tradingCurrent.tradingEpisode.candle.max.value >= tradingEngine.tradingCurrent.position.takeProfit.value
)
) {
TS.projects.superalgos.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] checkStopLossOrTakeProfitWasHit -> Take Profit was hit.')
@@ -933,8 +933,8 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
tradingStrategyModuleObject.closeStrategy('Position Closed')
/* Distance to Events Updates */
tradingEngine.tradingCurrent.episode.distanceToEvent.closePosition.value = 1
tradingEngine.tradingCurrent.episode.distanceToEvent.triggerOff.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.closePosition.value = 1
tradingEngine.tradingCurrent.tradingEpisode.distanceToEvent.triggerOff.value = 1
}
}
@@ -1073,15 +1073,15 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
*/
function openStage(stage) {
/* Recording the opening at the Trading Engine Data Structure */
stage.begin.value = tradingEngine.tradingCurrent.episode.cycle.lastBegin.value
stage.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
stage.beginRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
stage.begin.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastBegin.value
stage.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value
stage.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
function closeStage(stage) {
/* Recording the closing at the Trading Engine Data Structure */
stage.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
stage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
stage.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value
stage.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
}
@@ -1092,19 +1092,19 @@ exports.newSuperalgosBotModulesTradingStages = function (processIndex) {
*/
if (tradingEngine.tradingCurrent.strategyTriggerStage.status.value === 'Open') {
tradingEngine.tradingCurrent.strategyTriggerStage.end.value = tradingEngine.tradingCurrent.strategyTriggerStage.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.strategyTriggerStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.strategyTriggerStage.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
if (tradingEngine.tradingCurrent.strategyOpenStage.status.value === 'Open') {
tradingEngine.tradingCurrent.strategyOpenStage.end.value = tradingEngine.tradingCurrent.strategyOpenStage.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.strategyOpenStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.strategyOpenStage.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
if (tradingEngine.tradingCurrent.strategyManageStage.status.value === 'Open') {
tradingEngine.tradingCurrent.strategyManageStage.end.value = tradingEngine.tradingCurrent.strategyManageStage.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.strategyManageStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.strategyManageStage.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
if (tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Open') {
tradingEngine.tradingCurrent.strategyCloseStage.end.value = tradingEngine.tradingCurrent.strategyCloseStage.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.strategyCloseStage.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.strategyCloseStage.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
}
@@ -38,28 +38,28 @@ exports.newSuperalgosBotModulesTradingStrategy = function (processIndex) {
function openStrategy(index, situationName, strategyName) {
/* Starting begin and end */
tradingEngine.tradingCurrent.strategy.begin.value = tradingEngine.tradingCurrent.episode.cycle.lastBegin.value
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
tradingEngine.tradingCurrent.strategy.begin.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastBegin.value
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value
/* Recording the opening at the Trading Engine Data Structure */
tradingEngine.tradingCurrent.strategy.status.value = 'Open'
tradingEngine.tradingCurrent.strategy.serialNumber.value = tradingEngine.tradingCurrent.episode.episodeCounters.strategies.value
tradingEngine.tradingCurrent.strategy.serialNumber.value = tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.strategies.value
tradingEngine.tradingCurrent.strategy.identifier.value = TS.projects.superalgos.utilities.miscellaneousFunctions.genereteUniqueId()
tradingEngine.tradingCurrent.strategy.beginRate.value = tradingEngine.tradingCurrent.episode.candle.min.value
tradingEngine.tradingCurrent.strategy.beginRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.min.value
tradingEngine.tradingCurrent.strategy.index.value = index
tradingEngine.tradingCurrent.strategy.situationName.value = situationName
tradingEngine.tradingCurrent.strategy.strategyName.value = strategyName
/* Updating Episode Counters */
tradingEngine.tradingCurrent.episode.episodeCounters.strategies.value++
tradingEngine.tradingCurrent.tradingEpisode.episodeCounters.strategies.value++
}
function closeStrategy(exitType) {
tradingEngine.tradingCurrent.strategy.status.value = 'Closed'
tradingEngine.tradingCurrent.strategy.exitType.value = exitType
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.episode.cycle.lastEnd.value
tradingEngine.tradingCurrent.strategy.endRate.value = tradingEngine.tradingCurrent.episode.candle.min.value
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.tradingEpisode.cycle.lastEnd.value
tradingEngine.tradingCurrent.strategy.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.min.value
/*
Now that the strategy is closed, it is the right time to move this strategy from current to last at the Trading Engine data structure.
*/
@@ -69,7 +69,7 @@ exports.newSuperalgosBotModulesTradingStrategy = function (processIndex) {
function updateEnds() {
if (tradingEngine.tradingCurrent.strategy.status.value === 'Open') {
tradingEngine.tradingCurrent.strategy.end.value = tradingEngine.tradingCurrent.strategy.end.value + sessionParameters.timeFrame.config.value
tradingEngine.tradingCurrent.strategy.endRate.value = tradingEngine.tradingCurrent.episode.candle.close.value
tradingEngine.tradingCurrent.strategy.endRate.value = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
}
}
@@ -75,7 +75,7 @@ exports.newSuperalgosBotModulesTradingSystem = function (processIndex) {
This rate will later help plotting the error at the
charts.
*/
let rate = tradingEngine.tradingCurrent.episode.candle.close.value
let rate = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
errorDataArray.push(rate)
tradingSystem.errors.push(errorDataArray)
}
@@ -86,7 +86,7 @@ exports.newSuperalgosBotModulesTradingSystem = function (processIndex) {
This rate will later help plotting the warning at the
charts.
*/
let rate = tradingEngine.tradingCurrent.episode.candle.close.value
let rate = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
warningDataArray.push(rate)
tradingSystem.warnings.push(warningDataArray)
}
@@ -97,7 +97,7 @@ exports.newSuperalgosBotModulesTradingSystem = function (processIndex) {
This rate will later help plotting the warning at the
charts.
*/
let rate = tradingEngine.tradingCurrent.episode.candle.close.value
let rate = tradingEngine.tradingCurrent.tradingEpisode.candle.close.value
infoDataArray.push(rate)
tradingSystem.infos.push(infoDataArray)
}
@@ -19,7 +19,8 @@ exports.newSuperalgosFunctionLibrariesOutputManagementFunctions = function () {
outputDatasetsMap,
timeFrameLabel,
tradingProcessDate,
fileStorage
fileStorage,
headOfTheMarket
) {
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_PROCESSING_DAILY_FILES === true) {
/*
@@ -31,7 +32,7 @@ exports.newSuperalgosFunctionLibrariesOutputManagementFunctions = function () {
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).IS_SESSION_FIRST_LOOP === true && TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).IS_SESSION_RESUMING === false) {
await initializeOutputs()
} else {
if (TS.projects.superalgos.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine.tradingCurrent.episode.headOfTheMarket.value === true) {
if (headOfTheMarket === true) {
await loadFiles()
} else {
await initializeOutputs()
@@ -90,7 +90,7 @@ function newSuperalgosFunctionLibraryLearningSessionFunctions() {
'Learning Engine->' +
'Dynamic Indicators->Indicator Function->' +
'Learning Current->Learning Last->Previous->' +
'Episode->' +
'Learning Episode->' +
'Episode Base Asset->Episode Quoted Asset->Episode Counters->Episode Statistics->' +
'Strategies->Positions->Orders->Hits->Fails->' +
'Profit Loss->Hit Ratio->Hit Fail->Days->ROI->Annualized Rate Of Return->User Defined Statistic->' +
@@ -90,7 +90,7 @@ function newSuperalgosFunctionLibraryTradingSessionFunctions() {
'Trading Engine->' +
'Dynamic Indicators->Indicator Function->' +
'Trading Current->Trading Last->Previous->' +
'Episode->' +
'Trading Episode->' +
'Episode Base Asset->Episode Quoted Asset->Episode Counters->Episode Statistics->' +
'Strategies->Positions->Orders->Hits->Fails->' +
'Profit Loss->Hit Ratio->Hit Fail->Days->ROI->Annualized Rate Of Return->User Defined Statistic->' +