@backtest/framework
Version:
Backtesting trading strategies in TypeScript / JavaScript
106 lines • 5.05 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.saveHistoricalData = saveHistoricalData;
const prisma_historical_data_1 = require("./prisma-historical-data");
const parse_1 = require("./parse");
const api_1 = require("./api");
const logger = __importStar(require("./logger"));
async function _getParseSaveCandlesPrivate(runParams, newData) {
var _a, _b, _c;
let finishedCandles = false;
let allCandles = [];
const metaName = `${runParams.symbol}-${runParams.interval}`;
async function saveCandlesNew(saveCandles) {
const baseQuote = await (0, api_1.getBaseQuote)(runParams.symbol);
const meta = {
name: metaName,
symbol: runParams.symbol,
interval: runParams.interval,
base: baseQuote.base,
quote: baseQuote.quote,
startTime: saveCandles[0].closeTime,
endTime: saveCandles[saveCandles.length - 1].closeTime,
importedFromCSV: false,
creationTime: new Date().getTime(),
lastUpdatedTime: new Date().getTime()
};
return await (0, prisma_historical_data_1.insertCandles)(meta, saveCandles);
}
async function saveCandlesUpdate(saveCandles) {
await (0, prisma_historical_data_1.updateCandlesAndMetaCandle)(metaName, saveCandles);
return true;
}
while (!finishedCandles) {
let candleRequest = await (0, api_1.getCandles)({
symbol: runParams.symbol,
interval: runParams.interval,
endTime: runParams.endTime
});
logger.trace(`Fetched ${candleRequest === null || candleRequest === void 0 ? void 0 : candleRequest.length} for ${runParams.symbol} ${runParams.interval} (${runParams.endTime ? (0, parse_1.dateToString)(runParams.endTime) : null})`);
runParams.endTime = candleRequest[0][6];
if (((_a = runParams.endTime) !== null && _a !== void 0 ? _a : 0) < ((_b = runParams.startTime) !== null && _b !== void 0 ? _b : 0) || candleRequest.length <= 1) {
if (!(candleRequest.length <= 1))
candleRequest = await (0, parse_1.removeUnusedCandles)(candleRequest, (_c = runParams.startTime) !== null && _c !== void 0 ? _c : 0);
finishedCandles = true;
}
let candles = await (0, parse_1.parseCandles)(runParams.symbol, runParams.interval, candleRequest);
allCandles = [...candles, ...allCandles];
if (allCandles.length >= 50000) {
const saveCandlesResult = newData ? await saveCandlesNew(allCandles) : await saveCandlesUpdate(allCandles);
if (saveCandlesResult) {
logger.info(`Partial: Saved ${allCandles.length} candles for ${runParams.symbol} on the ${runParams.interval} interval`);
}
newData = false;
allCandles = [];
}
}
if (allCandles.length > 0) {
const saveCandlesResult = newData ? await saveCandlesNew(allCandles) : await saveCandlesUpdate(allCandles);
if (saveCandlesResult) {
logger.info(`Partial: Saved ${allCandles.length} candles for ${runParams.symbol} on the ${runParams.interval} interval`);
}
}
return allCandles;
}
async function saveHistoricalData(runParams) {
const allCandlesResults = await _getParseSaveCandlesPrivate(runParams, true);
if (allCandlesResults) {
logger.info(`Saved ${allCandlesResults.length} candles for ${runParams.symbol} on the ${runParams.interval} interval`);
}
logger.info(`Successfully downloaded ${runParams.symbol} on the ${runParams.interval} interval`);
return true;
}
//# sourceMappingURL=historical-data.js.map