The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Finance::Shares::Chart - construct shares graph

SYNOPSIS

    use Finance::Shares::Chart;

    my $fsc = new Finance::Shares::Chart( <options> );
    $fsc->add_data($data);
    $fsc->add_line($line);
    $fsc->build();
    $fsc->output($filename, $dir);

    $fsc->add_graph($name, $opt_hash);
    $fsc->set_period($start, $end);
    my $data = $fsc->data();

DESCRIPTION

This module provides the output for Finance::Shares::Model. It builds a series of graphs on a single page, with a key panel indicating the role of any lines added. A Finance::Shares::data object may be declared, which provides stock price quotes and volume information. Any number of Finance::Shares::Line objects may be displayed as well. These are normally generated from Finance::Shares::Function objects (See Finance::Shares::Function for details).

There are four types of graphs. Each type may appear as often as you wish (or not at all), but the first of each type gets used if none other is specified.

price

Price data can be displayed using normal open-close-high-low marks, Japanese candles, or just the closing positions for each day. The Y axis is scaled for prices.

volume

Volume bars are displayed on this graph whose Y axis is typically scaled in millions.

analysis

There would typically be more than one 'analysis' graph on a chart. The Y axis is usually scaled to show price movements which may be negative as well as positive.

logic

Several of the available functions compare two other lines or signal whether conditions are true or false. Their results would be shown on a 'logic' graph. The Y axis is often scaled 0 to 100%.

As there is only one Key panel shared by all graphs, each line is typically displayed in a different colour by default. Like almost everything else, this behaviour is configurable.

All error, log and debug messages are controlled by Log::Agent. By default this does the expected thing, but it does mean they may be routed differently as required. See Log::Agent for details.

CONSTRUCTOR

new( options )

<options> must be a hash ref or a list of hash keys and values. There are a lot of them - up to 250 or more. Many are just listed here. See the indicated man pages for full details. The options fit within a hash tree structure like the following.

    my $fsc = new Finance::Shares::Chart(
        background => [0.9, 0.95, 0.95],
        stock      => 'MSFT',
        period => {
            start  => '2003-01-01',
            by     => 'weeks',
        },
        graphs => [
            MACD => {
                percent => 40,
            },
            Tests => {
                gtype => 'logic',
                show_dates => 1,
            },
        ],
    );

