//@Name:Financial Histogram //@Description:Draws a histogram of various financial values. //@Future:Yes // Care has been taken in preparing this code but it is provided without guarantee. // You are welcome to modify and extend it. Please add your name as a modifier if you distribute it. var colour1 = Colour.Red var colour2 = Colour.White var colour3; var fundList = ["EPS","Dividend ps","Operating Cash Flow ps","Inflation Adj. EPS"]; var fundType = 0; function init(status) { if (status == Loading || status == Editing) { fundType = storage.getAt(0); colour1 = storage.getAt(1); } if (status == Adding || status == Editing) { dlg = new Dialog("Histogram settings...", 230, 60); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",10,8,110,-1,fundList,"","",fundType); dlg.addColPicker("VAL1",135,8,-1,-1,"","",colour1); if (dlg.show()==Dialog.Cancel) return false; fundType = dlg.getValue("DL1"); colour1= dlg.getValue("VAL1"); storage.setAt(0, fundType); storage.setAt(1, colour1); } setTitle(fundList[fundType]+" Histogram"); colour3 = lighterColour(colour1); setSeriesChartType(0, ChartType.Histogram); setSeriesColour(0, colour2); setSeriesLineStyle(0, Pen.Solid, 0); setSeriesChartType(1, ChartType.Block); setSeriesColour(1, colour1); setSeriesLineStyle(1, Pen.Solid, 0); setSeriesChartType(2, ChartType.Histogram); setSeriesColour(2, colour2); setSeriesLineStyle(2, Pen.Solid, 0); setSeriesChartType(3, ChartType.Block); setSeriesColour(3, colour3); setSeriesLineStyle(3, Pen.Solid, 0); } function getGraph(share, data) { var outResult = new Array(data.length+750); var outResultHisto = new Array(data.length+750); outResult[0] = 5; var outForecast = new Array(data.length+750); var outForecastBlock = new Array(data.length+750); var year; var i,k; var date,dd; for (year=0;;year--) { // look for the oldest valid eps values if (getShareResult(share,year,fundType)==undefined) break; } do { // step forward to the start of the price data year++; dd=share.getResult(year,Result.Date); if (dd==undefined) return outResult; // no data to plot date=dateNum(dd); } while (date= FBD && start == 0) { outResult[i]=getShareResult(share,year,fundType); outResultHisto[i]=getShareResult(share,year,fundType); start = 1; } if (data[i].dateNum >= date) { outResult[i]=getShareResult(share,year,fundType); if(getShareResult(share,year+1,fundType)>getShareResult(share,year,fundType)) { outResultHisto[i]=getShareResult(share,year+1,fundType) } else { outResultHisto[i]=getShareResult(share,year,fundType) } year++; if (year>0) { // the following year is a forecast outForecast[i]=outResult[i]; // start the forecast line k=i; i++; break; } dd=share.getResult(year,Result.Date); if (dd==undefined) break; // no more results date=dateNum(dd); } } for (; year<=3; year++) { // three years of possible forecast if (share.getResult(year,Result.ResultType)==ResultType.Forecast) { // check it is a forecast k+=252; // this is only an approximate position outForecast[k]=getShareResult(share,year,fundType) if(getShareResult(share,year+1,fundType)>getShareResult(share,year,fundType)) { outForecastBlock[k]=getShareResult(share,year+1,fundType) } else { outForecastBlock[k]=getShareResult(share,year,fundType) } } } // for (var i=0;i> 8) & 255; var blue = (colour >> 16) & 255; red = Math.min((red + ((255-red)/3).toFixed(0)),255); green = Math.min((green + ((255-green)/3).toFixed(0)),255); blue = Math.min((blue + ((255-blue)/3).toFixed(0)),255); return Colour.RGB(red,green,blue); } function getShareResult(share,year,resNum) { if (!share.getResult(year,Result.Date)) return; switch (resNum) { case 0: return share.getResult(year, Result.EPS) case 1: return share.getResult(year, Result.Dividend) case 2: return share.getResult(year, Result.OperatingCashFlow) / share.getResult(year, Result.NumSharesAv) * 100 case 3: var infl = getShare("ECON:UK.CPI"); return infl.getClose()/infl.getCloseOnDate(share.getResult(year,Result.Date))*share.getResult(year, Result.EPS); } }