sql-synergy
Version:
Synergy Wave TA
273 lines (272 loc) • 12.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SynergyTA = void 0;
const fs = require("fs");
var DataFrame = require('dataframe-js').DataFrame;
const resolve = require('path').resolve;
var oProperties = require('@uqapp/load_properties');
const sql_string_1 = require("walter-sql-string/lib/sql-string");
const express = require('express');
//import { Router } from "express" ;
var cors = require('cors');
//const app = express()
const createTCR_1 = require("./createTCR");
const IConstants_1 = require("./IConstants");
//import { PostgresConnector } from 'walter-db-routes/lib/PostgresConnector';
const LoadData_1 = require("./LoadData");
const WaveTerminator_1 = require("./WaveTerminator");
var serveStatic = require('serve-static');
process.on('uncaughtException', err => {
console.error('There was an uncaught error', err);
process.exit(1); //mandatory (as per the Node.js docs)
});
class SynergyTA {
constructor(db, sPropertiesFile, sOutputDir, oRouter) {
this.sTradingPairs = [];
this.sPeriods = [IConstants_1.IConstants.HOURLY, IConstants_1.IConstants.DAILY, IConstants_1.IConstants.WEEKLY, IConstants_1.IConstants.MONTHLY]; //, IConstants.QUARTERLY ] ; //, IConstants.YEARLY ] ;
this.sOutputDir = "";
this.busyCount = 0;
this.oReportMap = new Map();
this.bBusy = false;
this.oReport = [];
this.db = db;
try {
console.log("Synergy using ", sPropertiesFile);
(async () => { await oProperties.loadProperties(sPropertiesFile, true); console.log(oProperties); })();
}
catch (error) {
console.log(error);
return;
}
this.sleep(10000).then(async () => {
await me.loadSymbols();
await me.generateReport(me.sTradingPairs);
// await this.createReport() ;
});
var me = this;
this.sOutputDir = sOutputDir;
if (this.sOutputDir.endsWith('/') == false)
this.sOutputDir = this.sOutputDir + '/';
if (!fs.existsSync(this.sOutputDir)) {
fs.mkdirSync(this.sOutputDir);
}
var bShouldListen = false;
if (oRouter === undefined) {
bShouldListen = true;
this.app = express();
this.app.use(cors());
this.app.use(express.json());
oRouter = this.app.Router;
}
// oRouter.use('/charts', express.static('data'))
oRouter.use('/charts', serveStatic('data', { index: false, 'setHeaders': this.setHeaders }));
oRouter.get("/symbol/add/:symbol", async (req, res) => {
//get the existing user data
const sPair = req.params.symbol;
var sqlT = oProperties.lookupSQL('db.newPair');
var sql = sql_string_1.replace(sqlT, null, { S: sPair });
var data = await this.getDBService().getSQLResult(sql);
res.send({ success: true, msg: JSON.stringify(data) });
});
oRouter.get("/symbol/delete/:symbol", async (req, res) => {
//get the existing user data
const sPair = req.params.symbol;
var sqlT = oProperties.lookupSQL('db.deletePair');
var sql = sql_string_1.replace(sqlT, null, { S: sPair });
var data = await this.getDBService().getSQLResult(sql);
res.send({ success: true, msg: JSON.stringify(data) });
});
if (bShouldListen) {
this.app.listen(7000, async () => {
console.log('Server runs on port 7000'); // await this.calculateIndicators();
});
}
}
getDBService() {
return this.db;
}
async loadSymbols() {
this.sTradingPairs = [];
var sql = oProperties.lookupSQL('db.SYMBOLS');
var data = await this.getDBService().getSQLResult(sql);
console.log('loadSymbols', data);
// const fs = require('fs')
fs.writeFileSync(this.sOutputDir + "symbols.json", JSON.stringify(data.result));
data.result.forEach((s) => {
this.sTradingPairs.push(s['S']);
});
}
async sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
setHeaders(res, path) {
if (path !== undefined)
res.setHeader('Cache-Control', 'private, max-age=3600');
}
listenEvents() {
return ['NEW_DATA_1H'];
}
// newData: any[] = [];
async processDBEvent(name) {
console.log("** Event [" + name + "]");
await this.recalculate();
}
async recalculate() {
// this.busyCount++;
if (this.bBusy == true)
return;
this.bBusy = true;
await this.loadSymbols();
this.generateReport(this.sTradingPairs);
// this.busyCount = 0 ;
// while (this.busyCount > 0) {
// var data = await this.getDBService().getSQLResult('select distinct s from newData');
// var sTradingPairs: any[] = [];
// data.result.forEach((s:any) => {
// sTradingPairs.push(s['S']);
// });
// if (sTradingPairs.length == 0) {
// this.busyCount = 0;
// this.bBusy = false;
// return;
// }
// this.generateReport(sTradingPairs) ;
// this.busyCount--;
// }
this.bBusy = false;
}
async generateReport(sTradingPairs) {
// var data = await this.getDBService().getSQLResult("select (extract(epoch from d)/100)::int * 100 t, p, refp, aspect from PlanetAspects");
// var result = data.result.map((e: any) => Object.keys(e).map(k => e[k]).reverse())
// console.log(result) ;
// var oPW = fs.createWriteStream("./data/PlanetAspects.json");
// oPW.write(JSON.stringify(result));
// oPW.close();
let oMSQ;
for (var i = 0; i < sTradingPairs.length; i++) {
console.log("Processing ", sTradingPairs[i]);
await this.downloadOHLC2File(sTradingPairs[i]);
for (var p = 0; p < this.sPeriods.length; p++) {
oMSQ = new createTCR_1.createTCR(sTradingPairs[i], this.sPeriods[p]);
this.oReportMap.set(sTradingPairs[i] + "_" + this.sPeriods[p], oMSQ.oSignals);
}
let oWT = new WaveTerminator_1.WaveTerminator(oMSQ?.getMSQuote(), IConstants_1.IConstants.MONTHLY, IConstants_1.IConstants.MONTHLY);
oWT.generateWaves(0);
oWT = new WaveTerminator_1.WaveTerminator(oMSQ?.getMSQuote(), IConstants_1.IConstants.WEEKLY, IConstants_1.IConstants.WEEKLY);
oWT.generateWaves(0);
oWT = new WaveTerminator_1.WaveTerminator(oMSQ?.getMSQuote(), IConstants_1.IConstants.DAILY, IConstants_1.IConstants.DAILY);
oWT.generateWaves(0);
oWT = new WaveTerminator_1.WaveTerminator(oMSQ?.getMSQuote(), IConstants_1.IConstants.HOURLY, IConstants_1.IConstants.HOURLY);
oWT.generateWaves(0);
LoadData_1.LoadData.deleteDF();
}
this.oReport = [];
this.oReportMap.forEach((v) => {
this.oReport.push(v);
});
this.writeReport2File(this.sOutputDir + "reportOneLineV2.csv");
// var ss = sTradingPairs.join('\',\'');
// await this.getDBService().getSQLResult('delete from newData where s in ( \'' + ss + '\')');
}
async writeReport2File(sFileName) {
var oPW1 = fs.createWriteStream(sFileName);
// var oPW = fs.createWriteStream("./data/report.csv" );
oPW1.write("S,PRICE,D");
for (var p = 0; p < this.sPeriods.length; p++) {
var sP = IConstants_1.IConstants.sChart[p];
if (p == IConstants_1.IConstants.MONTHLY)
oPW1.write("," + sP + "CHCL," + sP + "TCR,T,GrandT" + sP);
else
oPW1.write("," + sP + "CHCL," + sP + "TCR," + sP + "RSI," + sP + "MACD," + sP + "STOC,T" + sP);
}
oPW1.write('\r\n');
// oPW.write("S,D,P,BCHCL,CHCL,TCR,RSI,MACD,STOC,T\r\n") ;
let s = "";
let t = 0;
let d = "";
let price = 0;
await this.oReport.forEach((r) => {
// oPW.write(r.S + "," + r.D + "," + r.P + "," + r.BCHCL + "," + r.CHCL + ","+ r.TCR + "," + r.RSI + "," + r.MACD + "," + r.STOCH + "," +
// (r.BCHCL + r.CHCL + r.TCR + r.RSI + r.MACD + r.STOCH) );
// oPW.write('\r\n') ;
if (s !== r.S) {
if (s.length > 0)
oPW1.write("," + t + '\r\n');
t = 0;
}
s = r.S;
if (r.P == IConstants_1.IConstants.sChart[IConstants_1.IConstants.HOURLY]) {
d = r.D;
price = r.PRICE;
oPW1.write(r.S + "," + price + "," + d);
}
if (r.P == IConstants_1.IConstants.sChart[IConstants_1.IConstants.MONTHLY]) {
t += (r.CHCL + r.TCR);
oPW1.write("," + r.CHCL + "," + r.TCR + "," + (r.CHCL + r.TCR));
}
else {
t += (r.CHCL + r.TCR + r.RSI + r.MACD + r.STOCH);
oPW1.write("," + r.CHCL + "," + r.TCR + "," + r.RSI + "," + r.MACD + "," + r.STOCH + "," + (r.CHCL + r.TCR + r.RSI + r.MACD + r.STOCH));
}
});
// oPW.close() ;
oPW1.write("," + t + '\r\n');
oPW1.close();
await new Promise(r => setTimeout(r, 200));
var reader = require('any-text');
var me = this;
reader.getText(sFileName).then((data) => {
oPW1 = fs.createWriteStream(sFileName + "_1.json");
oPW1.write(JSON.stringify(me.csvToJSON(data)));
oPW1.close();
console.log("DONE... " + new Date());
});
}
csvToJSON(csv) {
var lines = csv.split("\n");
var result = [];
var headers = lines[0].split(",");
for (var i = 1; i < lines.length; i++) {
var obj = {};
if (lines[i] == undefined || lines[i].trim() == "") {
continue;
}
var words = lines[i].split(",");
for (var j = 0; j < words.length; j++) {
obj[headers[j].trim()] = words[j];
}
result.push(obj);
}
return result;
}
async downloadOHLC2File(sSymbol) {
var iaSQL = ['select t/1000, o, h, l, c from OHLC where S = @S@ order by t ',
'select extract(epoch from t) as t, o, h, l, c from D_OHLC where S = @S@ order by t',
'select extract(epoch from t) as t, o, h, l, c from W_OHLC where S = @S@ order by t',
"select extract(epoch from (d::timestamp + INTERVAL '86400 seconds')) as t, o, h, l, c from M_OHLC where S = @S@ order by t",
"select extract(epoch from (d::timestamp + INTERVAL '0 seconds')) as t, o, h, l, c from Q_OHLC where S = @S@ order by t",
"select extract(epoch from (d::timestamp + INTERVAL '0 seconds')) as t, o, h, l, c from Y_OHLC where S = @S@ order by t"
];
for (var i = 0; i < this.sPeriods.length; i++) {
let sqld, sql, data, result;
sqld = iaSQL[i];
sql = sql_string_1.replace(sqld, null, { S: sSymbol, P: 'H' });
if (!fs.existsSync(this.sOutputDir + sSymbol)) {
fs.mkdirSync(this.sOutputDir + sSymbol);
}
// console.log (sql)
data = await this.getDBService().getSQLResult(sql);
result = data.result.map((e) => Object.keys(e).map(k => +e[k]).reverse());
var oPW = fs.createWriteStream(this.sOutputDir + sSymbol + "/" + IConstants_1.IConstants.sChartPeriods[this.sPeriods[i]] + ".json");
oPW.write(JSON.stringify(result));
oPW.close();
await this.sleep(500).then(async () => {
var df = await DataFrame.fromJSON(resolve(this.sOutputDir + sSymbol + "/" + IConstants_1.IConstants.sChartPeriods[this.sPeriods[i]] + ".json"));
// console.log("Storing ", sSymbol + "_"+ this.sPeriods[i]) ;
LoadData_1.LoadData.addDF(sSymbol + "_" + this.sPeriods[i], df);
});
}
}
}
exports.SynergyTA = SynergyTA;
//new SynergyTA();