episode balance
This commit is contained in:
1 parent
ce5277bfe4
commit
6f7727164c
7 files changed
+66
-49
No files matched your search
@@ -20,15 +20,16 @@ exports.newTradingEngine = function newTradingEngine(bot, logger) {
|
||||
return thisObject
|
||||
|
||||
function initialize() {
|
||||
/* Here we will go through all the nodes in the Trading Engine hiriarchy and apply the initial value to the value property when needed */
|
||||
|
||||
tradingEngine = bot.simulationState.tradingEngine
|
||||
sessionParameters = bot.SESSION.parameters
|
||||
|
||||
if (bot.FIRST_EXECUTION === true) {
|
||||
/*
|
||||
Here we will go through all the nodes in the Trading Engine hiriarchy and
|
||||
apply the initial value to the value property when needed
|
||||
*/
|
||||
initializeNode(tradingEngine)
|
||||
tradingEngine.current.balance.baseAsset.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
tradingEngine.current.balance.quotedAsset.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,13 +36,27 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) {
|
||||
}
|
||||
|
||||
function openEpisode() {
|
||||
/*
|
||||
This function is called each time the simulation starts. That does not mean the Episode
|
||||
must be opened there, since it might happen that it is looping at the end of the market
|
||||
or the task / session was restarted.
|
||||
*/
|
||||
if (bot.FIRST_EXECUTION === true) {
|
||||
/* Getting the begin Balance from the session configuration */
|
||||
tradingEngine.current.episode.beginBalance.baseAsset.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
tradingEngine.current.episode.beginBalance.quotedAsset.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
/* Recording the opening at the Trading Engine Data Structure */
|
||||
tradingEngine.current.episode.status.value = 'Open'
|
||||
tradingEngine.current.episode.serialNumber.value = 1
|
||||
tradingEngine.current.episode.identifier.value = global.UNIQUE_ID()
|
||||
tradingEngine.current.episode.begin.value = tradingEngine.current.candle.begin.value
|
||||
tradingEngine.current.episode.beginRate.value = tradingEngine.current.candle.close.value
|
||||
/* The current balance is also the begin balance, that is how this starts. */
|
||||
tradingEngine.current.episode.balance.baseAsset.value = sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
tradingEngine.current.episode.balance.quotedAsset.value = sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
/* Recording the opening at the Trading Engine Data Structure */
|
||||
tradingEngine.current.episode.status.value = 'Open'
|
||||
tradingEngine.current.episode.serialNumber.value = 1
|
||||
tradingEngine.current.episode.identifier.value = global.UNIQUE_ID()
|
||||
tradingEngine.current.episode.begin.value = tradingEngine.current.candle.begin.value
|
||||
tradingEngine.current.episode.beginRate.value = tradingEngine.current.candle.close.value
|
||||
}
|
||||
}
|
||||
|
||||
function updateExitType(exitType) {
|
||||
@@ -53,6 +67,8 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) {
|
||||
tradingEngine.current.episode.status.value = 'Closed'
|
||||
tradingEngine.current.episode.end.value = tradingEngine.current.candle.end.value
|
||||
tradingEngine.current.episode.endRate.value = tradingEngine.current.candle.close.value
|
||||
tradingEngine.current.episode.endBalance.baseAsset.value = tradingEngine.current.episode.balance.baseAsset.value
|
||||
tradingEngine.current.episode.endBalance.quotedAsset.value = tradingEngine.current.episode.balance.quotedAsset.value
|
||||
}
|
||||
|
||||
function resetEpisode() {
|
||||
@@ -63,6 +79,8 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) {
|
||||
if (tradingEngine.current.episode.status.value === 'Open') {
|
||||
tradingEngine.current.episode.end.value = tradingEngine.current.candle.end.value
|
||||
tradingEngine.current.episode.endRate.value = tradingEngine.current.candle.close.value
|
||||
tradingEngine.current.episode.endBalance.baseAsset.value = tradingEngine.current.episode.balance.baseAsset.value
|
||||
tradingEngine.current.episode.endBalance.quotedAsset.value = tradingEngine.current.episode.balance.quotedAsset.value
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,11 +159,11 @@ exports.newTradingEpisode = function newTradingEpisode(bot, logger) {
|
||||
|
||||
/* Updating Profit Loss */
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value =
|
||||
tradingEngine.current.balance.baseAsset.value -
|
||||
tradingEngine.current.episode.balance.baseAsset.value -
|
||||
sessionParameters.sessionBaseAsset.config.initialBalance
|
||||
|
||||
tradingEngine.current.episode.episodeQuotedAsset.profitLoss.value =
|
||||
tradingEngine.current.balance.quotedAsset.value -
|
||||
tradingEngine.current.episode.balance.quotedAsset.value -
|
||||
sessionParameters.sessionQuotedAsset.config.initialBalance
|
||||
|
||||
tradingEngine.current.episode.episodeBaseAsset.profitLoss.value = global.PRECISE(tradingEngine.current.episode.episodeBaseAsset.profitLoss.value, 10)
|
||||
|
||||
@@ -657,24 +657,24 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
case tradingSystemOrder.type === 'Market Buy Order' || tradingSystemOrder.type === 'Limit Buy Order': {
|
||||
|
||||
/* Balance Base Asset: Undo the previous accounting */
|
||||
tradingEngine.current.balance.baseAsset.value =
|
||||
tradingEngine.current.balance.baseAsset.value -
|
||||
tradingEngine.current.episode.balance.baseAsset.value =
|
||||
tradingEngine.current.episode.balance.baseAsset.value -
|
||||
previousBaseAssetSizeFilled
|
||||
|
||||
/* Balance Base Asset: Account the current filling and fees */
|
||||
tradingEngine.current.balance.baseAsset.value =
|
||||
tradingEngine.current.balance.baseAsset.value +
|
||||
tradingEngine.current.episode.balance.baseAsset.value =
|
||||
tradingEngine.current.episode.balance.baseAsset.value +
|
||||
tradingEngineOrder.orderBaseAsset.sizeFilled.value
|
||||
|
||||
/* Balance Quoted Asset: Undo the previous accounting */
|
||||
tradingEngine.current.balance.quotedAsset.value =
|
||||
tradingEngine.current.balance.quotedAsset.value +
|
||||
tradingEngine.current.episode.balance.quotedAsset.value =
|
||||
tradingEngine.current.episode.balance.quotedAsset.value +
|
||||
previousQuotedAssetSizeFilled +
|
||||
previousQuotedAssetFeesPaid
|
||||
|
||||
/* Balance Quoted Asset: Account the current filling and fees */
|
||||
tradingEngine.current.balance.quotedAsset.value =
|
||||
tradingEngine.current.balance.quotedAsset.value -
|
||||
tradingEngine.current.episode.balance.quotedAsset.value =
|
||||
tradingEngine.current.episode.balance.quotedAsset.value -
|
||||
tradingEngineOrder.orderQuotedAsset.sizeFilled.value -
|
||||
tradingEngineOrder.orderQuotedAsset.feesPaid.value
|
||||
break
|
||||
@@ -682,31 +682,31 @@ exports.newTradingExecution = function newTradingExecution(bot, logger, tradingE
|
||||
case tradingSystemOrder.type === 'Market Sell Order' || tradingSystemOrder.type === 'Limit Sell Order': {
|
||||
|
||||
/* Balance Base Asset: Undo the previous accounting */
|
||||
tradingEngine.current.balance.baseAsset.value =
|
||||
tradingEngine.current.balance.baseAsset.value +
|
||||
tradingEngine.current.episode.balance.baseAsset.value =
|
||||
tradingEngine.current.episode.balance.baseAsset.value +
|
||||
previousBaseAssetSizeFilled +
|
||||
previousBaseAssetFeesPaid
|
||||
|
||||
/* Balance Base Asset: Account the current filling and fees */
|
||||
tradingEngine.current.balance.baseAsset.value =
|
||||
tradingEngine.current.balance.baseAsset.value -
|
||||
tradingEngine.current.episode.balance.baseAsset.value =
|
||||
tradingEngine.current.episode.balance.baseAsset.value -
|
||||
tradingEngineOrder.orderBaseAsset.sizeFilled.value -
|
||||
tradingEngineOrder.orderBaseAsset.feesPaid.value
|
||||
|
||||
/* Balance Quoted Asset: Undo the previous accounting */
|
||||
tradingEngine.current.balance.quotedAsset.value =
|
||||
tradingEngine.current.balance.quotedAsset.value -
|
||||
tradingEngine.current.episode.balance.quotedAsset.value =
|
||||
tradingEngine.current.episode.balance.quotedAsset.value -
|
||||
previousQuotedAssetSizeFilled
|
||||
|
||||
/* Balance Quoted Asset: Account the current filling and fees */
|
||||
tradingEngine.current.balance.quotedAsset.value =
|
||||
tradingEngine.current.balance.quotedAsset.value +
|
||||
tradingEngine.current.episode.balance.quotedAsset.value =
|
||||
tradingEngine.current.episode.balance.quotedAsset.value +
|
||||
tradingEngineOrder.orderQuotedAsset.sizeFilled.value
|
||||
break
|
||||
}
|
||||
}
|
||||
tradingEngine.current.balance.baseAsset.value = global.PRECISE(tradingEngine.current.balance.baseAsset.value, 10)
|
||||
tradingEngine.current.balance.quotedAsset.value = global.PRECISE(tradingEngine.current.balance.quotedAsset.value, 10)
|
||||
tradingEngine.current.episode.balance.baseAsset.value = global.PRECISE(tradingEngine.current.episode.balance.baseAsset.value, 10)
|
||||
tradingEngine.current.episode.balance.quotedAsset.value = global.PRECISE(tradingEngine.current.episode.balance.quotedAsset.value, 10)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -240,8 +240,8 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
|
||||
/* Profit Loss Calculation */
|
||||
tradingEngine.current.position.positionStatistics.profitLoss.value =
|
||||
(
|
||||
tradingEngine.current.balance.baseAsset.value * tradingEngine.current.position.endRate.value +
|
||||
tradingEngine.current.balance.quotedAsset.value
|
||||
tradingEngine.current.episode.balance.baseAsset.value * tradingEngine.current.position.endRate.value +
|
||||
tradingEngine.current.episode.balance.quotedAsset.value
|
||||
) -
|
||||
(
|
||||
tradingEngine.previous.balance.baseAsset.value * tradingEngine.current.position.beginRate.value +
|
||||
@@ -279,11 +279,11 @@ exports.newTradingPosition = function newTradingPosition(bot, logger, tradingEng
|
||||
function updateResults() {
|
||||
/* Profit Loss Calculation */
|
||||
tradingEngine.current.position.positionBaseAsset.profitLoss.value =
|
||||
tradingEngine.current.balance.baseAsset.value -
|
||||
tradingEngine.current.episode.balance.baseAsset.value -
|
||||
tradingEngine.previous.balance.baseAsset.value
|
||||
|
||||
tradingEngine.current.position.positionQuotedAsset.profitLoss.value =
|
||||
tradingEngine.current.balance.quotedAsset.value -
|
||||
tradingEngine.current.episode.balance.quotedAsset.value -
|
||||
tradingEngine.previous.balance.quotedAsset.value
|
||||
|
||||
tradingEngine.current.position.positionBaseAsset.profitLoss.value = global.PRECISE(tradingEngine.current.position.positionBaseAsset.profitLoss.value, 10)
|
||||
|
||||
@@ -390,7 +390,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT
|
||||
let stopRunningDate = (new Date(tradingEngine.current.candle.begin.value)).toLocaleString()
|
||||
|
||||
if (sessionParameters.sessionBaseAsset.config.minimumBalance !== undefined) {
|
||||
if (tradingEngine.current.balance.baseAsset.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
|
||||
if (tradingEngine.current.episode.balance.baseAsset.value <= sessionParameters.sessionBaseAsset.config.minimumBalance) {
|
||||
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
|
||||
tradingSystem.errors.push([tradingSystem.id, errorMessage])
|
||||
if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) }
|
||||
@@ -399,7 +399,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionBaseAsset.config.maximumBalance !== undefined) {
|
||||
if (tradingEngine.current.balance.baseAsset.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
|
||||
if (tradingEngine.current.episode.balance.baseAsset.value >= sessionParameters.sessionBaseAsset.config.maximumBalance) {
|
||||
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
|
||||
tradingSystem.errors.push([tradingSystem.id, errorMessage])
|
||||
if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) }
|
||||
@@ -408,7 +408,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionQuotedAsset.config.minimumBalance !== undefined) {
|
||||
if (tradingEngine.current.balance.quotedAsset.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
|
||||
if (tradingEngine.current.episode.balance.quotedAsset.value <= sessionParameters.sessionQuotedAsset.config.minimumBalance) {
|
||||
const errorMessage = 'Min Balance reached @ ' + stopRunningDate
|
||||
tradingSystem.errors.push([tradingSystem.id, errorMessage])
|
||||
if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) }
|
||||
@@ -417,7 +417,7 @@ exports.newTradingSimulation = function newTradingSimulation(bot, logger, UTILIT
|
||||
}
|
||||
|
||||
if (sessionParameters.sessionQuotedAsset.config.maximumBalance !== undefined) {
|
||||
if (tradingEngine.current.balance.quotedAsset.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
|
||||
if (tradingEngine.current.episode.balance.quotedAsset.value >= sessionParameters.sessionQuotedAsset.config.maximumBalance) {
|
||||
const errorMessage = 'Max Balance reached @ ' + stopRunningDate
|
||||
tradingSystem.errors.push([tradingSystem.id, errorMessage])
|
||||
if (FULL_LOG === true) { logger.write(MODULE_NAME, '[WARN] runSimulation -> checkMinimunAndMaximunBalance -> ' + errorMessage) }
|
||||
|
||||
@@ -85,16 +85,10 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
|
||||
function mantain() {
|
||||
mantainPositions()
|
||||
mantainStrategies()
|
||||
tradingStrategyModule.mantain()
|
||||
mantainStages()
|
||||
mantainOrders()
|
||||
|
||||
function mantainStrategies() {
|
||||
tradingStrategyModule.resetTradingEngineDataStructure()
|
||||
tradingStrategyModule.updateCounters()
|
||||
tradingStrategyModule.updateEnds()
|
||||
}
|
||||
|
||||
function mantainStages() {
|
||||
resetTradingEngineDataStructure()
|
||||
updateCounters()
|
||||
@@ -342,8 +336,8 @@ exports.newTradingStages = function newTradingStages(bot, logger, tradingEngineM
|
||||
tradingSystem.evalFormulas(stageNode, 'Initial Definition')
|
||||
|
||||
/* Remember the balance we had before taking the position to later calculate profit or loss */
|
||||
tradingEngine.previous.balance.baseAsset.value = tradingEngine.current.balance.baseAsset.value
|
||||
tradingEngine.previous.balance.quotedAsset.value = tradingEngine.current.balance.quotedAsset.value
|
||||
tradingEngine.previous.balance.baseAsset.value = tradingEngine.current.episode.balance.baseAsset.value
|
||||
tradingEngine.previous.balance.quotedAsset.value = tradingEngine.current.episode.balance.quotedAsset.value
|
||||
|
||||
/* Entry Position size and rate */
|
||||
tradingSystem.evalFormulas(stageNode, 'Initial Targets')
|
||||
|
||||
@@ -4,11 +4,9 @@ exports.newTradingStrategy = function newTradingStrategy(bot, logger, tradingEng
|
||||
*/
|
||||
const MODULE_NAME = 'Trading Strategy'
|
||||
let thisObject = {
|
||||
mantain: mantain,
|
||||
openStrategy: openStrategy,
|
||||
closeStrategy: closeStrategy,
|
||||
updateEnds: updateEnds,
|
||||
resetTradingEngineDataStructure: resetTradingEngineDataStructure,
|
||||
updateCounters: updateCounters,
|
||||
initialize: initialize,
|
||||
finalize: finalize
|
||||
}
|
||||
@@ -25,6 +23,12 @@ exports.newTradingStrategy = function newTradingStrategy(bot, logger, tradingEng
|
||||
tradingEngine = undefined
|
||||
}
|
||||
|
||||
function mantain() {
|
||||
resetTradingEngineDataStructure()
|
||||
updateCounters()
|
||||
updateEnds()
|
||||
}
|
||||
|
||||
function openStrategy(index, situationName, strategyName) {
|
||||
tradingEngine.current.strategy.status.value = 'Open'
|
||||
tradingEngine.current.strategy.serialNumber.value = tradingEngine.current.episode.episodeCounters.strategies.value
|
||||
|
||||
Reference in new issue
Block a user