Finance-Quant-Charter

 view release on metacpan or  search on metacpan

lib/Finance/Quant/Charter.pm  view on Meta::CPAN

		my $diffx = Finance::Quant::TA::diff($s, $diff); 
		
		
		$lines->[0] = {	name => "Diff($diff)", color => 'marine', data => $diffx };
		$lines->[1] = {	name => "MA($lag) (Moving Avg)", color => 'cyan', data => Finance::Quant::TA::ma($lines->[0]->{data}, $lag) };
		$s = Finance::Quant::TA::stdev($lines->[0]->{data}, $lag);
		$s = Finance::Quant::TA::nstdev_ma($s, $lines->[1]->{data}, 2);
		$lines->[2] = {	name => 'MA + 2 Std Dev', color => 'lred', data => $s->[0] };
		$lines->[3] = {	name => 'MA - 2 Std Dev', color => 'lred', data => $s->[1] };
		
		
		my(@ty,@tx);
		@ty =  @{$lines->[0]->{data}};
		
		@tx = @{$s->[1]};

        my $xdata = undef;		
         $xdata = plotlines($img, $stock, $q->{Date}, $lines, $y_format);		
		
		
		
		
		
		return $xdata;
	}
	
		sub diffcheck {
		my ($stock, $q, $lag, $diff) = @_;
		my $img = $stock . "diff.jpg";
		print "generating $img...\n";
		my ($s, $lines) = ([],[]);
		my $y_format = sub { sprintf "  %.2f", $_[0] };

		$s = Finance::Quant::TA::logs($q->{Close});
		
		my $diffx = Finance::Quant::TA::diff($s, $diff); 
		
		
		$lines->[0] = {	name => "Diff($diff)", color => 'marine', data => $diffx };
		$lines->[1] = {	name => "MA($lag) (Moving Avg)", color => 'cyan', data => Finance::Quant::TA::ma($lines->[0]->{data}, $lag) };
		$s = Finance::Quant::TA::stdev($lines->[0]->{data}, $lag);
		$s = Finance::Quant::TA::nstdev_ma($s, $lines->[1]->{data}, 2);
		$lines->[2] = {	name => 'MA + 2 Std Dev', color => 'lred', data => $s->[0] };
		$lines->[3] = {	name => 'MA - 2 Std Dev', color => 'lred', data => $s->[1] };
		
		
		my(@ty,@tx);
		@ty =  @{$lines->[0]->{data}};
		
		@tx = @{$s->[1]};
		
		if($ty[$#ty] < $tx[$#tx]) {
            return 1;
		}else{
		    return 0;
		}
	}
	
	sub plotlines {
		my ($file, $stock, $x, $lines, $y_format) = @_;
		my @legend;
		my ($data, $colors) = ([], []);
		
		$data->[0] = $x;   # x-axis labels
	
		for (0..$#{$lines}) {
			$data->[(1+$_)] = $lines->[$_]->{data};
			$colors->[$_] = $lines->[$_]->{color};
			$legend[$_] = $lines->[$_]->{name};
		}
	
		my $graph = GD::Graph::lines->new(1024,420);
		$graph->set (dclrs => $colors) or die $graph->error;
		$graph->set_legend(@legend) or die $graph->error;
		$graph->set (legend_placement => 'BC') or die $graph->error;
		$graph->set(y_number_format => $y_format) if $y_format;
		
		my $skipp = int(0.2*scalar(@{$data->[0]})) unless(!$data->[0]);
		
		$skipp = 0 unless($skipp);
		
		$graph->set (
			title => "stock: $stock",
			boxclr => 'black',
			bgclr => 'dgray',
			axislabelclr => 'white',
			legendclr => 'white',
			textclr => 'white',
			r_margin => 20,
			tick_length => -4,
			y_long_ticks => 1,
			axis_space => 10,
			x_labels_vertical => 1,
			x_label_skip => $skipp
		) or return;# die $graph->error;
		my $gd = $graph->plot($data) or return;# die $graph->error;
	
		#open (IMG, ">$file") or die $!;
		#binmode IMG;
		#print IMG 
		return encode_base64($gd->png());
	
	}
	
	sub _tbl {
		my ($stock, $q) = @_;
		my $str = "";
		my @headers = qw/ Date Open High Low Close Volume /;
		my $tr_start = "<tr align=\"center\">\n";
		$str .= "<table border=\"1\" cellpadding=\"3\" cellspacing=\"0\">\n";
		$str .= $tr_start . "<td colspan=\"" . scalar @headers . "\">";
		$str .= "<b>Stock: $stock</b></td></tr>\n";
		$str .= $tr_start;
		$str .= "<td><b>" . $headers[$_] . "</b></td>\n" for 0..$#headers;
		$str .= "</tr>\n";
		for my $i (reverse 0..$#{$q->{Date}}) {
			$str .= $tr_start;
			$str .= "<td>" . $q->{$headers[$_]}->[$i] . "</td>\n" for 0..$#headers;
			$str .= "</tr>\n";
		}
		$str .= "</table>\n";
		return $str;
	}	




1;
__END__



( run in 3.215 seconds using v1.01-cache-2.11-cpan-99c4e6809bf )