Finance-ChartHist

 view release on metacpan or  search on metacpan

lib/Finance/ChartHist.pm  view on Meta::CPAN

  
}

sub _graph_multiple_symbols
{
  my $self = shift;
  my $graph_data = shift or die "No graph data!";
  
  ## Convert the price data to percentage movements
  $graph_data = $self->_convert_to_percentage_movement($graph_data);
  
  ## Get the percentage range for the data
  my ($y_min, $y_max) = $self->_calculate_price_range($graph_data);
  
  ## Figure out how many days our chart will show  
  my $s_date = Date::Simple->new($self->{start_date}) or croak "Couldn't parse start_date";
  my $e_date = Date::Simple->new($self->{end_date}) or croak "Couldn't parse end_date";
  my $date_count = $e_date - $s_date;
  ## Figure out how many x values exist in the chart
  my $tick_count = scalar @{ $graph_data->{$self->{symbols}[0]}[0] };
      
  my ($x_label_skip, $x_label_offset) = $self->_format_x_axis($graph_data,
                                                              $date_count,
                                                              $tick_count);

  #Produce a title for the graph
  my $title = "";
  foreach (@{ $self->{symbols} }) {
    $title = $title."$_ vs ";
  }
  $title =~ s/ vs $//;
                                                                
  my $graph = new GD::Graph::lines( $self->{width}, $self->{height});
    
  $graph->set( 
	x_label => $self->{x_label},
	y_label => $self->{y_label},
	title => $title,
	y_max_value => $y_max,
	y_min_value => $y_min,
	y_tick_number => $y_max - $y_min,
	x_tick_offset => $x_label_offset,
	x_label_skip => $x_label_skip,
	x_label_position => 1/2,
	box_axis => 0,
	r_margin => 10,
	line_width => 1,

	transparent => 0
  ) or warn $graph->error;
  
  ## Set up the data into the required format
  my @formated_data = ();
  foreach my $symbol (@{ $self->{symbols} }) {
    push @formated_data, $graph_data->{$symbol}[1];
  }
  unshift @formated_data, $graph_data->{$self->{symbols}[0]}[0];

  $graph->plot(\@formated_data) or die $graph->error;
  
  ## Set the legend
  $graph->set_legend( ["BHP", "PIXR"] );

  ## Keep a copy of the graph  
  $self->{graph} = $graph;
  
}

##
## Figure out the range of the share price, and
## calculate what limits we will put on the y-axis
## of the graph
sub _calculate_price_range
{
  my $self = shift;
  my $graph_data = shift or die "No graph data!";
  
  my ($y_max_value, $y_min_value) = (0, 0);
  
  if (scalar keys %{ $graph_data } > 1) {
    foreach my $symbol ( keys %{ $graph_data } ) {
      foreach my $percent (@{ $graph_data->{$symbol}[1] }) {
        if ($percent < $y_min_value) {
          $y_min_value = $percent;
        }

        if ($percent > $y_max_value) {
          $y_max_value = $percent;
        }
      }
    }
  }
  else {
    $y_max_value = $graph_data->{$self->{symbols}}[1][0];
    $y_min_value = $graph_data->{$self->{symbols}}[1][0];
    
    foreach my $price ( @{ $graph_data->{$self->{symbols}}[1] } ) {
      if ($price < $y_min_value) {
        $y_min_value = $price;
      }

      if ($price > $y_max_value) {
        $y_max_value = $price;
      }
    }
  }
  
  ($y_min_value, $y_max_value) = $self->_normalise_range($y_min_value, $y_max_value);
  
  return ($y_min_value, $y_max_value);
}


##
## Format the date values for the x-axis. The number of dates,
## and size of the graph will determine how the x-axis labels
## will be displayed.
##
sub _format_x_axis
{
  my $self = shift;
  my $graph_data = shift or die "No graph_data passed to _format_x_axis()\n";



( run in 1.524 second using v1.01-cache-2.11-cpan-39bf76dae61 )