[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GT] SVN Commit r707 - in branches/CPAN/lib/Finance/GeniusTrader: . DB
Author: clkao
Date: 2009-11-06 14:41:04 +0100 (Fri, 06 Nov 2009)
New Revision: 707
Modified:
branches/CPAN/lib/Finance/GeniusTrader/DB/Text.pm
branches/CPAN/lib/Finance/GeniusTrader/Prices.pm
Log:
Merge branch 'CPAN/topic/dbcache'
Modified: branches/CPAN/lib/Finance/GeniusTrader/DB/Text.pm
===================================================================
--- branches/CPAN/lib/Finance/GeniusTrader/DB/Text.pm 2009-11-06 13:40:02 UTC (rev 706)
+++ branches/CPAN/lib/Finance/GeniusTrader/DB/Text.pm 2009-11-06 13:41:04 UTC (rev 707)
@@ -5,7 +5,7 @@
# version 2 or (at your option) any later version.
# new version joao costa circa nov 07
-# $Id$
+# $Id: /mirror/geniustrader/trunk/GT/DB/Text.pm 11727 2008-06-10T04:43:34.636531Z thomas $
use strict;
our @ISA = qw(Finance::GeniusTrader::DB);
@@ -128,6 +128,7 @@
Finance::GeniusTrader::Conf::default('DB::Text::fields::high', '1');
Finance::GeniusTrader::Conf::default('DB::Text::fields::close', '3');
Finance::GeniusTrader::Conf::default('DB::Text::fields::volume', '4');
+ Finance::GeniusTrader::Conf::default('DB::Text::cache', '0');
$self->{'header_lines'} = Finance::GeniusTrader::Conf::get('DB::Text::header_lines');
$self->{'mark'} = Finance::GeniusTrader::Conf::get('DB::Text::marker');
@@ -139,6 +140,7 @@
$self->{'high'} = Finance::GeniusTrader::Conf::get('DB::Text::fields::high');
$self->{'close'} = Finance::GeniusTrader::Conf::get('DB::Text::fields::close');
$self->{'volume'} = Finance::GeniusTrader::Conf::get('DB::Text::fields::volume');
+ $self->{'use_cache'} = Finance::GeniusTrader::Conf::get('DB::Text::cache');
return bless $self, $class;
}
@@ -192,9 +194,23 @@
$extension =~ s/\$timeframe/$tfname/g;
my $file = $self->{'directory'} . "/$code" . $extension;
-
+ if ($self->{'use_cache'}) {
+ require Storable;
+ if (-f $file.".cache" && (stat($file.".cache"))[9] > (stat($file))[9]) {
+ my $cached = Storable::retrieve($file.".cache");
+ if (ref($cached) eq 'GT::Prices') {
+ bless $cached, 'Finance::GeniusTrader::Prices';
+ }
+ return $cached;
+ }
+ }
$prices->loadtxt($file, $self->{'mark'}, $self->{'date_format'},
$self->{'header_lines'}, %fields);
+
+ if ($self->{'use_cache'}) {
+ $prices->timestamp($_) for 0..$prices->count-1;
+ Storable::nstore($prices, $file.".cache");
+ }
return $prices;
}
Modified: branches/CPAN/lib/Finance/GeniusTrader/Prices.pm
===================================================================
--- branches/CPAN/lib/Finance/GeniusTrader/Prices.pm 2009-11-06 13:40:02 UTC (rev 706)
+++ branches/CPAN/lib/Finance/GeniusTrader/Prices.pm 2009-11-06 13:41:04 UTC (rev 707)
@@ -5,7 +5,7 @@
# version 2 or (at your option) any later version.
use strict;
-use vars qw(@ISA @EXPORT $FIRST $OPEN $HIGH $LOW $CLOSE $LAST $VOLUME $DATE);
+use vars qw(@ISA @EXPORT $FIRST $OPEN $HIGH $LOW $CLOSE $LAST $VOLUME $DATE $TIMESTAMP);
use Date::Calc qw(Decode_Date_US Decode_Date_EU Today);
#ALL# use Log::Log4perl qw(:easy);
@@ -21,6 +21,7 @@
$LAST = $CLOSE = 3;
$VOLUME = 4;
$DATE = 5;
+$TIMESTAMP = 6;
=head1 NAME
@@ -64,6 +65,12 @@
return $self->at($self->date($date));
}
+sub timestamp {
+ my ($self, $i) = @_;
+ return $self->{'prices'}[$i][$TIMESTAMP] ||=
+ Finance::GeniusTrader::DateTime::map_date_to_time($self->timeframe, $self->{'prices'}[$i][$DATE]);
+}
+
=item C<< $p->has_date('YYYY-MM-DD') >>
Return true if the object has prices for the corresponding date.
@@ -227,14 +234,13 @@
my $time = Finance::GeniusTrader::DateTime::map_date_to_time($self->timeframe, $date);
my $mindiff = $time;
my $mindate = '';
- foreach (@{$self->{'prices'}})
- {
- my $dtime = Finance::GeniusTrader::DateTime::map_date_to_time($self->timeframe, $_->[$DATE]);
+ for (my $i=0; $i < $self->count; ++$i) {
+ my $dtime = $self->timestamp($i);
my $diff = $dtime - $time;
next if ($diff < 0);
if ($diff < $mindiff)
{
- $mindate = $_->[$DATE];
+ $mindate = $self->at($i)->[$DATE];
$mindiff = $diff;
}
}
@@ -246,14 +252,13 @@
my $time = Finance::GeniusTrader::DateTime::map_date_to_time($self->timeframe, $date);
my $mindiff = $time;
my $mindate = '';
- foreach (@{$self->{'prices'}})
- {
- my $dtime = Finance::GeniusTrader::DateTime::map_date_to_time($self->timeframe, $_->[$DATE]);
+ for (my $i=0; $i < $self->count; ++$i) {
+ my $dtime = $self->timestamp($i);
my $diff = $time - $dtime;
next if ($diff < 0);
if ($diff < $mindiff)
{
- $mindate = $_->[$DATE];
+ $mindate = $self->at($i)->[$DATE];
$mindiff = $diff;
}
}
@@ -265,13 +270,12 @@
my $time = Finance::GeniusTrader::DateTime::map_date_to_time($self->timeframe, $date);
my $mindiff = $time;
my $mindate = '';
- foreach (@{$self->{'prices'}})
- {
- my $dtime = Finance::GeniusTrader::DateTime::map_date_to_time($self->timeframe, $_->[$DATE]);
+ for (my $i=0; $i < $self->count; ++$i) {
+ my $dtime = $self->timestamp($i);
my $diff = abs($time - $dtime);
if ($diff < $mindiff)
{
- $mindate = $_->[$DATE];
+ $mindate = $self->at($i)->[$DATE];
$mindiff = $diff;
}
}