Merge pull request #2466 from krimsonkla/develop

Contribution: "Last of the typos"
This commit is contained in:
Luis Fernando Molina authored and GitHub committed 2021-11-04 04:02:36 -04:00
commit 347cace378
176 files changed
+449 -449

No files matched your search

@@ -1,6 +1,6 @@
exports.newAlgorithmicTradingBotModulesOrdersCalculations = function (processIndex) {
/*
When we are live trading, we need to syncronize with the exchange.
When we are live trading, we need to synchronize with the exchange.
*/
let thisObject = {
@@ -48,7 +48,7 @@ exports.newAlgorithmicTradingBotModulesOrdersCalculations = function (processInd
If it happens that the size accepted (Actual Size) is different than the
size requested (Size), we need to make several adjustments so that the
accounting syncronizes with reality.
accounting synchronizes with reality.
*/
/* This calculation needs to happen only once, the first time the order is checked. */
@@ -65,8 +65,8 @@ exports.newAlgorithmicTradingBotModulesOrdersCalculations = function (processInd
function recalculateActualSize() {
/*
We will recalculate the Quoted Asset Actual Size. This will also give to it an initial value.
In the next formula, we are unsing the rate of the order because we dont know yet the Actual Rate.
This rate might be replaced afteerwards for the Actual Rate when this is calculated again once
In the next formula, we are using the rate of the order because we dont know yet the Actual Rate.
This rate might be replaced afterwards for the Actual Rate when this is calculated again once
the Actual Rate is known.
*/
tradingEngineOrder.orderQuotedAsset.actualSize.value = tradingEngineOrder.orderBaseAsset.actualSize.value * tradingEngineOrder.rate.value
@@ -133,7 +133,7 @@ exports.newAlgorithmicTradingBotModulesOrdersCalculations = function (processInd
tradingEngineOrder.orderStatistics.actualRate.value = TS.projects.foundations.utilities.miscellaneousFunctions.truncateToThisPrecision(tradingEngineOrder.orderStatistics.actualRate.value, 10)
/*
If the Actual Rate happens to be exctly the same than the order rate, then there is
If the Actual Rate happens to be exactly the same than the order rate, then there is
nothing else to do here. Otherwise there are adjustments to be made.
*/
if (tradingEngineOrder.orderStatistics.actualRate.value === tradingEngineOrder.rate.value) { return }
@@ -146,12 +146,12 @@ exports.newAlgorithmicTradingBotModulesOrdersCalculations = function (processInd
function recalculateActualSize() {
/*
Now we know the Actual Rate at which the order was filled. Since the actual rate
is not the same as the Rate we defined for the order, we need to syncronize
is not the same as the Rate we defined for the order, we need to synchronize
the Actual Order Size for Quoted Asset since it was calculated with the Order Size that we
now know it is not the one really used at the exchange. We will recalculate the
Actual Size in Quoted Asset and not in Base Asset, since the Actual Size in Base Asset
is the one we accepted by the exchange, so that is fixed, regardless of how we initially
got the Order Size in Base Asset, either from direct imput from the user or calculated
got the Order Size in Base Asset, either from direct input from the user or calculated
from the Order Size in Quoted Asset input it by the user. So here we go.
*/
previousQuotedAssetActualSize = tradingEngineOrder.orderQuotedAsset.actualSize.value
@@ -270,7 +270,7 @@ exports.newAlgorithmicTradingBotModulesOrdersCalculations = function (processInd
async function feesPaidCalculation(tradingEngineStage, tradingSystemOrder, tradingEngineOrder, order, applyFeePercentage) {
/*
Within the order information received from the exchange we can not see the fees paid so we need to
calculate them ourselves. Knwowing the Fees Paid is critical to later update the balances correctly,
calculate them ourselves. Knowing the Fees Paid is critical to later update the balances correctly,
since at every trade we will receive less than just the Actual Size. In fact we will receive the Actual
Size minus the Fees Paid.
@@ -324,7 +324,7 @@ exports.newAlgorithmicTradingBotModulesOrdersCalculations = function (processInd
/*
This calculation is for informational purposes, so that users do not have to calculate
it by themselves. The Amount Received out of the trade depends if we are Buying or Selling
the Base Asset. If we are Buying, then the Amount Receiced will be in Base Asset. If we
the Base Asset. If we are Buying, then the Amount Received will be in Base Asset. If we
are selling then it will be in Quoted Asset.
*/
@@ -36,7 +36,7 @@ exports.newAlgorithmicTradingBotModulesOrdersSimulations = function (processInde
async function actualSizeSimulation(tradingEngineStage, tradingSystemOrder, tradingEngineOrder, applyFeePercentage) {
/*
The Actual Size is the size the exchange accepts for the order,
regarless of the size sent in the request to the exchange.
regardless of the size sent in the request to the exchange.
While backtesting and paper trading, we do not really need to
simulate an Actual Size. We will just copy to that field the
@@ -81,7 +81,7 @@ exports.newAlgorithmicTradingBotModulesOrdersSimulations = function (processInde
switch (tradingEngineOrder.type) {
case 'Market Order': {
/* Actual Rate is simulated based on the Session Paremeters */
/* Actual Rate is simulated based on the Session Parameters */
let slippageAmount = tradingEngineOrder.rate.value * sessionParameters.slippage.config.marketOrderRate / 100
if (slippageAmount !== 0) {
switch (tradingSystemOrder.type) {
@@ -197,7 +197,7 @@ exports.newAlgorithmicTradingBotModulesOrdersSimulations = function (processInde
Until here we have got the Actual Rate based on the formula definition or based on session parameters slippage.
The last check is about watching what happened in the market. Let's remember that the exchange will
fill the order with the best possible matches at it's order book. That means that if the rate
we set for the order was too low (for a sale order) or too hight (for a buy order), the actual rate
we set for the order was too low (for a sale order) or too height (for a buy order), the actual rate
should be better than expected.
We don't know what it is at the order book, but whe know that the last candle includes trades that bounced between
@@ -303,7 +303,7 @@ exports.newAlgorithmicTradingBotModulesOrdersSimulations = function (processInde
if (tradingEngineOrder.orderStatistics.actualRate.value === tradingEngineOrder.rate.value) { return }
/*
Since the Actual Rate might have changed, we need to recalculate the Size Placed, where we accumulate all the Size Placed of
all orders of a Stage. For Base Asset there is nothing to do, since the Actual Rate does not have an inpact on it.
all orders of a Stage. For Base Asset there is nothing to do, since the Actual Rate does not have an impact on it.
For Quoted Asset, we need to first unaccount what this same orded added before to Size Placed (with the precious Actual Size) and
account with the new Actual Size.
@@ -462,7 +462,7 @@ exports.newAlgorithmicTradingBotModulesOrdersSimulations = function (processInde
}
/*
Another way to simulate the Fees Paid is by using the Session Paremeters configuration for Fees.
Another way to simulate the Fees Paid is by using the Session Parameters configuration for Fees.
*/
switch (tradingEngineOrder.type) {
case 'Market Order': {
@@ -510,7 +510,7 @@ exports.newAlgorithmicTradingBotModulesOrdersSimulations = function (processInde
/*
This simulation is for informational purposes, so that users do not have to calculate
it by themselves. The Amount Received out of the trade depends if we are Buying or Selling
the Base Asset. If we are Buying, then the Amount Receiced will be in Base Asset. If we
the Base Asset. If we are Buying, then the Amount Received will be in Base Asset. If we
are selling then it will be in Quoted Asset.
*/
@@ -135,7 +135,7 @@ exports.newAlgorithmicTradingBotModulesSnapshots = function(processIndex) {
function evalNode(node) {
if (node === undefined) { return }
/* Here we check if there is a codition to be evaluated */
/* Here we check if there is a condition to be evaluated */
if (node.type === 'Condition') {
/* We will eval this condition */
evalCondition(node)
@@ -154,7 +154,7 @@ exports.newAlgorithmicTradingBotModulesSnapshots = function(processIndex) {
if (schemaDocument === undefined) { return }
if (schemaDocument.childrenNodesProperties !== undefined) {
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoid counting each property of those as individual children.
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
@@ -398,7 +398,7 @@ exports.newAlgorithmicTradingBotModulesSnapshots = function(processIndex) {
if (record[record.length - 1] === undefined && contentArray.length > 0) {
let rowToMutateArray = contentArray[contentArray.length - 1].split(',')
// check if are for sure on the same tradenumber and merge the data and remove previous line incl separator
// check if are for sure on the same trade number and merge the data and remove previous line incl separator
if (rowToMutateArray[0] == record[0]) {
record.pop()
rowToMutateArray.splice(0, record.length)
@@ -451,7 +451,7 @@ exports.newAlgorithmicTradingBotModulesSnapshots = function(processIndex) {
function onFileReceived(err, text) {
if (err.result === TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) {
try {
// remove the last linebreak and seperator which is introduced extra during save
// remove the last linebreak and separator which is introduced extra during save
text = text.replace(/\n$/, '')
text = text.replace(/\r\n$/, '')
writeOutput(text)
@@ -1,6 +1,6 @@
exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) {
/*
We call the Trading Engine to the data structure that is needed in order to exevute the
We call the Trading Engine to the data structure that is needed in order to execute the
trading protocol with the specific rules defined at the Trading System.
*/
@@ -31,7 +31,7 @@ exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) {
if (TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).IS_SESSION_FIRST_LOOP === true) {
/*
Here we will go through all the nodes in the Trading Engine hiriarchy and
Here we will go through all the nodes in the Trading Engine hierarchy and
apply the initial value to the value property when needed
*/
initializeNode(tradingEngine)
@@ -116,7 +116,7 @@ exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) {
if (schemaDocument === undefined) { return }
if (schemaDocument.childrenNodesProperties !== undefined) {
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoid counting each property of those as individual children.
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
@@ -155,7 +155,7 @@ exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) {
if (schemaDocument === undefined) { return }
if (schemaDocument.childrenNodesProperties !== undefined) {
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoid counting each property of those as individual children.
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
@@ -198,7 +198,7 @@ exports.newAlgorithmicTradingBotModulesTradingEngine = function (processIndex) {
if (schemaDocument === undefined) { return }
if (schemaDocument.childrenNodesProperties !== undefined) {
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoid counting each property of those as individual children.
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
@@ -108,7 +108,7 @@ exports.newAlgorithmicTradingBotModulesTradingEpisode = function (processIndex)
function updateStatistics() {
/* Daus Calculation */
/* Days Calculation */
tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeStatistics.days.value =
tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.periods.value *
sessionParameters.timeFrame.config.value /
@@ -261,7 +261,7 @@ exports.newAlgorithmicTradingBotModulesTradingEpisode = function (processIndex)
}
function updateDistanceToTradingEventsCounters() {
/* Keeping Distance Counters Up-to-date while avoinding counting before the first event happens. */
/* Keeping Distance Counters Up-to-date while avoiding counting before the first event happens. */
if (
tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.triggerOn.value > 0
) {
@@ -1,6 +1,6 @@
exports.newAlgorithmicTradingBotModulesTradingExecution = function (processIndex) {
/*
The Trading Execution modules manages the execution nodes and execution algoritms.
The Trading Execution modules manages the execution nodes and execution algorithms.
*/
const MODULE_NAME = 'Trading Execution'
@@ -226,7 +226,7 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) {
let situationName = await checkOrderEvent(tradingSystemOrder.cancelOrderEvent, tradingSystemOrder, executionAlgorithm, executionNode)
if (situationName !== undefined) {
/* Simulate Order Cancelation, if needed. */
/* Simulate Order Cancellation, if needed. */
simulateCancelOrder(tradingEngineStage, tradingSystemOrder, tradingEngineOrder, 'Cancel Event')
/* Cancel the order at the Exchange, if needed. */
@@ -731,8 +731,8 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) {
/* Close this Order */
tradingEngineOrder.status.value = 'Closed'
/*
We must be carefull here not to overide an already defined exitType. It can happen
for instance that the order was cancellerd from the but veryfing the cancellation
We must be carefully here not to override an already defined exitType. It can happen
for instance that the order was cancelled from the but verifying the cancellation
was not possible because of a connection to the exchange problem. In that case
the exit type was defined but the order was kept open until the verification could be done.
*/
@@ -764,7 +764,7 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) {
}
/*
If the order happens to be at least partially filled, there is a syncronization work
If the order happens to be at least partially filled, there is a synchronization work
we need to do, that includes discovering which is the Actual Rate the order is being filled,
the Fees Paid and many other thing we need to account for.
*/
@@ -1118,7 +1118,7 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) {
if (order.status === 'NotFound') {
/*
Some exchanges, like Coinbase Pro, deletes orders after being cancelled, and when we request information
about them, it returns null. We will interprate this as ORDER NOT FOUND.
about them, it returns null. We will interpret this as ORDER NOT FOUND.
*/
const message = 'Order Not Found at the Exchange'
let docs = {
@@ -1136,8 +1136,8 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) {
]
)
/*
We must be carefull here not to overide an already defined exitType. It can happen
for instance that the order was cancellerd from the but veryfing the cancellation
We must be carefully here not to overide an already defined exitType. It can happen
for instance that the order was cancelled from the but verifying the cancellation
was not possible because of a connection to the exchange problem. In that case
the exit type was defined but the order was kept open until the verification could be done.
*/
@@ -1148,7 +1148,7 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) {
/*
Close this Order. Note that we are not closing the order until we have the exchange
response with the order details that we can use to syncronize with our accoounting.
response with the order details that we can use to synchronize with our accounting.
Otherwise if the connection to the exchange fails, we would have a closed order not
accounted in any way.
*/
@@ -1182,8 +1182,8 @@ exports.newAlgorithmicTradingBotModulesTradingOrders = function (processIndex) {
async function recalculateStageSize(tradingEngineStage, tradingEngineOrder) {
/*
Since the order is Cancelled, we need to adjust the stage sizePlaced. Remember that the Stage
Size Placed accumulates for each asset, the order size placed at the exchange. A cancelation means that
only the part filled can be considered placed, so we need to substract from the stage size
Size Placed accumulates for each asset, the order size placed at the exchange. A cancellation means that
only the part filled can be considered placed, so we need to subtract from the stage size
the remainder. To achieve this with the information we currently have, we are going first
to unaccount the order actual size, and the account only the sizeFilled + the feesPaid.
*/
@@ -1,6 +1,6 @@
exports.newAlgorithmicTradingBotModulesTradingOutput = function (processIndex) {
/*
This module will load if necesary all the data outputs so that they can be appended with new
This module will load if necessary all the data outputs so that they can be appended with new
records if needed. After running the simulation, it will save all the data outputs.
*/
const MODULE_NAME = 'Trading Output'
@@ -71,7 +71,7 @@ exports.newAlgorithmicTradingBotModulesTradingPosition = function (processIndex)
/* Updating Episode Counters */
tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value++
/* Inicializing this counter */
/* Initializing this counter */
tradingEngine.tradingCurrent.tradingEpisode.distanceToTradingEvent.takePosition.value = 1
/* Remember the balance we had before taking the position to later calculate profit or loss */
@@ -65,7 +65,7 @@
This is the Date that is going to be used across the execution of this Trading Process.
We need this because it has a different life cycle than the processData stored at the
Trading Engine data structure. This date has to remain the same during the whole execution
of the Trading Process until the end, inclusind the writing of Data Ranges and Status Reports.
of the Trading Process until the end, including the writing of Data Ranges and Status Reports.
The processDate of the Trading Engine data structure on the other hand can be changed during
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.
@@ -108,7 +108,7 @@
Here we check if we need to get Daily Files or not. As an optimization, when
we are running on a Time Frame of 1hs or above, we are not going to load
dependencies on Daily Files. The way we recognize that is by checking if
we alreaady set a value to currentTimeFrame.value. We are also not going to loop
we already set a value to currentTimeFrame.value. We are also not going to loop
through days if we are processing market files.
*/
if (currentTimeFrame.value) {
@@ -95,14 +95,14 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
*/
for (let index = 0; index < productRoot.length; index++) {
/*
The Product Root Node is the root of the node hiriarchy from where we are going to extract the record values.
The Product Root Node is the root of the node hierarchy from where we are going to extract the record values.
*/
let productRootNode = productRoot[index]
let record = scanRecordDefinition(product, productRootNode, index)
if (record !== undefined) {
/*
We will add the index value to the record itself, so that the plotter can know to which
brach of the trading engine data structure it belongs.
branch of the trading engine data structure it belongs.
*/
record.push(index)
persistIndividualRecord(record, product, outputDatasetArray)
@@ -114,7 +114,7 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
the record to be saved at the output file.
*/
/*
The Product Root Node is the root of the node hiriarchy from where we are going to extract the record values.
The Product Root Node is the root of the node hierarchy from where we are going to extract the record values.
*/
let productRootNode = productRoot
let record = scanRecordDefinition(product, productRootNode)
@@ -131,7 +131,7 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
for (let j = 0; j < product.record.properties.length; j++) {
let recordProperty = product.record.properties[j]
/*
The Property Root Node is the Root of the Hiriarchy branch we must find in order
The Property Root Node is the Root of the Hierarchy branch we must find in order
to get the node where we are going to extract the value. Initially
we point it to the Product Root Node, because that is the default in case
a property does not have at its configuration a different nodePath configured
@@ -150,7 +150,7 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
}
}
/*
The Target Node is the node from where we are going to exctract the value.
The Target Node is the node from where we are going to extract the value.
We will use the codeName of the Record Property to match it with
any of the properties of the Root Node to get the Target Node.
*/
@@ -170,7 +170,7 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
targetNode = propertyRootNode[recordProperty.config.childProperty]
}
/*
It can happen that intead of having a Node in targetNode what we have is an
It can happen that instead of having a Node in targetNode what we have is an
array of nodes. We need to pick one of the elements of the array and for that
we use the Index value we find at the configuration of the Record Property.
*/
@@ -187,7 +187,7 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
of Nodes defined in the Record Properties but not all of them exist at the Root Node.
We filter out those cases by not extracting the value from the value property.
*/
let value = 0 // This is a default value, since we do not want null in files because it breakes JSON format.
let value = 0 // This is a default value, since we do not want null in files because it brakes JSON format.
if (targetNode !== undefined) {
if (targetNode.type !== undefined) {
/*
@@ -251,14 +251,14 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
/*
When dealing with Daily Files, we need to avoid to write an open object at the last 'candle' of the day,
since the object will be duplicated on the next day. How do we know we are positioned at the last candle
of the day? Easy: the end of the candle must be 1 millisecod before the next day. That happens at any
of the day? Easy: the end of the candle must be 1 millisecond before the next day. That happens at any
time frame.
*/
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.
We will save the object only if it is closed, because we are at the last candle of the day.
*/
if (propertyValue === product.config.propertyValueThatClosesObject) {
outputDatasetArray.push(record)
@@ -275,7 +275,7 @@ exports.newAlgorithmicTradingBotModulesTradingRecords = function (processIndex)
}
else {
/*
For Market Files we will add a record everytime that proeprty value does not match this
For Market Files we will add a record everytime that property value does not match this
*/
if (propertyValue !== product.config.propertyValueThatPreventsSavingObject) {
outputDatasetArray.push(record)
@@ -1,6 +1,6 @@
exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processIndex) {
/*
This Module represents the trading simulacion. Escentially a loop through a set of candles and
This Module represents the trading simulation. Essentially a loop through a set of candles and
the execution at each loop cycle of the Trading System Protocol.
*/
const MODULE_NAME = 'Trading Simulation -> ' + TS.projects.foundations.globals.taskConstants.TASK_NODE.bot.processes[processIndex].session.name
@@ -134,7 +134,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
TS.projects.foundations.globals.processModuleObjects.MODULE_OBJECTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_MODULE_OBJECT.setCurrentCandle(candle) // We move the current candle we are standing at, to the trading engine data structure to make it available to anyone, including conditions and formulas.
/* We emit a heart beat so that the UI can now where we are at the overal process.*/
/* We emit a heart beat so that the UI can now where we are at the overall process.*/
heartBeat()
/* Opening the Episode, if needed. */
@@ -157,7 +157,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
/*
Do the stuff needed previous to the run like
Episode Counters and Statistics update. Mantaince is done
Episode Counters and Statistics update. Maintenance is done
once per simulation candle.
*/
tradingSystemModuleObject.mantain()
@@ -176,7 +176,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
/*
We check if we need to stop before appending the records so that the stop
reason is also propery recorded. Note also that we check this after the first
reason is also properly recorded. Note also that we check this after the first
cycle, where orders have not been submitted to the exchange yet, but we
had the chance to check for the status of placed orders or even cancel
the ones that needed cancellation.
@@ -312,7 +312,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
let currentDate = new Date(heartBeatDate)
let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate)
/*
Theere are a few tasks that we need to do only when the date changes,
There are a few tasks that we need to do only when the date changes,
otherwise it would be suboptimal.
*/
if (heartBeatDate.valueOf() !== previousHeartBeatDate) {
@@ -328,7 +328,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.newInternalLoop(currentDate, percentage)
}
/* Date only hearbeat */
/* Date only heartbeat */
if (sessionParameters.heartbeats.config.date === true && sessionParameters.heartbeats.config.candleIndex === false) {
hartbeatText = hartbeatText + currentDateString
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, hartbeatText, percentage)
@@ -337,7 +337,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
}
/*
When the Candle Index nees to be shown, then we can not send the hearbet
When the Candle Index needs to be shown, then we can not send the heartbeat
only when the dates changes, we have to send it for every candle.
It might also contain the date information.
*/
@@ -354,7 +354,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
function positionDataStructuresAtCurrentCandle() {
/*
In conditions and Formulas, we want users to have an easy sintax to refer to indicators. In order to achieve that, we need the user to have
In conditions and Formulas, we want users to have an easy syntax to refer to indicators. In order to achieve that, we need the user to have
easy access to the current candle for instance, or the current bollinger band, meaning the one the Simulation is currently standing at.
For that reason we do the following processing, to have at the chart data structure the current objects of each indicator / time frame.
*/
@@ -483,7 +483,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
Note: for Daily Files, this means that the last candle of each day will never be processed.
The first +1 is because array indexes are based on 0.
The second +1 is because we need to compare the next candle (remember that the loops allways avoid the
The second +1 is because we need to compare the next candle (remember that the loops always avoid the
last candle of the dataset available.)
*/
if (tradingEngine.tradingCurrent.tradingEpisode.candle.index.value + 1 + 1 === candles.length) {
@@ -550,7 +550,7 @@ exports.newAlgorithmicTradingBotModulesTradingSimulation = function (processInde
}
function checkMinimunAndMaximunBalance() {
/* Checks for Minimun and Maximun Balance. We do the check while not inside any strategy only. */
/* Checks for Minimum and Maximum Balance. We do the check while not inside any strategy only. */
if (
tradingEngine.tradingCurrent.strategy.index.value === tradingEngine.tradingCurrent.strategy.index.config.initialValue
) {
@@ -422,7 +422,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) {
/*
The system allows the user not to define a Manage Stage, because the Manage Stage is optional.
Here we are going to see if that is the case and if it is, we will inmidiatelly consider
Here we are going to see if that is the case and if it is, we will immediately consider
the Manage Stage as closed.
*/
if (manageStage === undefined) {
@@ -820,7 +820,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) {
if (tradingEngine.tradingCurrent.strategyCloseStage.status.value === 'Opening') {
/*
The system allows the user not to define a close stage, because the close stage is optional.
Here we are goint to see if that is the case and if it is, we will inmidiatelly consider
Here we are going to see if that is the case and if it is, we will immediately consider
the close stage as closed.
*/
if (tradingSystem.tradingStrategies[tradingEngine.tradingCurrent.strategy.index.value].closeStage === undefined) {
@@ -1024,7 +1024,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) {
The Target Size is defined by the end user either in Base Asset or Quoted Asset.
Whatever the user chooses defines also the way we check if the Target was met.
Why? Because the counterparty target is estimated with the Target Rate and it
is not syncronized with the reality we later learn when the exchange tell us the
is not synchronized with the reality we later learn when the exchange tell us the
actual rate each of the orders where executed at.
For the same reason that the user does not know exactly which is the rate the orders
@@ -1041,7 +1041,7 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) {
}
/*
We will also implement a mechanism to allow users declare an absolute value to add
to the Size Filled before checking it againt the Stage Target Size.
to the Size Filled before checking it against the Stage Target Size.
*/
let ABSOLUTE_DUST_IN_BASE_ASSET = 0
if (tradingSystemStage.config.absoluteDustInBaseAsset !== undefined) {
@@ -1151,13 +1151,13 @@ exports.newAlgorithmicTradingBotModulesTradingStages = function (processIndex) {
}
/*
The way the begining and end of the Stages object works is as follows:
This object begins with the last cycle, that is the current cycle diplaced
The way the beginning and end of the Stages object works is as follows:
This object begins with the last cycle, that is the current cycle displayed
backwards to the current candle. And it ends at the end of the last cycle.
During mantainance, we add the time frame of the candle, since we assume it
During maintenance, we add the time frame of the candle, since we assume it
will survive the 2 cycles without the end being updated. If it closes,
then we update the end to the end of the last cycle, overrinding the
mantainance if needed. If we assume that in the same cycle there will be
then we update the end to the end of the last cycle, overriding the
maintenance if needed. If we assume that in the same cycle there will be
no closing and opening of the same type of object, then there can be no
overlap.
*/
@@ -221,7 +221,7 @@ exports.newAlgorithmicTradingBotModulesTradingSystem = function (processIndex) {
} catch (err) {
/*
If an error ocurred during execution, it was alreeady logged and
If an error occurred during execution, it was already 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.
*/
@@ -237,14 +237,14 @@ exports.newAlgorithmicTradingBotModulesTradingSystem = function (processIndex) {
function evalNode(node, evaluating, descendentOfNodeType, isDescendent) {
if (node === undefined) { return }
/* Verify if this node is decendent of the specified node type */
/* Verify if this node is descendent of the specified node type */
if (isDescendent !== true) {
if (node.type === descendentOfNodeType) {
isDescendent = true
}
}
/* Here we check if there is a codition to be evaluated */
/* Here we check if there is a condition to be evaluated */
if (node.type === 'Condition' && evaluating === 'Conditions') {
/* We will eval this condition */
if (isDescendent === true) {
@@ -276,7 +276,7 @@ exports.newAlgorithmicTradingBotModulesTradingSystem = function (processIndex) {
if (schemaDocument === undefined) { return }
if (schemaDocument.childrenNodesProperties !== undefined) {
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoid counting each property of those as individual children.
for (let i = 0; i < schemaDocument.childrenNodesProperties.length; i++) {
let property = schemaDocument.childrenNodesProperties[i]
@@ -63,8 +63,8 @@
/* We tell the UI that we are running. */
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, undefined, undefined, "Running...")
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infraestructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date(); // This will be considered the process date and time, so as to have it consistenly all over the execution.
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infrastructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date(); // This will be considered the process date and time, so as to have it consistently all over the execution.
/* Main Loop Console Logging */
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.newMainLoop()
@@ -95,7 +95,7 @@
return
}
/* We will prepare first the infraestructure needed for the bot to run. There are 3 modules we need to sucessfullly initialize first. */
/* We will prepare first the infrastructure needed for the bot to run. There are 3 modules we need to sucessfullly initialize first. */
let processExecutionEvents
let userBot;
@@ -21,7 +21,7 @@
return;
}
/*
We will store here the session key, which we will need everytine
We will store here the session key, which we will need everytime
we need to emit an event related to the session itself.
*/
let VARIABLES_BY_PROCESS_INDEX = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex)
@@ -109,7 +109,7 @@
return
}
/* We are going to initialize here these constants whose values are comming at the event. */
/* We are going to initialize here these constants whose values are coming at the event. */
TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_SYSTEM_NODE = JSON.parse(message.event.tradingSystem)
TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).TRADING_ENGINE_NODE = JSON.parse(message.event.tradingEngine)
TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE = JSON.parse(message.event.session)
@@ -6568,7 +6568,7 @@
"procedureJavascriptCode": {
"type": "Procedure Javascript Code",
"name": "EDIT TOP LINES HERE TO CHANGE PERIODS",
"code": "// The Average VS Average Oscillator\n\n/* The Average VS Average Oscillator can be used to recognize changes between a fast average ('fastPeriod') and a slow average ('slowPeriod'). It measures 'Price Action', 'Volume', and a so called 'Open Interest'.\n'Bull Price Action' and 'Bear Price Action' is defined by the amount between the candle close and max and min.\n'Bull Volume' and 'Bear Volume' is divided using the price action.\n'Open Interest' is based upon the statement where:\nBull Candle and Volume Increase = Bull Interest\nBull Candle and Volume Decrease = Bear Interest\nBear Candle and Volume Increase = Bear Interest\nBear Candle and Volume Decrease = Bull Interest */\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n/* USER DEFINED VALUES SECTION */\n\nlet fastPeriod = 5 // Change this number to the period of your choice (must be less than 'slowPeriod')\nlet slowPeriod = 21 // Change this number to the period of your choice (must be greater than 'fastPeriod')\nlet periodMultiplier = 3 // The 'slowPeriod' is muliplied by the 'periodMultiplier to create the \"long term\" trend\nlet fastBoost = 1.00 // '1.00' equals 'no extra boost' to your 'fastPeriod' where as '1.23' would boost the value by 23%\nlet gravity = 0 // '0' equals 'no gravity' (pullback towards midline ('slowPeriod'))\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Declaring variables used\n\nlet candle = {\n open: record.current.open,\n close: record.current.close,\n min: record.current.min,\n max: record.current.max,\n begin: record.current.begin,\n end: record.current.end\n} \nlet volCandle = record.current\nlet volume = getElement('volumes', volCandle)\nlet totalVolume = volume.buy + volume.sell\nlet totalRange = candle.max - candle.min\nlet multipliedFast = fastPeriod * periodMultiplier\nlet multipliedSlow = slowPeriod * periodMultiplier\n\nif ( candle.close > candle.open ) { \n variable.bullPriceRange = ( candle.close - candle.min ),\n variable.bearPriceRange = ( candle.max - candle.close )\n}\nelse { \n variable.bullPriceRange = ( candle.close - candle.min ),\n variable.bearPriceRange = ( candle.max - candle.close )\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Declaring 'Volume Difference'\n\nvariable.previousCurrentVolume.push(totalVolume)\nif (variable.previousCurrentVolume.length > 2) {\n variable.previousCurrentVolume.splice(0, 1)\n}\n\nif (variable.previousCurrentVolume[1] === 'undefined') {\n variable.positiveVolumeDifference = 0.01\n}\nelse {\n if (variable.previousCurrentVolume[variable.previousCurrentVolume.max] > variable.previousCurrentVolume[0]) {\n variable.positiveTotalVolumeDifference = (variable.previousCurrentVolume[1] - variable.previousCurrentVolume[0]) \n }\n else {\n variable.positiveTotalVolumeDifference = (variable.previousCurrentVolume[0] - variable.previousCurrentVolume[1])\n }\n}\n\nvariable.bullVolumeDifference = variable.positiveTotalVolumeDifference * (variable.bullPriceRange / totalRange)\nvariable.bearVolumeDifference = variable.positiveTotalVolumeDifference * (variable.bearPriceRange / totalRange)\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Declaring 'Open Interest'\n// Converting values to percentages due to the differences of range and volume (range might be in decimals while volume often is in thousands)\n\nif ( candle.close > candle.open && variable.previousCurrentVolume[1] > variable.previousCurrentVolume[0] ) { // Candle UP & Volume UP, Bullish Interest\n variable.openInterest = 1 + ((variable.bullPriceRange / totalRange) * (variable.bullVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\nelse if ( candle.close < candle.open && variable.previousCurrentVolume[1] < variable.previousCurrentVolume[0] ) { // Candle DOWN & Volume DOWN, Bullish Interest\n variable.openInterest = 1 + ((variable.bearPriceRange / totalRange) * (variable.bearVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\nelse if ( candle.close > candle.open && variable.previousCurrentVolume[1] < variable.previousCurrentVolume[0] ) { // Candle UP & Volume DOWN, Bearish Interest\n variable.openInterest = 1 - ((variable.bullPriceRange / totalRange) * (variable.bullVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\nelse { // Candle DOWN & Volume UP, Bearish Interest\n variable.openInterest = 1 - ((variable.bearPriceRange / totalRange) * (variable.bearVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Saving to arrays\n\nvariable.savedCandleClose.push(candle.close)\nif (variable.savedCandleClose.length > multipliedSlow) {\n variable.savedCandleClose.splice(0, 1)\n}\n\nvariable.savLine truncated
"code": "// The Average VS Average Oscillator\n\n/* The Average VS Average Oscillator can be used to recognize changes between a fast average ('fastPeriod') and a slow average ('slowPeriod'). It measures 'Price Action', 'Volume', and a so called 'Open Interest'.\n'Bull Price Action' and 'Bear Price Action' is defined by the amount between the candle close and max and min.\n'Bull Volume' and 'Bear Volume' is divided using the price action.\n'Open Interest' is based upon the statement where:\nBull Candle and Volume Increase = Bull Interest\nBull Candle and Volume Decrease = Bear Interest\nBear Candle and Volume Increase = Bear Interest\nBear Candle and Volume Decrease = Bull Interest */\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n/* USER DEFINED VALUES SECTION */\n\nlet fastPeriod = 5 // Change this number to the period of your choice (must be less than 'slowPeriod')\nlet slowPeriod = 21 // Change this number to the period of your choice (must be greater than 'fastPeriod')\nlet periodMultiplier = 3 // The 'slowPeriod' is multiplied by the 'periodMultiplier to create the \"long term\" trend\nlet fastBoost = 1.00 // '1.00' equals 'no extra boost' to your 'fastPeriod' where as '1.23' would boost the value by 23%\nlet gravity = 0 // '0' equals 'no gravity' (pullback towards midline ('slowPeriod'))\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Declaring variables used\n\nlet candle = {\n open: record.current.open,\n close: record.current.close,\n min: record.current.min,\n max: record.current.max,\n begin: record.current.begin,\n end: record.current.end\n} \nlet volCandle = record.current\nlet volume = getElement('volumes', volCandle)\nlet totalVolume = volume.buy + volume.sell\nlet totalRange = candle.max - candle.min\nlet multipliedFast = fastPeriod * periodMultiplier\nlet multipliedSlow = slowPeriod * periodMultiplier\n\nif ( candle.close > candle.open ) { \n variable.bullPriceRange = ( candle.close - candle.min ),\n variable.bearPriceRange = ( candle.max - candle.close )\n}\nelse { \n variable.bullPriceRange = ( candle.close - candle.min ),\n variable.bearPriceRange = ( candle.max - candle.close )\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Declaring 'Volume Difference'\n\nvariable.previousCurrentVolume.push(totalVolume)\nif (variable.previousCurrentVolume.length > 2) {\n variable.previousCurrentVolume.splice(0, 1)\n}\n\nif (variable.previousCurrentVolume[1] === 'undefined') {\n variable.positiveVolumeDifference = 0.01\n}\nelse {\n if (variable.previousCurrentVolume[variable.previousCurrentVolume.max] > variable.previousCurrentVolume[0]) {\n variable.positiveTotalVolumeDifference = (variable.previousCurrentVolume[1] - variable.previousCurrentVolume[0]) \n }\n else {\n variable.positiveTotalVolumeDifference = (variable.previousCurrentVolume[0] - variable.previousCurrentVolume[1])\n }\n}\n\nvariable.bullVolumeDifference = variable.positiveTotalVolumeDifference * (variable.bullPriceRange / totalRange)\nvariable.bearVolumeDifference = variable.positiveTotalVolumeDifference * (variable.bearPriceRange / totalRange)\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Declaring 'Open Interest'\n// Converting values to percentages due to the differences of range and volume (range might be in decimals while volume often is in thousands)\n\nif ( candle.close > candle.open && variable.previousCurrentVolume[1] > variable.previousCurrentVolume[0] ) { // Candle UP & Volume UP, Bullish Interest\n variable.openInterest = 1 + ((variable.bullPriceRange / totalRange) * (variable.bullVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\nelse if ( candle.close < candle.open && variable.previousCurrentVolume[1] < variable.previousCurrentVolume[0] ) { // Candle DOWN & Volume DOWN, Bullish Interest\n variable.openInterest = 1 + ((variable.bearPriceRange / totalRange) * (variable.bearVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\nelse if ( candle.close > candle.open && variable.previousCurrentVolume[1] < variable.previousCurrentVolume[0] ) { // Candle UP & Volume DOWN, Bearish Interest\n variable.openInterest = 1 - ((variable.bullPriceRange / totalRange) * (variable.bullVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\nelse { // Candle DOWN & Volume UP, Bearish Interest\n variable.openInterest = 1 - ((variable.bearPriceRange / totalRange) * (variable.bearVolumeDifference / variable.positiveTotalVolumeDifference))\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n// Saving to arrays\n\nvariable.savedCandleClose.push(candle.close)\nif (variable.savedCandleClose.length > multipliedSlow) {\n variable.savedCandleClose.splice(0, 1)\n}\n\nvariable.saLine truncated
"project": "Foundations",
"id": "8c60ba71-a9d3-4f8e-afe0-896444288364",
"savedPayload": {
@@ -1 +1 @@
{"type":"Data Mine","name":"Zeus","config":"{ \n\"codeName\": \"Zeus\"\n}","project":"Superalgos","sensorBots":[],"apiDataFetcherBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Super Trend","config":"{ \n\"codeName\": \"Super-Trend\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":" {\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market Super Trend","project":"Superalgos","id":"2412939e-1585-47f9-8d09-7ea8dd7c8bf0","savedPayload":{"position":{"x":34664.87658172835,"y":17409.843880743556},"targetPosition":{"x":34703.69943849373,"y":17554.732754686916},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"7c8e7a6f-99c8-4d90-9f44-e3e9e909eb88"}}}],"outputDatasetFolders":[],"id":"74212c63-4a69-407d-80ec-d39ee2d8df74","savedPayload":{"position":{"x":34703.69943849373,"y":17554.732754686916},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Superalgos","statusDependencies":[{"type":"Status Dependency","name":"","config":"{ \n\"mainUtility\": \"Self Reference\"\n}","project":"Superalgos","id":"5a35d0d1-cfed-4893-84ab-344a77c7d252","savedPayload":{"position":{"x":34670.168008789864,"y":17150.036259608223},"targetPosition":{"x":34820.168008789864,"y":17409.843880743556},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"25f05344-3e7f-4d5f-ab1c-d72689a85764"}}},{"type":"Status Dependency","name":"","config":"{ \n\"mainUtility\": \"Market Ending Point\"\n}","project":"Superalgos","id":"2a42dd15-1e04-4826-bd5f-85d95fbae135","savedPayload":{"position":{"x":34897.81372232062,"y":17120.066132856835},"targetPosition":{"x":34820.168008789864,"y":17409.843880743556},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Superalgos","id":"88a45f27-a0b8-4234-b7aa-f139400305db","savedPayload":{"position":{"x":35079.9756299252,"y":17259.843880743556},"targetPosition":{"x":34820.168008789864,"y":17409.843880743556},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"eef38121-80a2-4471-b909-24acdc4d213a","savedPayload":{"position":{"x":34820.168008789864,"y":17409.843880743556},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Superalgos","id":"25f05344-3e7f-4d5f-ab1c-d72689a85764","savedPayload":{"position":{"x":34954.65432961507,"y":17487.489594274313},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"","project":"Superalgos","id":"d9b0ffbd-c1bd-4e43-a00d-04a6b6fb470b","savedPayload":{"position":{"x":35032.30004314583,"y":17621.97591509952},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"1824fa00-dd30-4cdc-acc0-01c2f29056c5"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Superalgos","id":"d405bfe9-74f9-4419-8288-94229c9813a6","savedPayload":{"position":{"x":35032.300043145Line truncated
{"type":"Data Mine","name":"Zeus","config":"{ \n\"codeName\": \"Zeus\"\n}","project":"Superalgos","sensorBots":[],"apiDataFetcherBots":[],"indicatorBots":[{"type":"Indicator Bot","name":"Super Trend","config":"{ \n\"codeName\": \"Super-Trend\"\n}","project":"Superalgos","processes":[{"type":"Process Definition","name":"Multi-Time-Frame-Market","config":" {\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n }","project":"Superalgos","processOutput":{"type":"Process Output","name":"New Process Output","project":"Superalgos","outputDatasets":[{"type":"Output Dataset","name":"Multi-Time-Frame-Market Super Trend","project":"Superalgos","id":"2412939e-1585-47f9-8d09-7ea8dd7c8bf0","savedPayload":{"position":{"x":34664.87658172835,"y":17409.843880743556},"targetPosition":{"x":34703.69943849373,"y":17554.732754686916},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":1,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"7c8e7a6f-99c8-4d90-9f44-e3e9e909eb88"}}}],"outputDatasetFolders":[],"id":"74212c63-4a69-407d-80ec-d39ee2d8df74","savedPayload":{"position":{"x":34703.69943849373,"y":17554.732754686916},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":2,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"processDependencies":{"type":"Process Dependencies","name":"New Process Dependencies","project":"Superalgos","statusDependencies":[{"type":"Status Dependency","name":"","config":"{ \n\"mainUtility\": \"Self Reference\"\n}","project":"Superalgos","id":"5a35d0d1-cfed-4893-84ab-344a77c7d252","savedPayload":{"position":{"x":34670.168008789864,"y":17150.036259608223},"targetPosition":{"x":34820.168008789864,"y":17409.843880743556},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"25f05344-3e7f-4d5f-ab1c-d72689a85764"}}},{"type":"Status Dependency","name":"","config":"{ \n\"mainUtility\": \"Market Ending Point\"\n}","project":"Superalgos","id":"2a42dd15-1e04-4826-bd5f-85d95fbae135","savedPayload":{"position":{"x":34897.81372232062,"y":17120.066132856835},"targetPosition":{"x":34820.168008789864,"y":17409.843880743556},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Status Report","name":"New Status Report","id":"a0a61ba9-91cb-4ec7-92fe-134ff079de2d"}}}],"dataDependencies":[{"type":"Data Dependency","name":"Candles Multi-Time-Frame-Market","project":"Superalgos","id":"88a45f27-a0b8-4234-b7aa-f139400305db","savedPayload":{"position":{"x":35079.9756299252,"y":17259.843880743556},"targetPosition":{"x":34820.168008789864,"y":17409.843880743556},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Dataset Definition","name":"Multi-Time-Frame-Market","id":"2b03494a-67d6-47f1-89b6-53fc4c9116a8"}}}],"dataMineDataDependencies":[],"id":"eef38121-80a2-4471-b909-24acdc4d213a","savedPayload":{"position":{"x":34820.168008789864,"y":17409.843880743556},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{"isRunning":false}}},"statusReport":{"type":"Status Report","name":"New Status Report","project":"Superalgos","id":"25f05344-3e7f-4d5f-ab1c-d72689a85764","savedPayload":{"position":{"x":34954.65432961507,"y":17487.489594274313},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{}}},"executionStartedEvent":{"type":"Execution Started Event","name":"","project":"Superalgos","id":"d9b0ffbd-c1bd-4e43-a00d-04a6b6fb470b","savedPayload":{"position":{"x":35032.30004314583,"y":17621.97591509952},"targetPosition":{"x":34742.52229525911,"y":17699.621628630277},"floatingObject":{"isPinned":false,"isFrozen":false,"isCollapsed":false,"angleToParent":2,"distanceToParent":3,"arrangementStyle":0},"uiObject":{},"referenceParent":{"type":"Execution Finished Event","name":"New Execution Finished Event","id":"1824fa00-dd30-4cdc-acc0-01c2f29056c5"}}},"executionFinishedEvent":{"type":"Execution Finished Event","name":"New Execution Finished Event","project":"Superalgos","id":"d405bfe9-74f9-4419-8288-94229c9813a6","savedPayload":{"position":{"x":35032.300043145Line truncated
@@ -82,13 +82,13 @@ exports.newDataMiningBotModulesSingleMarketAPIDataFetcherBot = function (process
/* We tell the UI that we are running. */
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex)
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infraestructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date(); // This will be considered the process date and time, so as to have it consistenly all over the execution.
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infrastructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date(); // This will be considered the process date and time, so as to have it consistently all over the execution.
/* Main Loop Console Logging */
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.newMainLoop()
/* We will prepare first the infraestructure needed for the bot to run. There are 4 modules we need to sucessfullly initialize first. */
/* We will prepare first the infrastructure needed for the bot to run. There are 4 modules we need to successfully initialize first. */
let processExecutionEvents
let statusDependencies;
let nextWaitTime;
@@ -79,13 +79,13 @@
/* We tell the UI that we are running. */
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex)
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infraestructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date() // This will be considered the process date and time, so as to have it consistenly all over the execution.
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infrastructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date() // This will be considered the process date and time, so as to have it consistently all over the execution.
/* Main Loop Console Logging */
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.newMainLoop()
/* We will prepare first the infraestructure needed for the bot to run. There are 3 modules we need to sucessfullly initialize first. */
/* We will prepare first the infrastructure needed for the bot to run. There are 3 modules we need to successfully initialize first. */
let processExecutionEvents
let processFramework;
let statusDependencies;
@@ -82,13 +82,13 @@
/* We tell the UI that we are running. */
TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex)
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infraestructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date(); // This will be considered the process date and time, so as to have it consistenly all over the execution.
/* We define the datetime for the process that we are running now. This will be the official processing time for both the infrastructure and the bot. */
TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME = new Date(); // This will be considered the process date and time, so as to have it consistently all over the execution.
/* Main Loop Console Logging */
TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.newMainLoop()
/* We will prepare first the infraestructure needed for the bot to run. There are 4 modules we need to sucessfullly initialize first. */
/* We will prepare first the infrastructure needed for the bot to run. There are 4 modules we need to successfully initialize first. */
let processExecutionEvents
let statusDependencies;
let nextWaitTime;
@@ -3,7 +3,7 @@
"pageNumber": 1,
"type": "Keyboard Shortcut Quick Guide",
"definition": {
"text": "Superalgos offers a number of keyboard shortcuts to make working with the platform more efficent and user friendly.",
"text": "Superalgos offers a number of keyboard shortcuts to make working with the platform more efficient and user friendly.",
"updated": 1634909540261
},
"paragraphs": [
@@ -14,7 +14,7 @@
},
{
"style": "Text",
"text": "Here is the current list of all implemented shortcuts and options for customazation:"
"text": "Here is the current list of all implemented shortcuts and options for customization:"
},
{
"style": "Subtitle",
@@ -109,7 +109,7 @@
},
{
"style": "List",
"text": "Display animation preformance: Ctrl + Shift + Alt + F11",
"text": "Display animation performance: Ctrl + Shift + Alt + F11",
"updated": 1634910183292
},
{
@@ -136,7 +136,7 @@
},
{
"style": "Text",
"text": "You can find additional descriptions of how to use your mouse and keybord to navigate the Charting Space and Design Space at the Basic Navigation page.",
"text": "You can find additional descriptions of how to use your mouse and keyboard to navigate the Charting Space and Design Space at the Basic Navigation page.",
"updated": 1634912820206
},
{
@@ -145,12 +145,12 @@
},
{
"style": "Important",
"text": "If any of these keyboard shortucts do not function as expected, please disable any installed browser extentions while using Superalgos as they can override expected functionality.",
"text": "If any of these keyboard shortcuts do not function as expected, please disable any installed browser extentions while using Superalgos as they can override expected functionality.",
"updated": 1634999290105
},
{
"style": "Success",
"text": "In addtion to this, many shortcuts will work without using the Alt key. For example Ctrl + Shift + Key-S. ",
"text": "In addition to this, many shortcuts will work without using the Alt key. For example Ctrl + Shift + Key-S. ",
"updated": 1634999389000
},
{
@@ -319,7 +319,7 @@ function newEducationTutorialSpace() {
htmlImage.height = "100"
} else if (icon === undefined) {
// Legacy Code to handle icons being fetched by literal path
// Note: This if statment should be removed once all tutoials have been refactored
// Note: This if statement should be removed once all tutorials have been refactored
let webParam = 'Icons/' + newImageProject + '/' + newImageName + '.png'
htmlImage.src = webParam
htmlImage.width = "100"
@@ -378,7 +378,7 @@ function newEducationTutorialSpace() {
config.controlDocs.page.type !== ''
) {
/*
This produces the Docs to laod the specified page.
This produces the Docs to load the specified page.
*/
UI.projects.education.spaces.docsSpace.openSpaceAreaAndNavigateTo(config.controlDocs.page.project, config.controlDocs.page.category, config.controlDocs.page.type, config.controlDocs.page.anchor)
}
@@ -391,7 +391,7 @@ function newEducationTutorialSpace() {
workspacesCounter++
if (config.workspaces === undefined) {
/*
The worspaces panel will remain as it is, and the user will be free to open or close it at will.
The workspaces panel will remain as it is, and the user will be free to open or close it at will.
*/
return
}
@@ -853,7 +853,7 @@ function newEducationTutorialSpace() {
}
let previousNode
/*
Reseet the Status of Current and Previous Node
Reset the Status of Current and Previous Node
so that RESUME goes to the right node.
*/
UI.projects.foundations.utilities.tutorial.saveTutorial(currentNode.payload, tutorial)
@@ -1084,7 +1084,7 @@ function newEducationTutorialSpace() {
function findTutorialNode(node) {
/*
We will consider the tutorialRootNode the head of the hirierchy
We will consider the tutorialRootNode the head of the hierarchy
*/
tutorialRootNode = node
@@ -1309,7 +1309,7 @@ function newEducationTutorialSpace() {
function syncConfigIconWithDocumentIcon() {
/*
We update here the image of the document with whatever we find at the config, since
we need to mechanism to keep this syncronized.
we need to mechanism to keep this synchronized.
*/
if (nodeConfig.icon === undefined) {
nodeConfig.icon = {
@@ -49,7 +49,7 @@
/* these are module specific variables: */
let percentageBandwidthArray = []; // Here we keep the percentageBandwidthArray to be ploted every time the Draw() function is called by the AAWebPlatform.
let percentageBandwidthArray = []; // Here we keep the percentageBandwidthArray to be plotted every time the Draw() function is called by the AAWebPlatform.
let zoomChangedEventSubscriptionId
let offsetChangedEventSubscriptionId
@@ -63,7 +63,7 @@
function finalize() {
try {
/* Stop listening to the necesary events. */
/* Stop listening to the necessary events. */
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId);
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId);
@@ -72,7 +72,7 @@
marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId);
dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId);
/* Destroyd References */
/* Destroyed References */
marketFiles = undefined;
dailyFiles = undefined;
@@ -113,7 +113,7 @@
marketFile = marketFiles.getFile(pTimeFrame);
fileCursor = dailyFiles.getFileCursor(pTimeFrame);
/* Listen to the necesary events. */
/* Listen to the necessary events. */
zoomChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged);
offsetChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged);
@@ -354,7 +354,7 @@
currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS);
}
/* Lests check if all the visible screen is going to be covered by percentageBandwidthArray. */
/* Lets check if all the visible screen is going to be covered by percentageBandwidthArray. */
let lowerEnd = leftDate.valueOf();
let upperEnd = rightDate.valueOf();
@@ -508,7 +508,7 @@
if (percentageBandwidthArray.length > 0) {
/* This next section is to get ready in order to be able to plot dinamically constrained to the viewport */
/* This next section is to get ready in order to be able to plot dynamically constrained to the viewport */
let visibleHeight = UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.bottomRight.y - UI.projects.foundations.spaces.chartingSpace.viewport.visibleArea.topLeft.y;
@@ -118,7 +118,7 @@ function newCandlesPlottersCandlesVolumesVolumesVolumePanel() {
y: Y_AXIS_BUY
};
/* Extra bounderies due to constrained space */
/* Extra boundaries due to constrained space */
const upperLimit = frameTitleHeight + frameBodyHeight * 0.15;
const downLimit = frameTitleHeight + frameBodyHeight * 0.85;
@@ -46,7 +46,7 @@
/* these are module specific variables: */
let volumes = []; // Here we keep the volumes to be ploted every time the Draw() function is called by the AAWebPlatform.
let volumes = []; // Here we keep the volumes to be plotted every time the Draw() function is called by the AAWebPlatform.
let onMouseOverEventSuscriptionId
let zoomChangedEventSubscriptionId
@@ -63,7 +63,7 @@
function finalize() {
try {
/* Stop listening to the necesary events. */
/* Stop listening to the necessary events. */
thisObject.container.eventHandler.stopListening(onMouseOverEventSuscriptionId)
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(zoomChangedEventSubscriptionId);
UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.stopListening(offsetChangedEventSubscriptionId);
@@ -72,7 +72,7 @@
marketFiles.eventHandler.stopListening(marketFilesUpdatedEventSubscriptionId);
dailyFiles.eventHandler.stopListening(dailyFilesUpdatedEventSubscriptionId);
/* Destroyd References */
/* Destroyed References */
marketFiles = undefined;
dailyFiles = undefined;
@@ -116,7 +116,7 @@
marketFile = marketFiles.getFile(pTimeFrame);
fileCursor = dailyFiles.getFileCursor(pTimeFrame);
/* Listen to the necesary events. */
/* Listen to the necessary events. */
zoomChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Zoom Changed", onViewportZoomChanged);
offsetChangedEventSubscriptionId = UI.projects.foundations.spaces.chartingSpace.viewport.eventHandler.listenToEvent("Position Changed", onViewportPositionChanged);
@@ -352,7 +352,7 @@
currentDate = new Date(currentDate.valueOf() + ONE_DAY_IN_MILISECONDS);
}
/* Lests check if all the visible screen is going to be covered by volumes. */
/* Lets check if all the visible screen is going to be covered by volumes. */
let lowerEnd = leftDate.valueOf();
let upperEnd = rightDate.valueOf();
@@ -650,7 +650,7 @@
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.GREEN + ', 0.40)';
if (userPositionDate >= volume.begin && userPositionDate <= volume.end) {
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.40)'; // Current bar accroding to time
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.40)'; // Current bar according to time
}
}
@@ -674,7 +674,7 @@
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', 0.40)';
if (userPositionDate >= volume.begin && userPositionDate <= volume.end) {
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.40)'; // Current volume accroding to time
browserCanvasContext.fillStyle = 'rgba(' + UI_COLOR.TITANIUM_YELLOW + ', 0.40)'; // Current volume according to time
}
browserCanvasContext.fill();
@@ -13,7 +13,7 @@
"label": "Send Test Message",
"workingLabel": "Sending Message",
"workDoneLabel": "Message Sent",
"workFailedLabel": "Message not Delived",
"workFailedLabel": "Message not Delivered",
"iconPathOn": "run",
"iconPathOff": "run",
"actionFunction": "payload.executeAction"
@@ -1,13 +1,13 @@
{
"type": "Reviews",
"definition": {
"text": "This book is a cataloge of all types of reviews at the Docs.",
"text": "This book is a catalogue of all types of reviews at the Docs.",
"updated": 1621437863554
},
"paragraphs": [
{
"style": "Chapter",
"text": "I->Foundations->Review->Superalgos Project Review->These are reviews of the project submited by users.",
"text": "I->Foundations->Review->Superalgos Project Review->These are reviews of the project submitted by users.",
"updated": 1621437834465
}
]
@@ -1,7 +1,7 @@
{
"type": "Plugin Workspace",
"definition": {
"text": "Refers to a Workspace created by a user, contributed to the project as a plugin and distributed with the software package. Plugin workspaces are useful to give users access to ready-to-run strategies, demos, tutorials, or intoductions to areas of the system under development.",
"text": "Refers to a Workspace created by a user, contributed to the project as a plugin and distributed with the software package. Plugin workspaces are useful to give users access to ready-to-run strategies, demos, tutorials, or introductions to areas of the system under development.",
"updated": 1629895587555,
"translations": [
{
@@ -1,7 +1,7 @@
{
"type": "Project Schema File",
"definition": {
"text": "It is the most basic and low level system-wide configuration file. You will find it at the Projects folder. It contains a list of all integrated projects and for each one the list of javascript modules organized in different categories, like Function Libraries, Utilities, Spaces, Globals, etc; in turn organized into the broather categories UI, TS and PL.",
"text": "It is the most basic and low level system-wide configuration file. You will find it at the Projects folder. It contains a list of all integrated projects and for each one the list of javascript modules organized in different categories, like Function Libraries, Utilities, Spaces, Globals, etc; in turn organized into the broader categories UI, TS and PL.",
"updated": 1614939492529
},
"paragraphs": [
@@ -1,7 +1,7 @@
{
"type": "Remove Distance to Parent Node",
"definition": {
"text": "The distance setting is dissabled and the node may assume any distance to its parent.",
"text": "The distance setting is disabled and the node may assume any distance to its parent.",
"updated": 1610030359012
},
"paragraphs": [
@@ -137,7 +137,7 @@
},
{
"style": "List",
"text": "@BeginCurrentMinute: This will instruct the Bot to use a timestamp at the begining of the current minute."
"text": "@BeginCurrentMinute: This will instruct the Bot to use a timestamp at the beginning of the current minute."
},
{
"style": "Javascript",
@@ -1,7 +1,7 @@
{
"type": "Set Node Arrangement to Concave",
"definition": {
"text": "The node adopts a slot on a circumsference around its parent node. In the icon’s graphic, the orange dot represents the parent node, and the blue dots represent the node adopting the specific arrangement style.",
"text": "The node adopts a slot on a circumference around its parent node. In the icon’s graphic, the orange dot represents the parent node, and the blue dots represent the node adopting the specific arrangement style.",
"updated": 1610032139983
},
"paragraphs": [
@@ -42,7 +42,7 @@
},
{
"style": "Text",
"text": "The formulas nodes there are used to expand the record definition adding fields that are not actually going to be saved on disk, to minimize space used, and they are going to be calculated at runtime. This allows proceeses that consume this data to have ell the fields available at runtime even though some were not actually saved on disk."
"text": "The formulas nodes there are used to expand the record definition adding fields that are not actually going to be saved on disk, to minimize space used, and they are going to be calculated at runtime. This allows processes that consume this data to have ell the fields available at runtime even though some were not actually saved on disk."
}
]
}
@@ -21,7 +21,7 @@
},
{
"style": "Text",
"text": "A formula may act in slightly different ways depending on the isCaculated attribute in the record property configuration:"
"text": "A formula may act in slightly different ways depending on the isCalculated attribute in the record property configuration:"
},
{
"style": "List",
@@ -50,7 +50,7 @@
},
{
"style": "List",
"text": "isCalculated determines if the field is stored in the dataset or if, instead, is calculated at a later stage. A value true* means that the record is not stored. In the case isCaculated is not defined in the configuration, it is assumed to be false.",
"text": "isCalculated determines if the field is stored in the dataset or if, instead, is calculated at a later stage. A value true* means that the record is not stored. In the case isCalculated is not defined in the configuration, it is assumed to be false.",
"updated": 1621972714008
},
{
@@ -10,7 +10,7 @@
},
{
"style": "Text",
"text": "Serial numbers start at 1 and increment by 1 with each intance of the object that is opened."
"text": "Serial numbers start at 1 and increment by 1 with each instance of the object that is opened."
},
{
"style": "Block",
@@ -1,7 +1,7 @@
{
"type": "Space Settings",
"definition": {
"text": "The space settings node features controls over the phisics, proportions, and positioning of icons representing node, and their menus."
"text": "The space settings node features controls over the physics, proportions, and positioning of icons representing node, and their menus."
},
"paragraphs": [
{
@@ -53,7 +53,7 @@
},
{
"style": "List",
"text": "animationSteps adjusts the amount of steps the animation takes to open a node menu upon hovering over it. A higher value leads to smoother transtion.",
"text": "animationSteps adjusts the amount of steps the animation takes to open a node menu upon hovering over it. A higher value leads to smoother transition.",
"updated": 1631588728860
},
{
@@ -73,46 +73,46 @@
},
{
"style": "List",
"text": "radiusPercentage is the reference radious of the circular matrix that governs the distribution of items in the circular menu. Larger numbers cause items to spread appart while smaller numbers makes items lie closer to each other.",
"text": "radiusPercentage is the reference radius of the circular matrix that governs the distribution of items in the circular menu. Larger numbers cause items to spread apart while smaller numbers makes items lie closer to each other.",
"updated": 1631554041849
},
{
"style": "Subtitle",
"text": "Shorcut Properties"
"text": "Shortcut Properties"
},
{
"style": "Text",
"text": "Shorcuts are key stroke combinations that helps users execute certain actions very quickly. To execute a shorcut users need to simultaniously press CTRL + SHIFT + a pre-defined key.",
"text": "Shortcuts are key stroke combinations that helps users execute certain actions very quickly. To execute a Shortcut users need to simultaneously press CTRL + SHIFT + a pre-defined key.",
"updated": 1625419324367
},
{
"style": "Success",
"text": "Shorcuts default values can be seen below. You can modify those values by changing the Config Properties listed below.",
"text": "Shortcuts default values can be seen below. You can modify those values by changing the Config Properties listed below.",
"updated": 1625419754545
},
{
"style": "List",
"text": "toggleMapMode defines which key will be used as a Shorcut for entering and leaving the Map Mode.",
"text": "toggleMapMode defines which key will be used as a Shortcut for entering and leaving the Map Mode.",
"updated": 1625419803171
},
{
"style": "List",
"text": "toggleDrawRelationshipLines defines which key will be used as a Shorcut for turning on and off the drawing of Reference Lines.",
"text": "toggleDrawRelationshipLines defines which key will be used as a Shortcut for turning on and off the drawing of Reference Lines.",
"updated": 1625419810253
},
{
"style": "List",
"text": "toggleDrawParentLines defines which key will be used as a Shorcut for turning on and off the drawing of Parent Lines.",
"text": "toggleDrawParentLines defines which key will be used as a Shortcut for turning on and off the drawing of Parent Lines.",
"updated": 1625419816654
},
{
"style": "List",
"text": "saveWorkspace defines which key will be used as a Shorcut for saving the Workspace.",
"text": "saveWorkspace defines which key will be used as a Shortcut for saving the Workspace.",
"updated": 1625419822252
},
{
"style": "List",
"text": "adjustAspectRation defines which key will be used as a Shorcut for forcing a Time Machine to adjust it's aspect ratio according to the size of the screen a user currently have.",
"text": "adjustAspectRation defines which key will be used as a Shortcut for forcing a Time Machine to adjust it's aspect ratio according to the size of the screen a user currently have.",
"updated": 1625419830418
}
]
@@ -14,7 +14,7 @@
},
{
"style": "Text",
"text": "Therefore, this section of the data structure features information spaning those periods only."
"text": "Therefore, this section of the data structure features information spanning those periods only."
}
]
}
@@ -14,7 +14,7 @@
},
{
"style": "Text",
"text": "Therefore, this section of the data structure features information spaning those periods only."
"text": "Therefore, this section of the data structure features information spanning those periods only."
}
]
}
@@ -10,7 +10,7 @@
},
{
"style": "Text",
"text": "The trigger stage is active from the instant the trigger-on event is triggered until either the trigger-off event or the take position event gets triggered. Therefore, this section of the data structure features information spaning those periods only."
"text": "The trigger stage is active from the instant the trigger-on event is triggered until either the trigger-off event or the take position event gets triggered. Therefore, this section of the data structure features information spanning those periods only."
}
]
}
@@ -10,7 +10,7 @@
},
{
"style": "Text",
"text": "The super scripts hierarchy may be used by developers who wish to create their own scripts for automating the deployment or manitenance of all sorts of structures of nodes across any of the hierarchies in the design space."
"text": "The super scripts hierarchy may be used by developers who wish to create their own scripts for automating the deployment or maintenance of all sorts of structures of nodes across any of the hierarchies in the design space."
},
{
"style": "Text",
@@ -3,7 +3,7 @@
"pageNumber": 31,
"type": "Superalgos Review - My first Superalgos review",
"definition": {
"text": "I'm just grinding the tutorials for now, can't wait to run some backtests. I'm impressed how complex but also easy to use this software is. As a developer i am also higly motivated to contribute to the project.",
"text": "I'm just grinding the tutorials for now, can't wait to run some backtests. I'm impressed how complex but also easy to use this software is. As a developer i am also highly motivated to contribute to the project.",
"updated": 1633844141741
},
"paragraphs": [
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Text",
"text": "Each type of node, might have a definition with the initial values for it's configuration. The Initial Values are set at the node iwhen the Node is first created. ",
"text": "Each type of node, might have a definition with the initial values for it's configuration. The Initial Values are set at the node when the Node is first created. ",
"updated": 1609244634949
}
]
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Text",
"text": "Some types of nodes, might have code that defines their behaviour. The code can usually be accesed by users via the Edit menu item. When first created, the code of a Node is initialized with the initial value present at the Node's Definition Document. Some types of node represents Formulas and they hold code that defines those formulas at the Node Code.",
"text": "Some types of nodes, might have code that defines their behaviour. The code can usually be accessed by users via the Edit menu item. When first created, the code of a Node is initialized with the initial value present at the Node's Definition Document. Some types of node represents Formulas and they hold code that defines those formulas at the Node Code.",
"updated": 1609246211297
}
]
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Text",
"text": "Each Node Type, might have a menu which allow users to interact with the Node. There is no fixed set of menu items. Instead each menu items is defined at each Node's definition. Each menu item haave a set of properties that allow the system to execute some action when the menu item is clicked by users.",
"text": "Each Node Type, might have a menu which allow users to interact with the Node. There is no fixed set of menu items. Instead each menu items is defined at each Node's definition. Each menu item has a set of properties that allow the system to execute some action when the menu item is clicked by users.",
"updated": 1609240463871
}
]
@@ -16,7 +16,7 @@
"paragraphs": [
{
"style": "Text",
"text": "Each Node Type, might have a set of rules that defines to which nodes it can be attached to. These rules are literally two lists of Node Type s, one for compatible types and the second one for uncompatible types. There is also the possiblity to replace the list of types for the keyword *Any Node*.",
"text": "Each Node Type, might have a set of rules that defines to which nodes it can be attached to. These rules are literally two lists of Node Type s, one for compatible types and the second one for incompatible types. There is also the possibility to replace the list of types for the keyword *Any Node*.",
"updated": 1609243750949
}
]
@@ -3,7 +3,7 @@
"pageNumber": "9",
"type": "Node Referencing Rules",
"definition": {
"text": "Each Node Type can have a set of rules that defines with which Node Type it can stablish a reference.",
"text": "Each Node Type can have a set of rules that defines with which Node Type it can Establish a reference.",
"updated": 1609244259240,
"translations": [
{
@@ -3,7 +3,7 @@
"pageNumber": "12",
"type": "Reference Parent",
"definition": {
"text": "The Reference Parent of a certain Node A, is the node with which A stablishes a Reference.",
"text": "The Reference Parent of a certain Node A, is the node with which A establishes a Reference.",
"updated": 1609240205404
},
"paragraphs": [
@@ -26,7 +26,7 @@
},
{
"style": "Text",
"text": "ARPS - Average Range Percentage Spread measures the amount force of Bull Power and Bear Power. Two separate indicators measuring the same thing, in order to be used either separatly or combined.",
"text": "ARPS - Average Range Percentage Spread measures the amount force of Bull Power and Bear Power. Two separate indicators measuring the same thing, in order to be used either separately or combined.",
"updated": 1617957855552
},
{
@@ -27,7 +27,7 @@
},
{
"style": "Text",
"text": "Two separate indicators that can be used either separatly or in combination with others."
"text": "Two separate indicators that can be used either separately or in combination with others."
},
{
"style": "Text",
@@ -67,7 +67,7 @@
},
{
"style": "List",
"text": "All values are multiplied by 100 to convert it to precentage form (%)."
"text": "All values are multiplied by 100 to convert it to percentage form (%)."
},
{
"style": "Subtitle",
@@ -43,7 +43,7 @@
},
{
"style": "List",
"text": "If it’s a backtesting or paper trading session, the order cancelation must be simulated (see Simulating Order Cancelation).",
"text": "If it’s a backtesting or paper trading session, the order cancellation must be simulated (see Simulating Order Cancellation).",
"updated": 1610222051378
},
{
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Text",
"text": "Simulating the cancelation of an order is almost trivial. Of course, the process applies to backtesting and paper trading sessions only.",
"text": "Simulating the cancellation of an order is almost trivial. Of course, the process applies to backtesting and paper trading sessions only.",
"updated": 1610223521328
},
{
@@ -26,7 +26,7 @@
},
{
"style": "Text",
"text": "Stage base aset, undoing the previous accounting:"
"text": "Stage base asset, undoing the previous accounting:"
},
{
"style": "Javascript",
@@ -3,7 +3,7 @@
"pageNumber": 1,
"type": "Sparta By @julian-molina",
"definition": {
"text": "The set of indicators built in the Sparta data mine include Simple Moving Average (SMA), Exponential Moving Averege (EMA), Relative Strength Index (RSI), and Moving Average convergence Divergence (MACD).",
"text": "The set of indicators built in the Sparta data mine include Simple Moving Average (SMA), Exponential Moving Average (EMA), Relative Strength Index (RSI), and Moving Average convergence Divergence (MACD).",
"updated": 1611685345604
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": 2,
"type": "Simple Moving Average (SMA) - Sparta Indicator",
"definition": {
"text": "The indicator produces the Simple Moving Avarge in multiple settings, including the popular 20, 50, 100, and 200, as well as less frequent base 7 and base 11 SMAs.",
"text": "The indicator produces the Simple Moving Average in multiple settings, including the popular 20, 50, 100, and 200, as well as less frequent base 7 and base 11 SMAs.",
"updated": 1611661320849
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": 3,
"type": "Exponential Moving Average (EMA) - Sparta Indicator",
"definition": {
"text": "The indicator produces the Exponential Moving Avarge in multiple settings, including the popular 20, 50, 100, and 200, as well as less frequent base 7 and base 11 SMAs.",
"text": "The indicator produces the Exponential Moving Average in multiple settings, including the popular 20, 50, 100, and 200, as well as less frequent base 7 and base 11 SMAs.",
"updated": 1611661783066
},
"paragraphs": [
@@ -23,7 +23,7 @@
},
{
"style": "Text",
"text": "The chart for this indicator shows the RSI oscillating in a scale ranging from 0 at the bottom to 100 at the top. The bottom section of the chart shows a blue background covering the range from 0 to 20, also marked by a dotted line. When the RSI value falls below the 20 mark, the RSI line turns red, for easier viasualization. Also in the bottom section, there is a second dotted line signaling the 30 mark."
"text": "The chart for this indicator shows the RSI oscillating in a scale ranging from 0 at the bottom to 100 at the top. The bottom section of the chart shows a blue background covering the range from 0 to 20, also marked by a dotted line. When the RSI value falls below the 20 mark, the RSI line turns red, for easier visualization. Also in the bottom section, there is a second dotted line signaling the 30 mark."
},
{
"style": "Text",
@@ -14,7 +14,7 @@
},
{
"style": "Text",
"text": "There are four different products, each configured with a specific setting for the fast and slow moving avarages and the MACD Signal line."
"text": "There are four different products, each configured with a specific setting for the fast and slow moving averages and the MACD Signal line."
},
{
"style": "Table",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": "6",
"type": "TS API Data Fetcher Bot Error - API Response Field Not Descendant From Endpoint",
"definition": {
"text": "Every API Response Field Node needs to descend from an API Endpoint node. Check this node's parent node, and it's parent, and continue until you find the API Endpoint. Find the place where the chain is broken and fix it in order for the API Data Fetcher Bot to be able to preccedd.",
"text": "Every API Response Field Node needs to descend from an API Endpoint node. Check this node's parent node, and it's parent, and continue until you find the API Endpoint. Find the place where the chain is broken and fix it in order for the API Data Fetcher Bot to be able to proceed.",
"updated": 1621860822884
},
"paragraphs": [
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": "11",
"type": "TS API Data Fetcher Bot Error - Timestamp Record Property Missing",
"definition": {
"text": "The API Data Fetcher Bot expects that one of the Repord Property nodes is defined with a config property codeName as a timestamp. This is a special value and concept. This means that the Record Property will hold the timestamp value returned by the API, but at the same time it assures the Bot that the information will be well organized by time. To solve this issue simply make sure that you have a Timestamp Record Property that ultimately references the Timestamp API Response Field holding the actual timestamp of the information returned by the API server.",
"text": "The API Data Fetcher Bot expects that one of the Record Property nodes is defined with a config property codeName as a timestamp. This is a special value and concept. This means that the Record Property will hold the timestamp value returned by the API, but at the same time it assures the Bot that the information will be well organized by time. To solve this issue simply make sure that you have a Timestamp Record Property that ultimately references the Timestamp API Response Field holding the actual timestamp of the information returned by the API server.",
"updated": 1621860822884
},
"paragraphs": [
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -1,7 +1,7 @@
{
"topic": "TS Dataset Type Standard Converter Error",
"pageNumber": "1",
"type": "TS Dataset Type Standard Convertert Error - Only One Data Dependency Expected",
"type": "TS Dataset Type Standard Converter Error - Only One Data Dependency Expected",
"definition": {
"text": "For this type of Dataset conversion, the process needs to have only one Data Dependency defined. Zero or more than one where found. To fix this issue, define only one Data Dependency and try again.",
"updated": 1621859784437
@@ -31,7 +31,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Message of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -43,7 +43,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -55,7 +55,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following is the Error Code of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -67,7 +67,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the API Data Fetcher Bot:"
"text": "The following are all the Error details of the Exception that occurred at the API Data Fetcher Bot:"
},
{
"style": "Placeholder",
@@ -1,7 +1,7 @@
{
"topic": "TS Dataset Type Standard Converter Error",
"pageNumber": "2",
"type": "TS Dataset Type Standard Convertert Error - Only One Output Dataset Expected",
"type": "TS Dataset Type Standard Converter Error - Only One Output Dataset Expected",
"definition": {
"text": "For this type of Dataset conversion, the process needs to have only one Output Datasety defined. Zero or more than one where found. To fix this issue, define only one Output Dataset and try again.",
"updated": 1621859784437
@@ -1,7 +1,7 @@
{
"topic": "TS Dataset Type Standard Converter Error",
"pageNumber": "3",
"type": "TS Dataset Type Standard Convertert Error - Status Report Is Corrupt",
"type": "TS Dataset Type Standard Converter Error - Status Report Is Corrupt",
"definition": {
"text": "The status report of one of the processes defined as Status Dependencies is corrupt and cannot be read. See below for details.",
"updated": 1621859784437
@@ -1,7 +1,7 @@
{
"topic": "TS Dataset Type Standard Converter Error",
"pageNumber": "4",
"type": "TS Dataset Type Standard Convertert Error - Get Context Variables Failed",
"type": "TS Dataset Type Standard Converter Error - Get Context Variables Failed",
"definition": {
"text": "It was not possible to get the context variables needed for running this process. See below for details.",
"updated": 1621859784437
@@ -3,7 +3,7 @@
"pageNumber": "1",
"type": "TS LF Learning Bot Error - Evaluating Condition Error",
"definition": {
"text": "An error occured while evaluating a user defined Condition in the Learning System.",
"text": "An error occurred while evaluating a user defined Condition in the Learning System.",
"updated": 1611925832560
},
"paragraphs": [
@@ -36,7 +36,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Learning Bot:",
"text": "The following is the Error Message of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569424352
},
{
@@ -49,7 +49,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Learning Bot:",
"text": "The following is the Error Stack of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569434043
},
{
@@ -62,7 +62,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Learning Bot:",
"text": "The following is the Error Code of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569440715
},
{
@@ -75,7 +75,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Learning Bot:",
"text": "The following are all the Error details of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569446711
},
{
@@ -3,7 +3,7 @@
"pageNumber": "2",
"type": "TS LF Learning Bot Error - Evaluating Formula Error",
"definition": {
"text": "An error occured while evaluatiing a user-defined Formula at the Learning System.",
"text": "An error occurred while evaluating a user-defined Formula at the Learning System.",
"updated": 1611926309593
},
"paragraphs": [
@@ -36,7 +36,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Learning Bot:",
"text": "The following is the Error Message of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569424352
},
{
@@ -49,7 +49,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Learning Bot:",
"text": "The following is the Error Stack of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569434043
},
{
@@ -62,7 +62,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Learning Bot:",
"text": "The following is the Error Code of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569440715
},
{
@@ -75,7 +75,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Learning Bot:",
"text": "The following are all the Error details of the Exception that occurred at the LF Learning Bot:",
"updated": 1611569446711
},
{
@@ -3,7 +3,7 @@
"pageNumber": 1,
"type": "TS LF Trading Bot Error - Evaluating Condition Error",
"definition": {
"text": "An error occured while evaluating a user defined Condition in the Trading System.",
"text": "An error occurred while evaluating a user defined Condition in the Trading System.",
"updated": 1611925832560
},
"paragraphs": [
@@ -36,7 +36,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:",
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569424352
},
{
@@ -49,7 +49,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:",
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569434043
},
{
@@ -62,7 +62,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:",
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569440715
},
{
@@ -75,7 +75,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:",
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:",
"updated": 1611569446711
},
{
@@ -3,7 +3,7 @@
"pageNumber": 2,
"type": "TS LF Trading Bot Error - Evaluating Formula Error",
"definition": {
"text": "An error occurred while evaluatiing a user-defined Formula at the Trading System.",
"text": "An error occurred while evaluating a user-defined Formula at the Trading System.",
"updated": 1611926309593
},
"paragraphs": [
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Text",
"text": "The Session Base Asset and Session Quoted Asset Trading Parameters enable the setting of a maximumBalance. The parameter is optional. When you use it, the LF Trading Bot checks—for every candle during the Trading Session—that the balance has not reached the configured maximum. If it does, this error is triggered and the Trading Session stops immediatelly.",
"text": "The Session Base Asset and Session Quoted Asset Trading Parameters enable the setting of a maximumBalance. The parameter is optional. When you use it, the LF Trading Bot checks—for every candle during the Trading Session—that the balance has not reached the configured maximum. If it does, this error is triggered and the Trading Session stops immediately.",
"updated": 1611930588291
},
{
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Text",
"text": "The Session Base Asset and Session Quoted Asset Trading Parameters enable the setting of a minimumBalance. The parameter is optional. When you use it, the LF Trading Bot checks—for every candle during the Trading Session—that the balance has not reached the configured minimum. If it does, this error is triggered and the Trading Session stops immediatelly.",
"text": "The Session Base Asset and Session Quoted Asset Trading Parameters enable the setting of a minimumBalance. The parameter is optional. When you use it, the LF Trading Bot checks—for every candle during the Trading Session—that the balance has not reached the configured minimum. If it does, this error is triggered and the Trading Session stops immediately.",
"updated": 1611934902255
},
{
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Error",
"text": "Order Statistics Node Misssing",
"text": "Order Statistics Node Missing",
"updated": 1611650682469
},
{
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Error",
"text": "Annoucement Unexpected Error",
"text": "Announcement Unexpected Error",
"updated": 1611732817870
},
{
@@ -3,7 +3,7 @@
"pageNumber": 56,
"type": "TS LF Trading Bot Error - Invalid Exchange API Secret",
"definition": {
"text": "The secret in the Exchange API Key you provided was not recongnized by the Exchange as a valid secret for the particular key.",
"text": "The secret in the Exchange API Key you provided was not recognized by the Exchange as a valid secret for the particular key.",
"updated": 1611951391613
},
"paragraphs": [
@@ -45,7 +45,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -57,7 +57,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -69,7 +69,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -81,7 +81,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -117,7 +117,7 @@
},
{
"style": "Text",
"text": "The following is the context information preserved when the error occured:"
"text": "The following is the context information preserved when the error occurred:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": 58,
"type": "TS LF Trading Bot Error - Cancel Order Unexpected Error",
"definition": {
"text": "An Unexpected Error occured while trying to cancel an order at the exchange. The LF Trading Bot continued running after reporting this error.",
"text": "An Unexpected Error occurred while trying to cancel an order at the exchange. The LF Trading Bot continued running after reporting this error.",
"updated": 1611952604513
},
"paragraphs": [
@@ -40,7 +40,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -52,7 +52,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -64,7 +64,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -76,7 +76,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -112,7 +112,7 @@
},
{
"style": "Text",
"text": "The following is the context information preserved when the error occured:"
"text": "The following is the context information preserved when the error occurred:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": 59,
"type": "TS LF Trading Bot Error - Create Order Unexpected Error",
"definition": {
"text": "An Uncexpected Error occured while trying to cancel an order at the exchange. The LF Trading Bot continued running after reporting this error.",
"text": "An Unexpected Error occurred while trying to cancel an order at the exchange. The LF Trading Bot continued running after reporting this error.",
"updated": 1611736350925
},
"paragraphs": [
@@ -40,7 +40,7 @@
},
{
"style": "Text",
"text": "The following is the Error Message of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Message of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -52,7 +52,7 @@
},
{
"style": "Text",
"text": "The following is the Error Stack of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Stack of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -64,7 +64,7 @@
},
{
"style": "Text",
"text": "The following is the Error Code of the Exception that occured at the LF Trading Bot:"
"text": "The following is the Error Code of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -76,7 +76,7 @@
},
{
"style": "Text",
"text": "The following are all the Error details of the Exception that occured at the LF Trading Bot:"
"text": "The following are all the Error details of the Exception that occurred at the LF Trading Bot:"
},
{
"style": "Placeholder",
@@ -112,7 +112,7 @@
},
{
"style": "Text",
"text": "The following is the context information preserved when the error occured:"
"text": "The following is the context information preserved when the error occurred:"
},
{
"style": "Placeholder",
@@ -3,7 +3,7 @@
"pageNumber": 60,
"type": "TS LF Trading Bot Error - Execution Unexpected Error",
"definition": {
"text": "An Unexpected Error occurred while procesing the execution of orders. The LF Trading Bot continued running after reporting this error.",
"text": "An Unexpected Error occurred while processing the execution of orders. The LF Trading Bot continued running after reporting this error.",
"updated": 1611953087876
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": "3",
"type": "TS LF Trading Bot Info - Order Closed",
"definition": {
"text": "The order that triggered this Infor Message has been closed.",
"text": "The order that triggered this Info Message has been closed.",
"updated": 1611920136713
},
"paragraphs": [
@@ -1,7 +1,7 @@
{
"topic": "TS LF Trading Bot Warnings",
"pageNumber": "8",
"type": "TS LF Trading Bot Warning - Simulating - Actual Rate Too Hight",
"type": "TS LF Trading Bot Warning - Simulating - Actual Rate Too High",
"definition": {
"text": "The Actual Rate was adjusted to the Candle Max value because the original Actual Rate of the Buy Order was above the Current Candle Max.",
"updated": 1611924420717
@@ -14,7 +14,7 @@
},
{
"style": "Warning",
"text": "Actual Rate Too Hight"
"text": "Actual Rate Too High"
},
{
"style": "Title",
@@ -1,9 +1,9 @@
{
"topic": "TS LF Trading Bot Warnings",
"pageNumber": "13",
"type": "TS LF Trading Bot Warning - Order Size Shrinked",
"type": "TS LF Trading Bot Warning - Order Size Shrunk",
"definition": {
"text": "The Order Size was shrinked to enforce the cap set in the Target Size of the stage. Otherwise, the original definition of the order Size would have set the Size Placed higher than the Target Size.",
"text": "The Order Size was shrunk to enforce the cap set in the Target Size of the stage. Otherwise, the original definition of the order Size would have set the Size Placed higher than the Target Size.",
"updated": 1611916645008
},
"paragraphs": [
@@ -14,7 +14,7 @@
},
{
"style": "Warning",
"text": "Order Size Shrinked"
"text": "Order Size Shrunk"
},
{
"style": "Title",
@@ -3,7 +3,7 @@
"pageNumber": "2",
"type": "TS Trading Session Error - Invalid Initial Datetime Property Value",
"definition": {
"text": "The initialDatetime property configured at the Time Range node is not recongnized as a valid Javascript Datetime.",
"text": "The initialDatetime property configured at the Time Range node is not recognized as a valid Javascript Datetime.",
"updated": 1611322806779
},
"paragraphs": [
@@ -14,7 +14,7 @@
},
{
"style": "Success",
"text": "Check Node JS Javsacript docs to learn how to correctly express a datetime value.",
"text": "Check Node JS Javascript docs to learn how to correctly express a datetime value.",
"updated": 1611323830743
},
{
@@ -3,7 +3,7 @@
"pageNumber": "3",
"type": "TS Trading Session Error - Invalid Final Datetime Property Value",
"definition": {
"text": "The finalDatetime property configured at the Time Range node is not recongnized as a valid Javascript Datetime.",
"text": "The finalDatetime property configured at the Time Range node is not recognized as a valid Javascript Datetime.",
"updated": 1611323471271
},
"paragraphs": [
@@ -14,7 +14,7 @@
},
{
"style": "Success",
"text": "Check Node JS Javsacript docs to learn how to correctly express a datetime value.",
"text": "Check Node JS Javascript docs to learn how to correctly express a datetime value.",
"updated": 1611323848427
},
{
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Success",
"text": "Add a Time Frame Node at the Trading Parameters Node where this error poped up, check it's config and try running the Trading Session again.",
"text": "Add a Time Frame Node at the Trading Parameters Node where this error popped up, check it's config and try running the Trading Session again.",
"updated": 1611331091819
}
]
@@ -3,7 +3,7 @@
"pageNumber": "5",
"type": "TS Trading Session Error - Label Property Missing",
"definition": {
"text": "A property called label is expeceted at the Time Frame Node config, but it is missing.",
"text": "A property called label is expected at the Time Frame Node config, but it is missing.",
"updated": 1611332389501
},
"paragraphs": [
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Success",
"text": "Add a Session Base Asset Node at the Trading Parameters Node where this error poped up, check it's config and try running the Trading Session again.",
"text": "Add a Session Base Asset Node at the Trading Parameters Node where this error popped up, check it's config and try running the Trading Session again.",
"updated": 1611331221697
}
]
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Success",
"text": "Add a Session Quoted Asset Node at the Trading Parameters Node where this error poped up, check it's config and try running the Trading Session again.",
"text": "Add a Session Quoted Asset Node at the Trading Parameters Node where this error popped up, check it's config and try running the Trading Session again.",
"updated": 1611331377674
}
]
@@ -3,7 +3,7 @@
"pageNumber": "9",
"type": "TS Trading Session Error - Initial Balance Property Missing",
"definition": {
"text": "A property called initialBalance is expeceted at the Session Base Asset and Session Quoted Asset Node config.",
"text": "A property called initialBalance is expected at the Session Base Asset and Session Quoted Asset Node config.",
"updated": 1611335687259
},
"paragraphs": [
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Success",
"text": "At the Task Node where this error poped up, add a Key Reference Node and reference from it an Exchange Account Key with it. Then you can try to run the Trading Session again.",
"text": "At the Task Node where this error popped up, add a Key Reference Node and reference from it an Exchange Account Key with it. Then you can try to run the Trading Session again.",
"updated": 1611392617497
}
]
@@ -9,7 +9,7 @@
"paragraphs": [
{
"style": "Success",
"text": "From the Key Reference Node where this error poped up, you need to reference an Account Exchange Key holding your keys to access your account at the Exchange.",
"text": "From the Key Reference Node where this error popped up, you need to reference an Account Exchange Key holding your keys to access your account at the Exchange.",
"updated": 1611392779124
}
]
@@ -3,7 +3,7 @@
"pageNumber": "12",
"type": "TS Trading Session Error - Codename Property Missing",
"definition": {
"text": "A property called codeName is expeceted at the Exchange Account Key Node config.",
"text": "A property called codeName is expected at the Exchange Account Key Node config.",
"updated": 1611392953689
},
"paragraphs": [
@@ -3,7 +3,7 @@
"pageNumber": "13",
"type": "TS Trading Session Error - Secret Property Missing",
"definition": {
"text": "A property called secret is expeceted at the Exchange Account Key Node config.",
"text": "A property called secret is expected at the Exchange Account Key Node config.",
"updated": 1611393059925
},
"paragraphs": [
@@ -37,7 +37,7 @@
},
{
"style": "Text",
"text": "The whole purpose of the Network definition is to let the system know where each task must run and where the data is localted. ",
"text": "The whole purpose of the Network definition is to let the system know where each task must run and where the data is located. ",
"updated": 1614353600414
},
{
@@ -51,7 +51,7 @@
},
{
"style": "Text",
"text": "There are many different way you might want to organize the Tasks across several Clients. It is really up to you. The system doesn't care or have any preferred way for you to do so. It justs need to know where each Task runs, and where the Data is located. That's it.",
"text": "There are many different way you might want to organize the Tasks across several Clients. It is really up to you. The system doesn't care or have any preferred way for you to do so. It just need to know where each Task runs, and where the Data is located. That's it.",
"updated": 1617263562866
},
{
@@ -32,7 +32,7 @@
},
{
"style": "Important",
"text": "One of the most important things to undestand of this procedure is that it takes into account the things you have at the workspace at the moment you run this command. "
"text": "One of the most important things to understand of this procedure is that it takes into account the things you have at the workspace at the moment you run this command. "
},
{
"style": "Text",
@@ -82,7 +82,7 @@
},
{
"style": "Text",
"text": "Assuming you will go with the startegy of installing one Network Node first, this is what you need to know on how to move Task s to other Network Nodes.",
"text": "Assuming you will go with the strategy of installing one Network Node first, this is what you need to know on how to move Task s to other Network Nodes.",
"updated": 1614357184981
},
{
@@ -92,7 +92,7 @@
},
{
"style": "Text",
"text": "Always remember that the system just needs you to define where you want the Tasks to run and the Data to be Hosted, but there is an implcit relationship between Tasks and Data because a Task produces certain Data, and those definition needs to be consistent and be found at the same Network Node."
"text": "Always remember that the system just needs you to define where you want the Tasks to run and the Data to be Hosted, but there is an implicit relationship between Tasks and Data because a Task produces certain Data, and those definition needs to be consistent and be found at the same Network Node."
},
{
"style": "Warning",
@@ -105,7 +105,7 @@
},
{
"style": "Note",
"text": "When we say moving, what we are saying is detaching a Node branch and re-attaching that same branch somewhere else. Note that if you, for example, make a backup of a branch, restore that somehwhere else without deleting the original branch first, you will inadvertently be creating new ids for each Node at this branch and messing up the incoming references, which will cause things to not work anymore.",
"text": "When we say moving, what we are saying is detaching a Node branch and re-attaching that same branch somewhere else. Note that if you, for example, make a backup of a branch, restore that somewhere else without deleting the original branch first, you will inadvertently be creating new ids for each Node at this branch and messing up the incoming references, which will cause things to not work anymore.",
"updated": 1617264249424
},
{
@@ -56,11 +56,11 @@
},
{
"style": "Text",
"text": "The variables explained further down this section, written as described for each indicator, are not valid unless they are preceeded by the declaration of the time frame they refer to."
"text": "The variables explained further down this section, written as described for each indicator, are not valid unless they are proceeded by the declaration of the time frame they refer to."
},
{
"style": "Text",
"text": "To do that, you need to preceed the above syntax with the following:"
"text": "To do that, you need to proceed the above syntax with the following:"
},
{
"style": "Javascript",
@@ -262,7 +262,7 @@
},
{
"style": "Text",
"text": "You may use any valid piece of JavaScript code for your conditions and formulas. The system imposses no contraints whatsoever. The code on conditions and formulas is run through the eval() function, as follows:",
"text": "You may use any valid piece of JavaScript code for your conditions and formulas. The system imposes no constraints whatsoever. The code on conditions and formulas is run through the eval() function, as follows:",
"updated": 1610215780497
},
{
@@ -14,7 +14,7 @@
},
{
"style": "Text",
"text": "For example, let’s say you wish to access the value of the Begin node under Strategy Open Stage. The path to that node, as denoted by the structure of the hierachy below, is:",
"text": "For example, let’s say you wish to access the value of the Begin node under Strategy Open Stage. The path to that node, as denoted by the structure of the hierarchy below, is:",
"updated": 1610216746961
},
{
Loaded 100 of 176 files, more files were not shown because too many files have changed in this diff. Show more