forked from askmike/gekko
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RSI.js
108 lines (79 loc) · 2.28 KB
/
RSI.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
103
104
105
106
107
108
/*
RSI - cykedev 14/02/2014
(updated a couple of times since, check git history)
*/
// helpers
var _ = require('lodash');
var log = require('../core/log.js');
var config = require('../core/util.js').getConfig();
var settings = config.RSI;
var RSI = require('./indicators/RSI.js');
// let's create our own method
var method = {};
// prepare everything our method needs
method.init = function() {
this.name = 'RSI';
this.trend = {
direction: 'none',
duration: 0,
persisted: false,
adviced: false
};
this.requiredHistory = config.tradingAdvisor.historySize;
// define the indicators we need
this.addIndicator('rsi', 'RSI', settings);
}
// for debugging purposes log the last
// calculated parameters.
method.log = function() {
var digits = 8;
var rsi = this.indicators.rsi;
log.debug('calculated RSI properties for candle:');
log.debug('\t', 'rsi:', rsi.rsi.toFixed(digits));
log.debug('\t', 'price:', this.lastPrice.toFixed(digits));
}
method.check = function() {
var rsi = this.indicators.rsi;
var rsiVal = rsi.rsi;
if(rsiVal > settings.thresholds.high) {
// new trend detected
if(this.trend.direction !== 'high')
this.trend = {
duration: 0,
persisted: false,
direction: 'high',
adviced: false
};
this.trend.duration++;
log.debug('In high since', this.trend.duration, 'candle(s)');
if(this.trend.duration >= settings.thresholds.persistence)
this.trend.persisted = true;
if(this.trend.persisted && !this.trend.adviced) {
this.trend.adviced = true;
this.advice('short');
} else
this.advice();
} else if(rsiVal < settings.thresholds.low) {
// new trend detected
if(this.trend.direction !== 'low')
this.trend = {
duration: 0,
persisted: false,
direction: 'low',
adviced: false
};
this.trend.duration++;
log.debug('In low since', this.trend.duration, 'candle(s)');
if(this.trend.duration >= settings.thresholds.persistence)
this.trend.persisted = true;
if(this.trend.persisted && !this.trend.adviced) {
this.trend.adviced = true;
this.advice('long');
} else
this.advice();
} else {
log.debug('In no trend');
this.advice();
}
}
module.exports = method;