turingtrader.js
Version:
A backtesting engine for Node.js
90 lines (76 loc) • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.loadAsset = void 0;
var _indicators = require("../indicators");
var _yahoo = require("./yahoo");
//==============================================================================
// Name: data/index
// Project: TuringTrader.js
// Description: data source wrapper.
// History: FUB, 2021iv30, created
//==============================================================================
var loadAsset = function loadAsset(sim, name, customLoaderFn) {
var id = "loadAsset(".concat(name, ",").concat(sim.startDate.getTime(), ",").concat(sim.endDate.getTime(), ")");
var loadData = function loadData() {
var dataLoaderFn = customLoaderFn !== null && customLoaderFn !== void 0 ? customLoaderFn : _yahoo.loadAssetFromYahoo;
var data = dataLoaderFn(sim, name).then(function (rawData) {
// simulator timestamps
var st = sim.tradingCalendar.tradingDays; // setup resampled data
var data = {
meta: rawData.meta,
t: st,
o: [],
h: [],
l: [],
c: [],
v: []
}; // BUGBUG: this code will fail, if there are no data
// within the requested range
var ri = -1; // ri is the index of the last *consumed* bar
st.forEach(function (t) {
// advance raw data to catch up with simulator
var ri0 = ri;
while (ri < rawData.t.length - 1 && rawData.t[ri + 1] <= t) {
ri++;
}
var consumedData = ri0 !== ri;
if (t < rawData.t[0]) {
// simulator timestamp before start of raw data
// => fill OHLCV w/ first open
data.o.push(rawData.o[0]);
data.h.push(rawData.o[0]);
data.l.push(rawData.o[0]);
data.c.push(rawData.o[0]);
data.v.push(0.0);
} else if (consumedData === true) {
// consumed data
// => fill OHLCV w/ resampled bar
data.o.push(rawData.o[ri]);
data.h.push(rawData.h[ri]);
data.l.push(rawData.l[ri]);
data.c.push(rawData.c[ri]);
data.v.push(rawData.v[ri]);
if (ri === 0) data.meta.firstT = t;
if (ri === rawData.t.length - 1) data.meta.lastT = t;
} else {
// consumed no data
// => fill OHLCV w/ previous close
data.o.push(rawData.c[ri]);
data.h.push(rawData.c[ri]);
data.l.push(rawData.c[ri]);
data.c.push(rawData.c[ri]);
data.v.push(0.0);
}
});
return data;
});
return data;
};
return sim.cache(id, function () {
return (0, _indicators.IndicatorsBar)(sim, id, loadData());
});
}; //==============================================================================
// end of file
exports.loadAsset = loadAsset;