[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GT] SVN Commit r595 - trunk/Scripts



Author: thomas
Date: 2008-03-30 06:09:02 +0200 (Sun, 30 Mar 2008)
New Revision: 595

Modified:
   trunk/Scripts/backtest.pl
   trunk/Scripts/backtest_many.pl
   trunk/Scripts/display_indicator.pl
   trunk/Scripts/display_signal.pl
   trunk/Scripts/graphic.pl
   trunk/Scripts/scan.pl
Log:
Use find_calculator to set up framework. Leave inconsistencies in data handling between scripts in place.

Modified: trunk/Scripts/backtest.pl
===================================================================
--- trunk/Scripts/backtest.pl	2008-03-30 04:07:51 UTC (rev 594)
+++ trunk/Scripts/backtest.pl	2008-03-30 04:09:02 UTC (rev 595)
@@ -19,7 +19,7 @@
 use Getopt::Long;
 use GT::Conf;
 use GT::DateTime;
-use GT::Tools qw(:conf);
+use GT::Tools qw(:conf :timeframe);
 use GT::Graphics::DataSource::PortfolioEvaluation;
 use GT::Graphics::Driver;
 use GT::Graphics::Object;
@@ -120,7 +120,7 @@
 
 =item
 
-./backtest.pl --close-strategy="Systems::TFS" --close-strategy="Stop::Fixed 6" --money-management="VAR" --money-management="SizeLimit" --system="TFS" --broker="SelfTrade Int�al" 13000
+./backtest.pl --close-strategy="Systems::TFS" --close-strategy="Stop::Fixed 6" --money-management="VAR" --money-management="OrderSizeLimit" --system="TFS" --broker="SelfTrade Int�al" 13000
 
 =back
 
@@ -128,7 +128,7 @@
 
 # Manage options
 my ($full, $verbose, $html, $display_trades, $template, $graph_file, $ofname, $broker, $system, $timeframe, $start, $end, $store_file) = 
-   (0, 0, 0, 0, '', '', '', '', '', '', '', '', '');
+   (0, 0, 0, 0, '', '', '', '', '', 'day', '', '', '');
 my (@mmname, @tfname, @csname);
 GetOptions('full!' => \$full, 'verbose!' => \$verbose, 'html!' => \$html,
 	   'template=s' => \$template, 'display-trades!' => \$display_trades,
@@ -201,36 +201,11 @@
 if (! $code) {
     die "You must give a symbol for the simulation.\n";
 }
-my $q = $db->get_prices($code);
-#$db->disconnect;
 
-my $calc = GT::Calculator->new($q);
-$calc->set_code($code);
+$timeframe = GT::DateTime::name_to_timeframe($timeframe);
 
-if ($timeframe)
-{
-    if (! $calc->set_current_timeframe(
-	    GT::DateTime::name_to_timeframe($timeframe)))
-    {
-	die "Can't create � $timeframe � timeframe ...\n";
-    }
-}
+my ($calc, $first, $last) = find_calculator($code, $timeframe, $full, $start, $end);
 
-my $c = $calc->prices->count;
-my $last = $c - 1;
-my $first = $c - 2 * GT::DateTime::timeframe_ratio($YEAR, 
-						   $calc->current_timeframe);
-$first = 0 if ($full);
-$first = 0 if ($first < 0);
-if ($start) {
-    my $date = $calc->prices->find_nearest_following_date($start);
-    $first = $calc->prices->date($date);
-}
-if ($end) {
-    my $date = $calc->prices->find_nearest_preceding_date($end);
-    $last = $calc->prices->date($date);
-}
-
 # The real work happens here
 my $analysis = backtest_single($pf_manager, $sys_manager, $broker, $calc, $first, $last);
 
@@ -265,7 +240,7 @@
     my $axis_h = GT::Graphics::Axis->new($scale);
     my $axis_v = GT::Graphics::Axis->new($scale);
     $axis_h->set_custom_big_ticks(build_axis_for_interval(union_range($graph_ds->get_value_range, $graph_ds2->get_value_range), 0, 1));
-    $axis_v->set_custom_big_ticks(build_axis_for_timeframe($q, $YEAR, 1, 1), 1);
+    $axis_v->set_custom_big_ticks(build_axis_for_timeframe($calc->prices(), $YEAR, 1, 1), 1);
     $zone->set_axis_left($axis_h);
     $zone->set_axis_bottom($axis_v);
     my $graphic = GT::Graphics::Graphic->new($zone);

Modified: trunk/Scripts/backtest_many.pl
===================================================================
--- trunk/Scripts/backtest_many.pl	2008-03-30 04:07:51 UTC (rev 594)
+++ trunk/Scripts/backtest_many.pl	2008-03-30 04:09:02 UTC (rev 595)
@@ -152,33 +152,8 @@
 	next;
     }
     my $code = $list->get($d);
