//@Name:Bollinger Band Value //@Description:Returns the value of the upper or lower Bollinger Band. //@Returns:Number //@Width:90 // coded by: Paul Hall, ShareScope Support var maPeriod = 20; // Bollinger Band's MA Period var maType = 0; // MA type var stdDev = 2; // Number of standard deviations var lookback = 0; var useIntra = 0; var outputList = ["Upper band","Lower band"]; var outputChoice = 0; var maList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA","TEMA"]; var maTitleList = ["SMA","EMA","WMA","TMA","VVHF","VCMO","VIDYA","TEMA"]; var dataType = 15; var dataList = ["1m","2m","2.5m","3m","4m","5m","6m","10m","15m","20m","30m","1h","2h","3h","4h","Daily","Weekly","Monthly"]; var dataList2 = ["1m","2m","2.5m","3m","4m","5m","6m","10m","15m","20m","30m","1h","2h","3h","4h","D","W","M"]; function init(status) { if (status == Loading || status == Editing) { maPeriod = storage.getAt(0); maType = storage.getAt(1); stdDev = storage.getAt(2); lookback = storage.getAt(3); outputChoice = storage.getAt(4); dataType = storage.getAt(5); useIntra = storage.getAt(6); } if (status == Adding || status == Editing) { dlg = new Dialog("Bollinger Band values", 270, 100); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("VAL1",40,60,25,-1,"MA:","",maPeriod,2,1000); dlg.addDropList("VAL2",75,60,-1,-1,maList,"","",maType); dlg.addNumEdit("VAL3",40,78,25,-1,"","devs",stdDev,0.1,5.0); dlg.addIntEdit("VAL4",145,5,20,-1,"","bars ago",lookback,0,1000); dlg.addDropList("VAL5",75,5,-1,-1,outputList,"Return value of the:","",outputChoice); dlg.addDropList("VAL6",75,23,-1,-1,dataList,"bar size:","",dataType); dlg.addTickBox("VAL7",145,23,60,-1,"inc. intraday",useIntra); dlg.addGroupBox(5,45,150,50,"Bollinger Band properties"); if (dlg.show()==Dialog.Cancel) return false; maPeriod = dlg.getValue("VAL1"); maType = dlg.getValue("VAL2"); stdDev = dlg.getValue("VAL3"); lookback = dlg.getValue("VAL4"); outputChoice = dlg.getValue("VAL5"); dataType = dlg.getValue("VAL6"); useIntra = dlg.getValue("VAL7"); storage.setAt(0, maPeriod); storage.setAt(1, maType); storage.setAt(2, stdDev); storage.setAt(3, lookback); storage.setAt(4, outputChoice); storage.setAt(5, dataType); storage.setAt(6, useIntra); } setTitle(outputList[outputChoice]+" (lookback:"+lookback+") B("+maPeriod+maTitleList[maType]+","+stdDev+") ("+dataList2[dataType]+")"); } function getVal(share) { var data = new Array; data = getData(share,dataType,useIntra); if(data.length=0;i--) { tempData = share.getIBarArray(i,dataPeriod*60); if (tempData==undefined || tempData.length<1) continue; data = data.concat(share.getIBarArray(i,dataPeriod*60)); } if (data==undefined || data[0]==undefined || data.length<2) return []; } else if (dataType==15 && useIntra==0) var data = share.getPriceArray(); else if (dataType==16 && useIntra==0) var data = share.getWeeklyBarArray(); else if (dataType==17 && useIntra==0) var data = share.getMonthlyBarArray(); //daily else if (dataType==15 && useIntra==1) { var data = share.getPriceArray(); 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()) { data[data.length]={ open:idata[0].open, high:idata[0].high, low:idata[0].low, close:(share.getIClose()==null?share.getIMid():share.getIClose()), volume:idata[0].volume, dateNum:idata[0].dateNum}; } } //weekly else if (dataType==16 && useIntra==1) { var data = share.getWeeklyBarArray(); 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()) { if (idata[0].date.getDay()data[data.length-1].high?idata[0].high:data[data.length-1].high), low:(idata[0].lowdata[data.length-1].high?idata[0].high:data[data.length-1].high), low:(idata[0].lowtempData[tempData.length-1].high?idata[0].high:tempData[tempData.length-1].high), low:(idata[0].lowdata[data.length-1].high?tempData[i].high:data[data.length-1].high), low:(tempData[i].low