-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathmacdext.go
82 lines (67 loc) · 1.78 KB
/
macdext.go
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
package tart
// Refer to MACD.
// This is a general version of MACD with moving average types
// for fast, slow, and signal lines as paremters.
type MacdExt struct {
fastN int64
slowN int64
signalN int64
n int64
fast *Ma
slow *Ma
signal *Ma
sz int64
}
func NewMacdExt(fastT MaType, fastN int64, slowT MaType, slowN int64, signalT MaType, signalN int64) *MacdExt {
if slowN < fastN {
fastN, slowN = slowN, fastN
}
return &MacdExt{
fastN: fastN,
slowN: slowN,
signalN: signalN,
n: slowN - 1 + signalN,
fast: NewMa(fastT, fastN),
slow: NewMa(slowT, slowN),
signal: NewMa(signalT, signalN),
sz: 0,
}
}
func (m *MacdExt) Update(v float64) (float64, float64, float64) {
m.sz++
slow := m.slow.Update(v)
if m.sz <= m.slowN-m.fastN {
// align the first valid result for fast & slow EMA
return 0, 0, 0
}
fast := m.fast.Update(v)
macd := fast - slow
if m.sz < m.slowN {
// wait until fast and slow EMAs are valid before populating signal EMA
return 0, 0, 0
}
sig := m.signal.Update(macd)
if m.sz < m.n {
return 0, 0, 0
}
return macd, sig, macd - sig
}
func (m *MacdExt) InitPeriod() int64 {
return m.n - 1
}
func (m *MacdExt) Valid() bool {
return m.sz > m.InitPeriod()
}
// Refer to MACD.
// This is a general version of MACD with moving average types
// for fast, slow, and signal lines as paremters.
func MacdExtArr(in []float64, fastT MaType, fastN int64, slowT MaType, slowN int64, signalT MaType, signalN int64) ([]float64, []float64, []float64) {
macd := make([]float64, len(in))
signal := make([]float64, len(in))
hist := make([]float64, len(in))
m := NewMacdExt(fastT, fastN, slowT, slowN, signalT, signalN)
for i, v := range in {
macd[i], signal[i], hist[i] = m.Update(v)
}
return macd, signal, hist
}