+    my ($calc, $first, $last) = find_calculator($code, $timeframe, $full, $start, $end);
 
-    my $db = create_standard_object("DB::" . GT::Conf::get("DB::module"));
-    my $q = $db->get_prices($code);
-    my $calc = GT::Calculator->new($q);
-    $calc->set_code($code);
-
-    if ($timeframe)
-    {
-	$calc->set_current_timeframe(
-	            GT::DateTime::name_to_timeframe($timeframe));
-    }
-
-    my $c = $calc->prices->count;
-    my $last = $c - 1;
-    my $first = $c - 2 * GT::DateTime::timeframe_ratio($YEAR,
-					       $calc->current_timeframe);
-    $first = 0 if ($full);
-    $first = 0 if ($first < 0);
-    if ($start) {
-	my $date = $calc->prices->find_nearest_following_date($start);
-	$first = $calc->prices->date($date);
-    }
-    if ($end) {
-	my $date = $calc->prices->find_nearest_preceding_date($end);
-	$last = $calc->prices->date($date);
-    }
-
     # Fork a process to avoid memory consumption
     foreach (@desc_systems)
     {
@@ -211,7 +186,6 @@
 	$bkt_spool->sync();
     }
 
-    $db->disconnect;
     # Close the child 
     exit 0;
 }

Modified: trunk/Scripts/display_indicator.pl
===================================================================
--- trunk/Scripts/display_indicator.pl	2008-03-30 04:07:51 UTC (rev 594)
+++ trunk/Scripts/display_indicator.pl	2008-03-30 04:09:02 UTC (rev 595)
@@ -75,27 +75,11 @@
 					@ARGV);
 
 # Il faut cr� tout le framework
-my $db = create_standard_object("DB::" . GT::Conf::get("DB::module"));
 my $indicator_name = $indicator->get_name;
-my ($q, $calc) = get_timeframe_data($code, $timeframe, $db, $nb_item);
+my ($calc, $first, $last) = find_calculator($code, $timeframe, $full, $start, $end, 200, $nb_item);
+# NOTE: above does not handle $last_record
+# $first = $last if ($last_record);
 
-my $last = $q->count() - 1;
-my $first = $last - 200;
-
-$first = 0 if ($full);
-$first = $last if ($last_record);
-$first = 0 if ($first < 0);
-
-if ($start) {
-    my $date = $calc->prices->find_nearest_following_date($start);
-    $first = $calc->prices->date($date);
-}
-if ($end) {
-    my $date = $calc->prices->find_nearest_preceding_date($end);
-    $last = $calc->prices->date($date);
-}
-
-
 # Au boulot
 print "Calculating indicator $indicator_name ...\n";
 $indicator->calculate_interval($calc, $first, $last);
@@ -109,14 +93,12 @@
 	if ($calc->indicators->is_available($name, $i)) {
 	    my $value = $calc->indicators->get($name, $i);
 	    if ($value =~ /^\d+(?:\.\d+)?$/) {
-		printf "%-20s[%s] = %.4f\n", $name, $q->at($i)->[$DATE], $value;
+		printf "%-20s[%s] = %.4f\n", $name, $calc->prices->at($i)->[$DATE], $value;
 	    } else {
-		printf "%-20s[%s] = %s\n", $name, $q->at($i)->[$DATE], $value;
+		printf "%-20s[%s] = %s\n", $name, $calc->prices->at($i)->[$DATE], $value;
 	    }
 		    
 	}
     }
 }
 
-$db->disconnect;
-

Modified: trunk/Scripts/display_signal.pl
===================================================================
--- trunk/Scripts/display_signal.pl	2008-03-30 04:07:51 UTC (rev 594)
+++ trunk/Scripts/display_signal.pl	2008-03-30 04:09:02 UTC (rev 595)
@@ -101,13 +101,6 @@
            "change!" => \$change,
           );
 my $timeframe = GT::DateTime::name_to_timeframe($tf);
-if (!defined($timeframe)) {
-	my $msg = "Unkown timeframe: $tf\nAvailable timeframes are:\n";
-	foreach (GT::DateTime::list_of_timeframe()) {
-		$msg .= '\t'.GT::DateTime::name_of_timeframe($_) . '\n';
-	}
-	die($msg);
-}
 
 # Create the signal according to the arguments
 my $signal_module = shift || pod2usage(verbose => 1);
@@ -121,39 +114,9 @@
 }
 
 my $signal = create_standard_object($signal_module, @ARGV);
-
-# Create the complete framework
-my $db = create_standard_object('DB::' . GT::Conf::get('DB::module'));
 my $signal_name = $signal->get_name;
