Relative Volatility Index (RVI)

ICE Data Services -

RVI.efs  
EFSLibrary - Discussion Board  

File Name: RVI.efs

Description:
Relative Volatility Index (RVI)

Formula Parameters:

  • Period : 10
  • UpperBand : 80
  • LowerBand : 20

Notes:

The RVI is a modified form of the relative strength index (RSI).
The original RSI calculation separates one-day net changes into positive closes and negative closes, then smoothes the data and normalizes the ratio on a scale of zero to 100 as the basis for the formula. The RVI uses the same basic formula but substitutes the 10-day standard deviation of the closing prices for either the up close or the down close. The goal is to create an indicator that measures the general direction of volatility. The volatility is being measured by the 10-days standard deviation of the closing prices.

Download File:
RVI.efs


EFS Code:

/*********************************
Provided By:  
    eSignal (Copyright c eSignal), a division of Interactive Data 
    Corporation. 2009. All rights reserved. This sample eSignal 
    Formula Script (EFS) is for educational purposes only and may be 
    modified and saved under a new file name.  eSignal is not responsible
    for the functionality once modified.  eSignal reserves the right 
    to modify and overwrite this EFS file with each new release.

Description:        
    Relative Volatility Index 
    
Version:            1.0  05/21/2009
     
Formula Parameters:                     Default:
    Period                              10
    UpperBand                           80
    LowerBand                           20
    
Notes:
    The RVI is a modified form of the relative strength index (RSI). 
    The original RSI calculation separates one-day net changes into 
    positive closes and negative closes, then smoothes the data and 
    normalizes the ratio on a scale of zero to 100 as the basis for the 
    formula. The RVI uses the same basic formula but substitutes the 
    10-day standard deviation of the closing prices for either the up 
    close or the down close. The goal is to create an indicator that 
    measures the general direction of volatility. The volatility is 
    being measured by the 10-days standard deviation of the closing prices. 
**********************************/
var fpArray = new Array();
var bInit = false;

function preMain() {
    setStudyTitle("Relative Volitility Index");
    setCursorLabelName("RVI",0);
    setDefaultBarFgColor(Color.red,0);
	setStudyMin(-1);
	setStudyMax(101);
    var x = 0;
    fpArray[x] = new FunctionParameter("Period", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(1);
        setDefault(10);
    }    
    fpArray[x] = new FunctionParameter("UpperBand", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setName("Upper Band");
        setLowerLimit(1);
        setDefault(80);
    }    
    fpArray[x] = new FunctionParameter("LowerBand", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setName("Lower Band");
        setLowerLimit(1);
        setDefault(20);
    }    
}

var xRVI = null;

function main(Period, UpperBand, LowerBand) {
var nBarState = getBarState();
var nRVI = 0;
    if (nBarState == BARSTATE_ALLBARS) {
        if(Period == null) Period = 10;
    }    
    if (bInit == false) {
        addBand(LowerBand, PS_SOLID, 1, Color.red, "Lower Band");
        addBand(UpperBand, PS_SOLID, 1, Color.green, "Upper Band");
        xRVI = efsInternal("Calc_RVI", Period);
        bInit = true;
    }
    nRVI = xRVI.getValue(0);
    if (nRVI == null) return;
	return nRVI;
}

var bSecondInit = false;
var xStdDev = null;
var xClose = null;
var nU1 = 0;
var nD1 = 0;
var nU = 0;
var nD = 0;

function Calc_RVI(nPeriod) {
var nRes = 0;
var u = 0;
var d = 0;
    if (bSecondInit == false) {
        xClose = close();
        xStdDev = efsInternal("Calc_StdDev", nPeriod, sma(nPeriod), xClose);
        bSecondInit = true;
    }
    if (xStdDev.getValue(0) == null) return;
	if (getBarState() == BARSTATE_NEWBAR){
		nU1 = nU;
		nD1 = nD;
	}
	if(xClose.getValue(0) > xClose.getValue(-1)) {
		u = xStdDev.getValue(0);
		d = 0;
	} else {
		d = xStdDev.getValue(0);
		u = 0;
	}
	nU = (13 * nU1 + u) / 14;
	nD = (13 * nD1 + d) / 14;
	nRes = 100 * nU / (nU + nD);
    return nRes;
}

function Calc_StdDev(nPeriod, xMA, xClose) {
var StdDev = 0;
var SumSqr = 0;
var counter = 0;
	if(xMA.getValue(0) == null) return;
	for(counter = 0; counter < nPeriod; counter++)
		SumSqr += Math.pow((xClose.getValue(-counter) - xMA.getValue(0)), 2);
	StdDev = Math.sqrt(SumSqr / nPeriod);
    return StdDev;
}