Running with more than one trigger on

This commit is contained in:
Luis Fernando Molina committed 2020-08-03 14:54:32 +02:00
1 parent 60a88b781f
commit 02f9a04a7e
2 files changed
+32 -64

No files matched your search

+5 -3
View File
@@ -252,7 +252,7 @@ exports.newSnapshots = function newSnapshots(bot, logger) {
function getResults(openDatetime, closeDatetime) {
let closeHeaders = ['Trade Number', 'Open Datetime', 'Close Datetime', 'Strategy Name', 'Trigger On Situation', 'Take Position Situation', 'Result', 'ROI', 'Exit Type']
let closeHeaders = ['Trade Number', 'Open Datetime', 'Close Datetime', 'Strategy Name', 'Trigger On Situation', 'Take Position Situation', 'Result In Base Asset', 'Result In Quoted Asset', 'ROI in Base Asset', 'ROI in Quoted Asset', 'Exit Type']
closeValues = [
tradingEngine.episode.episodeCounters.positions.value, // Position Number
(new Date(openDatetime)).toISOString(), // Open Datetime
@@ -260,8 +260,10 @@ exports.newSnapshots = function newSnapshots(bot, logger) {
tradingEngine.current.strategy.strategyName.value, // Strategy Name
tradingEngine.current.strategy.situationName.value, // Trigger On Situation
tradingEngine.current.position.situationName.value, // Take Position Situation
tradingEngine.current.position.positionStatistics.hitFail.value, // Result
tradingEngine.current.position.positionStatistics.ROI.value, // ROI
tradingEngine.current.position.positionBaseAsset.hitFail.value, // Result in Base Asset
tradingEngine.current.position.positionQuotedAsset.hitFail.value, // Result in Base Asset
tradingEngine.current.position.positionBaseAsset.ROI.value, // ROI in Base Asseet
tradingEngine.current.position.positionQuotedAsset.ROI.value, // ROI in Quoted Asset
tradingEngine.current.position.exitType.value // Exit Type
]
@@ -164,7 +164,7 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
if (situationName !== undefined) {
/* Open a new order */
await tryToOpenOrder(executionAlgorithm, tradingSystemOrder, tradingEngineOrder, situationName)
await tryToOpenOrder(executionAlgorithm, tradingSystemOrder, tradingEngineOrder, traingEngineOrderAsset, situationName)
}
}
break
@@ -205,7 +205,7 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
}
}
async function tryToOpenOrder(executionAlgorithm, tradingSystemOrder, tradingEngineOrder, situationName) {
async function tryToOpenOrder(executionAlgorithm, tradingSystemOrder, tradingEngineOrder, traingEngineOrderAsset, situationName) {
calculateOrderRate()
calculateOrderSize()
@@ -246,17 +246,10 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
if (tradingSystemOrder.positionRate.formula !== undefined) {
tradingEngineOrder.rate.value = tradingSystem.formulas.get(tradingSystemOrder.positionRate.formula.id)
if (tradingEngineOrder.rate.value === undefined) {
const errorText = 'Rate cannot be undefined. Fix this please.'
tradingSystem.errors.push([tradingSystemOrder.positionRate.formula.id, errorText])
throw (errorText)
}
if (tradingEngineOrder.rate.value === undefined) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value === undefined', tradingEngineOrder) }
if (isNaN(tradingEngineOrder.rate.value) === true) { badDefinitionUnhandledException(undefined, 'isNaN(tradingEngineOrder.rate.value) === true', tradingEngineOrder) }
if (tradingEngineOrder.rate.value <= 0) { badDefinitionUnhandledException(undefined, 'tradingEngineOrder.rate.value <= 0', tradingEngineOrder) }
if (tradingEngineOrder.rate.value <= 0) {
const errorText = 'Rate cannot be less or equal to zero. Fix this please.'
tradingSystem.errors.push([tradingSystemOrder.positionRate.formula.id, errorText])
throw (errorText)
}
tradingEngineOrder.rate.value = global.PRECISE(tradingEngineOrder.rate.value, 10)
}
}
@@ -271,50 +264,23 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
let sizeFormula
if (tradingEngine.current.position.positionBaseAsset.size.value > 0) {
/* Position was defined in Base Asset */
if (executionAlgorithm.sizeInBaseAsset !== undefined) {
if (executionAlgorithm.sizeInBaseAsset.formula !== undefined) {
sizeFormula = executionAlgorithm.sizeInBaseAsset.formula
} else {
const errorText = 'Size In Base Asset needs a child Formula. Fix this please.'
tradingSystem.errors.push([executionAlgorithm.sizeInBaseAsset.id, errorText])
throw (errorText)
}
} else {
const errorText = 'Execution Algorithm needs a child Size In Base Asset. Fix this please.'
tradingSystem.errors.push([executionAlgorithm.id, errorText])
throw (errorText)
}
if (executionAlgorithm.sizeInBaseAsset === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInBaseAsset === undefined', executionAlgorithm) }
if (executionAlgorithm.sizeInBaseAsset.formula === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInBaseAsset.formula === undefined', executionAlgorithm.sizeInBaseAsset) }
sizeFormula = executionAlgorithm.sizeInBaseAsset.formula
} else {
/* Position was defined in Quoted Asset */
if (executionAlgorithm.sizeInQuotedAsset !== undefined) {
if (executionAlgorithm.sizeInQuotedAsset.formula !== undefined) {
sizeFormula = executionAlgorithm.sizeInQuotedAsset.formula
} else {
const errorText = 'Size In Quoted Asset needs a child Formula. Fix this please.'
tradingSystem.errors.push([executionAlgorithm.sizeInQuotedAsset.id, errorText])
throw (errorText)
}
} else {
const errorText = 'Execution Algorithm needs a child Size In Quoted Asset. Fix this please.'
tradingSystem.errors.push([executionAlgorithm.id, errorText])
throw (errorText)
}
if (executionAlgorithm.sizeInQuotedAsset === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInQuotedAsset === undefined', executionAlgorithm) }
if (executionAlgorithm.sizeInQuotedAsset.formula === undefined) { badDefinitionUnhandledException(undefined, 'executionAlgorithm.sizeInQuotedAsset.formula === undefined', executionAlgorithm.sizeInBaseAsset) }
sizeFormula = executionAlgorithm.sizeInQuotedAsset.formula
}
/* Order Size Calculation */
let algorithmSize = tradingSystem.formulas.get(sizeFormula.id)
if (algorithmSize === undefined) {
const errorText = 'Execution Algorithm Size cannot be undefined. Fix this please.'
tradingSystem.errors.push([sizeFormula.id, errorText])
throw (errorText)
}
if (algorithmSize === undefined) { badDefinitionUnhandledException(undefined, 'algorithmSize === undefined', sizeFormula) }
if (isNaN(algorithmSize) === true) { badDefinitionUnhandledException(undefined, 'isNaN(algorithmSize) === true', sizeFormula) }
/* Validate that this config exists */
if (tradingSystemOrder.config.positionSizePercentage === undefined) {
const errorText = 'Config positionSizePercentage does not exist. Fix this please.'
tradingSystem.errors.push([tradingSystemOrder.id, errorText])
throw (errorText)
}
if (tradingSystemOrder.config.positionSizePercentage === undefined) { badDefinitionUnhandledException(undefined, 'tradingSystemOrder.config.positionSizePercentage === undefined', executionAlgorithm) }
traingEngineOrderAsset.size.value = algorithmSize * tradingSystemOrder.config.positionSizePercentage / 100
traingEngineOrderAsset.size.value = global.PRECISE(traingEngineOrderAsset.size.value, 10)
@@ -323,19 +289,19 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
if (
tradingEngineStageAsset.size.value + traingEngineOrderAsset.size.value > stageSizeLimit.value) {
/* We reduce the size to the remaining size of the position. */
traingEngineOrderAsset.size.value = stageSizeLimit.value - tradingEngineStageAsset.value
traingEngineOrderAsset.size.value = stageSizeLimit.value - tradingEngineStageAsset.size.value
traingEngineOrderAsset.size.value = global.PRECISE(traingEngineOrderAsset.size.value, 10)
}
/* We are going to ESTIMATE the size in the oposite asset type, because we will need it later */
switch (traingEngineOrderAsset.type) {
case 'Order Base Asset': {
tradingEngineOrder.orderQuotedAsset.size = tradingEngineOrder.orderBaseAsset.size * tradingEngineOrder.rate
tradingEngineOrder.size.value = global.PRECISE(tradingEngineOrder.size.value, 10)
tradingEngineOrder.orderQuotedAsset.size.value = tradingEngineOrder.orderBaseAsset.size.value * tradingEngineOrder.rate.value
tradingEngineOrder.orderQuotedAsset.size.value = global.PRECISE(tradingEngineOrder.orderQuotedAsset.size.value, 10)
}
case 'Order Quoted Asset': {
tradingEngineOrder.orderBaseAsset.size = tradingEngineOrder.orderQuotedAsset.size / tradingEngineOrder.rate
tradingEngineOrder.size.value = global.PRECISE(tradingEngineOrder.size.value, 10)
tradingEngineOrder.orderBaseAsset.size.value = tradingEngineOrder.orderQuotedAsset.size.value / tradingEngineOrder.rate.value
tradingEngineOrder.orderBaseAsset.size.value = global.PRECISE(tradingEngineOrder.orderBaseAsset.size.value, 10)
}
}
}
@@ -691,38 +657,38 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
function updateStageAssets() {
/* Stage Base Asset: Undo the previous accounting */
tradingEngineStage.stageBaseAsset.sizeFilled.value =
tradingEngineStage.stageBaseAsset.value -
tradingEngineStage.stageBaseAsset.sizeFilled.value -
previousBaseAssetSizeFilled
tradingEngineStage.stageBaseAsset.feesPaid.value =
tradingEngineStage.feesPaid.value -
tradingEngineStage.stageBaseAsset.feesPaid.value -
previousBaseAssetFeesPaid
/* Stage Base Asset: Account the current filling and fees */
tradingEngineStage.stageBaseAsset.sizeFilled.value =
tradingEngineStage.stageBaseAsset.value +
tradingEngineStage.stageBaseAsset.sizeFilled.value +
tradingEngineOrder.orderBaseAsset.sizeFilled.value
tradingEngineStage.stageBaseAsset.feesPaid.value =
tradingEngineStage.feesPaid.value +
tradingEngineStage.stageBaseAsset.feesPaid.value +
tradingEngineOrder.orderBaseAsset.feesPaid.value
/* Stage Quote Asset: Undo the previous accounting */
tradingEngineStage.stageQuotedAsset.sizeFilled.value =
tradingEngineStage.stageQuotedAsset.value -
tradingEngineStage.stageQuotedAsset.sizeFilled.value -
previousQuotedAssetSizeFilled
tradingEngineStage.stageQuotedAsset.feesPaid.value =
tradingEngineStage.feesPaid.value -
tradingEngineStage.stageQuotedAsset.feesPaid.value -
previousQuotedAssetFeesPaid
/* Stage Quote Asset: Account the current filling and fees */
tradingEngineStage.stageQuotedAsset.sizeFilled.value =
tradingEngineStage.stageQuotedAsset.value +
tradingEngineStage.stageQuotedAsset.sizeFilled.value +
tradingEngineOrder.orderQuotedAsset.sizeFilled.value
tradingEngineStage.stageQuotedAsset.feesPaid.value =
tradingEngineStage.feesPaid.value +
tradingEngineStage.stageQuotedAsset.feesPaid.value +
tradingEngineOrder.orderQuotedAsset.feesPaid.value
tradingEngineStage.stageBaseAsset.sizeFilled.value = global.PRECISE(tradingEngineStage.stageBaseAsset.sizeFilled.value, 10)