[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GT] SVN Commit r565 - trunk/GT/Indicators
Author: ras
Date: 2008-03-12 06:42:15 +0100 (Wed, 12 Mar 2008)
New Revision: 565
Added:
trunk/GT/Indicators/Test.pm
Log:
test rig to help validate indicators
usage instructions in the pod and comments
Added: trunk/GT/Indicators/Test.pm
===================================================================
--- trunk/GT/Indicators/Test.pm (rev 0)
+++ trunk/GT/Indicators/Test.pm 2008-03-12 05:42:15 UTC (rev 565)
@@ -0,0 +1,129 @@
+package GT::Indicators::Test;
+
+# Copyright 2008 Thomas Weigert
+# Based on and for GeniusTrader (C) 2000-2002 Rapha�Hertzog, Fabien Fulhaber
+# This file is distributed under the terms of the General Public License
+# version 2 or (at your option) any later version.
+
+# initial version 29 feb 08
+# $Id: Test.pm,v 1.1 2008/03/01 04:08:16 ras Exp ras $
+
+use strict;
+use vars qw(@ISA @NAMES @DEFAULT_ARGS);
+
+use GT::Indicators;
+use GT::Prices;
+
+
AT
ISA = qw(GT::Indicators);
+
AT
NAMES = ("Test[#1,#2,#3,#4]","CM[#1]");
+
AT
DEFAULT_ARGS = (5, 3, 3, "EMA", "Generic::MinInPeriod", "{I:Prices CLOSE}" );
+
+=pod
+
+=item Instructions:
+
+This indicator functions as a test rig to ensure that another indicator
+is robust in the presence of complex embedding into other indicators.
+
+It is not generic, unfortunately, but tests indicators only with respect
+to their first argument.
+
+Use it as follows:
+
+ ./display_indicator.pl --start=2000-06-16 --end=2000-06-29 \
+ I:Test 13000 60 60 60 SMA Generic::MaxInPeriod
+
+This will test the SMA; the second indicator Generic::MaxInPeriod is only
+there to add complexity. It defaults to Generic::MinInPeriod.
+
+This test will do the following:
+
+1. Apply Arg5 to Arg6, using Arg1 as parameter (by default:
+ {I:Generic:MinInPeriod 5 {I:Prices CLOSE}}
+2. Smooth the result by Arg4, using Arg2 as parameter (by default:
+ {I:EMA 3 ...}
+3. Smooth the result by Arg4, using Arg3 as parameter (by default:
+ {I:EMA 3 ...}
+
+The first output is the result (3), the second output is the result (1).
+
+=cut
+
+
+sub initialize {
+ my $self = shift;
+
+ my $ind1 = $self->{'args'}->get_arg_names(4);
+ my $ind2 = $self->{'args'}->get_arg_names(5);
+ eval "use GT::Indicators::$ind1;\n";
+ eval "use GT::Indicators::$ind2;\n";
+
+ # We need to call MIN and MAX first
+ my $min = "\$self->{'min'} = GT::Indicators::$ind2->new([ \$self->{'args'}->get_arg_names(1), \$self->{'args'}->get_arg_names(6) ]);";
+ eval $min;
+
+
+ # Initialize smoothing of CM
+ my $smoothing = "\$self->{'smooth_cm'} = GT::Indicators::$ind1->new([ \$self->{'args'}->get_arg_names(3), \"{I:$ind1 \" . \$self->{'args'}->get_arg_names(2) . \"{I:Generic:ByName \" . \$self->get_name(1) . \"}}\" ])";
+ eval $smoothing;
+
+
+ # Smoothing functions are args 2 and 3
+ my $nb_days = $self->{'args'}->get_arg_names(2)+$self->{'args'}->get_arg_names(3);
+
+ $self->add_indicator_dependency($self->{'min'}, $nb_days+1);
+ $self->add_arg_dependency(6, $nb_days + $self->{'args'}->get_arg_constant(1));
+
+
+}
+
+=pod
+
+=head2 GT::Indicators::Test::calculate($calc, $day)
+
+=cut
+
+sub calculate {
+ my ($self, $calc, $i) = @_;
+ my $indic = $calc->indicators;
+ my $prices = $calc->prices;
+ my $min_name = $self->{'min'}->get_name;
+ my $name = $self->get_name(0);
+ my $cm_name = $self->get_name(1);
+
+ return if ($indic->is_available($cm_name, $i) &&
+ $indic->is_available($name, $i));
+
+
+ # Smoothing functions are args 2
+ my $nb_days = $self->{'args'}->get_arg_values($calc, $i, 2)+$self->{'args'}->get_arg_values($calc, $i, 3);
+
+ return if (! $self->check_dependencies($calc, $i));
+
+ # Calculate CM
+ for (my $n = 0; $n < $nb_days; $n++) {
+
+ # Return if CM is available
+ next if $indic->is_available($cm_name, $i - $n);
+
+ # Get MIN and MAX
+ my $lowest_low = $indic->get($min_name, $i - $n);
+
+ # Calculate CM
+ my $cm_value = $lowest_low;
+
+ # Return the results
+ $indic->set($cm_name, $i - $n, $cm_value);
+
+ }
+
+
+ $self->{'smooth_cm'}->calculate($calc, $i);
+ my $s2 = $indic->get($self->{'smooth_cm'}->get_name, $i);
+ $indic->set($name, $i, $s2);
+
+
+}
+
+
+1;