-
Notifications
You must be signed in to change notification settings - Fork 43
/
trix.src.js
124 lines (110 loc) · 2.94 KB
/
trix.src.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var exponent,
signalExponent,
label,
signalLabel,
closes = [],
singleEMA,
singleEMAs = [],
doubleEMA,
doubleEMAs = [],
tripleEMA,
previousTripleEMA,
TRIXs = [],
signal;
function getRunUpCount (periods, signalPeriods) {
return periods * 6 + (signalPeriods || 0);
}
function getBufferSize (periods, signalPeriods) {
return periods;
}
function validate (periods, signalPeriods) {
if (typeof periods !== "number") {
error("TRIX periods must be a number");
}
if (periods % 1 !== 0) {
error("TRIX periods must be an integer");
}
if (periods > 100) {
error("TRIX maximum periods is 100");
}
if (periods <= 0) {
error("TRIX periods must be greater than 0");
}
if (signalPeriods) {
if (typeof signalPeriods !== "number") {
error("TRIX signalPeriods must be a number");
}
if (signalPeriods % 1 !== 0) {
error("TRIX signalPeriods must be an integer");
}
if (signalPeriods > 100) {
error("TRIX maximum signalPeriods is 100");
}
if (signalPeriods < 0) {
error("TRIX periods must be greater than or equal to 0");
}
}
}
function onStart (periods, signalPeriods) {
exponent = 2 / (periods + 1);
if (signalPeriods) {
signalExponent = 2 / (signalPeriods + 1);
label = "trix(" + periods + "," + signalPeriods + ")";
signalLabel = label + " Signal";
}
}
function onIntervalClose (periods, signalPeriods) {
var TRIX,
singleEMA = ema(periods);
if (doubleEMA === undefined) {
singleEMAs.push(singleEMA);
if (singleEMAs.length === periods) {
doubleEMA = Math.average(singleEMAs);
} else {
return null;
}
} else {
doubleEMA = ((singleEMA - doubleEMA) * exponent) + doubleEMA;
}
if (tripleEMA === undefined) {
doubleEMAs.push(doubleEMA);
if (doubleEMAs.length === periods) {
tripleEMA = Math.average(doubleEMAs);
} else {
return null;
}
} else {
tripleEMA = ((doubleEMA - tripleEMA) * exponent) + tripleEMA;
}
if (previousTripleEMA === undefined) {
previousTripleEMA = tripleEMA;
return null;
}
TRIX = ((tripleEMA - previousTripleEMA) / previousTripleEMA) * 100;
if (!signalPeriods) {
return {
value: TRIX,
overlay: false
};
}
previousTripleEMA = tripleEMA;
if (signal === undefined) {
TRIXs.push(TRIX);
if (TRIXs.length === signalPeriods) {
signal = Math.average(TRIXs);
} else {
return null;
}
} else {
signal = ((TRIX - signal) * signalExponent) + signal;
}
return [{
name: label,
value: TRIX,
overlay: false
}, {
name: signalLabel,
value: signal,
overlay: false
}];
}