/********************************************************* Alexis C. Montenegro © June 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. **********************************************************/ var fpArray = new Array(); function preMain() { setPriceStudy(true); setStudyTitle("Keltner Channel"); setCursorLabelName("Upper", 0); setCursorLabelName("Basis", 1); setCursorLabelName("Lower", 2); setDefaultBarFgColor(Color.blue, 0); setDefaultBarFgColor(Color.red, 1); setDefaultBarFgColor(Color.blue, 2); setPlotType(PLOTTYPE_LINE,0); setPlotType(PLOTTYPE_LINE,1); setPlotType(PLOTTYPE_LINE,2); setDefaultBarThickness(1,0); setDefaultBarThickness(1,1); setDefaultBarThickness(1,2); var x=0; fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(1); setDefault(10); } fpArray[x] = new FunctionParameter("Multiplier", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0); setDefault(2); } fpArray[x] = new FunctionParameter("Source", FunctionParameter.STRING); with(fpArray[x++]){ addOption("open"); addOption("high"); addOption("low"); addOption("close"); addOption("hl2"); addOption("hlc3"); addOption("ohlc4"); setDefault("close"); } fpArray[x] = new FunctionParameter("Type", FunctionParameter.BOOLEAN); with(fpArray[x++]){ setName("Exponential"); setDefault(false); } fpArray[x] = new FunctionParameter("Symbol", FunctionParameter.STRING); with(fpArray[x++]){ setDefault(); } fpArray[x] = new FunctionParameter("Interval", FunctionParameter.STRING); with(fpArray[x++]){ setDefault(); } fpArray[x] = new FunctionParameter("Offset", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0); setDefault(0); } fpArray[x] = new FunctionParameter("LineColor1", FunctionParameter.COLOR); with(fpArray[x++]){ setName("Channel Color"); setDefault(Color.blue); } fpArray[x] = new FunctionParameter("LineColor2", FunctionParameter.COLOR); with(fpArray[x++]){ setName("Basis Color"); setDefault(Color.red); } fpArray[x] = new FunctionParameter("Params", FunctionParameter.BOOLEAN); with(fpArray[x++]){ setName("Show Parameters"); setDefault(false); } } var bInit = false; var vSymbol = null; var xKeltner = null; var xKeltnerBasis = null; var xKeltnerUpper = null; var xKeltnerLower = null; function main(Length,Multiplier,Type,Source,Symbol,Interval,Offset,LineColor1,LineColor2,Params) { if(bInit == false){ if(Symbol == null) Symbol = getSymbol(); if(Interval == null) Interval = getInterval(); vSymbol = Symbol+","+Interval; Type==false?Type=0:Type=1; xKeltner = efsInternal("calcKeltner",Type,Length,Multiplier,Offset,eval(Source),sym(vSymbol)); xKeltnerUpper = getSeries(xKeltner,0); xKeltnerBasis = getSeries(xKeltner,1); xKeltnerLower = getSeries(xKeltner,2); setDefaultBarFgColor(LineColor1,0); setDefaultBarFgColor(LineColor2,1); setDefaultBarFgColor(LineColor1,2); setShowTitleParameters(eval(Params)); bInit = true; } return new Array (xKeltnerUpper,xKeltnerBasis,xKeltnerLower); } var xInit = false; var Avg = null; function calcKeltner(type,length,multiplier,offset,source,series){ if(xInit==false){ if(type==0){ Avg = offsetSeries(sma(length,source()),offset); }else if(type==1){ Avg = offsetSeries(ema(length,source()),offset); } xInit=true; } var AvgRange = 0; for(var i = 0; i < length; i++) { AvgRange += high(-(i+offset)) - low(-(i+offset)); } AvgRange /= length; var Basis = Avg.getValue(0); var Upper = Basis+(AvgRange*multiplier); var Lower = Basis-(AvgRange*multiplier); return new Array (Upper,Basis,Lower); }