Colours can be a decimal from 0 (black) to 1 (brightest), or a triple within an array ref when each decimal represents the brightness of red, green and blue. Any measurements are in PostScript units (1/72"), so think point sizes.

Top level options

verbose

Controls the amount of feedback provided

    0   silent
    1   errors only (default)
    2   slghtly more informative
    3+  debugging
iname

A unique name assigned by Finance::Shares::Model. It identifies the chart and its associated data (if any).

background

The background colour for all the graphs. This can be a shade of grey (0.0 for black, 1.0 for brightest) or an array ref holding similar decimals for red, green and blue, e.g. [ 0.6, 0.4, 0 ] for a red-orange. (Default: 1.0)

bgnd_outline

By default the price and volume marks are drawn with a contrasting outline. Setting this to 1 makes this outline the same colour as the background. (Default: 0)

dpi

One of the advantages of PostScript output is that it can make the best use of each medium. Setting this to 72 produces output suitable for most computer monitors. Use a higher figure for hard copy, depending on you printer's capabilities. (Default: 300)

directory

Optional directory prepended to the output file name.

glyph_ratio

Generating PostScript is a one-way process. It is not possible to find out how much space will be taken up by a string using a proportional spaced font, so guesses are made. This allows that guess to be fine tuned. (Default: 0.44)

heading

Appears at the top of the page. Defaults to something suitable.

page

An optional string used as the PostScript page 'number'. Although this may be anything many programs expect this to be short like a page number, with no spaces.

smallest

The underlying PostScript::Graph::Paper module will sometimes generate more subdivisions and axis lines than needed, especially at high resolutions. smallest provides some control over this for the Y axes. It specifies the size of the smallest gap between lines; giving a larger number means fewer lines. The default produces 3 dots at the resolution given to dots_per_inch.

Note that the only way to control the line density on the X axis is to plot fewer dates. One way of doing this is to set the Finance::Shares::Sample contructor option by to 'weeks' or 'months'.

sequence

An internal PostScript::Graph::Sequence controls the different colours given to each line displayed. Assigning your own here gives you more control of how the lines appear. Not that it is possible to override this behaviour completely by specifying auto = 'none'> within each line style hash. See PostScript::Graph::Style.

stock

This would be a code indicating the particular stock being displayed. However, it could be anything as it is only used in constructing the default heading.

show_breaks

A value of 1 means that any undefined values show a break in the line, otherwise the line is continuous. (Default: 0)

period

The chart displays dates in a given range at a particular frequency - days, months etc. It does not show all the dates in the associated Finance::Shares::data object, as a certain lead time is often required to establish reliable calculations. The chart may also have an unfilled area after the end of the data to allow for a little extrapolation.

These details are given within a period sub-hash, which may have the following fields.

start

The first date to be displayed. It should be in YYYY-MM-DD format.

end

The last date on the chart. Again, in YYYY-MM-DD format.

by

Determines how the intervening dates are counted. Suitable values are

    quotes      weekdays
    days        weeks
    months

file

This can be either a PostScript::File object or a hash ref holding parameters suitable for creating one. The default is to set up a landscape A4 page with half inch margins. The hash ref may contain the following keys. See PostScript::File for details.

    paper       width
    height      landscape
    eps         dir
    png         gs
    left        right
    top         bottom
    clipping    clip_command
    headings    reencode
    debug       errors
    errx        erry
    

heading_font

A sub-hash controlling how the heading appears. Recognized keys are:

font

The font family name which should be one of the following. (Default: 'Times-Bold')

    Courier
    Courier-Bold
    Courier-BoldOblique
    Courier-Oblique
    Helvetica
    Helvetica-Bold
    Helvetica-BoldOblique
    Helvetica-Oblique
    Times-Roman
    Times-Bold
    Times-BoldItalic
    Times-Italic
    Symbol
size

Point size to use. (Default: 14)

color

The normal colour format: either a grey value or an array ref holding [<red>,<green>,<blue>]. (Default: 1.0)

normal_font

This controls the font used to label the graphs. The defaults are different ('Helvetica', 10pt) but the keys are the same as for heading_font.

key

This sub-hash controls the appearance of the Key panel. See PostScript::Graph::Key for details of these possible entries.

    background      title
    outline_color   outline_width
    title_font      text_font
    spacing         glyph_ratio
    vert_spacing    horz_spacing
    icon_width      icon_height
    text_width
   

x_axis

The dates axis is controlled by this sub-hash. The show_ options largely refer to how the date labels are built up. changes_only controls whether the full label is shown (0) or only those parts that have changed (1). Other options are explained in PostScript::Graph::Paper.

    show_lines      changes_only
    show_weekday    show_day
    show_month      show_year
    mark_min        mark_max
    color           heavy_color
    mid_color       light_color
    heavy_width     mid_width
    light_width

graphs

This is an exception. Where all the other headings describe hash refs, this is an array ref. The array lists descriptions for each of the graphs to be shown on the page. Each graph description is a hash ref keyed by the graph's title.

    graphs => [
        'Stock Prices' => {
                gtype => 'price',
                ...
            },
        'Trading Volumes' => {
                gtype => 'volume',
                ...
            },
        'Momentum' => {
                gtype => 'analysis',
                ...
            },
        'On-Balance Volume' => {
                gtype => 'analysis',
                ...
            },
        ...
    ],

Graph options

Each graph hash ref may include any of the following values or sub-hashes.

percent

This is the proportion of space allocated to the graph. Specifying 0 hides it. It is not a strict percentage in that they don't all have to add up to 100, but it does give an idea of the sort of numbers to put here. There may be problems if the value is less than 10, or so small the graph cannot physically be drawn in the space.

Some graphs will become visible automatically (provided their percent is not 0) if data or lines should be shown there. They take a default value of 20.

gtype

Identifies the type of Y axis to use. Must be one of

    price       volume
    analysis    logic
show_dates

True if the dates axis is to be shown under this chart. By default the dates are placed under the first graph that hasn't specified show_dates => 0.

bars

Only appropriate for the volume type graph, this sub-hash specifies how the volume bars look. See PostScript::Graph::Style.

    color           width
    inner_color     outer_color
    inner_width     outer_width

points

Only appropriate for the price type graph, this sub-hash specifies how the price marks look. Values for shape are as follows and NOT as described in PostScript::Graph::Style.

    stock   stock2
    candle  candle2
    close   close2
    

The other options are as bars.

layout

See PostScript::Graph::Paper for details.

    spacing
    top_margin
    right_margin
    

y_axis

See PostScript::Graph::Paper for details.

    title           color
    heavy_color     mid_color
    light_color     heavy_width
    mid_width       light_width
    mark_min        mark_max
    label_gap       si_shift

add_data( data )

Declare the stock quote data associated with this chart - there should only be one. data must be a Finance::Shares::data object.

add_line( line )

Register a line with this chart. line should be a Finance::Shares::Line derived object. It's graph is determined from its optional {graph} or mandatory {gtype} fields.

build( )

Once the resources are gathered, this method puts them all together. The chart is built in PostScript. If no PostScript::File object was given to the constructor one is created for this chart, otherwise the chart is written to the current page.

output( [filename [, directory]] )

The graphs are constructed and written out to a PostScript file. A suitable suffix (.ps, .epsi or .epsf) will be appended to the file name.

If no filename is given, the PostScript text is returned. This makes handling CGI requests easier.

ACCESS METHODS

name( )

Returns the canonical name for this chart.

data( )

Return the Finance::Shares::data object holding the stock quotes for this chart.

graph_for( line )

The most reliable way of determining which graph a particular Finance::Shares::Line object will appear on. A new graph is created if no existing graph is suitable. line must have at least a {gtype} field and optionally a {graph} field holding a graph name.

set_period( )

Used by the associated Finance::Shares::data object to ensure the dates used in the default title are correct.

hidden( )

Returns true if the chart is not to be displayed.

CLASS METHODS

The PostScript code is a class method so that it may be available to other classes that don't need a Stock object.

The useful functions in the 'gstockdict' dictionary draw a stock chart mark and a close mark in either one or two colours.

    make_candle
    make_candle2
    make_stock
    make_stock2
    make_close
    make_close2

The all consume 5 numbers from the stack (even if they aren't all used):

    x yopen ylow yhigh yclose
   

gstockdict

A few functions are defined in the gstockdict dictionary. These provide the code for the shapes drawn as price marks. These dictionary entries are defined:

    make_stock   Draw single price mark
    make_stock2  Draw double price mark
    make_candle  Draw Japanese candle mark
    make_candle2 Draw Japanese candle mark
    make_close   Draw single closing price mark
    make_close2  Draw double closing price mark
    yclose       parameter
    ylow         parameter
    yhigh        parameter
    yopen        parameter
    x            parameter
    dx           working value
    dy           working value

A postscript function suitable for passing to the shape option to new must have 'make_' preprended to the name. It should take 5 parameters similar to the code for shape = 'stock'> which is called as follows.

    x yopen ylow yhigh yclose make_stock
    

BUGS

Please do let me know when you suspect something isn't right. A short script working from a CSV file demonstrating the problem would be very helpful.

AUTHOR

Chris Willmot, chris@willmot.org.uk

LICENCE

Copyright (c) 2003 Christopher P Willmot

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. A copy can be found at http://www.gnu.org/copyleft/gpl.html

SEE ALSO

Finance::Shares::Overview provides an introduction to the suite, and fsmodel is the principal script.

Modules involved in processing the model include Finance::Shares::Model, Finance::Shares::MySQL, Finance::Shares::Chart. Chart and file details may be found in PostScript::File, PostScript::Graph::Paper, PostScript::Graph::Key, PostScript::Graph::Style.

Functions are invoked from their own modules, all with lower-case names such as Finance::Shares::moving_average. The nitty-gritty on how to write each line specification are found there.

The quote data is stored in a Finance::Shares::data object. For information on writing additional line functions see Finance::Shares::Function and Finance::Shares::Line. Also, Finance::Shares::Code covers writing your own tests.