File Coverage

blib/lib/Finance/Quant/Charter.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


\n";
line stmt bran cond sub pod time code
1             #!/usr/bin/perl -X
2             package Finance::Quant::Charter;
3              
4 1     1   23548 use strict;
  1         2  
  1         37  
5 1     1   6 use warnings;
  1         1  
  1         28  
6 1     1   1052 use Data::Dumper;
  1         11253  
  1         164  
7             require Exporter;
8              
9             our @ISA = qw(Exporter);
10              
11             # Items to export into callers namespace by default. Note: do not export
12             # names by default without a very good reason. Use EXPORT_OK instead.
13             # Do not simply export all your public functions/methods/constants.
14              
15             # This allows declaration use Finance::Quant::Charter ':all';
16             # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
17             # will save memory.
18             our %EXPORT_TAGS = ( 'all' => [ qw(
19            
20             ) ] );
21              
22             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
23              
24             our @EXPORT = qw(
25             html diffcheck
26             );
27              
28             our $VERSION = '0.01';
29              
30             # Preloaded methods go here.
31              
32              
33 1     1   816 use MIME::Base64;
  1         871  
  1         76  
34 1     1   481 use Finance::Quant::TA;
  0            
  0            
35             use GD::Graph::lines;
36             use Finance::Quant;
37             # my @headers = qw/ Date Open High Low Close Volume /; hardcoded in _tbl()
38             # $q->{Close} assumed exists in plotlog() & plotdiff()
39             sub html {
40             my ($stock, $q, $ma, $diff) = @_;
41             print "generating html...\n";
42            
43             my $quant = Finance::Quant->new;
44            
45            
46             my $image = $quant->get_source_image(sprintf("http://content.nasdaq.com/ibes/%s_Smallcon.jpg",$stock));
47              
48            
49             my $xguru = "";
50             my $ff = "";
51            
52             if($image!~/DQoNCjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRp/) {
53             $ff = $quant->get_source_image(sprintf("http://community.nasdaq.com/community-ratings.aspx?stockticker=%s&AllRatings=1",$stock));
54            
55             if($ff =~ /(.*)ratings<\/b>/){
56             $quant->{'result'}=$1;
57             }
58             }
59            
60             my @guru = $quant->getguruscreener($stock);
61            
62             $xguru ="
    ";
63            
64             $xguru ="
  • nasdaq comunity rating:".$quant->{result}."
  • " unless(!$quant->{result});
    65            
    66             foreach my $gu (@guru){
    67            
    68             $xguru .= sprintf("
  • raiting:[%s]\t\t%s
  • ",$gu->{pct},$gu->{methode});
    69            
    70             }
    71             $xguru .="";
    72            
    73             my $str = "";
    74             $str .= "$stock
    ".$xguru."
    \n";
    75            
    76             $str .= "

    \n" unless(!defined($image) || !defined($quant->{'result'}));
    77             $str .= "

    \n";
    78             $str .= "

    \n";
    79             $str .= _tbl($stock, $q);
    80             $str .= "\n";
    81             return $str;
    82             }
    83            
    84             sub plotlog {
    85             my ($stock, $q, $diff) = @_;
    86             my $img = $stock . "log.jpg";
    87             print "generating $img...\n";
    88             my ($s, $lines) = ([],[]);
    89             my $y_format = sub { sprintf " \$%.2f", exp $_[0] };
    90            
    91             $s = Finance::Quant::TA::logs($q->{Close});
    92             $lines->[0] = { name => 'Log of Closing Price', color => 'marine', data => $s };
    93             $lines->[1] = { name => "MA($diff) (Moving Avg)", color => 'cyan', data => Finance::Quant::TA::ma($lines->[0]->{data}, $diff) };
    94              
    95              
    96             my $xdata = undef;
    97            
    98             $xdata = plotlines($img, $stock, $q->{Date}, $lines, $y_format);
    99            
    100             return $xdata;
    101             }
    102              
    103             sub plotdiff {
    104             my ($stock, $q, $lag, $diff) = @_;
    105             my $img = $stock . "diff.jpg";
    106             print "generating $img...\n";
    107             my ($s, $lines) = ([],[]);
    108             my $y_format = sub { sprintf " %.2f", $_[0] };
    109              
    110             $s = Finance::Quant::TA::logs($q->{Close});
    111            
    112             my $diffx = Finance::Quant::TA::diff($s, $diff);
    113            
    114            
    115             $lines->[0] = { name => "Diff($diff)", color => 'marine', data => $diffx };
    116             $lines->[1] = { name => "MA($lag) (Moving Avg)", color => 'cyan', data => Finance::Quant::TA::ma($lines->[0]->{data}, $lag) };
    117             $s = Finance::Quant::TA::stdev($lines->[0]->{data}, $lag);
    118             $s = Finance::Quant::TA::nstdev_ma($s, $lines->[1]->{data}, 2);
    119             $lines->[2] = { name => 'MA + 2 Std Dev', color => 'lred', data => $s->[0] };
    120             $lines->[3] = { name => 'MA - 2 Std Dev', color => 'lred', data => $s->[1] };
    121            
    122            
    123             my(@ty,@tx);
    124             @ty = @{$lines->[0]->{data}};
    125            
    126             @tx = @{$s->[1]};
    127              
    128             my $xdata = undef;
    129             $xdata = plotlines($img, $stock, $q->{Date}, $lines, $y_format);
    130            
    131            
    132            
    133            
    134            
    135             return $xdata;
    136             }
    137            
    138             sub diffcheck {
    139             my ($stock, $q, $lag, $diff) = @_;
    140             my $img = $stock . "diff.jpg";
    141             print "generating $img...\n";
    142             my ($s, $lines) = ([],[]);
    143             my $y_format = sub { sprintf " %.2f", $_[0] };
    144              
    145             $s = Finance::Quant::TA::logs($q->{Close});
    146            
    147             my $diffx = Finance::Quant::TA::diff($s, $diff);
    148            
    149            
    150             $lines->[0] = { name => "Diff($diff)", color => 'marine', data => $diffx };
    151             $lines->[1] = { name => "MA($lag) (Moving Avg)", color => 'cyan', data => Finance::Quant::TA::ma($lines->[0]->{data}, $lag) };
    152             $s = Finance::Quant::TA::stdev($lines->[0]->{data}, $lag);
    153             $s = Finance::Quant::TA::nstdev_ma($s, $lines->[1]->{data}, 2);
    154             $lines->[2] = { name => 'MA + 2 Std Dev', color => 'lred', data => $s->[0] };
    155             $lines->[3] = { name => 'MA - 2 Std Dev', color => 'lred', data => $s->[1] };
    156            
    157            
    158             my(@ty,@tx);
    159             @ty = @{$lines->[0]->{data}};
    160            
    161             @tx = @{$s->[1]};
    162            
    163             if($ty[$#ty] < $tx[$#tx]) {
    164             return 1;
    165             }else{
    166             return 0;
    167             }
    168             }
    169            
    170             sub plotlines {
    171             my ($file, $stock, $x, $lines, $y_format) = @_;
    172             my @legend;
    173             my ($data, $colors) = ([], []);
    174            
    175             $data->[0] = $x; # x-axis labels
    176            
    177             for (0..$#{$lines}) {
    178             $data->[(1+$_)] = $lines->[$_]->{data};
    179             $colors->[$_] = $lines->[$_]->{color};
    180             $legend[$_] = $lines->[$_]->{name};
    181             }
    182            
    183             my $graph = GD::Graph::lines->new(1024,420);
    184             $graph->set (dclrs => $colors) or die $graph->error;
    185             $graph->set_legend(@legend) or die $graph->error;
    186             $graph->set (legend_placement => 'BC') or die $graph->error;
    187             $graph->set(y_number_format => $y_format) if $y_format;
    188            
    189             my $skipp = int(0.2*scalar(@{$data->[0]})) unless(!$data->[0]);
    190            
    191             $skipp = 0 unless($skipp);
    192            
    193             $graph->set (
    194             title => "stock: $stock",
    195             boxclr => 'black',
    196             bgclr => 'dgray',
    197             axislabelclr => 'white',
    198             legendclr => 'white',
    199             textclr => 'white',
    200             r_margin => 20,
    201             tick_length => -4,
    202             y_long_ticks => 1,
    203             axis_space => 10,
    204             x_labels_vertical => 1,
    205             x_label_skip => $skipp
    206             ) or return;# die $graph->error;
    207             my $gd = $graph->plot($data) or return;# die $graph->error;
    208            
    209             #open (IMG, ">$file") or die $!;
    210             #binmode IMG;
    211             #print IMG
    212             return encode_base64($gd->png());
    213            
    214             }
    215            
    216             sub _tbl {
    217             my ($stock, $q) = @_;
    218             my $str = "";
    219             my @headers = qw/ Date Open High Low Close Volume /;
    220             my $tr_start = "
    221             $str .= "\n"; \n"; \n" for 0..$#headers; \n"; \n" for 0..$#headers; \n";
    222             $str .= $tr_start . "";
    223             $str .= "Stock: $stock
    224             $str .= $tr_start;
    225             $str .= "" . $headers[$_] . "
    226             $str .= "
    227             for my $i (reverse 0..$#{$q->{Date}}) {
    228             $str .= $tr_start;
    229             $str .= "" . $q->{$headers[$_]}->[$i] . "
    230             $str .= "
    231             }
    232             $str .= "
    \n";
    233             return $str;
    234             }
    235              
    236              
    237              
    238              
    239             1;
    240             __END__