From 02f9a04a7ef23bb9e9aab35bb26d5eedd473ac87 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 3 Aug 2020 14:54:32 +0200 Subject: [PATCH] Running with more than one trigger on --- TaskServer/LowFrequencyTrading/Snapshots.js | 8 +- .../LowFrequencyTrading/TradingExecution.js | 88 ++++++------------- 2 files changed, 32 insertions(+), 64 deletions(-) diff --git a/TaskServer/LowFrequencyTrading/Snapshots.js b/TaskServer/LowFrequencyTrading/Snapshots.js index 89c10767b..49456433f 100644 --- a/TaskServer/LowFrequencyTrading/Snapshots.js +++ b/TaskServer/LowFrequencyTrading/Snapshots.js @@ -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 ] diff --git a/TaskServer/LowFrequencyTrading/TradingExecution.js b/TaskServer/LowFrequencyTrading/TradingExecution.js index dd5c0af13..b9ae0bcb0 100644 --- a/TaskServer/LowFrequencyTrading/TradingExecution.js +++ b/TaskServer/LowFrequencyTrading/TradingExecution.js @@ -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)