//@LibraryID:136,1 //@Name:Fixed Relative Strength //@Description:Returns the relative strength of the share against the chosen index. The starting point is fixed and will not rebase on zooming. //@Env:Production //@Type:Historical // 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 lookback = 250; //lookback period var baseShare = getShare("UKI:UKX"); var useSector = 0; //use sector true/false var LineCol = Colour.Blue; var LineStyle = 0; var LineWidth = 0; var baseShare; var sigCol = Colour.Red; var sigStyle = Pen.Solid; var sigWidth = 0; var maList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA"]; var maL2 = ["SMA","EMA","WMA","TMA","VVHF","VCMO","VIDYA"]; var sigType = 0; var sigPeriod = 9; var sigTick = 0; function init(status) { if (status == Loading || status == Editing) { baseShare = getShare(storage.getAt(0),storage.getAt(1)); lookback = storage.getAt(2); var store1 = restore(storage.getAt(3), [[useSector,0,1],[LineStyle,0,4],[LineWidth,0,7]]); useSector = store1[0][0]; LineStyle = store1[0][1]; LineWidth = store1[0][2]; LineCol = storage.getAt(4); sigCol = storage.getAt(5); var store2 = restore(storage.getAt(6), [[sigTick,0,1],[sigStyle,0,4],[sigWidth,0,7],[sigType,0,6]]); sigTick = store2[0][0]; sigStyle = store2[0][1]; sigWidth = store2[0][2]; sigType = store2[0][3]; sigPeriod = storage.getAt(7); } if (status == Adding || status == Editing) { dlg = new Dialog((status==Adding?"Add":"Edit")+" indicator", 220, 75); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("INT1",8,-1,-1,-1,"","Lookback",lookback,2,5000) dlg.addSharePicker("SP1", 50, -1, -1, -1, "Base Share", "", baseShare); dlg.addColLinePicker("CL1",120,5,-1,-1,"","",LineCol,LineStyle,LineWidth); dlg.addTickBox("TB1",10,40,100,-1,"Use sector index",useSector); dlg.addIntEdit("VAL1",45,60,-1,-1,"Signal:","period",sigPeriod,2,5000); dlg.addColLinePicker("VAL2",170,60,-1,-1,"","",sigCol,sigStyle,sigWidth); dlg.addDropList("VAL3",105,60,55,-1,maList,"","",sigType); dlg.addTickBox("VAL4",8,61,10,10,"",sigTick); if (dlg.show()==Dialog.Cancel) return false; lookback = dlg.getValue("INT1"); useSector = dlg.getValue("TB1"); baseShare = dlg.getValue("SP1"); LineCol = dlg.getValue("CL1").colour; LineStyle = dlg.getValue("CL1").pen; LineWidth = dlg.getValue("CL1").width; sigPeriod = dlg.getValue("VAL1"); sigCol = dlg.getValue("VAL2").colour; sigStyle = dlg.getValue("VAL2").pen; sigWidth = dlg.getValue("VAL2").width; sigType = dlg.getValue("VAL3"); sigTick = dlg.getValue("VAL4"); storage.setAt(0, baseShare.getShareScopeID()); storage.setAt(1, baseShare.getShareNum()); storage.setAt(2, lookback); storage.setAt(3, compress([[useSector,0,1],[LineStyle,0,4],[LineWidth,0,7]])); storage.setAt(4, LineCol); storage.setAt(5, sigCol); storage.setAt(6, compress([[sigTick,0,1],[sigStyle,0,4],[sigWidth,0,7],[sigType,0,6]])); storage.setAt(7, sigPeriod); } setSeriesColour(0,LineCol); setSeriesLineStyle(0,LineStyle,LineWidth); setSeriesColour(1,sigCol); setSeriesLineStyle(1,sigStyle,sigWidth); setHorizontalLine(0); } function getGraph(share, data) { var indicatorValues = new Array(); var signalValues = new Array(); var signalMA = new MA(sigPeriod,sigType) //if useSector is true, use sector index instead of selected base share if (useSector) { baseShare = share.getSectorIndex(); if (baseShare==undefined) { for (var i=0;i0;i--) { F2 = relData[relData.length-i]; S2 = data[data.length-i].close; indicatorValues[data.length-i] = ((((F1 / S1) * (S2 / F2)) - 1) * 100); if(sigTick) signalValues[data.length-i] = signalMA.getNext(indicatorValues[data.length-i]); else signalValues[data.length-i] = null; } return [indicatorValues,signalValues]; } function compress(data) { var rangeTot = 1 var output = 0 for (var i = 0;i8388608) print("Too much data for single storage space") return output } function restore(storage, data) { var remainder = storage var rangeTot = 1 for (var i=0;i=0;i--) { if (i