Latest iteration ready
This commit is contained in:
1 parent
81779c49a3
commit
8199198637
12 files changed
+594
-382
No files matched your search
+295
-181
@@ -3839,9 +3839,15 @@
|
||||
"propertyNameAtParent": "positionBaseAsset",
|
||||
"properties": [
|
||||
{
|
||||
"name": "size",
|
||||
"name": "entryTargetSize",
|
||||
"type": "node",
|
||||
"childType": "Size",
|
||||
"childType": "Entry Target Size",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "exitTargetSize",
|
||||
"type": "node",
|
||||
"childType": "Exit Target Size",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
@@ -3892,9 +3898,15 @@
|
||||
"propertyNameAtParent": "positionQuotedAsset",
|
||||
"properties": [
|
||||
{
|
||||
"name": "size",
|
||||
"name": "entryTargetSize",
|
||||
"type": "node",
|
||||
"childType": "Size",
|
||||
"childType": "Entry Target Size",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "exitTargetSize",
|
||||
"type": "node",
|
||||
"childType": "Exit Target Size",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
@@ -6042,9 +6054,15 @@
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "rate",
|
||||
"name": "entryTargetRate",
|
||||
"type": "node",
|
||||
"childType": "Rate",
|
||||
"childType": "Entry Target Rate",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "exitTargetRate",
|
||||
"type": "node",
|
||||
"childType": "Exit Target Rate",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
@@ -6144,11 +6162,79 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Position->Market Order->Limit Order->"
|
||||
"compatibleTypes": "->Market Order->Limit Order->"
|
||||
},
|
||||
"icon": "pantone",
|
||||
"propertyNameAtParent": "rate"
|
||||
},
|
||||
{
|
||||
"type": "Entry Target Rate",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Configure This",
|
||||
"label": "Configure This",
|
||||
"iconPathOn": "settings",
|
||||
"iconPathOff": "settings",
|
||||
"actionFunction": "uiObject.configEditor.activate"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"editors": {
|
||||
"config": true
|
||||
},
|
||||
"initialValues": {
|
||||
"config": "{\n\"initialValue\": 0\n}"
|
||||
},
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Position->"
|
||||
},
|
||||
"icon": "pantone",
|
||||
"propertyNameAtParent": "entryTargetRate"
|
||||
},
|
||||
{
|
||||
"type": "Exit Target Rate",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Configure This",
|
||||
"label": "Configure This",
|
||||
"iconPathOn": "settings",
|
||||
"iconPathOff": "settings",
|
||||
"actionFunction": "uiObject.configEditor.activate"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"editors": {
|
||||
"config": true
|
||||
},
|
||||
"initialValues": {
|
||||
"config": "{\n\"initialValue\": 0\n}"
|
||||
},
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Position->"
|
||||
},
|
||||
"icon": "pantone",
|
||||
"propertyNameAtParent": "exitTargetRate"
|
||||
},
|
||||
{
|
||||
"type": "Size",
|
||||
"menuItems": [
|
||||
@@ -6178,11 +6264,79 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Position->Order Base Asset->Order Quoted Asset->Position Base Asset->Position Quoted Asset->"
|
||||
"compatibleTypes": "->Order Base Asset->Order Quoted Asset->"
|
||||
},
|
||||
"icon": "upload",
|
||||
"propertyNameAtParent": "size"
|
||||
},
|
||||
{
|
||||
"type": "Entry Target Size",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Configure This",
|
||||
"label": "Configure This",
|
||||
"iconPathOn": "settings",
|
||||
"iconPathOff": "settings",
|
||||
"actionFunction": "uiObject.configEditor.activate"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"editors": {
|
||||
"config": true
|
||||
},
|
||||
"initialValues": {
|
||||
"config": "{\n\"initialValue\": 0\n}"
|
||||
},
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Position Base Asset->Position Quoted Asset->"
|
||||
},
|
||||
"icon": "upload",
|
||||
"propertyNameAtParent": "entryTargetSize"
|
||||
},
|
||||
{
|
||||
"type": "Exit Target Size",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Configure This",
|
||||
"label": "Configure This",
|
||||
"iconPathOn": "settings",
|
||||
"iconPathOff": "settings",
|
||||
"actionFunction": "uiObject.configEditor.activate"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"editors": {
|
||||
"config": true
|
||||
},
|
||||
"initialValues": {
|
||||
"config": "{\n\"initialValue\": 0\n}"
|
||||
},
|
||||
"addLeftIcons": true,
|
||||
"level": 3,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Position Base Asset->Position Quoted Asset->"
|
||||
},
|
||||
"icon": "upload",
|
||||
"propertyNameAtParent": "exitTargetSize"
|
||||
},
|
||||
{
|
||||
"type": "Size Placed",
|
||||
"menuItems": [
|
||||
@@ -8715,7 +8869,7 @@
|
||||
},
|
||||
"level": 4,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Position Size->Position Rate->Phase->Record Property->Simulated Actual Rate->Situation->"
|
||||
"compatibleTypes": "->Target Size In Base Asset->Target Size In Quoted Asset->Target Rate->Phase->Record Property->Simulated Actual Rate->Situation->"
|
||||
},
|
||||
"icon": "pipette",
|
||||
"propertyNameAtParent": "formula"
|
||||
@@ -9356,29 +9510,11 @@
|
||||
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#open-stage",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "initialDefinition",
|
||||
"label": "Add Initial Definition",
|
||||
"action": "Add Missing Children",
|
||||
"label": "Add Missing Items",
|
||||
"relatedUiObject": "Initial Definition",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "openExecution",
|
||||
"label": "Add Open Execution",
|
||||
"relatedUiObject": "Open Execution",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "closeStageEvent",
|
||||
"label": "Add Close Stage Event",
|
||||
"relatedUiObject": "Close Stage Event",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"label": "Add Announcement",
|
||||
@@ -9402,6 +9538,12 @@
|
||||
},
|
||||
"icon": "stage-open",
|
||||
"properties": [
|
||||
{
|
||||
"name": "initialTargets",
|
||||
"type": "node",
|
||||
"childType": "Initial Targets",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "initialDefinition",
|
||||
"type": "node",
|
||||
@@ -9512,28 +9654,57 @@
|
||||
"type": "node",
|
||||
"childType": "Initial Take Profit",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "positionSizeInBaseAsset",
|
||||
"type": "node",
|
||||
"childType": "Position Size In Base Asset",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "positionSizeInQuotedAsset",
|
||||
"type": "node",
|
||||
"childType": "Position Size In Quoted Asset",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "positionRate",
|
||||
"type": "node",
|
||||
"childType": "Position Rate",
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "initialDefinition"
|
||||
},
|
||||
{
|
||||
"type": "Initial Targets",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add Missing Children",
|
||||
"label": "Add Missing Items",
|
||||
"relatedUiObject": "Initial Definition",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"addLeftIcons": true,
|
||||
"level": 2,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Open Stage->Close Stage->"
|
||||
},
|
||||
"icon": "targeting",
|
||||
"properties": [
|
||||
{
|
||||
"name": "targetRate",
|
||||
"type": "node",
|
||||
"childType": "Target Rate",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "targetSizeInBaseAsset",
|
||||
"type": "node",
|
||||
"childType": "Target Size In Base Asset",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "targetSizeInQuotedAsset",
|
||||
"type": "node",
|
||||
"childType": "Target Size In Quoted Asset",
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "initialTargets"
|
||||
},
|
||||
{
|
||||
"type": "Managed Stop Loss",
|
||||
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#stop",
|
||||
@@ -9852,7 +10023,7 @@
|
||||
"propertyNameAtParent": "initialTakeProfit"
|
||||
},
|
||||
{
|
||||
"type": "Position Size In Base Asset",
|
||||
"type": "Target Size In Base Asset",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
@@ -9875,7 +10046,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 4,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Initial Definition->"
|
||||
"compatibleTypes": "->Initial Targets->"
|
||||
},
|
||||
"icon": "stage-open-position-size",
|
||||
"properties": [
|
||||
@@ -9886,10 +10057,10 @@
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "positionSizeInBaseAsset"
|
||||
"propertyNameAtParent": "targetSizeInBaseAsset"
|
||||
},
|
||||
{
|
||||
"type": "Position Size In Quoted Asset",
|
||||
"type": "Target Size In Quoted Asset",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
@@ -9912,7 +10083,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 4,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Initial Definition->"
|
||||
"compatibleTypes": "->Initial Targets->"
|
||||
},
|
||||
"icon": "stage-open-position-size",
|
||||
"properties": [
|
||||
@@ -9923,85 +10094,10 @@
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "positionSizeInQuotedAsset"
|
||||
"propertyNameAtParent": "targetSizeInQuotedAsset"
|
||||
},
|
||||
{
|
||||
"type": "Size In Base Asset",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "formula",
|
||||
"label": "Add Formula",
|
||||
"relatedUiObject": "Formula",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"addLeftIcons": true,
|
||||
"level": 4,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Execution Algorithm->"
|
||||
},
|
||||
"icon": "eos",
|
||||
"properties": [
|
||||
{
|
||||
"name": "formula",
|
||||
"type": "node",
|
||||
"childType": "Formula",
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "sizeInBaseAsset"
|
||||
},
|
||||
{
|
||||
"type": "Size In Quoted Asset",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "formula",
|
||||
"label": "Add Formula",
|
||||
"relatedUiObject": "Formula",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"addLeftIcons": true,
|
||||
"level": 4,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Execution Algorithm->"
|
||||
},
|
||||
"icon": "eos",
|
||||
"properties": [
|
||||
{
|
||||
"name": "formula",
|
||||
"type": "node",
|
||||
"childType": "Formula",
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "sizeInQuotedAsset"
|
||||
},
|
||||
{
|
||||
"type": "Position Rate",
|
||||
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#position-rate",
|
||||
"type": "Target Rate",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
@@ -10024,7 +10120,7 @@
|
||||
"addLeftIcons": true,
|
||||
"level": 5,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Initial Definition->Limit Buy Order->Limit Sell Order->"
|
||||
"compatibleTypes": "->Initial Targets->"
|
||||
},
|
||||
"icon": "stage-open-postion-rate",
|
||||
"properties": [
|
||||
@@ -10035,7 +10131,44 @@
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "positionRate"
|
||||
"propertyNameAtParent": "targetRate"
|
||||
},
|
||||
{
|
||||
"type": "Order Rate",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "formula",
|
||||
"label": "Add Formula",
|
||||
"relatedUiObject": "Formula",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"label": "Delete This",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"addLeftIcons": true,
|
||||
"level": 5,
|
||||
"chainAttachesTo": {
|
||||
"compatibleTypes": "->Limit Buy Order->Limit Sell Order->"
|
||||
},
|
||||
"icon": "stage-open-postion-rate",
|
||||
"properties": [
|
||||
{
|
||||
"name": "formula",
|
||||
"type": "node",
|
||||
"childType": "Formula",
|
||||
"autoAdd": true
|
||||
}
|
||||
],
|
||||
"propertyNameAtParent": "orderRate"
|
||||
},
|
||||
{
|
||||
"type": "Open Execution",
|
||||
@@ -10076,20 +10209,11 @@
|
||||
"type": "Execution Algorithm",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "sizeInBaseAsset",
|
||||
"label": "Add Size In Base Asset",
|
||||
"relatedUiObject": "Size In Base Asset",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "sizeInQuotedAsset",
|
||||
"label": "Add Size In Quoted Asset",
|
||||
"relatedUiObject": "Size In Quoted Asset",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
"action": "Configure This",
|
||||
"actionFunction": "uiObject.configEditor.activate",
|
||||
"label": "Configure This",
|
||||
"iconPathOn": "html",
|
||||
"iconPathOff": "html"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
@@ -10125,6 +10249,12 @@
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
}
|
||||
],
|
||||
"initialValues": {
|
||||
"config": "{\n\"percentageOfStageTargetSize\": 100 \n}"
|
||||
},
|
||||
"editors": {
|
||||
"config": true
|
||||
},
|
||||
"addLeftIcons": true,
|
||||
"level": 4,
|
||||
"chainAttachesTo": {
|
||||
@@ -10133,18 +10263,6 @@
|
||||
"icon": "execution-algorithm",
|
||||
"propertyNameAtParent": "executionAlgorithms",
|
||||
"properties": [
|
||||
{
|
||||
"name": "sizeInBaseAsset",
|
||||
"type": "node",
|
||||
"childType": "Size In Base Asset",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "sizeInQuotedAsset",
|
||||
"type": "node",
|
||||
"childType": "Size In Quoted Asset",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "marketBuyOrders",
|
||||
"type": "array",
|
||||
@@ -10204,7 +10322,7 @@
|
||||
}
|
||||
],
|
||||
"initialValues": {
|
||||
"config": "{\n\"positionSizePercentage\": 100, \n\"spawnMultipleOrders\": false \n}"
|
||||
"config": "{\n\"percentageOfAlgorithmSize\": 100, \n\"spawnMultipleOrders\": false \n}"
|
||||
},
|
||||
"editors": {
|
||||
"config": true
|
||||
@@ -10314,9 +10432,9 @@
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "positionRate",
|
||||
"label": "Add Position Rate",
|
||||
"relatedUiObject": "Position Rate",
|
||||
"propertyToCheckFor": "orderRate",
|
||||
"label": "Add Order Rate",
|
||||
"relatedUiObject": "Order Rate",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
@@ -10371,9 +10489,9 @@
|
||||
"propertyNameAtParent": "limitBuyOrders",
|
||||
"properties": [
|
||||
{
|
||||
"name": "positionRate",
|
||||
"name": "orderRate",
|
||||
"type": "node",
|
||||
"childType": "Position Rate",
|
||||
"childType": "Order Rate",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
@@ -10407,9 +10525,9 @@
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "positionRate",
|
||||
"label": "Add Position Rate",
|
||||
"relatedUiObject": "Position Rate",
|
||||
"propertyToCheckFor": "orderRate",
|
||||
"label": "Add Order Rate",
|
||||
"relatedUiObject": "Order Rate",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
@@ -10464,9 +10582,9 @@
|
||||
"propertyNameAtParent": "limitSellOrders",
|
||||
"properties": [
|
||||
{
|
||||
"name": "positionRate",
|
||||
"name": "orderRate",
|
||||
"type": "node",
|
||||
"childType": "Position Rate",
|
||||
"childType": "Order Rate",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
@@ -10807,11 +10925,9 @@
|
||||
"docURL": "https://docs.superalgos.org/suite-hierarchy-trading-system.html#close-stage",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "closeExecution",
|
||||
"label": "Add Close Execution",
|
||||
"relatedUiObject": "Close Execution",
|
||||
"action": "Add Missing Children",
|
||||
"label": "Add Missing Items",
|
||||
"relatedUiObject": "Initial Definition",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
@@ -10820,14 +10936,6 @@
|
||||
"relatedUiObject": "Announcement",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Add UI Object",
|
||||
"disableIfPropertyIsDefined": true,
|
||||
"propertyToCheckFor": "closeStageEvent",
|
||||
"label": "Add Close Stage Event",
|
||||
"relatedUiObject": "Close Stage Event",
|
||||
"actionFunction": "payload.onMenuItemClick"
|
||||
},
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
@@ -10845,6 +10953,12 @@
|
||||
},
|
||||
"icon": "stage-close",
|
||||
"properties": [
|
||||
{
|
||||
"name": "initialTargets",
|
||||
"type": "node",
|
||||
"childType": "Initial Targets",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "closeExecution",
|
||||
"type": "node",
|
||||
|
||||
@@ -27,15 +27,16 @@ function newSessionFunctions() {
|
||||
'Trading Strategy->' +
|
||||
'Trigger Stage->Trigger On Event->Trigger Off Event->Take Position Event->' +
|
||||
'Announcement->Announcement Formula->' +
|
||||
'Open Stage->Initial Definition->Open Execution->' +
|
||||
'Position Size In Base Asset->Position Size In Quoted Asset->Position Rate->Formula->' +
|
||||
'Initial Stop->Initial Take Profit->' +
|
||||
'Open Stage->' +
|
||||
'Initial Definition->Initial Stop->Initial Take Profit->' +
|
||||
'Manage Stage->' +
|
||||
'Managed Stop Loss->Managed Take Profit->' +
|
||||
'Phase->Formula->Next Phase Event->Move To Phase Event->Phase->' +
|
||||
'Situation->Condition->Javascript Code->' +
|
||||
'Close Stage->Close Execution->' +
|
||||
'Close Stage->' +
|
||||
'Initial Targets->Target Size In Base Asset->Target Size In Quoted Asset->Target Rate->Formula->' +
|
||||
'Announcement->Announcement Formula->' +
|
||||
'Open Execution->Close Execution->' +
|
||||
'Execution Algorithm->Market Buy Order->Market Sell Order->Limit Buy Order->Limit Sell Order->' +
|
||||
'Create Order Event->Cancel Order Event->' +
|
||||
'Size In Base Asset->Size In Quoted Asset->Position Rate->Formula->' +
|
||||
@@ -62,12 +63,12 @@ function newSessionFunctions() {
|
||||
'Serial Number->Identifier->Begin->End->Strategy Name->Index->Status->Begin Rate->End Rate->Situation Name->' +
|
||||
'Strategy Counters->Periods->' +
|
||||
'Position->' +
|
||||
'Serial Number->Identifier->Begin->End->Rate->Exit Type->Status->Begin Rate->End Rate->Situation Name->' +
|
||||
'Serial Number->Identifier->Begin->End->Entry Target Rate->Exit Target Rate->Exit Type->Status->Begin Rate->End Rate->Situation Name->' +
|
||||
'Stop Loss->Stop Loss Stage->Stop Loss Phase->Stop Loss Position->' +
|
||||
'Take Profit->Take Profit Stage->Take Profit Phase->Take Profit Position->' +
|
||||
'Position Counters->Periods->' +
|
||||
'Position Statistics->Days->User Defined Statistic->' +
|
||||
'Position Base Asset->Position Quoted Asset->Size->Profit Loss->ROI->Hit Fail->' +
|
||||
'Position Base Asset->Position Quoted Asset->Entry Target Size->Exit Target Size->Profit Loss->ROI->Hit Fail->' +
|
||||
'Formula->' +
|
||||
'Exchange Orders->Market Buy Orders->Market Sell Orders->Limit Buy Orders->Limit Sell Orders->' +
|
||||
'Market Order->Limit Order->' +
|
||||
|
||||
@@ -459,9 +459,9 @@ function newFloatingObject() {
|
||||
|
||||
function thisObjectPhysics() {
|
||||
// The radius also have a target.
|
||||
let ANIMATION_STEP = Math.abs(thisObject.targetRadius - thisObject.rawRadius) / 5
|
||||
let ANIMATION_STEP = Math.abs(thisObject.targetRadius - thisObject.rawRadius) / 2
|
||||
|
||||
if (ANIMATION_STEP === 0) { ANIMATION_STEP = 10 }
|
||||
if (ANIMATION_STEP === 0) { ANIMATION_STEP = thisObject.rawRadius }
|
||||
|
||||
if (Math.abs(thisObject.container.frame.radius - thisObject.targetRadius) >= ANIMATION_STEP) {
|
||||
if (thisObject.container.frame.radius < thisObject.targetRadius) {
|
||||
@@ -471,26 +471,30 @@ function newFloatingObject() {
|
||||
}
|
||||
|
||||
thisObject.container.eventHandler.raiseEvent('Dimmensions Changed', event)
|
||||
} else {
|
||||
thisObject.container.frame.radius = thisObject.targetRadius
|
||||
}
|
||||
|
||||
// The imageSize also have a target.
|
||||
|
||||
if (Math.abs(thisObject.currentImageSize - thisObject.targetImageSize) >= ANIMATION_STEP) {
|
||||
if (thisObject.currentImageSize < thisObject.targetImageSize) {
|
||||
thisObject.currentImageSize = thisObject.currentImageSize + ANIMATION_STEP
|
||||
} else {
|
||||
thisObject.currentImageSize = thisObject.currentImageSize - ANIMATION_STEP
|
||||
}
|
||||
} else {
|
||||
thisObject.currentImageSize = thisObject.targetImageSize
|
||||
}
|
||||
|
||||
// The fontSize also have a target.
|
||||
|
||||
if (Math.abs(thisObject.currentFontSize - thisObject.targetFontSize) >= ANIMATION_STEP / 10) {
|
||||
if (thisObject.currentFontSize < thisObject.targetFontSize) {
|
||||
thisObject.currentFontSize = thisObject.currentFontSize + ANIMATION_STEP / 10
|
||||
} else {
|
||||
thisObject.currentFontSize = thisObject.currentFontSize - ANIMATION_STEP / 10
|
||||
}
|
||||
} else {
|
||||
thisObject.currentFontSize = thisObject.targetFontSize
|
||||
}
|
||||
|
||||
if (Math.abs(thisObject.currentHierarchyRing - thisObject.targetHierarchyRing) >= ANIMATION_STEP) {
|
||||
@@ -499,10 +503,11 @@ function newFloatingObject() {
|
||||
} else {
|
||||
thisObject.currentHierarchyRing = thisObject.currentHierarchyRing - ANIMATION_STEP
|
||||
}
|
||||
} else {
|
||||
thisObject.currentHierarchyRing = thisObject.targetHierarchyRing
|
||||
}
|
||||
|
||||
/* Floating object position in screen coordinates */
|
||||
|
||||
thisObject.payload.position.x = thisObject.container.frame.position.x
|
||||
thisObject.payload.position.y = thisObject.container.frame.position.y
|
||||
}
|
||||
@@ -616,7 +621,7 @@ function newFloatingObject() {
|
||||
|
||||
thisObject.rawRadius = radius
|
||||
thisObject.targetRadius = radius
|
||||
thisObject.container.frame.radius = radius / 5
|
||||
thisObject.container.frame.radius = radius
|
||||
|
||||
thisObject.container.eventHandler.raiseEvent('Dimmensions Changed', event)
|
||||
}
|
||||
|
||||
@@ -1323,7 +1323,7 @@ function newUiObject() {
|
||||
position = canvas.floatingSpace.transformPointToMap(position)
|
||||
}
|
||||
|
||||
let radius = thisObject.container.frame.radius
|
||||
let radius = thisObject.payload.floatingObject.container.frame.radius
|
||||
/* Label Text */
|
||||
let labelPoint
|
||||
let fontSize = thisObject.payload.floatingObject.currentFontSize
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"type":"Data Mine","name":"Masters-Trading","config":"{ \n\"codeName\": \"Masters-Trading\"\n}","sensorBots":[],"indicatorBots":[],"tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"liveTradingWaitTime\": 0,\n \"paperTradingWaitTime\": 0,\n \"fordwardTestingWaitTime\": 0,\n \"backtestingWaitTime\": 0,\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","processOutput":{"type":"Process Output","name":"New Process Output","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","id":"6fc3054e-5034-4fc7-bddf-02360e0a6acf","savedPayload":{"position":{"x":15723.286067012163,"y":14691.452358358745},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"db063d7b-db05-4bf6-941f-999e1ccb38fc"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","id":"c3c2240f-514b-40de-825f-674037117d0b","savedPayload":{"position":{"x":15661.068828320313,"y":14534.623356920203},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"0764aaaf-d970-4f23-9df8-55fe5b7dd273"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","id":"1dfdfc0d-842f-4e63-a591-256ac8a06b0f","savedPayload":{"position":{"x":15605.684950713085,"y":14375.417211070198},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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","id":"39360c55-5ba8-413b-b0bd-cac3789ebf5f","savedPayload":{"position":{"x":15557.234264268895,"y":14214.013724663686},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"ba614415-6e4f-4979-97a5-34c72a59e67c","savedPayload":{"position":{"x":15515.806073587833,"y":14050.694613167838},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"1a2e3461-33e6-45b1-bcc1-c56a8c5d275c","savedPayload":{"position":{"x":15481.476972643579,"y":13885.757353327504},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"567e4dc9-4deb-41e4-9ac9-dde943fb91ba","savedPayload":{"position":{"x":15454.310482593217,"y":13719.505427234359},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"e94b9bb3-9f0c-4550-94e1-09de444780a8","savedPayload":{"position":{"x":15434.356886328966,"y":13552.245779307135},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"213b8fe8-f772-41ea-a3f5-97867be555f7"}}},{"type":"Output Dataset","name":"Multi-Period-Market Distance To Event","id":"a30e7306-7be9-41b6-Line truncated
|
||||
{"type":"Data Mine","name":"Masters-Trading","config":"{ \n\"codeName\": \"Masters-Trading\"\n}","sensorBots":[],"indicatorBots":[],"tradingBots":[{"type":"Trading Bot","name":"Low Frequency","config":"{\n\"codeName\": \"Low-Frequency\"\n}","processes":[{"type":"Process Definition","name":"Trading","config":"{\n \"codeName\": \"Trading\",\n \"liveTradingWaitTime\": 0,\n \"paperTradingWaitTime\": 0,\n \"fordwardTestingWaitTime\": 0,\n \"backtestingWaitTime\": 0,\n \"sessionRunWaitTime\": 5000,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Low-Frequency-Trading-Process\"\n }\n }","processOutput":{"type":"Process Output","name":"New Process Output","outputDatasets":[{"type":"Output Dataset","name":"Multi-Period-Market Episode Counters","id":"6fc3054e-5034-4fc7-bddf-02360e0a6acf","savedPayload":{"position":{"x":15723.286067012163,"y":14691.452358358745},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Market","id":"db063d7b-db05-4bf6-941f-999e1ccb38fc"}}},{"type":"Output Dataset","name":"Multi-Period-Daily Episode Counters","id":"c3c2240f-514b-40de-825f-674037117d0b","savedPayload":{"position":{"x":15661.068828320313,"y":14534.623356920203},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"0764aaaf-d970-4f23-9df8-55fe5b7dd273"}}},{"type":"Output Dataset","name":"Multi-Period-Market Episode Statistics","id":"1dfdfc0d-842f-4e63-a591-256ac8a06b0f","savedPayload":{"position":{"x":15605.684950713085,"y":14375.417211070198},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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","id":"39360c55-5ba8-413b-b0bd-cac3789ebf5f","savedPayload":{"position":{"x":15557.234264268895,"y":14214.013724663686},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"ba614415-6e4f-4979-97a5-34c72a59e67c","savedPayload":{"position":{"x":15515.806073587833,"y":14050.694613167838},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Candle","id":"1a2e3461-33e6-45b1-bcc1-c56a8c5d275c","savedPayload":{"position":{"x":15481.476972643579,"y":13885.757353327504},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"567e4dc9-4deb-41e4-9ac9-dde943fb91ba","savedPayload":{"position":{"x":15454.310482593217,"y":13719.505427234359},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"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 Current Balance","id":"e94b9bb3-9f0c-4550-94e1-09de444780a8","savedPayload":{"position":{"x":15434.356886328966,"y":13552.245779307135},"targetPosition":{"x":19339.49171426391,"y":13174.630201482603},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Period-Daily","id":"213b8fe8-f772-41ea-a3f5-97867be555f7"}}},{"type":"Output Dataset","name":"Multi-Period-Market Distance To Event","id":"a30e7306-7be9-41b6-Line truncated
|
||||
@@ -1 +1 @@
|
||||
{"type":"Workspace","name":"Beta 6 - Testing WHB","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"8081\"\n}","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","exchangeDataProducts":[{"type":"Exchange Data Products","name":"Binance","singleMarketData":[{"type":"Single Market Data","name":"Binance BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"dd7c8795-bb24-4438-9d77-b37a9000ad7f","savedPayload":{"position":{"x":23357.055360727853,"y":29739.13668562185},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles","id":"fe6065ec-4d2d-47a0-bae0-8647f0e195d7"}}},{"type":"Data Product","name":"Volumes","id":"98e6c917-f4b7-4b71-9215-de3ccaf3dc0c","savedPayload":{"position":{"x":23291.030236843966,"y":29662.131374764274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"1a366aef-efef-470e-88e0-2a6fbe4dd91f"}}},{"type":"Data Product","name":"Candles Channels","id":"1d7dd537-5f6f-4eb2-8e56-ddba0aef720f","savedPayload":{"position":{"x":23231.77091792585,"y":29579.512296539906},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels","id":"8c81d378-0947-4e9d-be25-58e69120152e"}}},{"type":"Data Product","name":"Candles Channels Objects","id":"221c8d22-8a7f-4014-a7ed-0bafc886b123","savedPayload":{"position":{"x":23179.942027683566,"y":29492.078725813997},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels Objects","id":"ba5dbb67-2030-42a0-9ff8-1ee80874f047"}}},{"type":"Data Product","name":"Bollinger Bands","id":"6929ebe7-6486-4299-add5-ed0282500d91","savedPayload":{"position":{"x":23135.872351370694,"y":29400.352192197388},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4a3ed8eb-a73e-4fb4-835a-681cf47d7373","savedPayload":{"position":{"x":23099.965969252025,"y":29305.112951112584},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"5ffc6a67-e33b-422b-8e36-f9711f93c723","savedPayload":{"position":{"x":23072.49341713892,"y":29207.0453495464},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"48f7953c-f62d-4292-b042-d1ac05f8f80f","savedPayload":{"position":{"x":23053.683458829226,"y":29106.890611883788},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}},{"type":"Data Product","name":"Popular SMAs","id":"3b9a3c93-6d41-440e-89a2-2fd1b2dde603","savedPayload":{"position":{"x":23043.701100505998,"y":29005.50001492274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen"Line truncated
|
||||
{"type":"Workspace","name":"Beta 6 - Testing WHB","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"8081\"\n}","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","exchangeDataProducts":[{"type":"Exchange Data Products","name":"Binance","singleMarketData":[{"type":"Single Market Data","name":"Binance BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"dd7c8795-bb24-4438-9d77-b37a9000ad7f","savedPayload":{"position":{"x":23357.055360727853,"y":29739.13668562185},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles","id":"fe6065ec-4d2d-47a0-bae0-8647f0e195d7"}}},{"type":"Data Product","name":"Volumes","id":"98e6c917-f4b7-4b71-9215-de3ccaf3dc0c","savedPayload":{"position":{"x":23291.030236843966,"y":29662.131374764274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"1a366aef-efef-470e-88e0-2a6fbe4dd91f"}}},{"type":"Data Product","name":"Candles Channels","id":"1d7dd537-5f6f-4eb2-8e56-ddba0aef720f","savedPayload":{"position":{"x":23231.77091792585,"y":29579.512296539906},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels","id":"8c81d378-0947-4e9d-be25-58e69120152e"}}},{"type":"Data Product","name":"Candles Channels Objects","id":"221c8d22-8a7f-4014-a7ed-0bafc886b123","savedPayload":{"position":{"x":23179.942027683566,"y":29492.078725813997},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels Objects","id":"ba5dbb67-2030-42a0-9ff8-1ee80874f047"}}},{"type":"Data Product","name":"Bollinger Bands","id":"6929ebe7-6486-4299-add5-ed0282500d91","savedPayload":{"position":{"x":23135.872351370694,"y":29400.352192197388},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4a3ed8eb-a73e-4fb4-835a-681cf47d7373","savedPayload":{"position":{"x":23099.965969252025,"y":29305.112951112584},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"5ffc6a67-e33b-422b-8e36-f9711f93c723","savedPayload":{"position":{"x":23072.49341713892,"y":29207.0453495464},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"48f7953c-f62d-4292-b042-d1ac05f8f80f","savedPayload":{"position":{"x":23053.683458829226,"y":29106.890611883788},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}},{"type":"Data Product","name":"Popular SMAs","id":"3b9a3c93-6d41-440e-89a2-2fd1b2dde603","savedPayload":{"position":{"x":23043.701100505998,"y":29005.50001492274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen"Line truncated
|
||||
@@ -1 +0,0 @@
|
||||
{"type":"Workspace","name":"Beta 6","rootNodes":[{"type":"Network","name":"Superalgos","networkNodes":[{"type":"Network Node","name":"My Computer","config":"{ \n\"host\": \"localhost\", \n\"webPort\": \"34248\", \n\"webSocketsPort\": \"8081\"\n}","dataStorage":{"type":"Data Storage","name":"New Data Storage","sessionIndependentData":{"type":"Session Independent Data","name":"New Session Independent Data","exchangeDataProducts":[{"type":"Exchange Data Products","name":"Binance","singleMarketData":[{"type":"Single Market Data","name":"Binance BTC/USDT","dataProducts":[{"type":"Data Product","name":"Candles","id":"dd7c8795-bb24-4438-9d77-b37a9000ad7f","savedPayload":{"position":{"x":23357.055360727853,"y":29739.13668562185},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles","id":"fe6065ec-4d2d-47a0-bae0-8647f0e195d7"}}},{"type":"Data Product","name":"Volumes","id":"98e6c917-f4b7-4b71-9215-de3ccaf3dc0c","savedPayload":{"position":{"x":23291.030236843966,"y":29662.131374764274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Volumes","id":"1a366aef-efef-470e-88e0-2a6fbe4dd91f"}}},{"type":"Data Product","name":"Candles Channels","id":"1d7dd537-5f6f-4eb2-8e56-ddba0aef720f","savedPayload":{"position":{"x":23231.77091792585,"y":29579.512296539906},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels","id":"8c81d378-0947-4e9d-be25-58e69120152e"}}},{"type":"Data Product","name":"Candles Channels Objects","id":"221c8d22-8a7f-4014-a7ed-0bafc886b123","savedPayload":{"position":{"x":23179.942027683566,"y":29492.078725813997},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Candles Channels Objects","id":"ba5dbb67-2030-42a0-9ff8-1ee80874f047"}}},{"type":"Data Product","name":"Bollinger Bands","id":"6929ebe7-6486-4299-add5-ed0282500d91","savedPayload":{"position":{"x":23135.872351370694,"y":29400.352192197388},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Bands","id":"29088877-8d63-4217-8d34-8742afc262f4"}}},{"type":"Data Product","name":"Percentage Bandwidth","id":"4a3ed8eb-a73e-4fb4-835a-681cf47d7373","savedPayload":{"position":{"x":23099.965969252025,"y":29305.112951112584},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Percentage Bandwidth","id":"3b7885a0-cd72-4a3f-a38b-3dc8c47bd068"}}},{"type":"Data Product","name":"Bollinger Channels Objects","id":"5ffc6a67-e33b-422b-8e36-f9711f93c723","savedPayload":{"position":{"x":23072.49341713892,"y":29207.0453495464},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Channels Objects","id":"1f111f72-624f-4166-9f99-ab8d785d5267"}}},{"type":"Data Product","name":"Bollinger Sub-Channels Objects","id":"48f7953c-f62d-4292-b042-d1ac05f8f80f","savedPayload":{"position":{"x":23053.683458829226,"y":29106.890611883788},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":true,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false},"referenceParent":{"type":"Product Definition","name":"Bollinger Sub-Channels Objects","id":"080c87fc-4546-4482-ab11-180a33f6d9ab"}}},{"type":"Data Product","name":"Popular SMAs","id":"3b9a3c93-6d41-440e-89a2-2fd1b2dde603","savedPayload":{"position":{"x":23043.701100505998,"y":29005.50001492274},"targetPosition":{"x":24208.69903024272,"y":28943.27543890267},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollLine truncated
|
||||
@@ -80,7 +80,7 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
let tradingSystemOrder = orders[i]
|
||||
|
||||
/* Trading System Validations */
|
||||
if (tradingSystemOrder.config.positionSizePercentage === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.positionSizePercentage === undefined', tradingSystemOrder) }
|
||||
if (tradingSystemOrder.config.percentageOfAlgorithmSize === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.percentageOfAlgorithmSize === undefined', tradingSystemOrder) }
|
||||
if (tradingSystemOrder.referenceParent === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.referenceParent === undefined', tradingSystemOrder) }
|
||||
|
||||
let tradingEngineOrder = tradingEngineModule.getNodeById(tradingSystemOrder.referenceParent.id)
|
||||
@@ -204,11 +204,13 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
tradingEngineOrder.situationName.value = situationName
|
||||
|
||||
function calculateOrderRate() {
|
||||
/* Order Rate Calculation */
|
||||
tradingEngineOrder.rate.value = tradingEngine.current.position.rate.value // By default this is the order rate.
|
||||
if (tradingSystemOrder.positionRate !== undefined) {
|
||||
if (tradingSystemOrder.positionRate.formula !== undefined) {
|
||||
tradingEngineOrder.rate.value = tradingSystem.formulas.get(tradingSystemOrder.positionRate.formula.id)
|
||||
/* By default this is the order rate and it is the rate that applies to Market Orders */
|
||||
tradingEngineOrder.rate.value = tradingEngine.current.candle.close.value
|
||||
|
||||
/* Optional Rate Definition */
|
||||
if (tradingSystemOrder.orderRate !== undefined) {
|
||||
if (tradingSystemOrder.orderRate.formula !== undefined) {
|
||||
tradingEngineOrder.rate.value = tradingSystem.formulas.get(tradingSystemOrder.orderRate.formula.id)
|
||||
|
||||
if (tradingEngineOrder.rate.value === undefined) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value === undefined', tradingEngineOrder) }
|
||||
if (isNaN(tradingEngineOrder.rate.value) === true) { badDefinitionUnhandledException(undefined, 'isNaN(tradingEngineOrder.rate.value) === true', tradingEngineOrder) }
|
||||
@@ -220,45 +222,24 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
}
|
||||
|
||||
function calculateOrderSize() {
|
||||
/*
|
||||
If the position size was defined in Base Asset, then
|
||||
the algorithm needs to define its size also in Base Asset.
|
||||
The same if it was deined in Quoted Asset.
|
||||
*/
|
||||
let sizeFormula
|
||||
if (tradingEngine.current.position.positionBaseAsset.size.value > 0) {
|
||||
/* Position was defined in Base Asset */
|
||||
if (executionAlgorithm.sizeInBaseAsset === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInBaseAsset === undefined', executionAlgorithm) }
|
||||
if (executionAlgorithm.sizeInBaseAsset.formula === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInBaseAsset.formula === undefined', executionAlgorithm.sizeInBaseAsset) }
|
||||
sizeFormula = executionAlgorithm.sizeInBaseAsset.formula
|
||||
} else {
|
||||
/* Position was defined in Quoted Asset */
|
||||
if (executionAlgorithm.sizeInQuotedAsset === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInQuotedAsset === undefined', executionAlgorithm) }
|
||||
if (executionAlgorithm.sizeInQuotedAsset.formula === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInQuotedAsset.formula === undefined', executionAlgorithm.sizeInBaseAsset) }
|
||||
sizeFormula = executionAlgorithm.sizeInQuotedAsset.formula
|
||||
}
|
||||
/* Validate that this config exists */
|
||||
if (executionAlgorithm.config.percentageOfStageTargetSize === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.config.percentageOfStageTargetSize === undefined', executionAlgorithm) }
|
||||
if (isNaN(executionAlgorithm.config.percentageOfStageTargetSize) === true) { badDefinitionUnhandledException(undefined, 'isNaN(executionAlgorithm.config.percentageOfStageTargetSize) === true', executionAlgorithm) }
|
||||
|
||||
/* Order Size Calculation */
|
||||
let algorithmSize = tradingSystem.formulas.get(sizeFormula.id)
|
||||
if (algorithmSize === undefined) { badDefinitionUnhandledException(undefined, 'algorithmSize === undefined', sizeFormula) }
|
||||
if (isNaN(algorithmSize) === true) { badDefinitionUnhandledException(undefined, 'isNaN(algorithmSize) === true', sizeFormula) }
|
||||
let algorithmSizeInBaseAsset = tradingEngineStage.stageBaseAsset.targetSize.value * executionAlgorithm.config.percentageOfStageTargetSize / 100
|
||||
let algorithmSizeInQuotedAsset = tradingEngineStage.stageQuotedAsset.targetSize.value * executionAlgorithm.config.percentageOfStageTargetSize / 100
|
||||
|
||||
/* Validate that this config exists */
|
||||
if (tradingSystemOrder.config.positionSizePercentage === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.positionSizePercentage === undefined', executionAlgorithm) }
|
||||
if (tradingSystemOrder.config.percentageOfAlgorithmSize === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.percentageOfAlgorithmSize === undefined', tradingSystemOrder) }
|
||||
if (isNaN(tradingSystemOrder.config.percentageOfAlgorithmSize) === true) { badDefinitionUnhandledException(undefined, 'isNaN(tradingSystemOrder.config.percentageOfAlgorithmSize) === true', tradingSystemOrder) }
|
||||
|
||||
if (tradingEngine.current.position.positionBaseAsset.size.value > 0) {
|
||||
/* Position was defined in Base Asset */
|
||||
tradingEngineOrder.orderBaseAsset.size.value = algorithmSize * tradingSystemOrder.config.positionSizePercentage / 100
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngineOrder.orderBaseAsset.size.value * tradingEngineOrder.rate.value
|
||||
} else {
|
||||
/* Position was defined in Quoted Asset */
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = algorithmSize * tradingSystemOrder.config.positionSizePercentage / 100
|
||||
tradingEngineOrder.orderBaseAsset.size.value = tradingEngineOrder.orderQuotedAsset.size.value / tradingEngineOrder.rate.value
|
||||
}
|
||||
tradingEngineOrder.orderBaseAsset.size.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.size.value, 10)
|
||||
tradingEngineOrder.orderBaseAsset.size.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.size.value, 10)
|
||||
/* Size in Base Asset */
|
||||
tradingEngineOrder.orderBaseAsset.size.value = algorithmSizeInBaseAsset * tradingSystemOrder.config.percentageOfAlgorithmSize / 100
|
||||
|
||||
/* Check against the Stage Size Limit */
|
||||
/* Size in Quoted Asset */
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = algorithmSizeInQuotedAsset * tradingSystemOrder.config.percentageOfAlgorithmSize / 100
|
||||
|
||||
/* Check that the Size calculated would not surpass Stage Target Size */
|
||||
if (
|
||||
tradingEngineOrder.orderBaseAsset.size.value + tradingEngineStage.stageBaseAsset.sizePlaced.value >
|
||||
tradingEngineStage.stageBaseAsset.targetSize.value
|
||||
@@ -271,6 +252,9 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
) {
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngineStage.stageQuotedAsset.targetSize.value - tradingEngineStage.stageQuotedAsset.sizePlaced.value
|
||||
}
|
||||
|
||||
tradingEngineOrder.orderBaseAsset.size.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.size.value, 10)
|
||||
tradingEngineOrder.orderQuotedAsset.size.value = global.PRECISE(tradingEngineOrder.orderQuotedAsset.size.value, 10)
|
||||
}
|
||||
|
||||
async function createOrderAtExchange(tradingSystemOrder, tradingEngineOrder) {
|
||||
@@ -319,7 +303,9 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
}
|
||||
|
||||
/* Filter by what is defined at the Strategy */
|
||||
if (tradingSystemOrder.simulatedExchangeEvents === undefined) { return }
|
||||
if (tradingSystemOrder.simulatedExchangeEvents === undefined) {
|
||||
badDefinitionUnhandledException(undefined, 'tradingSystemOrder.simulatedExchangeEvents === undefined', tradingSystemOrder)
|
||||
}
|
||||
|
||||
let previousBaseAssetSizeFilled = tradingEngineOrder.orderBaseAsset.sizeFilled.value
|
||||
let previousQuotedAssetSizeFilled = tradingEngineOrder.orderQuotedAsset.sizeFilled.value
|
||||
@@ -481,11 +467,11 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
function sizeFilledSimulation() {
|
||||
/* Size Filled */
|
||||
tradingEngineOrder.orderBaseAsset.sizeFilled.value =
|
||||
tradingEngineOrder.orderBaseAsset.size.value *
|
||||
(tradingEngineOrder.orderBaseAsset.size.value - tradingEngineOrder.orderBaseAsset.feesPaid.value) *
|
||||
tradingEngineOrder.orderStatistics.percentageFilled.value / 100
|
||||
|
||||
tradingEngineOrder.orderQuotedAsset.sizeFilled.value =
|
||||
tradingEngineOrder.orderQuotedAsset.size.value *
|
||||
(tradingEngineOrder.orderQuotedAsset.size.value - tradingEngineOrder.orderQuotedAsset.feesPaid.value) *
|
||||
tradingEngineOrder.orderStatistics.percentageFilled.value / 100
|
||||
|
||||
tradingEngineOrder.orderBaseAsset.sizeFilled.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.sizeFilled.value, 10)
|
||||
|
||||
@@ -11,7 +11,7 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
|
||||
applyTakeProfitFormula: applyTakeProfitFormula,
|
||||
updateStopLoss: updateStopLoss,
|
||||
updateTakeProfit: updateTakeProfit,
|
||||
initializePositionSizeAndRate: initializePositionSizeAndRate,
|
||||
initialTargets: initialTargets,
|
||||
updateEnds: updateEnds,
|
||||
updateStatus: updateStatus,
|
||||
updateCounters: updateCounters,
|
||||
@@ -100,93 +100,122 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
|
||||
tradingEngine.current.position.takeProfit.takeProfitStage.value = stage
|
||||
}
|
||||
|
||||
function initializePositionSizeAndRate() {
|
||||
function initialTargets(stageNode) {
|
||||
|
||||
setPositionSize()
|
||||
setPositionRate()
|
||||
if (stageNode.initialTargets === undefined) {
|
||||
const message = 'Stage without Initial Targets node. Add one please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode)
|
||||
}
|
||||
|
||||
tradingEngine.current.position.beginRate.value = tradingEngine.current.position.rate.value
|
||||
setTargetRate()
|
||||
setTargetSize()
|
||||
|
||||
function setPositionSize() {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
|
||||
/* Basic Validation */
|
||||
if (
|
||||
strategy.openStage.initialDefinition.positionSizeInBaseAsset !== undefined &&
|
||||
strategy.openStage.initialDefinition.positionSizeInQuotedAsset !== undefined
|
||||
) {
|
||||
const errorText = 'Only Position Size In Base Asset or Position Size In Quoted Asset is allowed. Remove one of them please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.id, errorText])
|
||||
throw (errorText)
|
||||
function setTargetRate() {
|
||||
if (stageNode.initialTargets.targetRate === undefined) {
|
||||
const message = 'Target Rate Node not Found. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets)
|
||||
}
|
||||
if (stageNode.initialTargets.targetRate.formula === undefined) {
|
||||
const message = 'Formula of Target Rate Node not Found. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetRate)
|
||||
}
|
||||
|
||||
/* Position In Base Asset */
|
||||
if (strategy.openStage.initialDefinition.positionSizeInBaseAsset !== undefined) {
|
||||
if (strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula !== undefined) {
|
||||
let value = tradingSystem.formulas.get(strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula.id)
|
||||
if (value === undefined) {
|
||||
const errorText = 'Position Size In Base Asset cannot be undefined. Fix this please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula.id, errorText])
|
||||
throw (errorText)
|
||||
}
|
||||
if (value === undefined) {
|
||||
const errorText = 'Position Size In Base Asset cannot be zero. Fix this please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInBaseAsset.formula.id, errorText])
|
||||
throw (errorText)
|
||||
}
|
||||
tradingEngine.current.position.positionBaseAsset.size.value = global.PRECISE(value, 10)
|
||||
} else {
|
||||
const errorText = 'You need to specify a Formula for this.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInBaseAsset.id, errorText])
|
||||
throw (errorText)
|
||||
let value = tradingSystem.formulas.get(stageNode.initialTargets.targetRate.formula.id)
|
||||
if (value === undefined) {
|
||||
const message = 'Target Rate can not be undefined. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetRate.formula)
|
||||
}
|
||||
if (isNaN(value)) {
|
||||
const message = 'Target Rate must be a number. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetRate.formula)
|
||||
}
|
||||
|
||||
switch (stageNode.type) {
|
||||
case 'Open Stage': {
|
||||
tradingEngine.current.position.entryTargetRate.value = global.PRECISE(value, 10)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
/* Position In Quoted Asset */
|
||||
if (strategy.openStage.initialDefinition.positionSizeInQuotedAsset !== undefined) {
|
||||
if (strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula !== undefined) {
|
||||
let value = tradingSystem.formulas.get(strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula.id)
|
||||
if (value === undefined) {
|
||||
const errorText = 'Position Size In Quoted Asset cannot be undefined. Fix this please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula.id, errorText])
|
||||
throw (errorText)
|
||||
}
|
||||
if (value === undefined) {
|
||||
const errorText = 'Position Size In Quoted Asset cannot be zero. Fix this please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInQuotedAsset.formula.id, errorText])
|
||||
throw (errorText)
|
||||
}
|
||||
tradingEngine.current.position.positionQuotedAsset.size.value = global.PRECISE(value, 10)
|
||||
} else {
|
||||
const errorText = 'You need to specify a Formula for this.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionSizeInQuotedAsset.id, errorText])
|
||||
throw (errorText)
|
||||
case 'Close Stage': {
|
||||
tradingEngine.current.position.exitTargetRate.value = global.PRECISE(value, 10)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setPositionRate() {
|
||||
let strategy = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value]
|
||||
|
||||
if (strategy.openStage.initialDefinition.positionRate === undefined) {
|
||||
const errorText = 'Position Rate Node not Found. Fix this please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.id, errorText])
|
||||
throw (errorText)
|
||||
}
|
||||
if (strategy.openStage.initialDefinition.positionRate.formula === undefined) {
|
||||
const errorText = 'Formula of Position Rate Node not Found. Fix this please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionRate.id, errorText])
|
||||
throw (errorText)
|
||||
function setTargetSize() {
|
||||
/* Basic Validation */
|
||||
if (
|
||||
stageNode.initialTargets.targetSizeInBaseAsset !== undefined &&
|
||||
stageNode.initialTargets.targetSizeInQuotedAsset !== undefined
|
||||
) {
|
||||
const message = 'Only Target Size In Base Asset or Target Size In Quoted Asset is allowed. Remove one of them please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode)
|
||||
}
|
||||
|
||||
let value = tradingSystem.formulas.get(strategy.openStage.initialDefinition.positionRate.formula.id)
|
||||
if (value === undefined) {
|
||||
const errorText = 'Position Rate can not be undefined. Fix this please.'
|
||||
tradingSystem.errors.push([strategy.openStage.initialDefinition.positionRate.formula.id, errorText])
|
||||
throw (errorText)
|
||||
/* Position In Base Asset */
|
||||
if (stageNode.initialTargets.targetSizeInBaseAsset !== undefined) {
|
||||
if (stageNode.initialTargets.targetSizeInBaseAsset.formula !== undefined) {
|
||||
let value = tradingSystem.formulas.get(stageNode.initialTargets.targetSizeInBaseAsset.formula.id)
|
||||
if (value === undefined) {
|
||||
const message = 'Target Size In Base Asset cannot be undefined. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInBaseAsset.formula)
|
||||
}
|
||||
if (value === undefined) {
|
||||
const message = 'Target Size In Base Asset cannot be zero. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInBaseAsset.formula)
|
||||
}
|
||||
|
||||
switch (stageNode.type) {
|
||||
case 'Open Stage': {
|
||||
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value = global.PRECISE(value, 10)
|
||||
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value =
|
||||
global.PRECISE(value * tradingEngine.current.position.entryTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
case 'Close Stage': {
|
||||
tradingEngine.current.position.positionBaseAsset.exitTargetSize.value = global.PRECISE(value, 10)
|
||||
tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value =
|
||||
global.PRECISE(value * tradingEngine.current.position.exitTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const message = 'You need to specify a Formula for this.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInBaseAsset)
|
||||
}
|
||||
}
|
||||
|
||||
tradingEngine.current.position.rate.value = value
|
||||
/* Position In Quoted Asset */
|
||||
if (stageNode.initialTargets.targetSizeInQuotedAsset !== undefined) {
|
||||
if (stageNode.initialTargets.targetSizeInQuotedAsset.formula !== undefined) {
|
||||
let value = tradingSystem.formulas.get(stageNode.initialTargets.targetSizeInQuotedAsset.formula.id)
|
||||
if (value === undefined) {
|
||||
const message = 'Target Size In Quoted Asset cannot be undefined. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInQuotedAsset.formula)
|
||||
}
|
||||
if (value === undefined) {
|
||||
const message = 'Target Size In Quoted Asset cannot be zero. Fix this please.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInQuotedAsset.formula)
|
||||
}
|
||||
switch (stageNode.type) {
|
||||
case 'Open Stage': {
|
||||
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value = global.PRECISE(value, 10)
|
||||
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value =
|
||||
global.PRECISE(value / tradingEngine.current.position.entryTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
case 'Close Stage': {
|
||||
tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value = global.PRECISE(value, 10)
|
||||
tradingEngine.current.position.positionBaseAsset.exitTargetSize.value =
|
||||
global.PRECISE(value / tradingEngine.current.position.exitTargetRate.value, 10)
|
||||
break
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const errorText = 'You need to specify a Formula for this.'
|
||||
badDefinitionUnhandledException(undefined, message, stageNode.initialTargets.targetSizeInQuotedAsset.formula)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,11 +262,11 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
|
||||
/* ROI Calculation */
|
||||
tradingEngine.current.position.positionBaseAsset.ROI.value =
|
||||
tradingEngine.current.position.positionBaseAsset.profitLoss.value * 100 /
|
||||
tradingEngine.current.position.positionBaseAsset.size.value
|
||||
tradingEngine.current.position.positionBaseAsset.entryTargetSize.value
|
||||
|
||||
tradingEngine.current.position.positionQuotedAsset.ROI.value =
|
||||
tradingEngine.current.position.positionQuotedAsset.profitLoss.value * 100 /
|
||||
tradingEngine.current.position.positionQuotedAsset.size.value
|
||||
tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value
|
||||
|
||||
tradingEngine.current.position.positionBaseAsset.ROI.value = global.PRECISE(tradingEngine.current.position.positionBaseAsset.ROI.value, 10)
|
||||
|
||||
@@ -253,4 +282,17 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
|
||||
tradingEngine.current.position.positionQuotedAsset.hitFail.value = 'FAIL'
|
||||
}
|
||||
}
|
||||
|
||||
function badDefinitionUnhandledException(err, message, node) {
|
||||
tradingSystem.errors.push([node.id, message])
|
||||
|
||||
logger.write(MODULE_NAME, "[ERROR] -> " + message);
|
||||
logger.write(MODULE_NAME, "[ERROR] -> node.name = " + node.name);
|
||||
logger.write(MODULE_NAME, "[ERROR] -> node.type = " + node.type);
|
||||
logger.write(MODULE_NAME, "[ERROR] -> node.config = " + JSON.stringify(node.config));
|
||||
if (err !== undefined) {
|
||||
logger.write(MODULE_NAME, "[ERROR] -> err.stack = " + err.stack);
|
||||
}
|
||||
throw 'It is not safe to continue with a Definition Error like this. Please fix the problem and try again.'
|
||||
}
|
||||
}
|
||||
@@ -343,9 +343,10 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
tradingEngine.previous.balance.baseAsset.value = tradingEngine.current.balance.baseAsset.value
|
||||
tradingEngine.previous.balance.quotedAsset.value = tradingEngine.current.balance.quotedAsset.value
|
||||
|
||||
/* Position size and rate */
|
||||
tradingPositionModule.initializePositionSizeAndRate()
|
||||
initializeOpenStageSizeTarget()
|
||||
/* Entry Position size and rate */
|
||||
tradingSystem.evalFormulas(stageNode, 'Initial Targets')
|
||||
tradingPositionModule.initialTargets(stageNode)
|
||||
initializeStageTargetSize()
|
||||
|
||||
/* Check Execution at open stage node */
|
||||
tradingSystem.evalConditions(stageNode, 'Open Execution')
|
||||
@@ -381,16 +382,36 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
tradingEngine.current.strategyOpenStage
|
||||
)
|
||||
/*
|
||||
The Open is finished when the fillSize + feesPaid reaches the Position Size.
|
||||
This can happens at any time when we update the sizeFilled value when we see
|
||||
at the exchange that orders were filled.
|
||||
The Open is finished when the placedSize reaches the targetSize in any of the
|
||||
stage assets, and the fillSize + feesPaid reaches the placedSize also in any
|
||||
of the stage Assets.
|
||||
This can happens at any time when we update the sizeFilled and the feesPaid values
|
||||
when we see at the exchange that orders were filled.
|
||||
*/
|
||||
if (
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value * 0.999) {
|
||||
(
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced >=
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize
|
||||
|
||||
||
|
||||
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizePlaced >=
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize
|
||||
)
|
||||
&&
|
||||
(
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value
|
||||
|
||||
||
|
||||
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizePlaced.value
|
||||
)
|
||||
) {
|
||||
changeStageStatus('Open Stage', 'Closed', 'Position Size Filled')
|
||||
initializeCloseStageSizeTarget()
|
||||
} else {
|
||||
/* Check the Close Stage Event */
|
||||
tradingSystem.evalConditions(stageNode, 'Close Stage Event')
|
||||
@@ -409,63 +430,51 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
let stageNode = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].openStage
|
||||
let executionNode = stageNode.openExecution
|
||||
|
||||
/* Check if there are unfilled orders */
|
||||
if (
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value <
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value * 0.999) {
|
||||
/* There are unfilled orders, we will check if they were executed, and cancel the ones that were not. */
|
||||
/*
|
||||
Check if there are unfilled orders, we will check if they were executed,
|
||||
and cancel the ones that were not.
|
||||
*/
|
||||
tradingSystem.evalConditions(stageNode, 'Open Execution')
|
||||
tradingSystem.evalFormulas(stageNode, 'Open Execution')
|
||||
|
||||
tradingSystem.evalConditions(stageNode, 'Open Execution')
|
||||
tradingSystem.evalFormulas(stageNode, 'Open Execution')
|
||||
|
||||
await tradingExecutionModule.runExecution(
|
||||
executionNode,
|
||||
true,
|
||||
tradingEngine.current.strategyOpenStage
|
||||
)
|
||||
}
|
||||
await tradingExecutionModule.runExecution(
|
||||
executionNode,
|
||||
true,
|
||||
tradingEngine.current.strategyOpenStage
|
||||
)
|
||||
|
||||
/*
|
||||
The Closing is finished when the fillSize + feesPaid reaches the ordersSize.
|
||||
This can happens either because we update the sizeFilled value when we see
|
||||
at the exchange that orders were filled, or we reduce the ordersSize when
|
||||
we cancel not yet filled orders.
|
||||
we cancel not yet filled orders. Here it does not matter the targetSize since
|
||||
this status represent a force closure of this stage.
|
||||
*/
|
||||
if (
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value * 0.999) {
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.sizePlaced.value
|
||||
|
||||
||
|
||||
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizePlaced.value
|
||||
) {
|
||||
changeStageStatus('Open Stage', 'Closed')
|
||||
initializeCloseStageSizeTarget()
|
||||
}
|
||||
}
|
||||
|
||||
function initializeOpenStageSizeTarget() {
|
||||
function initializeStageTargetSize() {
|
||||
/*
|
||||
Here we will transform the position size into targets for each asset of the stage.
|
||||
*/
|
||||
if (tradingEngine.current.position.positionBaseAsset.size.value > 0) {
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value = tradingEngine.current.position.positionBaseAsset.size.value
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value =
|
||||
tradingEngine.current.position.positionBaseAsset.size.value * tradingEngine.current.position.rate.value
|
||||
} else {
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value = tradingEngine.current.position.positionQuotedAsset.size.value
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value =
|
||||
tradingEngine.current.position.positionQuotedAsset.size.value / tradingEngine.current.position.rate.value
|
||||
}
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value = tradingEngine.current.position.positionBaseAsset.entryTargetSize.value
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value = tradingEngine.current.position.positionQuotedAsset.entryTargetSize.value
|
||||
|
||||
tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyOpenStage.stageBaseAsset.targetSize.value, 10)
|
||||
tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyOpenStage.stageQuotedAsset.targetSize.value, 10)
|
||||
}
|
||||
|
||||
function initializeCloseStageSizeTarget() {
|
||||
/*
|
||||
Here we will move the size filled of the open stage to the size target of the close stage.
|
||||
*/
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value = tradingEngine.current.strategyOpenStage.stageBaseAsset.sizeFilled.value
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value = tradingEngine.current.strategyOpenStage.stageQuotedAsset.sizeFilled.value
|
||||
}
|
||||
}
|
||||
|
||||
function runManageStage() {
|
||||
@@ -577,7 +586,7 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
the Position Rate, and we assign the values Above or Below to it.
|
||||
*/
|
||||
if (tradingEngine.current.position.stopLoss.stopLossPosition.value === tradingEngine.current.position.stopLoss.stopLossPosition.config.initialValue) {
|
||||
if (tradingEngine.current.position.stopLoss.value > tradingEngine.current.position.rate.value) {
|
||||
if (tradingEngine.current.position.stopLoss.value > tradingEngine.current.position.entryTargetRate.value) {
|
||||
tradingEngine.current.position.stopLoss.stopLossPosition.value = 'Above'
|
||||
} else {
|
||||
tradingEngine.current.position.stopLoss.stopLossPosition.value = 'Below'
|
||||
@@ -593,7 +602,7 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
the Position Rates, and we assign the values Above or Below to it.
|
||||
*/
|
||||
if (tradingEngine.current.position.takeProfit.takeProfitPosition.value === tradingEngine.current.position.takeProfit.takeProfitPosition.config.initialValue) {
|
||||
if (tradingEngine.current.position.takeProfit.value > tradingEngine.current.position.rate.value) {
|
||||
if (tradingEngine.current.position.takeProfit.value > tradingEngine.current.position.entryTargetRate.value) {
|
||||
tradingEngine.current.position.takeProfit.takeProfitPosition.value = 'Above'
|
||||
} else {
|
||||
tradingEngine.current.position.takeProfit.takeProfitPosition.value = 'Below'
|
||||
@@ -876,6 +885,13 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
the total filled size of the Open Stage. By skiping execution now
|
||||
we allow the open stage to get a final value for sizeFilled that we can use.
|
||||
*/
|
||||
let stageNode = tradingSystem.tradingStrategies[tradingEngine.current.strategy.index.value].closeStage
|
||||
|
||||
/* Exit Position size and rate */
|
||||
tradingSystem.evalFormulas(stageNode, 'Initial Targets')
|
||||
tradingPositionModule.initialTargets(stageNode)
|
||||
|
||||
initializeStageTargetSize()
|
||||
changeStageStatus('Close Stage', 'Open')
|
||||
return
|
||||
}
|
||||
@@ -898,14 +914,35 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
)
|
||||
|
||||
/*
|
||||
The Close Stage is finished when the fillSize + feesPaid reaches the Open Fill Size.
|
||||
This can happens at any time when we update the sizeFilled value when we see
|
||||
at the exchange that orders were filled.
|
||||
The Open is finished when the placedSize reaches the targetSize in any of the
|
||||
stage assets, and the fillSize + feesPaid reaches the placedSize also in any
|
||||
of the stage Assets.
|
||||
This can happens at any time when we update the sizeFilled and the feesPaid values
|
||||
when we see at the exchange that orders were filled.
|
||||
*/
|
||||
if (
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizePlaced.value * 0.999) {
|
||||
(
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizePlaced >=
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize
|
||||
|
||||
||
|
||||
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.sizePlaced >=
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize
|
||||
)
|
||||
&&
|
||||
(
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.sizePlaced.value
|
||||
|
||||
||
|
||||
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.sizeFilled.value +
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.feesPaid.value >=
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.sizePlaced.value
|
||||
)
|
||||
) {
|
||||
changeStageStatus('Close Stage', 'Closed', 'Size Placed Filled')
|
||||
} else {
|
||||
/* Check the Close Stage Event */
|
||||
@@ -942,6 +979,17 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
exitPositionAndStrategy()
|
||||
}
|
||||
|
||||
function initializeStageTargetSize() {
|
||||
/*
|
||||
Here we will transform the position size into targets for each asset of the stage.
|
||||
*/
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value = tradingEngine.current.position.positionBaseAsset.exitTargetSize.value
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value = tradingEngine.current.position.positionQuotedAsset.exitTargetSize.value
|
||||
|
||||
tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyCloseStage.stageBaseAsset.targetSize.value, 10)
|
||||
tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value = global.PRECISE(tradingEngine.current.strategyCloseStage.stageQuotedAsset.targetSize.value, 10)
|
||||
}
|
||||
|
||||
function exitPositionAndStrategy() {
|
||||
|
||||
/* Position Statistics & Results */
|
||||
@@ -1187,15 +1235,18 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
|
||||
function updateStatus() {
|
||||
if (tradingEngine.current.strategyTriggerStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyTriggerStage)
|
||||
resetStage(tradingEngine.current.strategyTriggerStage.status)
|
||||
}
|
||||
if (tradingEngine.current.strategyOpenStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyOpenStage)
|
||||
resetStage(tradingEngine.current.strategyOpenStage.status)
|
||||
}
|
||||
if (tradingEngine.current.strategyManageStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyManageStage)
|
||||
resetStage(tradingEngine.current.strategyManageStage.status)
|
||||
}
|
||||
if (tradingEngine.current.strategyCloseStage.status.value === 'Closed') {
|
||||
resetStage(tradingEngine.current.strategyTriggerStage)
|
||||
resetStage(tradingEngine.current.strategyOpenStage)
|
||||
resetStage(tradingEngine.current.strategyManageStage)
|
||||
resetStage(tradingEngine.current.strategyCloseStage)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,17 +118,31 @@ exports.newTradingSystem = function newTradingSystem(bot, logger, tradingEngineM
|
||||
}
|
||||
|
||||
async function run() {
|
||||
/* Run the Trigger Stage */
|
||||
tradingStagesModule.runTriggerStage()
|
||||
try {
|
||||
/* Run the Trigger Stage */
|
||||
tradingStagesModule.runTriggerStage()
|
||||
|
||||
/* Run the Open Stage */
|
||||
await tradingStagesModule.runOpenStage()
|
||||
/* Run the Open Stage */
|
||||
await tradingStagesModule.runOpenStage()
|
||||
|
||||
/* Run the Manage Stage */
|
||||
tradingStagesModule.runManageStage()
|
||||
/* Run the Manage Stage */
|
||||
tradingStagesModule.runManageStage()
|
||||
|
||||
/* Run the Close Stage */
|
||||
await tradingStagesModule.runCloseStage()
|
||||
/* Run the Close Stage */
|
||||
await tradingStagesModule.runCloseStage()
|
||||
} catch (err) {
|
||||
/*
|
||||
If an error ocurred during execution, it was alreeady logged and
|
||||
included at the errors array. That means we need to do nothing here,
|
||||
just prevent the execution to be halted for not handling exceptions.
|
||||
*/
|
||||
if (typeof err === 'string' || err instanceof String) {
|
||||
logger.write(MODULE_NAME, '[ERROR] runExecution -> err = ' + err)
|
||||
}
|
||||
if (err.stack !== undefined) {
|
||||
logger.write(MODULE_NAME, '[ERROR] runExecution -> err = ' + err.stack)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function evalNode(node, evaluating, descendentOfNodeType, isDescendent) {
|
||||
|
||||
@@ -41,7 +41,7 @@ global.UNIQUE_ID = function () {
|
||||
}
|
||||
|
||||
global.PRECISE = function (floatNumber, precision) {
|
||||
return parseFloat(Number.parseFloat(floatNumber).toPrecision(precision))
|
||||
return this.parseFloat(floatNumber.toFixed(precision))
|
||||
}
|
||||
|
||||
process.on('uncaughtException', function (err) {
|
||||
|
||||
Reference in new issue
Block a user