line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Math::Business::Stochastic; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
859
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
35
|
|
4
|
1
|
|
|
1
|
|
6
|
use warnings; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
29
|
|
5
|
1
|
|
|
1
|
|
967
|
use diagnostics; |
|
1
|
|
|
|
|
186619
|
|
|
1
|
|
|
|
|
13
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
our $VERSION = '0.03'; |
8
|
|
|
|
|
|
|
|
9
|
1
|
|
|
1
|
|
504
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
96
|
|
10
|
1
|
|
|
1
|
|
5
|
use List::Util qw(max min sum); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
1143
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
1; |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
sub new { |
15
|
1
|
|
|
1
|
0
|
421
|
bless { |
16
|
|
|
|
|
|
|
val => [], |
17
|
|
|
|
|
|
|
days => 0, |
18
|
|
|
|
|
|
|
}; |
19
|
|
|
|
|
|
|
} |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
sub set_days { |
22
|
1
|
|
|
1
|
0
|
2
|
my $this = shift; |
23
|
1
|
|
|
|
|
1
|
my ($k,$d,$sd) = @_; |
24
|
|
|
|
|
|
|
|
25
|
1
|
50
|
|
|
|
5
|
croak "k must be a positive non-zero integers" if int($k) <= 0; |
26
|
1
|
50
|
|
|
|
4
|
croak "d must be a positive non-zero integers" if int($d) <= 0; |
27
|
1
|
50
|
|
|
|
3
|
croak "sd must be a positive non-zero integers" if int($sd) <= 0; |
28
|
|
|
|
|
|
|
|
29
|
1
|
|
|
|
|
3
|
$this->{k} = int($k); |
30
|
1
|
|
|
|
|
1
|
$this->{d} = int($d); |
31
|
1
|
|
|
|
|
3
|
$this->{sd} = int($sd); |
32
|
1
|
|
|
|
|
3
|
$this->{days} = int($k) + int($d) + int($sd) - 2; |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
|
35
|
23
|
|
|
23
|
0
|
282
|
sub query_k { my $this = shift; return $this->{cur_k}; } |
|
23
|
|
|
|
|
112
|
|
36
|
23
|
|
|
23
|
0
|
7722
|
sub query_d { my $this = shift; return $this->{cur_d}; } |
|
23
|
|
|
|
|
102
|
|
37
|
23
|
|
|
23
|
0
|
7175
|
sub query_sd { my $this = shift; return $this->{cur_sd}; } |
|
23
|
|
|
|
|
106
|
|
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
sub insert { |
40
|
22
|
|
|
22
|
0
|
6607
|
my $this = shift; |
41
|
22
|
|
|
|
|
40
|
my ($high,$low,$close) = @_; |
42
|
|
|
|
|
|
|
|
43
|
22
|
50
|
|
|
|
61
|
croak "You must set the number of days before you try to insert" if not $this->{days}; |
44
|
22
|
50
|
|
|
|
42
|
croak "You must specify the high,low,close values" unless defined $close; |
45
|
22
|
50
|
|
|
|
55
|
croak "High value must be higher than low value" unless $high >= $low; |
46
|
22
|
50
|
|
|
|
47
|
croak "Low value must be lower than close value" unless $low <= $close; |
47
|
22
|
50
|
|
|
|
43
|
croak "High value must be higher than close value" unless $high >= $close; |
48
|
|
|
|
|
|
|
|
49
|
22
|
|
|
|
|
23
|
push @{ $this->{val_high} }, $high; |
|
22
|
|
|
|
|
53
|
|
50
|
22
|
|
|
|
|
27
|
push @{ $this->{val_low} }, $low; |
|
22
|
|
|
|
|
44
|
|
51
|
22
|
|
|
|
|
27
|
push @{ $this->{val} }, $close; |
|
22
|
|
|
|
|
39
|
|
52
|
|
|
|
|
|
|
|
53
|
22
|
|
|
|
|
47
|
$this->recalc; |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
sub start_with { |
57
|
0
|
|
|
0
|
0
|
0
|
my $this = shift; |
58
|
0
|
|
|
|
|
0
|
$this->{val_high} = shift; |
59
|
0
|
|
|
|
|
0
|
$this->{val_low} = shift; |
60
|
0
|
|
|
|
|
0
|
$this->{val} = shift; |
61
|
|
|
|
|
|
|
|
62
|
0
|
0
|
|
|
|
0
|
croak "bad arg to start_with" unless ref($this->{val_high}) eq "ARRAY"; |
63
|
0
|
0
|
|
|
|
0
|
croak "bad arg to start_with" unless ref($this->{val_low}) eq "ARRAY"; |
64
|
0
|
0
|
|
|
|
0
|
croak "bad arg to start_with" unless ref($this->{val}) eq "ARRAY"; |
65
|
0
|
0
|
|
|
|
0
|
croak "bad arg to start_with" unless @{$this->{val_high}} == @{$this->{val}}; |
|
0
|
|
|
|
|
0
|
|
|
0
|
|
|
|
|
0
|
|
66
|
0
|
0
|
|
|
|
0
|
croak "bad arg to start_with" unless @{$this->{val_low}} == @{$this->{val}}; |
|
0
|
|
|
|
|
0
|
|
|
0
|
|
|
|
|
0
|
|
67
|
|
|
|
|
|
|
|
68
|
0
|
|
|
|
|
0
|
$this->recalc; |
69
|
|
|
|
|
|
|
} |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
sub recalc { |
72
|
22
|
|
|
22
|
0
|
28
|
my $this = shift; |
73
|
|
|
|
|
|
|
|
74
|
22
|
|
|
|
|
24
|
shift @{ $this->{val_high} } while @{ $this->{val_high} } > $this->{days}; |
|
35
|
|
|
|
|
92
|
|
|
13
|
|
|
|
|
30
|
|
75
|
22
|
|
|
|
|
27
|
shift @{ $this->{val_low} } while @{ $this->{val_low} } > $this->{days}; |
|
35
|
|
|
|
|
92
|
|
|
13
|
|
|
|
|
26
|
|
76
|
22
|
|
|
|
|
25
|
shift @{ $this->{val} } while @{ $this->{val} } > $this->{days}; |
|
35
|
|
|
|
|
86
|
|
|
13
|
|
|
|
|
27
|
|
77
|
|
|
|
|
|
|
|
78
|
22
|
100
|
|
|
|
27
|
if( $this->{k} <= @{ $this->{val} } ) { |
|
22
|
|
|
|
|
55
|
|
79
|
18
|
|
|
|
|
19
|
push @{ $this->{val_max} }, max( picklast($this->{k},@{$this->{val_high}}) ); |
|
18
|
|
|
|
|
37
|
|
|
18
|
|
|
|
|
46
|
|
80
|
18
|
|
|
|
|
28
|
push @{ $this->{val_min} }, min( picklast($this->{k},@{$this->{val_low}}) ); |
|
18
|
|
|
|
|
35
|
|
|
18
|
|
|
|
|
42
|
|
81
|
18
|
|
|
|
|
26
|
push @{ $this->{val_close_minus_min} }, $this->{val}->[-1] - $this->{val_min}->[-1]; |
|
18
|
|
|
|
|
47
|
|
82
|
18
|
|
|
|
|
22
|
push @{ $this->{val_max_minus_min} }, $this->{val_max}->[-1] - $this->{val_min}->[-1]; |
|
18
|
|
|
|
|
40
|
|
83
|
18
|
|
|
|
|
20
|
shift @{ $this->{val_max} } while @{ $this->{val_max} } > $this->{k}; |
|
31
|
|
|
|
|
82
|
|
|
13
|
|
|
|
|
23
|
|
84
|
18
|
|
|
|
|
18
|
shift @{ $this->{val_min} } while @{ $this->{val_min} } > $this->{k}; |
|
31
|
|
|
|
|
71
|
|
|
13
|
|
|
|
|
26
|
|
85
|
18
|
|
|
|
|
19
|
shift @{ $this->{val_close_minus_min} } while @{ $this->{val_close_minus_min} } > $this->{k}; |
|
31
|
|
|
|
|
72
|
|
|
13
|
|
|
|
|
25
|
|
86
|
18
|
|
|
|
|
19
|
shift @{ $this->{val_max_minus_min} } while @{ $this->{val_max_minus_min} } > $this->{k}; |
|
31
|
|
|
|
|
74
|
|
|
13
|
|
|
|
|
19
|
|
87
|
|
|
|
|
|
|
} |
88
|
22
|
100
|
|
|
|
41
|
if( $this->{k}+$this->{d}-1 <= @{ $this->{val} } ) { |
|
22
|
|
|
|
|
51
|
|
89
|
16
|
|
|
|
|
19
|
push @{ $this->{val_d} }, sum(picklast($this->{d},@{$this->{val_close_minus_min}})) / sum(picklast($this->{d},@{$this->{val_max_minus_min}})) * 100; |
|
16
|
|
|
|
|
31
|
|
|
16
|
|
|
|
|
33
|
|
|
16
|
|
|
|
|
36
|
|
90
|
16
|
|
|
|
|
27
|
shift @{ $this->{val_d} } while @{ $this->{val_d} } > $this->{sd}; |
|
29
|
|
|
|
|
75
|
|
|
13
|
|
|
|
|
25
|
|
91
|
|
|
|
|
|
|
} |
92
|
|
|
|
|
|
|
|
93
|
22
|
50
|
66
|
|
|
109
|
if( not defined $this->{val_max_minus_min}->[-1] or $this->{val_max_minus_min}->[-1] > 0 ) { |
94
|
22
|
100
|
|
|
|
25
|
if( @{ $this->{val} } == $this->{days} ) { |
|
22
|
100
|
|
|
|
53
|
|
|
8
|
100
|
|
|
|
45
|
|
95
|
14
|
|
|
|
|
42
|
$this->{cur_k} = ($this->{val}->[-1] - $this->{val_min}->[-1]) / ($this->{val_max_minus_min}->[-1]) * 100; |
96
|
14
|
|
|
|
|
20
|
$this->{cur_d} = $this->{val_d}->[-1]; |
97
|
14
|
|
|
|
|
22
|
$this->{cur_sd} = sum(picklast($this->{sd},@{$this->{val_d}})) / $this->{sd}; |
|
14
|
|
|
|
|
34
|
|
98
|
|
|
|
|
|
|
} |
99
|
6
|
|
|
|
|
19
|
elsif( @{ $this->{val} } >= $this->{days} - $this->{sd} + 1 ) { |
100
|
2
|
|
|
|
|
7
|
$this->{cur_k} = ($this->{val}->[-1] - $this->{val_min}->[-1]) / ($this->{val_max_minus_min}->[-1]) * 100; |
101
|
2
|
|
|
|
|
6
|
$this->{cur_d} = $this->{val_d}->[-1]; |
102
|
2
|
|
|
|
|
7
|
$this->{cur_sd} = undef; |
103
|
|
|
|
|
|
|
} |
104
|
|
|
|
|
|
|
elsif( @{ $this->{val} } >= $this->{days} - $this->{sd} - $this->{d} + 2 ) { |
105
|
2
|
|
|
|
|
8
|
$this->{cur_k} = ($this->{val}->[-1] - $this->{val_min}->[-1]) / ($this->{val_max_minus_min}->[-1]) * 100; |
106
|
2
|
|
|
|
|
3
|
$this->{cur_d} = undef; |
107
|
2
|
|
|
|
|
6
|
$this->{cur_sd} = undef; |
108
|
|
|
|
|
|
|
} |
109
|
|
|
|
|
|
|
else { |
110
|
4
|
|
|
|
|
6
|
$this->{cur_k} = undef; |
111
|
4
|
|
|
|
|
7
|
$this->{cur_d} = undef; |
112
|
4
|
|
|
|
|
11
|
$this->{cur_sd} = undef; |
113
|
|
|
|
|
|
|
} |
114
|
|
|
|
|
|
|
} |
115
|
|
|
|
|
|
|
else { |
116
|
0
|
|
|
|
|
0
|
$this->{cur_k} = undef; |
117
|
0
|
|
|
|
|
0
|
$this->{cur_d} = undef; |
118
|
0
|
|
|
|
|
0
|
$this->{cur_sd} = undef; |
119
|
|
|
|
|
|
|
} |
120
|
|
|
|
|
|
|
} |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
sub picklast { |
123
|
82
|
|
|
82
|
0
|
103
|
my $n = int(shift); |
124
|
82
|
|
|
|
|
332
|
return splice @_,-$n; |
125
|
|
|
|
|
|
|
} |
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
__END__ |