//@Name:Special MACD //@Description:A MACD based on two fully editable MAs //@Returns:Number //@Width:80 // 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 MAtype1 = 0; var MAtype2 = 0; var MAtype3 = 0; var var1 = 10; var var2 = 20; var var3 = 9; var dataType1 = 3; var dataType2 = 3; var indCol1 = Colour.Magenta; var indStyle1 = 0; var indWidth1 = 1; var indCol2 = Colour.Magenta; var indStyle2 = 1; var indWidth2 = 0; var indCol3 = Colour.DarkGreen; var indCol4 = Colour.DarkRed; var outputList = ["MACD","MACD+signal","MACD+signal+histogram","Histogram","Signal only"]; var outputType = 0; var maList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA","TEMA","Hull","Vol.Weighted"]; var maTitleList = ["SMA","EMA","WMA","TMA","VVHF","VCMO","VIDYA","TEMA","HMA","VWMA"]; var dataList = ["Open","High","Low","Close","Typical","Median","Weighted","HeikenAshi","Volume"]; var usePerc = 0; function init(status) { if (status == Loading || status == Editing) { var F = new File(); F.open("/output/specialMACD.cfg",File.ReadMode); indCol1 = F.readLine(); indStyle1 = F.readLine(); indWidth1 = F.readLine(); dataType1 = F.readLine(); dataType2 = F.readLine(); indCol2 = F.readLine(); indStyle2 = F.readLine(); indWidth2 = F.readLine(); indCol3 = F.readLine(); indCol4 = F.readLine(); F.close(); MAtype1 = storage.getAt(0); var1 = storage.getAt(1); MAtype2 = storage.getAt(2); var2 = storage.getAt(3); MAtype3 = storage.getAt(4); var3 = storage.getAt(5); outputType = storage.getAt(6); usePerc = storage.getAt(7); } if (status == Adding || status == Editing) { dlg = new Dialog("Settings...",280,110); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",8,5,80,-1,maList,"","",MAtype1); dlg.addIntEdit("INT1",95,5,-1,-1,"","",var1,2,1000); dlg.addColLinePicker("CL1",135,5,-1,-1,"","",indCol1,indStyle1,indWidth1); dlg.addDropList("DL3",175,5,40,-1,dataList,"","",dataType1); dlg.addDropList("DL2",8,23,80,-1,maList,"","",MAtype2); dlg.addIntEdit("INT2",95,23,-1,-1,"","",var2,3,1000); dlg.addDropList("DL4",175,23,40,-1,dataList,"","",dataType2); dlg.addDropList("DL5",8,41,80,-1,maList,"","",MAtype3); dlg.addIntEdit("INT3",95,41,-1,-1,"","",var3,3,1000); dlg.addColLinePicker("CL2",135,41,-1,-1,""," MACD Signal",indCol2,indStyle2,indWidth2); dlg.addDropList("DL6",35,68,80,-1,outputList,"Output","",outputType); dlg.addColPicker("CL3",135,60,-1,-1,"","Pos histogram",indCol3); dlg.addColPicker("CL4",135,75,-1,-1,"","Neg histogram",indCol4); dlg.addTickBox("TB1",8,92,230,-1,"Calculate MACD as a % difference instead of an absolute difference",usePerc); if (dlg.show()==Dialog.Cancel) return false; MAtype1 = dlg.getValue("DL1"); var1 = dlg.getValue("INT1"); indCol1 = dlg.getValue("CL1").colour; indStyle1 = dlg.getValue("CL1").pen; indWidth1 = dlg.getValue("CL1").width; MAtype2 = dlg.getValue("DL2"); var2 = dlg.getValue("INT2"); dataType1 = dlg.getValue("DL3"); dataType2 = dlg.getValue("DL4"); MAtype3 = dlg.getValue("DL5"); var3 = dlg.getValue("INT3"); indCol2 = dlg.getValue("CL2").colour; indStyle2 = dlg.getValue("CL2").pen; indWidth2 = dlg.getValue("CL2").width; outputType = dlg.getValue("DL6"); indCol3 = dlg.getValue("CL3"); indCol4 = dlg.getValue("CL4"); usePerc = dlg.getValue("TB1"); var F = new File(); F.open("/output/specialMACD.cfg",File.WriteMode); F.writeLine(indCol1); F.writeLine(indStyle1); F.writeLine(indWidth1); F.writeLine(dataType1); F.writeLine(dataType2); F.writeLine(indCol2); F.writeLine(indStyle2); F.writeLine(indWidth2); F.writeLine(indCol3); F.writeLine(indCol4); F.close(); storage.setAt(0, MAtype1); storage.setAt(1, var1); storage.setAt(2, MAtype2); storage.setAt(3, var2); storage.setAt(4, MAtype3); storage.setAt(5, var3); storage.setAt(6, outputType); storage.setAt(7, usePerc); } if (outputType<3) { setSeriesColour(0,indCol1); setSeriesLineStyle(0,indStyle1,indWidth1); setSeriesColour(1,indCol2); setSeriesLineStyle(1,indStyle2,indWidth2); setSeriesChartType(2,ChartType.Histogram); setSeriesColourMode(2,ColourMode.PosNeg); setSeriesColour(2,indCol3,indCol4); } else if (outputType==3) { setSeriesChartType(0,ChartType.Histogram); setSeriesColourMode(0,ColourMode.PosNeg); setSeriesColour(0,indCol3,indCol4); } else if (outputType==4) { setSeriesColour(0,indCol2); setSeriesLineStyle(0,indStyle2,indWidth2); } setHorizontalLine(0); if (outputType==0) setTitle("MACD"+(usePerc?"%":"")+" ("+var1+" "+maTitleList[MAtype1]+", "+var2+" "+maTitleList[MAtype2]+")"); else setTitle("MACD"+(usePerc?"%":"")+" ("+var1+" "+maTitleList[MAtype1]+", "+var2+" "+maTitleList[MAtype2]+", "+var3+" "+maTitleList[MAtype3]+" signal)"); } function getGraph(share, data) { var line1 = new Array(); var line2 = new Array(); //calculate the first ma if (MAtype1 == 8) { var sqrtperiod1 = Math.round(Math.sqrt(var1)); var ma1 = new MA(var1/2, MA.Weighted); var ma2 = new MA(var1, MA.Weighted); var ma3 = new MA(sqrtperiod1, MA.Weighted); for (var i=0; i