//@Name:Stochastic Oscillator //@Description: Draws the Stochastic Oscillator and allows you to set overbought and oversold lines on the indicator. // 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: Phil Tolhurst, ShareScope Support var period=20; var slow=2; var signal=9; var overbought = 80; var oversold = 20; var MAList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","Vidya"]; var MPS=0; var PWO=0; var PSO=0; var colour1=11862016; var colour2=11862016; var colour3=255; var width1=0; var width2=0; var width3=0; var pen1=0; var pen2=2; var pen3=0; var MAType=0; function init(status) { if (status == Loading || status == Editing) { MPS = storage.getAt(0); PWO = storage.getAt(1); PSO = storage.getAt(2); colour1 = storage.getAt(3); colour2 = storage.getAt(4); colour3 = storage.getAt(5); MPS = MPS.toString(); MAType=(parseInt(MPS.substr(0,1),10))-1; slow=parseInt(MPS.substr(1,3),10); period=parseInt(MPS.substr(4,3),10); PWO = PWO.toString(); pen1=parseInt(PWO.substr(1,1),10); width1=parseInt(PWO.substr(2,1),10); overbought=parseInt(PWO.substr(3,2),10); oversold=parseInt(PWO.substr(5,2),10); PSO = PSO.toString(); pen2=(parseInt(PSO.substr(0,1),10))-1; width2=parseInt(PSO.substr(1,1),10); pen3=parseInt(PSO.substr(2,1),10); width3=parseInt(PSO.substr(3,1),10); signal=parseInt(PSO.substr(4,3),10); } if (status == Adding || status == Editing) { var dlg = new Dialog("Stochastic Oscilator", 285, 100); dlg.addOkButton(); dlg.addCancelButton(); dlg.addGroupBox(5,5,220,30,"Indicator Properties %K"); dlg.addIntEdit("INT1",8,15,-1,-1, "","periods",period,1,999); dlg.addColLinePicker("INT3",90,15,-1,-1,"","",colour1,pen1,width1); dlg.addIntEdit("INT2",185,15,-1,-1, "Slowing Periods","",slow,1,255); dlg.addGroupBox(5,35,220,30,"Signal Properties %D"); dlg.addIntEdit("INT4",8,45,-1,-1, "","periods",signal,1,999); dlg.addColLinePicker("INT5",90,45,-1,-1,"","",colour2,pen2,width2); dlg.addDropList("INT6",150,45,-1,-1, MAList, "Method","",MAType); dlg.addGroupBox(5,65,220,30,"Horizontal Line"); dlg.addIntEdit("INT7",8,75,-1,-1, "","Overbought level",overbought,1,99); dlg.addIntEdit("INT8",105,75,-1,-1, "","Oversold level",oversold,1,99); dlg.addColLinePicker("INT9",185,75,-1,-1,"","",colour3,pen3,width3); if (dlg.show() == Dialog.Cancel) return false; period = dlg.getValue("INT1"); slow = dlg.getValue("INT2"); signal = dlg.getValue("INT4"); overbought = dlg.getValue("INT7"); oversold = dlg.getValue("INT8"); MAType=dlg.getValue("INT6"); colour1 = dlg.getValue("INT3").colour; pen1 = dlg.getValue("INT3").pen; width1 = dlg.getValue("INT3").width; colour2 = dlg.getValue("INT5").colour; pen2 = dlg.getValue("INT5").pen; width2 = dlg.getValue("INT5").width; colour3 = dlg.getValue("INT9").colour; pen3 = dlg.getValue("INT9").pen; width3 = dlg.getValue("INT9").width; //MaTpye+period+slow stored in one value MPS=(MAType+1)*1000000+slow*1000+period; //Pen1,Width1,OB,OS PWO= 1000000+pen1*100000+width1*10000+overbought*100+oversold; //Pen2,Width2,Pen3,Width3,signal PSO = (pen2+1)*1000000+width2*100000+pen3*10000+width3*1000+signal; storage.setAt(0, MPS); storage.setAt(1, PWO); storage.setAt(2, PSO); storage.setAt(3, colour1); storage.setAt(4, colour2); storage.setAt(5, colour3); } setTitle(period+"("+slow+")%K "+signal+"%D Stochastic Osc."); setSeriesColour(0, colour1); setSeriesLineStyle(0, pen1, width1); setSeriesColour(1, colour2); setSeriesLineStyle(1, pen2, width2); setSeriesColour(2, colour3); setSeriesLineStyle(2, pen3, width3); setSeriesColour(3, colour3); setSeriesLineStyle(3, pen3, width3); setRange(Range.MinMax,0,100); } function getGraph(share, data) { var SOMain = new Array(); var SOSignal = new Array(); var OutputOB = new Array(); var OutputOS = new Array(); var SO1 = new StochOsc(period,slow,signal,MAType); for (var i=0;i