-my ($q, $calc) = get_timeframe_data($code, $timeframe, $db);
-my $last = $q->count() - 1;
-my $first = $last - 200;
+my ($calc, $first, $last) = find_calculator($code, $timeframe, $full, $start, $end, 200);
 
-$first = 0 if ($full);
-$first = 0 if ($first < 0);
-
-# very rudimentary date format check
-my $dash_count;
-
-if ($start) {
-    $_ = $start;
-    print STDERR "\nthe only date format that i like is YYYY-MM-DD,\n"
-               . "i don't think --start=$start is going to do what you expect\n"
-      if ( ( $dash_count = $_ =~ tr/-//d ) != 2 );
-    my $date = $calc->prices->find_nearest_following_date($start);
-    $first = $calc->prices->date($date);
-}
-if ($end) {
-    $_ = $end;
-    print STDERR "\nthe only date format that i like is YYYY-MM-DD,\n"
-               . "i don't think --end=$end is going to do what you expect\n"
-      if ( ( $dash_count = $_ =~ tr/-//d ) != 2 );
-    my $date = $calc->prices->find_nearest_preceding_date($end);
-    $last = $calc->prices->date($date);
-}
-
-#print STDERR "first $first, last $last\n";
-#exit;
 print "\t$signal_module\n";
 # Launching the signal
 print "Testing signal $signal_name ...\n";
@@ -168,18 +131,18 @@
 
         if ($calc->signals->is_available($name, $i)) {
           if ( ! $change ) {
-            printf "%-20s[%s] = %s\n", $name, $q->at($i)->[$DATE],
+            printf "%-20s[%s] = %s\n", $name, $calc->prices->at($i)->[$DATE],
                     ($calc->signals->get($name, $i) ? 'yes' : 'no');
           }else{
             # show only changes from prior
             my $state = $calc->signals->get($name, $i);
 
             if ( ! defined ( $prior_state ) ) {
-              printf "%-20s[%s] = %s\n", $name, $q->at($i)->[$DATE],
+              printf "%-20s[%s] = %s\n", $name, $calc->prices->at($i)->[$DATE],
                ($state ? 'yes' : 'no');
             } else {
               if ( $prior_state != $state ) {
-                printf "%-20s[%s] = %s\n", $name, $q->at($i)->[$DATE],
+                printf "%-20s[%s] = %s\n", $name, $calc->prices->at($i)->[$DATE],
                  ($state ? 'yes' : 'no');
               }
             }
@@ -189,4 +152,3 @@
     }
 }
 
-$db->disconnect;

Modified: trunk/Scripts/graphic.pl
===================================================================
--- trunk/Scripts/graphic.pl	2008-03-30 04:07:51 UTC (rev 594)
+++ trunk/Scripts/graphic.pl	2008-03-30 04:09:02 UTC (rev 595)
@@ -204,6 +204,11 @@
 
 The end date used to plot the graphic. This option overrides the --nb-item option.
 
+=item --full
+
+Plot all available periods. This option overides the options --nb-item,
+--start, and --end.
+
 =item --type=candle|candlevol|candlevolplace|barchart|line|none
 
 The type of graphic to plot. none causes the price not to be displayed, however, overlays
@@ -227,7 +232,7 @@
 =cut
 
 my $tf = 'day';
-my $nb_item = 120;
+my $nb_item;
 my ($start, $end) = ("", "");
 my ($width, $height) = ("", "200");
 my $type = "candle";
@@ -275,35 +280,8 @@
 
 pod2usage( -verbose => 2) if ($man);
 my $code = shift || pod2usage(1);
-my $db = create_standard_object("DB::" . GT::Conf::get("DB::module"));
 my $timeframe = GT::DateTime::name_to_timeframe($tf);
-if (!defined($timeframe)) {
-	my $msg = "Unkown timeframe: $tf\nAvailable timeframes are:\n";
-	foreach (GT::DateTime::list_of_timeframe()) {
-		$msg .= "\t".GT::DateTime::name_of_timeframe($_) . "\n";
-	}
-	die($msg);
-}
-
-my ($q, $calc) = get_timeframe_data($code, $timeframe, $db, $max_loaded_items);
-
-my ($first, $last) = ($q->count() - $nb_item, $q->count() - 1);
-$first = 0 if ($first < 0);
-
-if ($start) {
-    $first = $q->date($q->find_nearest_following_date($start));
-    $first = 0 if (! defined($first));
-    $last = $first + $nb_item - 1;
-    $last = $q->count() - 1 if ($last >= $q->count());
-}
-if ($end) {
-    $last = $q->date($q->find_nearest_preceding_date($end));
-    $last = $q->count() - 1 if (! defined($last));
-    if (!$start) {
-        $first = $last - $nb_item + 1;
-        $first = 0 if $first < 0;
-    }
-}
+my ($calc, $first, $last) = find_calculator($code, $timeframe, 0, $start, $end, $nb_item, $max_loaded_items);
 $nb_item = $last - $first + 1;
 
 GT::Conf::default("Graphics::Driver", "GD");
@@ -327,8 +305,8 @@
 $zone->add_subzone(0, $y_zone++, $z_m);
 
 my $graphic = GT::Graphics::Graphic->new($zone);
+my $q = $calc->prices();
 
-
 if ($volume and ($type ne "none")) {
     my $z_v = GT::Graphics::Zone->new($width, $vheight);
     $zone->add_subzone(0, $y_zone++, $z_v);
@@ -357,12 +335,12 @@
 
 $zone->set_border_width(1);
 if ($title) { 
-    my $longname = $db->get_name($code);
+    my $longname = get_long_name($code);
     $title =~ s/%c/$code/;
     $title =~ s/%n/$longname/;
     $zone->set_title_top($title);
 } else {
-    my $longname = $db->get_name($code);
+    my $longname = get_long_name($code);
     if ($longname) {
 	$zone->set_title_top("$longname - $code");
     } else {
@@ -406,13 +384,13 @@
     my $space = $scale_m->convert_to_x_coordinate(
 	    int(GT::DateTime::timeframe_ratio($MONTH, $timeframe))
 	) - $scale_m->convert_to_x_coordinate(0);
-    if ($space <= 5) {
+    if ($space <= 10) {
 	$axis2->set_custom_big_ticks(
-		build_axis_for_timeframe($q, $YEAR, 1, 1), 1
+		build_axis_for_timeframe($q, $YEAR, 1, 1, $space * 12), 1
 	    );
     } else {
 	$axis2->set_custom_big_ticks(
-		build_axis_for_timeframe($q, $MONTH, 1, 1), 1
+		build_axis_for_timeframe($q, $MONTH, 1, 1, $space), 1
 	    );
 	$axis2->set_custom_ticks(build_axis_for_timeframe($q, $WEEK, 0), 1);
     }
@@ -422,11 +400,11 @@
 	) - $scale_m->convert_to_x_coordinate(0);
     if ($space <= 5) {
 	$axis2->set_custom_big_ticks(
-		build_axis_for_timeframe($q, $YEAR, 1, 1), 1
+		build_axis_for_timeframe($q, $YEAR, 1, 1, $space * 20), 1
 	    );
     } else {
 	$axis2->set_custom_big_ticks(
-		build_axis_for_timeframe($q, $MONTH, 1, 1), 1
+		build_axis_for_timeframe($q, $MONTH, 1, 1, $space), 1
 	    );
     }
     #$axis2->set_custom_ticks(build_axis_for_timeframe($q, $WEEK, 0), 1);
@@ -721,8 +699,6 @@
 $graphic->display($driver, $picture);
 $driver->dump($picture);
 
-$db->disconnect;
-
 # This functions get in input a string like "Object(arg1,arg2,Arg3)"
 # where each arg may itself be an Object with its own argument. It
 # returns the object name followed by all the arguments.

Modified: trunk/Scripts/scan.pl
===================================================================
--- trunk/Scripts/scan.pl	2008-03-30 04:07:51 UTC (rev 594)
+++ trunk/Scripts/scan.pl	2008-03-30 04:09:02 UTC (rev 595)
@@ -412,34 +412,8 @@
     }
     my $code = $list->get($d);
 
-    my $db = create_standard_object("DB::" . GT::Conf::get("DB::module"));
-    my $q = $db->get_prices($code);
-    my $calc = GT::Calculator->new($q);
-    $calc->set_code($code);
+    my ($calc, $first, $last) = find_calculator($code, $timeframe, 0, $start, $end);
 
-    if ($timeframe)
-    {
-	$calc->set_current_timeframe(
-	            GT::DateTime::name_to_timeframe($timeframe));
-    }
-
-    my $c = $calc->prices->count;
-    my $last = $c - 1;
-    my $first = $c - 2 * GT::DateTime::timeframe_ratio($YEAR,
-					       $calc->current_timeframe);
-    $first = 0 if ($full);
-    $first = 0 if ($first < 0);
-
-    if ($start) {
-	my $ndate = $calc->prices->find_nearest_following_date($start);
-	$first = $calc->prices->date($ndate);
-    }
-
-    if ($end) {
-	my $ndate = $calc->prices->find_nearest_preceding_date($end);
-	$last = $calc->prices->date($ndate);
-    }
-
     my $i;
     if ($calc->prices->has_date($date)) {
 	$i = $calc->prices->date($date);
@@ -477,8 +451,7 @@
 
     }
 
-    $db->disconnect;
-    # Close the child
+    # Close the child 
     exit 0;
 }