-
Notifications
You must be signed in to change notification settings - Fork 941
Expand file tree
/
Copy pathstatistics.ts
More file actions
80 lines (62 loc) · 2.21 KB
/
statistics.ts
File metadata and controls
80 lines (62 loc) · 2.21 KB
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
/// <reference path="utils.ts"/>
/// <reference path="interfaces.ts"/>
/// <reference path="fair-value.ts"/>
import Utils = require("./utils");
import Interfaces = require("./interfaces");
import FairValue = require("./fair-value");
import moment = require("moment");
export interface IComputeStatistics {
latest: number;
initialize(seedData: number[]): void;
addNewValue(value: number): number;
}
export class EwmaStatisticCalculator implements IComputeStatistics {
constructor(private _alpha: number) { }
public latest: number = null;
initialize(seedData: number[]) {
for (var i = 0; i < seedData.length; i++)
this.addNewValue(seedData[i]);
}
addNewValue(value: number): number {
this.latest = computeEwma(value, this.latest, this._alpha);
return this.latest;
}
}
export function computeEwma(newValue: number, previous: number, alpha: number): number {
if (previous !== null) {
return alpha * newValue + (1 - alpha) * previous;
}
return newValue;
}
export class EmptyEWMACalculator implements Interfaces.IEwmaCalculator {
constructor() { }
latest: number = null;
Updated = new Utils.Evt<any>();
}
export class ObservableEWMACalculator implements Interfaces.IEwmaCalculator {
private _log = Utils.log("ewma");
constructor(private _timeProvider: Utils.ITimeProvider, private _fv: FairValue.FairValueEngine, private _alpha?: number) {
this._alpha = _alpha || .095;
_timeProvider.setInterval(this.onTick, moment.duration(1, "minutes"));
this.onTick();
}
private onTick = () => {
var fv = this._fv.latestFairValue;
if (fv === null) {
this._log.info("Unable to compute EMWA value");
return;
}
var value = computeEwma(fv.price, this._latest, this._alpha);
this.setLatest(value);
};
private _latest: number = null;
public get latest() { return this._latest; }
private setLatest = (v: number) => {
if (Math.abs(v - this._latest) > 1e-3) {
this._latest = v;
this.Updated.trigger();
this._log.info("New EMWA value", this._latest);
}
};
Updated = new Utils.Evt<any>();
}