//@Name:TR Compare //@Description:Compares the total return of the share with that of another chosen instrument. Dividends are included from the ex-dividend date. // 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. //Coded by: Richard Chiesa, ShareScript Support var exDates1 = []; var divAmount1 = []; var divType1 = []; var exDates2 = []; var divAmount2 = []; var divType2 = []; var col1 = Colour.Cyan; var style1 = 0; var width1 = 1; var col2 = Colour.Red; var style2 = 0; var width2 = 1; var baseShare = getShare("LSE:BP."); var changeShare; function init(status) { if (status == Loading || status == Editing) { col1 = storage.getAt(0); style1 = storage.getAt(1); width1 = storage.getAt(2); col2 = storage.getAt(3); style2 = storage.getAt(4); width2 = storage.getAt(5); baseShare = getShare(storage.getAt(6),storage.getAt(7)); } if (status == Adding || status == Editing) { storage.setAt(6, baseShare.getShareScopeID()); storage.setAt(7, baseShare.getShareNum()); dlg = new Dialog("Colour settings",180,55); dlg.addOkButton(); dlg.addCancelButton(); dlg.addColLinePicker("CL1",8,-1,-1,-1,"","Main TR Line",col1,style1,width1); dlg.addColLinePicker("CL2",8,-1,-1,-1,"","Overlayed TR Line",col2,style2,width2); if (dlg.show()==Dialog.Cancel) return false; col1 = dlg.getValue("CL1").colour; style1 = dlg.getValue("CL1").pen; width1 = dlg.getValue("CL1").width; col2 = dlg.getValue("CL2").colour; style2 = dlg.getValue("CL2").pen; width2 = dlg.getValue("CL2").width; storage.setAt(0, col1); storage.setAt(1, style1); storage.setAt(2, width1); storage.setAt(3, col2); storage.setAt(4, style2); storage.setAt(5, width2); } changeShare = createButton("Select Share", changeBase); } function changeBase() { dlg = new Dialog("Change share...",150,55); dlg.addOkButton(); dlg.addCancelButton(); dlg.addSharePicker("SP1", 8, -1, -1, -1,"", "", baseShare); if (dlg.show()==Dialog.Cancel) return false; baseShare = dlg.getValue("SP1"); storage.setAt(6, baseShare.getShareScopeID()); storage.setAt(7, baseShare.getShareNum()); onNewChart(); } function onNewChart() { var share = getCurrentShare(); //create div arrays for current share exDates1 = []; divAmount1 = []; divType1 = []; for (var i=-25;i<=1;i++) { exDates1 = exDates1.concat(share.getResultArray(i,Result.ExDivDate)); divAmount1 = divAmount1.concat(share.getResultArray(i,Result.Dividend)); divType1 = divType1.concat(share.getResultArray(i,Result.Type)); } for (var i=divAmount1.length;i>0;i--) { if (divType1[i] == "Announced" || divType1[i] == "Final" || divType1[i] == "Q3" || (divType1[i] == "Interim" && divType1[i-1] == "Q1")) { if (divType1[i-1]=="Special") divAmount1[i] -= divAmount1[i-2]; else divAmount1[i] -= divAmount1[i-1]; } } //remove any blank pay dates for (i=0;i0;i--) { if (divType2[i] == "Announced" || divType2[i] == "Final" || divType2[i] == "Q3" || (divType2[i] == "Interim" && divType2[i-1] == "Q1")) { if (divType2[i-1]=="Special") divAmount2[i] -= divAmount2[i-2]; else divAmount2[i] -= divAmount2[i-1]; } } //remove any blank pay dates for (i=0;i=bars[s].date) break; } for (var divj = 0;divj=bars[s].date) break; } //draw the main share's total return line setPenStyle(style1,width1,col1); var totDividend1 = 0; moveTo(s,bars[s].close); for (var i=s;i<=f;i++) { if (divi=exDates1[divi]) { totDividend1 += divAmount1[divi]; divi++; } lineTo(i,bars[i].close+totDividend1); } //draw the base share's total return line setPenStyle(style2,width2,col2); var totDividend2 = 0; moveTo(s,bars[s].close); for (var i=s;i<=f;i++) { if (divj=exDates2[divj]) { totDividend2 += divAmount2[divj]; divj++; } var price = baseShare.getCloseOnDate(bars[i].date); if (price==null) price = firstPrice; lineTo(i,(price+totDividend2)*ratio); } setTitle(baseShare.getName()+" - TR"); }