forked from anandanand84/technicalindicators
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathATR.ts
91 lines (76 loc) · 2.06 KB
/
ATR.ts
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
import { Indicator, IndicatorInput } from '../indicator/indicator';
/**
* Created by AAravindan on 5/8/16.
*/
"use strict"
import { WEMA } from '../moving_averages/WEMA';
import { TrueRange } from './TrueRange';
export class ATRInput extends IndicatorInput {
low:number[]
high:number[]
close:number[]
period:number
};
export class ATR extends Indicator {
result : number[];
generator:IterableIterator<number | undefined>;
constructor(input:ATRInput) {
super(input);
var lows = input.low;
var highs = input.high;
var closes = input.close;
var period = input.period;
var format = this.format;
if(!((lows.length === highs.length) && (highs.length === closes.length) )){
throw ('Inputs(low,high, close) not of equal size');
}
var trueRange = new TrueRange({
low : [],
high: [],
close: []
});
var wema = new WEMA({period : period, values : [], format : (v) => {return v}});
this.result = [];
this.generator = (function* (){
var tick = yield;
var avgTrueRange,trange;;
while (true) {
trange = trueRange.nextValue({
low : tick.low,
high : tick.high,
close : tick.close
});
if(trange === undefined){
avgTrueRange = undefined;
}else {
avgTrueRange = wema.nextValue(trange);
}
tick = yield avgTrueRange
}
})();
this.generator.next();
lows.forEach((tick,index) => {
var result = this.generator.next({
high : highs[index],
low : lows[index],
close : closes[index]
});
if(result.value !== undefined){
this.result.push(format(result.value));
}
});
};
static calculate = atr;
nextValue(price:number):number | undefined {
return this.generator.next(price).value;
};
}
export function atr(input:ATRInput):number[] {
Indicator.reverseInputs(input);
var result = new ATR(input).result;
if(input.reversedInput) {
result.reverse();
}
Indicator.reverseInputs(input);
return result;
};