UNPKG

sql-synergy

Version:

Synergy Wave TA

273 lines (272 loc) 12.4 kB
"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();