-
Notifications
You must be signed in to change notification settings - Fork 43
/
fisherTransform.src.js
110 lines (92 loc) · 2.45 KB
/
fisherTransform.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
var smoothingExponent,
fisherExponent,
label,
signalLabel,
midpoints = [],
raws = [],
smoothed,
logarithm,
logarithms = [],
fisher,
lastFisher;
// TODO Could parameterize smoothing periods
var smoothingPeriods = 5;
var fisherPeriods = 3;
function validate (periods) {
if (typeof periods !== "number") {
error("Fisher Transform periods must be a number");
}
if (periods % 1 !== 0) {
error("Fisher Transform periods must be an integer");
}
if (periods > 100) {
error("Fisher Transform maximum periods is 100");
}
if (periods <= 0) {
error("Fisher Transform periods must be greater than 0");
}
}
function getRunUpCount (periods) {
return periods + smoothingPeriods + fisherPeriods + 1;
}
function getBufferSize () {
return 0;
}
function onStart (periods) {
smoothingExponent = 2 / (smoothingPeriods + 1);
fisherExponent = 2 / (fisherPeriods + 1);
label = "Fisher Transform (" + periods + ")";
signalLabel = label + " Signal";
}
function onIntervalClose (periods) {
var midpoint = (HIGH + LOW) / 2,
periodLow,
raw,
output;
midpoints.push(midpoint);
if (midpoints.length < periods) {
return null;
} else if (midpoints.length > periods) {
midpoints.shift();
}
periodLow = Math.min.apply(null, midpoints);
raw = 2 * ((midpoint - periodLow) / (Math.max.apply(null, midpoints) - periodLow)) - 1;
if (smoothed === undefined) {
raws.push(raw);
if (raws.length === smoothingPeriods) {
smoothed = Math.average(raws);
} else {
return null;
}
} else {
smoothed = ((raw - smoothed) * smoothingExponent) + smoothed;
}
logarithm = Math.log((1 + smoothed) / (1 - smoothed));
if (fisher === undefined) {
logarithms.push(logarithm);
if (logarithms.length === fisherPeriods) {
fisher = Math.average(logarithms);
} else {
return null;
}
} else {
fisher = ((logarithm - fisher) * fisherExponent) + fisher;
}
if (lastFisher === undefined) {
lastFisher = fisher;
return null;
}
output = [{
name: label,
overlay: false,
value: fisher,
precision: 3
}, {
name: signalLabel,
overlay: false,
value: lastFisher,
precision: 3
}];
lastFisher = fisher;
return output;
}