forked from risecloud/gekkoNeatapticIndicator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
neataptic.js
102 lines (82 loc) · 2.89 KB
/
neataptic.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
const config = require('../core/util.js').getConfig();
const log = require('../core/log.js');
const _ = require('lodash');
const strat = {
init() {
this.name = 'NEAT Strat';
this.requiredHistory = config.tradingAdvisor.historySize;
config.backtest.batchSize = 1000;
config.silent = true;
config.debug = false;
this.addIndicator('neat', 'NEAT', {
hiddenLayers: this.settings.hiddenLayers,
lookAhead: this.settings.lookAheadCandles,
iterations: this.settings.iterations,
error: this.settings.error,
rate: this.settings.learnRate,
momentum: this.settings.momentum,
history: config.tradingAdvisor.historySize,
rsi: this.settings.RSI,
sma: this.settings.SMA,
architecture: this.settings.architecture
});
this.position = 'none';
this.longAt = 0;
this.stopLossTimes = 0;
this.startTime = new Date();
},
check(candle) {
if (this.candle.close.length < this.requiredHistory) {
return;
}
let short = false;
let long = true;
let minPercentMet = false;
for (let i = 0, iLen = this.indicators.neat.prediction.length; i < iLen; i++) {
if (this.settings.candlesForShort.indexOf(i + 1) !== -1) {
short = short || this.checkShort(candle, this.indicators.neat.prediction[i]);
}
if (this.settings.candlesForLong.indexOf(i + 1) !== -1) {
let percentage = i + 1 === _.max(this.settings.candlesForLong) ? this.settings.minPercentIncrease : 0;
long = long && this.checkLong(candle, this.indicators.neat.prediction[i], percentage);
}
}
if (short && this.position !== 'short' || this.position === 'long' && this.checkStopLoss(candle)) {
this.position = 'short';
this.advice('short');
} else if (long && this.position !== 'long') {
this.position = 'long';
this.longAt = candle.close;
this.advice('long');
}
},
checkShort(candle, prediction) {
return candle.close > prediction;
},
checkLong(candle, prediction, percentThresh) {
return prediction > candle.close && this.convertToPercent(candle.close, prediction) > percentThresh;
},
checkStopLoss(candle) {
let ret = false;
if (this.longAt > candle.close) {
ret = this.convertToPercent(candle.close, this.longAt) > this.settings.stopLoss;
if (ret) {
this.stopLossTimes++;
}
}
return ret;
},
convertToPercent(numerator, denominator) {
return (1 - (numerator / denominator)) * 100;
},
end() {
let seconds = ((new Date() - this.startTime) / 1000),
minutes = seconds / 60,
str;
minutes < 1 ? str = seconds.toFixed(2) + ' seconds' : str = minutes.toFixed(2) + ' minutes';
log.info('====================================');
log.info('Finished in ' + str + ' stopped loss ' + this.stopLossTimes + ' times');
log.info('====================================');
}
}
module.exports = strat;