Skip to content

Commit e8ae934

Browse files
authored
Merge pull request #49 from Artimatic/feature/29-Backtesting-and-ml
Feature/29 backtesting and ml
2 parents d83af39 + 30c84d4 commit e8ae934

File tree

102 files changed

+8607
-5219
lines changed

Some content is hidden

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

102 files changed

+8607
-5219
lines changed

package-lock.json

Lines changed: 4318 additions & 4085 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"main": "server/app.js",
66
"scripts": {
77
"ng": "ng",
8-
"start": "npm run serve",
8+
"start": "npm run build && npm run serve",
99
"build": "ng build --aot && npm run build-ts && npm run tslint",
1010
"serve": "node dist/app.js",
1111
"test-server": "npm run build-ts && node server-tests.js",
@@ -44,6 +44,7 @@
4444
"cookie-parser": "^1.4.3",
4545
"core-js": "^2.6.1",
4646
"d3fc-financial-feed": "^3.0.0",
47+
"elliptic": "^6.5.4",
4748
"errorhandler": "^1.5.0",
4849
"errors": "^0.3.0",
4950
"eslint": "^6.8.0",
@@ -76,7 +77,10 @@
7677
"tslib": "^1.10.0",
7778
"tulind": "^0.8.15",
7879
"twilio": "^3.50.0",
80+
"typescript": "3.5.3",
81+
"websocket-extensions": "^0.1.4",
7982
"xlsx": "^0.14.2",
83+
"y18n": "^4.0.1",
8084
"yahoo-finance-data": "^3.2.0",
8185
"zone.js": "^0.9.1"
8286
},
@@ -107,11 +111,10 @@
107111
"nodemon": "^1.14.1",
108112
"protractor": "^5.4.2",
109113
"ts-node": "^3.3.0",
110-
"tslint": "^5.15.0",
111-
"typescript": "^3.5.3"
114+
"tslint": "^5.15.0"
112115
},
113116
"engines": {
114-
"node": ">=12.18.3"
117+
"node": "12.18.3"
115118
},
116119
"babel": {
117120
"presets": [

server/api/backtest/algo.service.ts

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ class AlgoService {
1212
}
1313

1414
checkVwma(lastClose: number, vwma: number): DaytradeRecommendation {
15-
if (lastClose > vwma) {
16-
return DaytradeRecommendation.Bearish;
17-
} else {
18-
return DaytradeRecommendation.Neutral;
15+
if (_.isNumber(lastClose) && _.isNumber(vwma)) {
16+
if (lastClose >= vwma) {
17+
return DaytradeRecommendation.Bullish;
18+
} if (lastClose < vwma) {
19+
return DaytradeRecommendation.Bearish;
20+
}
1921
}
22+
return DaytradeRecommendation.Neutral;
2023
}
2124

2225
checkMfi(mfi: number): DaytradeRecommendation {
@@ -73,23 +76,24 @@ class AlgoService {
7376
return counter;
7477
}
7578

76-
checkRocCrossover(roc70Previous: number, roc70: number): DaytradeRecommendation {
77-
if (roc70Previous > 0 && roc70 < 0) {
79+
checkRocCrossover(roc70Previous: number, roc70: number, mfi: number): DaytradeRecommendation {
80+
if (roc70Previous > 0 && roc70 < 0 && mfi > 78) {
7881
return DaytradeRecommendation.Bearish;
7982
}
80-
if (roc70Previous < 0 && roc70 > 0) {
83+
if (roc70Previous < 0 && roc70 > 0 && mfi < 23) {
8184
return DaytradeRecommendation.Bullish;
8285
}
8386

8487
return DaytradeRecommendation.Neutral;
8588
}
8689

87-
checkMfiTrend(mfiPrevious: number, mfi: number): DaytradeRecommendation {
90+
checkMfiTrend(mfiPrevious: number, mfi: number, roc10Previous: number, roc10: number): DaytradeRecommendation {
8891
const change = DecisionService.getPercentChange(mfi, mfiPrevious);
89-
if (change > 0.3) {
90-
return DaytradeRecommendation.Bearish;
91-
} else if (change < -0.3) {
92+
const changeRoc = Math.abs(DecisionService.getPercentChange(roc10, roc10Previous));
93+
if (change > 0.2 && roc10 > roc10Previous && changeRoc > 0.1) {
9294
return DaytradeRecommendation.Bullish;
95+
} else if (change < -0.2 && roc10Previous > roc10 && changeRoc > 0.1) {
96+
return DaytradeRecommendation.Bearish;
9397
}
9498

9599
return DaytradeRecommendation.Neutral;
@@ -98,12 +102,13 @@ class AlgoService {
98102
checkMfiDivergence(mfiPrevious: number, mfi: number, roc10Previous: number, roc10: number): DaytradeRecommendation {
99103
const mfiChange = Math.abs(DecisionService.getPercentChange(mfi, mfiPrevious));
100104
const roc10Change = Math.abs(DecisionService.getPercentChange(roc10, roc10Previous));
101-
if (mfiChange > 0.1 && roc10Change > 0.3 && mfiPrevious < mfi && roc10Previous > roc10) {
102-
return DaytradeRecommendation.Bullish;
103-
} else if (mfiChange > 0.1 && roc10Change > 0.3 && mfiPrevious > mfi && roc10Previous < roc10) {
104-
return DaytradeRecommendation.Bearish;
105+
if (mfiChange > 0.18 && roc10Change > 0.1) {
106+
if (mfiPrevious < mfi && roc10Previous > roc10) {
107+
return DaytradeRecommendation.Bullish;
108+
} else if (mfiPrevious > mfi && roc10Previous < roc10) {
109+
return DaytradeRecommendation.Bearish;
110+
}
105111
}
106-
107112
return DaytradeRecommendation.Neutral;
108113
}
109114

@@ -121,21 +126,17 @@ class AlgoService {
121126
return DaytradeRecommendation.Neutral;
122127
}
123128

124-
checkMacdDaytrade(indicator: Indicators, roc10Previous: number, roc10: number): DaytradeRecommendation {
125-
const macd = indicator.macd[2];
126-
127-
if (roc10Previous > 0 && roc10 < 0) {
128-
if (macd[macd.length - 1] <= 0) {
129-
return DaytradeRecommendation.Bearish;
130-
}
131-
}
129+
checkMacdDaytrade(currentMacd: any, previousMacd: any): DaytradeRecommendation {
130+
if (previousMacd) {
131+
const macd = currentMacd[2];
132+
const prevMacd = previousMacd[2];
132133

133-
if (roc10Previous < 0 && roc10 > 0) {
134-
if (macd[macd.length - 1] > 0) {
134+
if (macd[macd.length - 1] > 0 && prevMacd[prevMacd.length - 1] <= 0) {
135135
return DaytradeRecommendation.Bullish;
136+
} else if (macd[macd.length - 1] <= 0 && prevMacd[prevMacd.length - 1] > 0) {
137+
return DaytradeRecommendation.Bearish;
136138
}
137139
}
138-
139140
return DaytradeRecommendation.Neutral;
140141
}
141142

server/api/backtest/backtest.controller.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ class BacktestController extends BaseController {
225225
}
226226

227227
getDaytradeIndicators(request, response) {
228-
BacktestService.getDaytradeIndicators(request.body.quotes, request.body.period)
228+
BacktestService.getCurrentDaytradeIndicators(request.body.symbol, request.body.period)
229229
.then((data) => BaseController.requestGetSuccessHandler(response, data))
230230
.catch((err) => BaseController.requestErrorHandler(response, err));
231231
}
@@ -238,23 +238,24 @@ class BacktestController extends BaseController {
238238
!request.body.parameters) {
239239
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
240240
}
241-
response.status(200).send(BacktestService.runDaytradeBacktest(request.body.symbol,
241+
BacktestService.runDaytradeBacktest(request.body.symbol,
242242
request.body.currentDate,
243243
request.body.startDate,
244-
request.body.parameters));
244+
request.body.parameters)
245+
.then((data) => BaseController.requestGetSuccessHandler(response, data))
246+
.catch((err) => BaseController.requestErrorHandler(response, err));
245247
}
246248

247-
getDaytrade(request, response) {
249+
getCurrentDaytrade(request, response) {
248250
if (_.isEmpty(request.body) ||
249-
!request.body.indicators ||
250-
!request.body.parameters) {
251+
!request.body.symbol) {
251252
return response.status(Boom.badRequest().output.statusCode).send(Boom.badRequest().output);
252253
}
253-
BacktestService.getDaytrade(request.body.price,
254+
BacktestService.getCurrentDaytrade(
255+
request.body.symbol,
256+
request.body.price,
254257
request.body.paidPrice,
255-
request.body.indicators,
256258
request.body.parameters, response);
257-
258259
}
259260

260261
calibrateDaytrade(request, response) {

0 commit comments

Comments
 (0)