fme-free-barchart-fetch
Version:
API for fetching data from the Free Barchart API
157 lines (127 loc) • 4.85 kB
text/typescript
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);
});
})
}
*/