//@Name:Special MACD //@Description:Resturns the latest value of the "Special MACD", a MACD based on two fully editable MAs //@Returns:Number //@Width:80 //@Update:Periodic, 30 //@Env:Production // 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 outputList = ["MACD","Signal","Histogram"]; var outputType = 0; var maList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA","TEMA","Hull"]; var maTitleList = ["SMA","EMA","WMA","TMA","VVHF","VCMO","VIDYA","TEMA","HMA"]; var dataList = ["Open","High","Low","Close","Typical","Median","Weighted","HeikenAshi"]; var usePerc = 0; function init(status) { if (status == Loading || status == Editing) { MAtype1 = storage.getAt(0); var1 = storage.getAt(1); MAtype2 = storage.getAt(2); var2 = storage.getAt(3); MAtype3 = storage.getAt(4); var3 = storage.getAt(5); dataType1 = Math.floor(storage.getAt(6)/10); dataType2 = storage.getAt(6)%10; outputType = Math.floor(storage.getAt(7)/10); usePerc = storage.getAt(7)%10; } if (status == Adding || status == Editing) { dlg = new Dialog("Settings...",260,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.addDropList("DL3",135,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",135,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.addDropList("DL6",35,68,80,-1,outputList,"Output","",outputType); 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"); MAtype2 = dlg.getValue("DL2"); var2 = dlg.getValue("INT2"); dataType1 = dlg.getValue("DL3"); dataType2 = dlg.getValue("DL4"); MAtype3 = dlg.getValue("DL5"); var3 = dlg.getValue("INT3"); outputType = dlg.getValue("DL6"); usePerc = dlg.getValue("TB1"); 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, dataType1*10+dataType2); storage.setAt(7, outputType*10+usePerc); } 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]); } function getVal(share) { var data = share.getPriceArray(var2*6); if (data.length<2) return; var idata = share.getIBarArray(0,86400); if (idata!=undefined && idata.length==1 && new Date().getDate()==idata[0].date.getDate() && new Date().getDate()!=data[data.length-1].date.getDate()) { var tclose = share.getIClose(); var topen = share.getIOpen(); data[data.length]={open:(topen==null?idata[0].open:topen),high:idata[0].high,low:idata[0].low,close:(tclose==null?share.getIMid():tclose),volume:idata[0].volume}; } var line1 = new Array(); var line2 = new Array(); 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