/********************************************************* Alexis C. Montenegro © April 2005 Use and/or modify this code freely. If you redistribute it please include this and/or any other comment blocks and a description of any changes you make. **********************************************************/ function preMain() { setPriceStudy(true); setStudyTitle("StdevEnvelope3"); setCursorLabelName("Upper", 0); setCursorLabelName("Basis", 1); setCursorLabelName("Lower", 2); setDefaultBarStyle(PS_SOLID, 0); setDefaultBarStyle(PS_SOLID, 1); setDefaultBarStyle(PS_SOLID, 2); setDefaultBarFgColor(Color.blue, 0); setDefaultBarFgColor(Color.red, 1); setDefaultBarFgColor(Color.blue, 2); setDefaultBarThickness(1, 0); setDefaultBarThickness(1, 1); setDefaultBarThickness(1, 2); setPlotType(PLOTTYPE_LINE, 0); setPlotType(PLOTTYPE_LINE, 1); setPlotType(PLOTTYPE_LINE, 2); var fp1 = new FunctionParameter("Source", FunctionParameter.STRING); fp1.addOption("open"); fp1.addOption("high"); fp1.addOption("low"); fp1.addOption("close"); fp1.addOption("hl2"); fp1.addOption("hlc3"); fp1.addOption("ohlc4"); fp1.setDefault("close"); var fp2 = new FunctionParameter("Length", FunctionParameter.NUMBER); fp2.setLowerLimit(1); fp2.setDefault(20); var fp3 = new FunctionParameter("Constant", FunctionParameter.NUMBER); fp3.setLowerLimit(1); fp3.setDefault(2); var fp4 = new FunctionParameter("Interval", FunctionParameter.STRING); fp4.setDefault(); var fp5 = new FunctionParameter("Params", FunctionParameter.BOOLEAN); fp5.setName("Show Parameters"); fp5.setDefault(false); } var bInit=false; var xBandsBasis = null; var xBands = null; var xBandsUpper = null; var xBandsLower = null; function main(Source,Length,Constant,Interval,Params) { if(bInit==false){ if(Interval == null) Interval = getInterval(); xBandsBasis = getSeries(ema(3,ema(3,ema(3,middleDonchian(3,inv(Interval)))))); xBands = efsInternal("calcUpper",Length,Constant,xBandsBasis,eval(Source)(inv(Interval))); xBandsUpper = getSeries(xBands,0); xBandsLower = getSeries(xBands,1); setShowTitleParameters(eval(Params)); bInit=true; } return new Array (xBandsUpper,xBandsBasis,xBandsLower); } var xInit1 = false; var xStdDev = null; function calcUpper(xLength,xConstant,xBasis,xSource){ if(xInit1==false){ xStdDev = efsInternal("calcStdDev",xLength,xSource); xInit1=true; } var nBasis = xBasis.getValue(0); var nStdDev = xStdDev.getValue(0); if(nBasis==null||nStdDev==null) return; var xUpper = nBasis+nBasis*nStdDev*xConstant/Math.sqrt(261); var xLower = nBasis-nBasis*nStdDev*xConstant/Math.sqrt(261); return new Array (xUpper,xLower); } var nStdDev2 = 0; var nStdDev2_1 = 0; var nLogReturns = 0; var nLogReturns_1 = 0; function calcStdDev(_length,_source){ if(_source.getValue(-1)==null) return; Source = _source.getValue(0)/_source.getValue(-1); if(getBarState()==BARSTATE_NEWBAR){ nStdDev2_1=nStdDev2; nLogReturns_1=nLogReturns; } nLogReturns = Math.abs(Math.log(Source)); if(nStdDev2_1==0){ nStdDev2 = nLogReturns_1; }else{ nStdDev2 = nStdDev2_1 + ((2/(_length+1))*(nLogReturns*Math.sqrt(261) - nStdDev2_1)); } return nStdDev2; }