FVE (Volatility Modified)

ICE Data Services -

VolatilityModifiedFVE.efs                                                                           EFSLibrary - Discussion Board

File Name: VolatilityModifiedFVE.efs


Description:
FVE (Volatility Modified)

 

Formula Parameters:
Samples : 22
Perma : 40
Cintra : 0.1
Cinter : 0.1

 

Notes:
This is another version of FVE indicator that we have posted earlier
in this forum.
This version has an important enhancement to the previous one that`s
especially useful with intraday minute charts.
Due to the volatility had not been taken into account to avoid the extra
complication in the formula, the previous formula has some drawbacks:
The main drawback is that the constant cutoff coefficient will overestimate
price changes in minute charts and underestimate corresponding changes in
weekly or monthly charts.
And now the indicator uses adaptive cutoff coefficient which will adjust to
all time frames automatically.

 

Download File:
VolatilityModifiedFVE.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:        
    FVE (Volatility Modified)
    
Version:            1.0  05/26/2009
     
Formula Parameters:                     Default:
    Samples                             22
    Perma                               40
    Cintra                              0.1
    Cinter                              0.1
    
Notes:
    This is another version of FVE indicator that we have posted earlier 
    in this forum.
    This version has an important enhancement to the previous one that`s 
    especially useful with intraday minute charts.
    Due to the volatility had not been taken into account to avoid the extra 
    complication in the formula, the previous formula has some drawbacks:
    The main drawback is that the constant cutoff coefficient will overestimate 
    price changes in minute charts and underestimate corresponding changes in 
    weekly or monthly charts.
    And now the indicator uses adaptive cutoff coefficient which will adjust to 
    all time frames automatically.

**********************************/
var fpArray = new Array();
var bInit = false;

function preMain() {
    setStudyTitle("Volatility Finite Volume Elements");
    setCursorLabelName("FVI",0);
    setDefaultBarFgColor(Color.green,0);
    setCursorLabelName("FVI EMA",1);
    setDefaultBarFgColor(Color.blue,1);
    setDefaultBarThickness(2);
    addBand(0, PS_SOLID, 1, Color.black);
    var x = 0;
    fpArray[x] = new FunctionParameter("Samples", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(1);
        setDefault(22);
    }    
    var x = 0;
    fpArray[x] = new FunctionParameter("Perma", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(1);
        setDefault(40);
    }    
    var x = 0;
    fpArray[x] = new FunctionParameter("Cintra", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(0.001);
        setDefault(0.1);
    }    
    var x = 0;
    fpArray[x] = new FunctionParameter("Cinter", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(0.001);
        setDefault(0.1);
    }    
}

var xModVol = null;
var xModVolEMA = null;

function main(Samples, Perma, Cintra, Cinter){
var nBarState = getBarState();
var nModVol = 0;
var nModVolEMA = 0;
    if (nBarState == BARSTATE_ALLBARS) {
        if(Samples == null)	Samples = 22;
        if(Perma == null) Perma = 40;
        if(Cintra == null) Cintra = 0.1;
        if(Cinter == null) Cinter = 0.1;
    }    
	if (bInit == false)	{
        xModVol = efsInternal("Calc_ModVolatility", Samples, Perma, Cintra, Cinter);
        xModVolEMA = getSeries(xModVol, 1);
        bInit = true;
	}
    nModVol = xModVol.getValue(0);
    nModVolEMA = xModVolEMA.getValue(0);
    if (nModVolEMA == null) return;
	return new Array(nModVol, nModVolEMA);
}

var bSecondInit = false;
var xVolumePlusMinus = null;
var xVolume = null;
var xFVE = null;
var xEMAFVE = null;

function Calc_ModVolatility(Samples, Perma, Cintra, Cinter) {
var nRes = 0;
    if (bSecondInit == false) {
        xVolume = volume();
        xVolumePlusMinus = efsInternal("Calc_VolumePlusMinus", Samples, xVolume, Cintra, Cinter);
        xFVE = efsInternal("Calc_FVE", Samples, xVolumePlusMinus, xVolume);
        xEMAFVE = ema(Perma, xFVE);
        bSecondInit = true;
    }
	nFVE = xFVE.getValue(0); 
	nEMA = xEMAFVE.getValue(0);
	if (nEMA == null) return;
    return new Array(nFVE, nEMA);
}

function Calc_FVE(Samples, xVolumePlusMinus, xVolume) {
var nRes = 0;
var Fvesum = 0;
var VolSum = 0;
var i = 0;
	for(i = 0; i < Samples; i++) {
		Fvesum += xVolumePlusMinus.getValue(-i);
		VolSum += xVolume.getValue(-i);
	}
	nRes = (Fvesum / VolSum) * 100;
    return nRes;
}

var bThridInit = false;
var xClose = null;
var xhlc3 = null;
var xhl2 = null;
var xIntra = null;
var xInter = null;
var xStDevIntra = null;
var xStDevInter = null;

function Calc_VolumePlusMinus(Samples, xVolume, Cintra, Cinter) {
var nRes = 0;
var	TP = 0;
var	TP1 = 0;
var	Intra = 0;
var	Vintra = 0;
var	Inter = 0;
var	Vinter = 0;
var	CutOff = 0;	
var	MF = 0;
    if (bThridInit == false) {
        xClose = close();
        xhlc3 = hlc3();
        xhl2 = hl2();
        xIntra = efsInternal("Calc_Intra", xhlc3);
        xInter = getSeries(xIntra, 1);
        xStDevIntra = efsInternal("Calc_StdDev", Samples, sma(Samples, xIntra), xIntra);
        xStDevInter = efsInternal("Calc_StdDev", Samples, sma(Samples, xInter), xInter);    
        bThridInit = true;
    }
	TP = xhlc3.getValue(0);
	TP1 = xhlc3.getValue(-1);
	Intra = xIntra.getValue(0);
	Vintra = xStDevIntra.getValue(0);
	Inter = xInter.getValue(0);
	Vinter = xStDevInter.getValue(0);
	CutOff = Cintra * Vintra + Cinter * Vinter;	
	MF = xClose.getValue(0) - xhl2.getValue(0) + TP - TP1;
	if(MF > CutOff * xClose.getValue(0))
		FveFactor = 1;
	else if(MF < -1 * CutOff * xClose.getValue(0))
		FveFactor = -1;
	else
		FveFactor = 0;
	
	nRes = xVolume.getValue(0) * FveFactor;
    return nRes;
}

function Calc_Intra(xhlc3) {
var nResIntra = 0;
var nResInter = 0;
    if (xhlc3.getValue(-1) == null) return;
    nResIntra = Math.log(high(0)) - Math.log(low(0));
    nResInter = Math.log(xhlc3.getValue(0)) - Math.log(xhlc3.getValue(-1));
    return new Array(nResIntra, nResInter);
}

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