//@Name:KDJ Indicator //@Description: Draws the Stochastic Indicator but includes the divergence (%J) line. Otherwise known as the KDJ 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: Paul Hall, 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 colour4=Colour.LightGrey; 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); colour4 = storage.getAt(6); 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, 130); 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,"Divergence %J"); dlg.addText(15,78,100,10,"%J = 3*%K - 2*%D"); dlg.addColLinePicker("INT7",185,75,-1,-1,"line colour:","",colour3,pen3,width3); dlg.addGroupBox(5,95,220,30,"Horizontal Line"); dlg.addIntEdit("INT8",8,105,-1,-1, "","Overbought level",overbought,1,99); dlg.addIntEdit("INT9",105,105,-1,-1, "","Oversold level",oversold,1,99); dlg.addColPicker("INT10",185,105,-1,-1,"","",colour4); if (dlg.show() == Dialog.Cancel) return false; period = dlg.getValue("INT1"); slow = dlg.getValue("INT2"); signal = dlg.getValue("INT4"); overbought = dlg.getValue("INT8"); oversold = dlg.getValue("INT9"); 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("INT7").colour; pen3 = dlg.getValue("INT7").pen; width3 = dlg.getValue("INT7").width; colour4 = dlg.getValue("INT10"); //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); storage.setAt(6, colour4); } setTitle(period+"("+slow+")%K "+signal+"%D KDJ Indicator"); setSeriesColour(0, colour1); setSeriesLineStyle(0, pen1, width1); setSeriesColour(1, colour2); setSeriesLineStyle(1, pen2, width2); setSeriesColour(2, colour3); setSeriesLineStyle(2, pen3, width3); setSeriesColour(3, colour4); //setSeriesLineStyle(3, pen3, width3); setSeriesColour(4, colour4); //setSeriesLineStyle(4, pen3, width3); //setRange(Range.MinMax,0,100); } function getGraph(share, data) { var SOMain = new Array(); var SOSignal = new Array(); var SOJ = new Array(); var OutputOB = new Array(); var OutputOS = new Array(); var SO1 = new StochOsc(period,slow,signal,MAType); for (var i=0;i