UNPKG

turingtrader.js

Version:
95 lines (83 loc) 3.68 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.loadAssetFromYahoo = void 0; var _nodeFetch = _interopRequireDefault(require("node-fetch")); //============================================================================== // Name: data/yahoo // Project: TuringTrader.js // Description: data source for Yahoo! finance. // History: FUB, 2021v02, created //============================================================================== var loadAssetFromYahoo = function loadAssetFromYahoo(sim, name) { // TODO: we might need to do some mapping here var ticker = name; // NOTE: JS has epochs in milliseconds, Yahoo expects seconds var day = 24 * 60 * 60; var period1 = Math.trunc(sim.startDate.getTime() / 1000) - 5 * day; var period2 = Math.trunc(sim.endDate.getTime() / 1000) + 5 * day; var url = "http://query1.finance.yahoo.com/v8/finance/chart/".concat(ticker, "?interval=1d&period1=").concat(period1, "&period2=").concat(period2); // see https://developers.google.com/web/updates/2015/03/introduction-to-fetch var status = function status(response) { if (response.status >= 200 && response.status < 300) { return Promise.resolve(response); } else { return Promise.reject(new Error(response.statusText)); } }; var json = function json(response) { return response.json(); }; var promise = (0, _nodeFetch["default"])(url).then(status).then(json).then(function (response) { // deconstruct response from Yahoo! var meta = response.chart.result[0].meta; var rawTimestamps = response.chart.result[0].timestamp; var rawOpen = response.chart.result[0].indicators.quote[0].open; var rawHigh = response.chart.result[0].indicators.quote[0].high; var rawLow = response.chart.result[0].indicators.quote[0].low; var rawClose = response.chart.result[0].indicators.quote[0].close; var rawVolume = response.chart.result[0].indicators.quote[0].volume; var adjustedClose = response.chart.result[0].indicators.adjclose[0].adjclose; // calculate adjusted prices var adjustFactor = adjustedClose.map(function (element, index) { return element / rawClose[index]; }); var adjustedOpen = rawOpen.map(function (element, index) { return element * adjustFactor[index]; }); var adjustedHigh = rawHigh.map(function (element, index) { return element * adjustFactor[index]; }); var adjustedLow = rawLow.map(function (element, index) { return element * adjustFactor[index]; }); var adjustedVolume = rawVolume.map(function (element, index) { return element / adjustFactor[index]; }); // convert timestamps // NOTE: Yahoo! timestamps are at the open (9:30 am), // TuringTrader.js timestamps are at the close (4:00 pm). // this is not an issue, because the simulator will align // the timestamps with the trading calendar upon load. var timestamps = rawTimestamps.map(function (element) { return new Date(element * 1000); }); return { meta: { ticker: ticker, firstT: timestamps[0], lastT: timestamps[timestamps.length - 1] }, t: timestamps, o: adjustedOpen, h: adjustedHigh, l: adjustedLow, c: adjustedClose, v: adjustedVolume }; }) // FIXME: what are we doing here? ["catch"](function (err) { return sim.info(err); }); return promise; }; //============================================================================== // end of file exports.loadAssetFromYahoo = loadAssetFromYahoo;