[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GT] SVN Commit r622 - trunk/GT/Indicators
Author: thomas
Date: 2008-04-27 00:04:45 +0200 (Sun, 27 Apr 2008)
New Revision: 622
Modified:
trunk/GT/Indicators/PERF.pm
Log:
Fixed I:PERF with respect to default handling and updated doc.
Modified: trunk/GT/Indicators/PERF.pm
===================================================================
--- trunk/GT/Indicators/PERF.pm 2008-04-26 15:26:51 UTC (rev 621)
+++ trunk/GT/Indicators/PERF.pm 2008-04-26 22:04:45 UTC (rev 622)
@@ -8,6 +8,7 @@
use vars qw(@ISA @NAMES @DEFAULT_ARGS);
use GT::Indicators;
+use GT::Tools;
use GT::Prices;
@ISA = qw(GT::Indicators);
@@ -16,10 +17,11 @@
=head1 GT::Indicators::PERF
-The performance indicator display a security's price performance from a reference day as a percentage.
+The performance indicator display a security's price performance from
+a reference day as a percentage. If the market is not available for
+the reference day, use nearest preceding day.
-If first parameter is omitted, uses the first price as a reference day.
-(Note: In this case, uses "0" in name of indicator.)
+Note: The day must be given in GT internal format and must match the timeframe.
Example :
GT::Indicators::PERF->new(["2001-09-22"]);
@@ -28,21 +30,37 @@
=head2 GT::Indicators::PERF::calculate($calc, $day)
=cut
+
sub calculate {
my ($self, $calc, $i) = @_;
- my $reference = $self->{'args'}->get_arg_constant(1);
my $indic = $calc->indicators;
my $prices = $calc->prices;
+
+ my $reference = $self->{'reference'};
+ unless ( defined $reference ) {
+
+ my $date = $self->{'args'}->get_arg_constant(1);
+ if ( $date ) {
+ $date = $prices->find_nearest_preceding_date($date);
+ $reference = $prices->date($date);
+ } else {
+ $reference = $i;
+ $date = $prices->at($i)->[$DATE];
+ my $name = $self->{'names'}->[0];
+ $name =~ s/PERF\[0,/PERF[$date,/o;
+ $self->{'names'}->[0] = $name;
+ }
+
+ $self->{'reference'} = $reference;
+
+ }
+
my $performance_name = $self->get_name(0);
return if ($indic->is_available($performance_name, $i));
- # Make sure we already have a reference date
- $reference = $prices->at(0)->[$DATE] if (!$reference);
- my $item = $prices->date($reference);
-
# Calculate the performance of a security from a reference day in percentage
- my $performance = ((($self->{'args'}->get_arg_values($calc, $i, 2) - $self->{'args'}->get_arg_values($calc, $item, 2)) / $self->{'args'}->get_arg_values($calc, $item, 2)) * 100);
+ my $performance = ((($self->{'args'}->get_arg_values($calc, $i, 2) - $self->{'args'}->get_arg_values($calc, $reference, 2)) / $self->{'args'}->get_arg_values($calc, $reference, 2)) * 100);
$indic->set($performance_name, $i, $performance);
}