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]]
]