Re: financial chart with volumes

• To: mathgroup at smc.vnet.net
• Subject: [mg93866] Re: financial chart with volumes
• From: Andreas <aagas at ix.netcom.com>
• Date: Thu, 27 Nov 2008 05:32:28 -0500 (EST)

```I took a further if not quite elegant shot at a candle stick chart.

dateOffset = 100;
datesStartEnd = {DatePlus[DateList[], -dateOffset], DateList[]};
instrument = "IBM";

(* The following uses David Parks' GetFinancialData[] function (reproduced at the end of this post):*)

financialData =
GetFinancialData[
instrument, {"Open", "High", "Low",
"Close"}, {DatePlus[DateList[], -dateOffset], DateList[],
"Day"}];

(* The next 6 lines take the financial data and through a series of steps form 2 data lists: openAboveClose and closeAboveOpen. They each have a list of opening prices and a list of closing prices, but only for the relevant dates. When we plot these below they will make up the different colored candle bodies.

I know, the code looks ridiculously complicated to me.  Mathematica must have a more elegant way to generate these data sets. I tried to use Select[] but to no avail... Any suggestions welcome.*)

t1 = financialData[[All, 2]] - financialData[[All, 5]];
t2 = Partition[
Flatten[Table[{financialData[[i]], t1[[i]]}, {i, 1,
Length[financialData]}][[All]], 2], 6];

t3a = DeleteCases[
Table[If[t2[[i, 6]] > 0, t2[[i]]], {i, 1, Length[t2]}], Null];
t3b = DeleteCases[
Table[If[t2[[i, 6]] <= 0, t2[[i]]], {i, 1, Length[t2]}], Null];

openAboveClose = {t3a[[All, ;; 2]], t3a[[All, {1, 5}]]};
closeAboveOpen = {t3b[[All, ;; 2]], t3b[[All, {1, 5}]]};

(* The following produces a 2 data set list to generate the high to low line of the candlestick chart *)

highLow = {FinancialData[instrument, "Low", datesStartEnd],
FinancialData[instrument, "High", datesStartEnd]};

(* Ploting proceeds quite directly, 3 overlaid DateListPlots: 1 for the high to low line, 1 for days where the market opens higher than its close, and 1 for the reverse.  The candle bodies scale relative to both the number of intervals plotted and the ImageSize of the overall chart. *)

Show[
{DateListPlot[highLow , Filling -> {1 -> {2}},
FillingStyle -> Directive[Black, Thin], PlotMarkers -> {"", ""}],

DateListPlot[openAboveClose , Filling -> {1 -> {2}},
FillingStyle ->
Directive[Red, Thickness[.0075*100/dateOffset], Opacity[1]],
PlotMarkers -> {"", ""}],

DateListPlot[closeAboveOpen , Filling -> {1 -> {2}},
FillingStyle ->
Directive[Blue, Thickness[.0075*100/dateOffset], Opacity[1]],
PlotMarkers -> {"", ""}]

}, ImageSize -> 400, PlotLabel -> instrument
]
_________________

One can easily change the color of the candles, and they stay readable with quite a few bars.

To summarize the strategy, I broke up the data into pieces which would each have different graphic characteristics in the final chart, then assembled the pieces using Show[].

One could combine this with some of the other responses in this thread to display volume or other indicators.

Again, if anyone has any ideas for producing the data sets a bit more elegantly, I'd much appreciate it.

(I've wanted to do this for a long time ;-)

A.
_________________
GetFinancialData::usage =
"GetFinancialData[name, {property1,property2...},iterator] will \
generate a data set where each record will contain {datelist, \
propertyvalues..}. The iterator is the standard {start,end, period} \
used in FinancialData. This is basically a method of retrieving a \
number of property values at once.";

SyntaxInformation[
GetFinancialData] = {"ArgumentsPattern" -> {_, {_, __}, _}};
GetFinancialData[name_String, {first_String, rest__String},
iterator_List] :=
Module[{work, other},
work = Transpose@FinancialData[name, first, iterator];
other = FinancialData[name, #, iterator, "Value"] & /@ {rest};
Transpose[Join[work, other]]
]

```

• Prev by Date: Re: Package Problem
• Next by Date: Re: Re: v.7.0 issues
• Previous by thread: Re: financial chart with volumes
• Next by thread: pass by reference