|
21 | 21 | from __future__ import (absolute_import, division, print_function, |
22 | 22 | unicode_literals) |
23 | 23 |
|
24 | | -from . import Indicator |
| 24 | +from . import PeriodN |
25 | 25 |
|
26 | | -__all__ = ['LaguerreRSI'] |
| 26 | +__all__ = ['LaguerreRSI', 'LRSI'] |
27 | 27 |
|
28 | | -class LaguerreRSI(Indicator): |
| 28 | + |
| 29 | +class LaguerreRSI(PeriodN): |
29 | 30 | alias = ('LRSI',) |
30 | 31 | lines = ('lrsi',) |
31 | | - params = (('gamma', 0.5),) |
| 32 | + params = ( |
| 33 | + ('gamma', 0.5), |
| 34 | + ('period', 6), |
| 35 | + ) |
32 | 36 |
|
33 | 37 | plotinfo = dict( |
34 | 38 | plotymargin=0.15, |
35 | 39 | plotyticks=[0.0, 0.2, 0.5, 0.8, 1.0] |
36 | 40 | ) |
37 | 41 |
|
38 | 42 | def __init__(self): |
39 | | - self.addminperiod(6) |
40 | | - self.l0 = [0, 0] |
41 | | - self.l1 = [0, 0] |
42 | | - self.l2 = [0, 0] |
43 | | - self.l3 = [0, 0] |
| 43 | + self.l0, self.l1, self.l2, self.l3 = 0.0, 0.0, 0.0, 0.0 |
44 | 44 |
|
45 | 45 | super(LaguerreRSI, self).__init__() |
46 | 46 |
|
47 | | - def next(self): |
48 | | - tp = (self.data.high + self.data.low) / 2 |
49 | | - self.l0.insert(0, ((1 - self.p.gamma) * tp + |
50 | | - self.p.gamma * self.l0[0])) |
51 | | - self.l1.insert(0, (-self.p.gamma * self.l0[0] + self.l0[1] + |
52 | | - self.p.gamma * self.l1[0])) |
53 | | - self.l2.insert(0, (-self.p.gamma * self.l1[0] + self.l1[1] + |
54 | | - self.p.gamma * self.l2[0])) |
55 | | - self.l3.insert(0, (-self.p.gamma * self.l2[0] + self.l2[1] + |
56 | | - self.p.gamma * self.l3[0])) |
57 | | - del self.l0[2:] |
58 | | - del self.l1[2:] |
59 | | - del self.l2[2:] |
60 | | - del self.l3[2:] |
| 47 | + def prenext(self): |
| 48 | + self.next(notpre=False) |
| 49 | + |
| 50 | + def next(self, notpre=True): |
| 51 | + tp_0 = (self.data.high + self.data.low) / 2 # price point |
| 52 | + l0_1 = self.l0 # cache previous intermediate values |
| 53 | + l1_1 = self.l1 |
| 54 | + l2_1 = self.l2 |
| 55 | + |
| 56 | + g = self.p.gamma # avoid more lookups |
| 57 | + self.l0 = l0 = (1 - g) * tp_0 + g * l0_1 * notpre # interm values |
| 58 | + self.l1 = l1 = -g * l0 + l0_1 + g * l1_1 * notpre |
| 59 | + self.l2 = l2 = -g * l1 + l1_1 + g * l2_1 * notpre |
| 60 | + self.l3 = l3 = -g * l2 + l2_1 + g * self.l3 * notpre |
61 | 61 |
|
62 | | - cd = 0 |
63 | | - cu = 0 |
64 | | - if self.l0[0] >= self.l1[0]: |
65 | | - cu = self.l0[0] - self.l1[0] |
| 62 | + cd = 0.0 |
| 63 | + cu = 0.0 |
| 64 | + if l0 >= l1: |
| 65 | + cu = l0 - 11 |
66 | 66 | else: |
67 | | - cd = self.l1[0] - self.l0[0] |
| 67 | + cd = l1 - l0 |
68 | 68 |
|
69 | | - if self.l1[0] >= self.l2[0]: |
70 | | - cu = cu + self.l1[0] - self.l2[0] |
| 69 | + if l1 >= l2: |
| 70 | + cu = cu + l1 - l2 |
71 | 71 | else: |
72 | | - cd = cd + self.l2[0] - self.l1[0] |
| 72 | + cd = cd + l2 - l1 |
73 | 73 |
|
74 | | - if self.l2[0] >= self.l3[0]: |
75 | | - cu = cu + self.l2[0] - self.l3[0] |
| 74 | + if l2 >= l3: |
| 75 | + cu = cu + l2 - l3 |
76 | 76 | else: |
77 | | - cd = cd + self.l3[0] - self.l2[0] |
| 77 | + cd = cd + l3 - l2 |
78 | 78 |
|
79 | | - self.lines.lrsi[0] = cu / (cu + cd) |
| 79 | + self.lines.lrsi[0] = cu / (cu + cd) # store line value |
0 commit comments