Skip to content

Commit b261bf3

Browse files
committed
Refactored
1 parent c1e14ab commit b261bf3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+432
-685
lines changed

.jshintrc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"boss": true,
3+
"node": true,
4+
"eqeqeq": true,
5+
"strict": true,
6+
"newcap": false,
7+
"undef": true,
8+
"unused": true,
9+
"onecase": true,
10+
"lastsemic": true
11+
}

package.json

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
{
2-
"name": "merchant-of-nottingham",
2+
"name": "robinhood-algorithmic-trading-in-angular",
33
"version": "0.0.1",
44
"license": "MIT",
55
"scripts": {
66
"ng": "ng",
77
"start": "nodemon server/app.js --exec babel-node",
8-
"build": "ng build && babel server -d dist",
8+
"build": "ng build && && npm run tslint && babel server -d dist",
99
"serve": "node dist/index.js",
1010
"test": "ng test",
1111
"lint": "ng lint",
1212
"e2e": "ng e2e",
13-
"postinstall": "ng build --environment=prod"
13+
"postinstall": "ng build --environment=prod",
14+
"tslint": "tslint -c tslint.json -p tsconfig.json"
1415
},
1516
"private": true,
1617
"dependencies": {
@@ -50,7 +51,7 @@
5051
"lodash": "^4.17.11",
5152
"mathjs": "^3.18.0",
5253
"method-override": "^2.3.10",
53-
"moment": "^2.20.1",
54+
"moment": "^2.23.0",
5455
"morgan": "^1.9.0",
5556
"path": "^0.12.7",
5657
"qs": "^6.5.1",
@@ -78,20 +79,20 @@
7879
"babel-preset-env": "^1.6.1",
7980
"babel-preset-es2017": "^6.24.1",
8081
"babel-preset-stage-2": "^6.24.1",
81-
"codelyzer": "~3.2.0",
82-
"jasmine-core": "~2.6.2",
83-
"jasmine-spec-reporter": "~4.1.0",
84-
"karma": "~1.7.0",
85-
"karma-chrome-launcher": "~2.1.1",
86-
"karma-cli": "~1.0.1",
82+
"codelyzer": "^3.2.0",
83+
"jasmine-core": "^2.99.1",
84+
"jasmine-spec-reporter": "^4.2.1",
85+
"karma": "^1.7.0",
86+
"karma-chrome-launcher": "^2.2.0",
87+
"karma-cli": "^1.0.1",
8788
"karma-coverage-istanbul-reporter": "^1.2.1",
8889
"karma-jasmine": "^1.1.1",
8990
"karma-jasmine-html-reporter": "^0.2.2",
9091
"nodemon": "^1.14.1",
9192
"protractor": "^5.4.1",
92-
"ts-node": "~3.3.0",
93-
"tslint": "~5.8.0",
94-
"typescript": "~2.4.2"
93+
"ts-node": "^3.3.0",
94+
"tslint": "^5.12.0",
95+
"typescript": "^2.6.0"
9596
},
9697
"engines": {
9798
"node": ">=8.9.0"

server/api/backtest/backtest.controller.js

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import * as _ from 'lodash';
22
import * as Boom from 'boom';
33

4-
import BaseController from '../../api/templates/base.controller';
4+
import BaseController from '../templates/base.controller';
55

6-
import { BacktestService } from './backtest.service';
7-
8-
import * as errors from '../../components/errors/baseErrors';
6+
import BacktestService from './backtest.service';
97

108
class BacktestController extends BaseController {
119

@@ -16,8 +14,7 @@ class BacktestController extends BaseController {
1614
backtest(request, response) {
1715
if (_.isEmpty(request.body)) {
1816
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
19-
}
20-
else {
17+
} else {
2118
BacktestService.evaluateStrategyAll(request.body.ticker, request.body.end, request.body.start)
2219
.then((data) => BaseController.requestGetSuccessHandler(response, data))
2320
.catch((err) => BaseController.requestErrorHandler(response, err));
@@ -29,8 +26,7 @@ class BacktestController extends BaseController {
2926
!request.body.short ||
3027
!request.body.long) {
3128
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
32-
}
33-
else {
29+
} else {
3430
BacktestService.getMeanReversionChart(request.body.ticker,
3531
request.body.end,
3632
request.body.start,
@@ -49,14 +45,13 @@ class BacktestController extends BaseController {
4945
}
5046

5147
getIndicator(request, response) {
52-
BaseController.requestGetSuccessHandler(response, BacktestService.getIndicator())
48+
BaseController.requestGetSuccessHandler(response, BacktestService.getIndicator());
5349
}
5450

5551
getBollingerBands(request, response) {
5652
if (_.isEmpty(request.body)) {
5753
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
58-
}
59-
else {
54+
} else {
6055
BacktestService.getBBands(request.body.real, request.body.period, request.body.stddev)
6156
.then((data) => BaseController.requestGetSuccessHandler(response, data))
6257
.catch((err) => BaseController.requestErrorHandler(response, err));
@@ -66,8 +61,7 @@ class BacktestController extends BaseController {
6661
getSMA(request, response) {
6762
if (_.isEmpty(request.body)) {
6863
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
69-
}
70-
else {
64+
} else {
7165
BacktestService.getSMA(request.body.real, request.body.period)
7266
.then((data) => BaseController.requestGetSuccessHandler(response, data))
7367
.catch((err) => BaseController.requestErrorHandler(response, err));
@@ -77,8 +71,7 @@ class BacktestController extends BaseController {
7771
getMfi(request, response) {
7872
if (_.isEmpty(request.body)) {
7973
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
80-
}
81-
else {
74+
} else {
8275
BacktestService.getMfi(request.body.high, request.body.low, request.body.close, request.body.volume, request.body.period)
8376
.then((data) => BaseController.requestGetSuccessHandler(response, data))
8477
.catch((err) => BaseController.requestErrorHandler(response, err));
@@ -88,8 +81,7 @@ class BacktestController extends BaseController {
8881
getRateOfChange(request, response) {
8982
if (_.isEmpty(request.body)) {
9083
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
91-
}
92-
else {
84+
} else {
9385
BacktestService.getRateOfChange(request.body.real, request.body.period)
9486
.then((data) => BaseController.requestGetSuccessHandler(response, data))
9587
.catch((err) => BaseController.requestErrorHandler(response, err));
@@ -115,4 +107,4 @@ class BacktestController extends BaseController {
115107
}
116108
}
117109

118-
module.exports.BacktestController = new BacktestController();
110+
export default new BacktestController();
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
1-
import { BacktestController } from './backtest.controller';
1+
import BacktestController from './backtest.controller';
22

33
export let backtest = (request, response) => {
44
BacktestController.backtest(request, response);
5-
}
5+
};
66

77
export let getMeanReversionChart = (request, response) => {
88
BacktestController.getMeanReversionChart(request, response);
9-
}
9+
};
1010

1111
export let indicator = (request, response) => {
1212
BacktestController.getIndicator(request, response);
13-
}
13+
};
1414

1515
export let bollingerBands = (request, response) => {
1616
BacktestController.getBollingerBands(request, response);
17-
}
17+
};
1818

1919
export let infoV2 = (request, response) => {
2020
BacktestController.getInfoV2(request, response);
21-
}
21+
};
2222

2323
export let infoV2Chart = (request, response) => {
2424
BacktestController.getInfoV2Chart(request, response);
25-
}
25+
};
2626

2727
export let timeline = (request, response) => {
2828
BacktestController.getHistoricalMatches(request, response);
29-
}
29+
};
3030

3131
export let sma = (request, response) => {
3232
BacktestController.getSMA(request, response);
33-
}
33+
};
3434

3535
export let roc = (request, response) => {
3636
BacktestController.getRateOfChange(request, response);
37-
}
37+
};
3838

3939
export let mfi = (request, response) => {
4040
BacktestController.getMfi(request, response);
41-
}
41+
};

server/api/backtest/backtest.service.js

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import moment from 'moment';
2-
import json2csv from 'json2csv';
3-
import fs from 'fs';
4-
import RequestPromise from 'request-promise';
2+
import * as json2csv from 'json2csv';
3+
import * as fs from 'fs';
4+
import * as _ from 'lodash';
55

6-
import { QuoteService } from './../quote/quote.service';
7-
import { ReversionService } from './../mean-reversion/reversion.service';
8-
import * as DecisionService from './../mean-reversion/reversion-decision.service';
6+
import RequestPromise from 'request-promise';
97

10-
import * as errors from '../../components/errors/baseErrors';
8+
import QuoteService from '../quote/quote.service';
9+
import ReversionService from '../mean-reversion/reversion.service';
10+
import DecisionService from '../mean-reversion/reversion-decision.service';
11+
import BaseErrors from '../../components/errors/baseErrors';
1112
import * as tulind from 'tulind';
1213
import configurations from '../../config/environment';
1314

@@ -16,7 +17,7 @@ const appUrl = configurations.apps.goliath;
1617
const config = {
1718
shortTerm: [3, 103],
1819
longTerm: [5, 286]
19-
}
20+
};
2021

2122
let startTime;
2223
let endTime;
@@ -45,14 +46,14 @@ class BacktestService {
4546
evaluateStrategyAll(ticker, end, start) {
4647
console.log('Executing: ', ticker, new Date());
4748
startTime = moment();
48-
return this.runTest(ticker, end, start);
49+
return this.runIntradayTest(ticker, end, start);
4950
}
5051

5152
getDateRanges(currentDate, startDate) {
52-
let current = moment(currentDate),
53+
const current = moment(currentDate),
5354
start = moment(startDate);
5455

55-
let days = current.diff(start, 'days') + 1;
56+
const days = current.diff(start, 'days') + 1;
5657

5758
return {
5859
end: current.format(),
@@ -61,7 +62,7 @@ class BacktestService {
6162
}
6263

6364
getData(ticker, currentDate, startDate) {
64-
let { end, start } = this.getDateRanges(currentDate, startDate);
65+
const { end, start } = this.getDateRanges(currentDate, startDate);
6566

6667
return QuoteService.getDailyQuotes(ticker, end, start)
6768
.then(data => {
@@ -70,20 +71,20 @@ class BacktestService {
7071
}
7172

7273
runTest(ticker, currentDate, startDate) {
73-
let shortTerm = config.shortTerm;
74-
let longTerm = config.longTerm;
75-
let snapshots = [];
74+
const shortTerm = config.shortTerm;
75+
const longTerm = config.longTerm;
76+
const snapshots = [];
7677
return this.getData(ticker, currentDate, startDate)
7778
.then(quotes => {
7879
const fields = ['shortTerm', 'longTerm', 'totalReturns', 'totalTrades', 'recommendedDifference'];
7980
for (let i = shortTerm[0]; i < shortTerm[1]; i++) {
8081
for (let j = longTerm[0]; j < longTerm[1]; j++) {
8182
if (i < j) {
82-
let MAs = ReversionService.executeMeanReversion(ReversionService.calcMA, quotes, i, j);
83-
let recommendedDifference = 0.003;
83+
const MAs = ReversionService.executeMeanReversion(ReversionService.calcMA, quotes, i, j);
84+
const recommendedDifference = 0.003;
8485

85-
let averagesRange = { shortTerm: i, longTerm: j };
86-
let returns = DecisionService.calcReturns(MAs, recommendedDifference, startDate);
86+
const averagesRange = { shortTerm: i, longTerm: j };
87+
const returns = DecisionService.calcReturns(MAs, recommendedDifference, startDate);
8788

8889
if (returns.totalReturns > 0 && returns.totalTrades > 3) {
8990
snapshots.push({ ...averagesRange, ...returns, recommendedDifference });
@@ -92,8 +93,9 @@ class BacktestService {
9293
snapshots.push({ ...averagesRange, ...returns, recommendedDifference });
9394

9495
if (i % 3 === 0 && j === longTerm[longTerm.length - 1] - 1) {
95-
fs.writeFile(`${ticker}_analysis_${startDate}-${currentDate}_${i}.csv`, json2csv({ data: snapshots, fields: fields }), function (err) {
96-
if (err) throw err;
96+
fs.writeFile(`${ticker}_analysis_${startDate}-
97+
${currentDate}_${i}.csv`, json2csv({ data: snapshots, fields: fields }), function (err) {
98+
if (err) { throw err; }
9799
console.log('file saved');
98100
});
99101
snapshots.length = 0;
@@ -106,29 +108,41 @@ class BacktestService {
106108

107109
const duration = moment.duration(endTime.diff(startTime)).humanize();
108110

109-
console.log("Duration: ", duration);
111+
console.log('Duration: ', duration);
110112

111113
fs.writeFile(`${ticker}_analysis_${currentDate}-${startDate}.csv`, json2csv({ data: snapshots, fields: fields }), function (err) {
112-
if (err) throw err;
114+
if (err) { throw err; }
113115
console.log('file saved');
114116
});
115117
return snapshots;
116118
});
117119
}
118120

121+
runIntradayTest(symbol, currentDate, startDate) {
122+
return QuoteService.queryForIntraday(symbol, startDate, currentDate)
123+
.then(quotes => {
124+
_.forEach(quotes, (q) => {
125+
126+
});
127+
});
128+
}
129+
130+
getBuySignal() {
131+
}
132+
119133
getMeanReversionChart(ticker, currentDate, startDate, deviation, shortTerm, longTerm) {
120134
return this.getData(ticker, currentDate, startDate)
121135
.then(quotes => {
122136
return ReversionService.executeMeanReversion(ReversionService.calcMA, quotes, shortTerm, longTerm);
123137
})
124138
.catch(err => {
125139
console.log('ERROR! backtest', err);
126-
throw errors.InvalidArgumentsError();
140+
throw BaseErrors.InvalidArgumentsError();
127141
});
128142
}
129143

130144
getTradeDays(days) {
131-
let workDaysPerWeek = 5 / 7,
145+
const workDaysPerWeek = 5 / 7,
132146
holidays = 9;
133147

134148
return Math.ceil(days * workDaysPerWeek - holidays);
@@ -150,7 +164,7 @@ class BacktestService {
150164

151165
return RequestPromise(options)
152166
.then((data) => {
153-
let arr = JSON.parse(data);
167+
const arr = JSON.parse(data);
154168
return arr;
155169
})
156170
.catch((error) => {
@@ -174,7 +188,7 @@ class BacktestService {
174188

175189
return RequestPromise(options)
176190
.then((data) => {
177-
let arr = JSON.parse(data);
191+
const arr = JSON.parse(data);
178192
return arr;
179193
})
180194
.catch((error) => {
@@ -208,4 +222,4 @@ class BacktestService {
208222
}
209223
}
210224

211-
module.exports.BacktestService = new BacktestService();
225+
export default new BacktestService();

server/api/mean-reversion/index.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
const express = require('express');
2-
const handler = require('./reversion.router');
3-
1+
import * as express from 'express';
42
const router = express.Router();
53

6-
router.post('/', handler.reversion);
7-
router.post('/backtest', handler.backtest);
8-
router.post('/info', handler.backtestQuick);
9-
router.post('/pricing', handler.pricing);
4+
import ReversionController from './reversion.controller';
5+
6+
router.post('/', ReversionController.getAlgoData);
7+
router.post('/backtest', ReversionController.runBacktest);
8+
router.post('/info', ReversionController.runBacktestQuick);
109

1110
module.exports = router;

0 commit comments

Comments
 (0)