//@Name:SMI //@Description:Draws the Stochastic Momentum Index var maList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA"]; var maTitleList = ["SMA","EMA","WMA","TMA","VVHF","VCMO","VIDYA"]; var MAtype = 1; var period = 20; var slowing = 5; var smooth = 5; var signal = 9; var col1 = Colour.Red var col2 = Colour.Red var style1 = 0; var style2 = 1; var width1 = 0; var width2 = 0; function init(status) { if (status == Loading || status == Editing) { MAtype = storage.getAt(0); period = storage.getAt(1); slowing = storage.getAt(2); smooth = storage.getAt(3); signal = storage.getAt(4); col1 = storage.getAt(5); col2 = storage.getAt(6); var storedData = restore(storage.getAt(7),[[style1,0,4],[width1,0,7],[style2,0,4],[width2,0,7]]) style1 = storedData[0][0]; width1 = storedData[1][0]; style2 = storedData[2][0]; width2 = storedData[3][0]; } if (status == Adding || status == Editing) { dlg = new Dialog("Select Period Length", 165, 120); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("INT1",8,-1,-1,-1,"","HL period",period,2,1000); dlg.addDropList("DL1",8,-1,80,-1,maList,"","",MAtype); dlg.addIntEdit("INT2",8,-1,-1,-1,"","slowing period",slowing,2,1000); dlg.addIntEdit("INT3",8,-1,-1,-1,"","smoothing period",smooth,2,1000); dlg.addColLinePicker("CL1",8,-1,-1,-1,"","Main Line",col1,style1,width1) dlg.addIntEdit("INT4",8,-1,-1,-1,"","signal period",signal,2,1000); dlg.addColLinePicker("CL2",8,-1,-1,-1,"","Signal Line",col2,style2,width2) if (dlg.show()==Dialog.Cancel) return false; MAtype = dlg.getValue("DL1"); period = dlg.getValue("INT1"); slowing = dlg.getValue("INT2"); smooth = dlg.getValue("INT3"); signal = dlg.getValue("INT4"); 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, MAtype); storage.setAt(1, period); storage.setAt(2, slowing); storage.setAt(3, smooth); storage.setAt(4, signal); storage.setAt(5, col1) storage.setAt(6, col2) storage.setAt(7, compress([[style1,0,4],[width1,0,7],[style2,0,4],[width2,0,7]])) } setSeriesLineStyle(0, style1, width1); setSeriesColour(0, col1); setSeriesLineStyle(1, style2, width2); setSeriesColour(1, col2); setHorizontalLine(40); setHorizontalLine(0); setHorizontalLine(-40); setTitle("SMI ("+period+","+slowing+","+smooth+","+signal+")") } function getGraph(share, data) { var hh = new MinMax(period); var ll = new MinMax(period); var ma1 = new MA(slowing, MAtype); var ma2 = new MA(slowing, MAtype); var ma3 = new MA(smooth, MAtype); var ma4 = new MA(smooth, MAtype); var ma5 = new MA(signal, MAtype); var mainOutput = []; var sigOutput = []; for (var i =0;i8388608) print("Too much data for single storage space") return output } //restore from compression algorithm //storage is the compress function output and data is the same as compress function input. //individual values in "data" aren't important (those get overwritten), but min and max values are function restore(storage, data) { var remainder = storage var rangeTot = 1 for (var i=0;i=0;i--) { if (i