UNPKG

fme-free-barchart-fetch

Version:

API for fetching data from the Free Barchart API

157 lines (127 loc) 4.85 kB
import {Log} from "fme-logger"; var L = new Log("FreeBarchart"); import * as _m from "moment-timezone"; import * as request from "request-promise-native"; interface EsQuote { } interface History { } function convert (x:any) { var obj:any = {}; obj.symbol = x.symbol; obj.date = _m(x.timestamp).format("YYYYMMDD"); obj.time = _m(x.timestamp).format("HHmm"); obj.timeNumber = _m(x.timestamp).hours()*60+_m(x.timestamp).minutes(); obj.open = x.open; obj.close = x.close; obj.high = x.high; obj.low = x.low; obj.volume = x.volume; return obj } export class FreeBarchart { version = "1.0.0"; host = "marketdata.websol.barchart.com"; endpoint = "getHistory.json"; // symbol = "ES*1"; symbol = "SPY"; type = "minutes"; types = ["ticks", "minutes", "nearbyMinutes", "formTMinutes", "daily", "dailyNearest", "dailyContinue", "weekly", "weeklyNearest", "weeklyContinue", "monthly", "monthlyNearest", "monthlyContinue", "quarterly", "quarterlyNearest", "quarterlyContinue", "yearly", "yearlyNearest", "yearlyContinue"]; typesSingleDay = ["ticks","minutes","nearbyMinutes","formTMinutes"]; interval = 1; // // @KEY = FREE BARCHART KEY STRING // @SYMBOL = BARCHART SYMBOL // @FRAME = TIMEFRAME = "minute","day","week" // @Interval = number (1,2,3) (combines with FRAME to complete the reqeust); // constructor(private key:string,symbol:string,frame:string,interval:number) { this.symbol = symbol; this.type = frame.toLowerCase().trim(); if (this.types.indexOf(this.type) == -1 ) { L.error("Invalid type passed",this.types,"valid types are",JSON.stringify(this.types)) return; } if (!interval) this.interval = 1; else this.interval = interval;; } getDailyMinutes = async (sDate:Date) => { var type = this.type.trim().toLowerCase(); var symbol = this.symbol.trim().toLowerCase(); var startDate = _m(sDate).format("YYYYMMDD"); var req = "/"+this.endpoint+"?key="+this.key+"&symbol="+this.symbol+"&type="+type+"&startDate="+startDate+"&interval="+this.interval; var fullUrl = "http://"+this.host+req L.info("requesting:",fullUrl); var rtn = JSON.parse(await request(fullUrl)).results; // L.info("Rtn is",rtn); var filter = {}; if (this.typesSingleDay.indexOf(type) > -1) { filter = rtn.filter((x:any) =>{return _m(x.timestamp).format("YYYYMMDD") == _m(sDate).format("YYYYMMDD")} ).map(convert); } else { filter = rtn.filter.map(convert); } return filter; } } /* function convertNinjaDT (dt) { if (dt.length < 5) return; var d = dt.split(" ")[0]; var t = dt.split(" ")[1]; var YYYY = d.substring(0,4); var MM = d.substring(4,6)-1; var DD = d.substring(6,8); var HH = t.substring(0,2); var mm = t.substring(2,4); var ss = "00"; var tsMM = (MM + 1).toString(); if (tsMM.length < 2) tsMM = "0"+tsMM; var time = HH+mm+ss; var date = YYYY+tsMM+DD; // L.info (YYYY,MM,DD,HH,mm,ss); return ( {timestamp : new Date (YYYY,MM,DD,HH,mm,ss),time:time,date:date}); } // // Barchart API for access historic ES data to keep our database current // barchart = {}; var http = require('http'); barchart.getES = function (sDate,CB) { var dt = new Date(); var YYYY = dt.getFullYear().toString(); var MM = (dt.getMonth()+1).toString(); var DD = dt.getDate().toString(); var startDate = sDate; var type = "minutes"; var host = "marketdata.websol.barchart.com"; var endpoint = "getHistory.json"; var symbol = "ES*1"; // // ===> create full request URL // var req = "/"+endpoint+"?key="+barchart.key+"&symbol="+symbol+"&type="+type+"&startDate="+startDate; // // ===> Make the request, chunk the results and call back the passed in function // L.info ("calling barchart with url",host,req); http.get({ host:host, path:req },function(response){ var body =""; response.on("data",function(d){ body += d; }); response.on("end",function(){ parsed=JSON.parse(body); // L.info("got and end",parsed); barchart.storeES(parsed); // <== hand off to be stored }); response.on('error', function(err) { L.error("Error during HTTP request"); L.error(err.message); }); }) } */