/********************************************************* Alexis C. Montenegro © January 2006 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(false); setStudyTitle("Klinger Volume Osc"); setCursorLabelName("KVO",0); setCursorLabelName("Signal",1); setDefaultBarFgColor(Color.blue, 0); setDefaultBarFgColor(Color.red, 1); setPlotType(PLOTTYPE_LINE,0); setPlotType(PLOTTYPE_LINE,1); setDefaultBarThickness(1,0); setDefaultBarThickness(1,1); var x=0; fpArray[x] = new FunctionParameter("Fast", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(1); setDefault(34); } fpArray[x] = new FunctionParameter("Slow", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(1); setDefault(55); } fpArray[x] = new FunctionParameter("Signal", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(1); setDefault(13); } 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("Params", FunctionParameter.BOOLEAN); with(fpArray[x++]){ setName("Show Parameters"); setDefault(false); } } var bInit = false var xKVO = null; var xSignal = null; function main(Fast,Slow,Signal,Symbol,Interval,Params){ if(bInit==false){ if(Symbol == null) Symbol = getSymbol(); if(Interval == null) Interval = getInterval(); var vSymbol = Symbol+","+Interval; xKVO = getSeries(efsInternal("calcKVO",Fast,Slow,sym(vSymbol))); xSignal = getSeries(ema(Signal,xKVO)); addBand(0, PS_SOLID, 1, Color.black,"0"); setShowTitleParameters(eval(Params)); bInit = true; } return new Array (xKVO,xSignal); } var xVForce = null; var xFastAvg = null; var xSlowAvg = null; function calcKVO(fast,slow,source){ if(xVForce==null) xVForce = efsInternal("calcVforce") if(xFastAvg==null) xFastAvg = ema(fast,xVForce); if(xSlowAvg==null) xSlowAvg = ema(slow,xVForce); var nFastAvg = xFastAvg.getValue(0); var nSlowAvg = xSlowAvg.getValue(0); if(nFastAvg==null||nSlowAvg==null) return; return (nFastAvg-nSlowAvg); } var xInit = false; var xHLC = null; var xHigh = null; var xLow = null; var xVol = null; var DM = 0; var DM_1 = 0; var CM = 0; var CM_1 = 0; var Trend = 0; var Trend_1 = 0; function calcVforce(){ if(xInit==false){ xHLC = hlc3(); xHigh = high(); xLow = low(); xVol = volume(); xInit = true; } if(getBarState()==BARSTATE_NEWBAR){ Trend_1 = Trend; DM_1 = DM; CM_1 = CM; } DM = xHigh.getValue(0)-xLow.getValue(0); var nVforce = 0; if(xHLC.getValue(0) > xHLC.getValue(-1)){ Trend = 1; }else{ Trend = -1; } if(Trend==Trend_1){ CM = CM_1 + DM; }else{ CM = DM_1 + DM; } if(CM != 0){ nVforce = xVol.getValue(0)*Math.abs(2*(DM/CM)-1)*Trend*100; } return nVforce; }