[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;
 	}
     }