Files
Superalgos/Trading/TradingRecords.js
T
2020-06-04 13:55:09 +02:00

163 lines
7.1 KiB
JavaScript

exports.newTradingRecords = function newTradingRecords(bot, logger) {
const MODULE_NAME = 'Trading Records'
let thisObject = {
addSimulationRecord: addSimulationRecord,
addConditionsRecord: addConditionsRecord,
addStrategyRecord: addStrategyRecord,
addPositionRecord: addPositionRecord,
initialize: initialize,
finalize: finalize
}
let tradingEngine
return thisObject
function initialize() {
tradingEngine = bot.TRADING_ENGINE
}
function finalize() {
tradingEngine = undefined
}
function addSimulationRecord() {
/* Simulation Record */
let simulationRecord
if (tradingEngine.current.balance.baseAsset.value === Infinity) {
tradingEngine.current.balance.baseAsset.value = Number.MAX_SAFE_INTEGER
}
if (tradingEngine.current.balance.quotedAsset.value === Infinity) {
tradingEngine.current.balance.quotedAsset.value = Number.MAX_SAFE_INTEGER
}
simulationRecord = [
candle.begin,
candle.end,
tradingEngine.current.balance.baseAsset.value,
tradingEngine.current.balance.quotedAsset.value,
tradingEngine.episode.episodeStatistics.profitLoss.value,
tradingEngine.last.position.profitLoss.value,
tradingEngine.current.position.stopLoss.value,
tradingEngine.episode.positionCounters.positions.value,
tradingEngine.episode.episodeCounters.hits.value,
tradingEngine.episode.episodeCounters.fails.value,
tradingEngine.episode.episodeStatistics.hitRatio.value,
tradingEngine.episode.episodeStatistics.ROI.value,
tradingEngine.episode.episodeCounters.periods,
tradingEngine.episode.episodeStatistics.days,
tradingEngine.episode.episodeStatistics.anualizedRateOfReturn.value,
tradingEngine.current.position.rate.value,
tradingEngine.last.position.ROI.value,
tradingEngine.current.position.takeProfit.value,
tradingEngine.current.position.stopLoss.stopLossPhase.value,
tradingEngine.current.position.takeProfit.takeProfitPhase.value,
tradingEngine.current.position.size.value,
sessionParameters.sessionBaseAsset.config.initialBalance,
sessionParameters.sessionBaseAsset.config.minimumBalance,
sessionParameters.sessionBaseAsset.config.maximumBalance,
sessionParameters.sessionQuotedAsset.config.initialBalance,
sessionParameters.sessionQuotedAsset.config.minimumBalance,
sessionParameters.sessionQuotedAsset.config.maximumBalance,
'"' + sessionParameters.sessionBaseAsset.name + '"',
'"' + sessionParameters.sessionQuotedAsset.name + '"',
'"' + bot.market.marketBaseAsset + '"',
'"' + bot.market.marketQuotedAsset + '"',
tradingEngine.current.position.positionCounters.periods.value,
tradingEngine.current.position.positionStatistics.days.value
]
recordsArray.push(simulationRecord)
}
function addConditionsRecord() {
/* Prepare the information for the Conditions File */
let conditionsRecord = [
candle.begin,
candle.end,
tradingEngine.current.strategy.index.value,
tradingEngine.current.position.stopLoss.stopLossPhase.value,
tradingEngine.current.position.takeProfit.takeProfitPhase.value,
conditionsValues,
formulasErrors,
formulasValues
]
conditionsArray.push(conditionsRecord)
}
function addStrategyRecord() {
/*
Lets see if there will be an open strategy ...
Except if we are at the head of the market (remember we skipped the last candle for not being closed.)
*/
if (tradingEngine.current.strategy.begin.value !== 0 && tradingEngine.current.strategy.end.value === 0 && currentCandleIndex === candles.length - 2 && lastCandle.end !== lastInstantOfTheDay) {
tradingEngine.current.strategy.status.value = 'Open'
tradingEngine.current.strategy.end.value = candle.end
}
/* Prepare the information for the Strategies File */
if (tradingEngine.current.strategy.begin.value !== 0 && tradingEngine.current.strategy.end.value !== 0) {
let strategyRecord = [
tradingEngine.current.strategy.begin.value,
tradingEngine.current.strategy.end.value,
tradingEngine.current.strategy.status.value,
tradingEngine.current.strategy.index.value,
tradingEngine.current.strategy.beginRate.value,
tradingEngine.current.strategy.endRate.value,
'"' + tradingEngine.current.strategy.situationName.value + '"',
'"' + tradingEngine.current.strategy.strategyName.value + '"'
]
strategiesArray.push(strategyRecord)
inializeCurrentStrategy()
}
}
function addPositionRecord() {
/*
Lets see if there will be an open trade ...
Except if we are at the head of the market (remember we skipped the last candle for not being closed.)
*/
if (tradingEngine.current.position.begin.value !== 0 &&
tradingEngine.current.position.end.value === 0 &&
currentCandleIndex === candles.length - 2 &&
lastCandle.end !== lastInstantOfTheDay) {
/* This means the trade is open */
tradingEngine.current.position.status.value = 2
tradingEngine.current.position.end.value = candle.end
tradingEngine.current.position.endRate.value = candle.close
/* Here we will calculate the ongoing ROI */
if (sessionParameters.sessionBaseAsset.name === bot.market.marketBaseAsset) {
tradingEngine.current.position.positionStatistics.ROI.value = (tradingEngine.current.position.rate.value - candle.close) / tradingEngine.current.position.rate.value * 100
} else {
tradingEngine.current.position.positionStatistics.ROI.value = (candle.close - tradingEngine.current.position.rate.value) / tradingEngine.current.position.rate.value * 100
}
}
/* Prepare the information for the Positions File */
if (tradingEngine.current.position.begin.value !== 0 && tradingEngine.current.position.end.value !== 0) {
let positionRecord = [
tradingEngine.current.position.begin.value,
tradingEngine.current.position.end.value,
tradingEngine.current.position.status.value,
tradingEngine.current.position.positionStatistics.ROI.value,
tradingEngine.current.position.beginRate.value,
tradingEngine.current.position.endRate.value,
tradingEngine.current.position.exitType.value,
'"' + tradingEngine.current.position.situationName.value + '"'
]
positionsArray.push(positionRecord)
initializeCurrentPosition()
}
}
}