VIDYA (StdDev)

ICE Data Services -

VIDYA.efs  
EFSLibrary - Discussion Board  

File Name: VIDYA.efs

Description:
Indicator - VIDYA (StdDev)

Formula Parameters:

  • Length: 21
  • Price: Close
  • Alpha: 0.02

Notes:
This indicator plots volatility adjusted length exponential MA based on standard deviation of prices as a measure of volatility. It is dynamic, not static indicator: a variable-length moving average, which adapts to the volatility in question by exponentially smoothing data based on standard deviation.

Download File:
VIDYA.efs


EFS Code:

/*********************************
Provided By:  
    eSignal (Copyright c eSignal), a division of Interactive Data 
    Corporation. 2008. 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:        
   Indicator - VIDYA (StdDev) 

Version:            1.0  09/26/2008

Notes:
    This indicator plots volatility adjusted length exponential MA based
    on standard deviation of prices as a measure of volatility. It is dynamic,
    not static indicator: a variable-length moving average, which adapts to the
    volatility in question by exponentially smoothing data based on standard deviation. 
    
Formula Parameters:                     Default:
    Length                                21
    Price                                Close
    Alpha                                0.02

**********************************/

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

function preMain()
{
    setPriceStudy(true);
    setStudyTitle("VIDYA (StdDev)");
    setCursorLabelName("VIDYA");
    
    var x=0;
    fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);
	with(fpArray[x++]){
        setLowerLimit(1);		
        setDefault(20);
    }

    fpArray[x] = new FunctionParameter("Price", FunctionParameter.STRING);
    with(fpArray[x++]){
        setName("Price Data To Use");
        addOption("open"); 
        addOption("high");
        addOption("low");
        addOption("close");
        addOption("hl2");
        addOption("hlc3");
        addOption("ohlc4"); 
        setDefault("close"); 
    }


    fpArray[x] = new FunctionParameter("Alpha", FunctionParameter.NUMBER);
	with(fpArray[x++]){
        setLowerLimit(0.01);		
        setDefault(0.2);
    }
    
    
}

var xMyPrice = null;
var xStdDev = null;
var xStdDevAvg = null;

function main(Alpha, Price, Length) {
var nState = getBarState();
var nRef = ref(-1);
var nStdDevVidya = 0;
var nStdDev = 0;
var nStdDevAvg = 0;
var nPrice = 0;
var nResult = 0;
var nBarCount = getCurrentBarCount();


    if (nState == BARSTATE_ALLBARS) {
        if (Alpha == null) Alpha = 0.2;
        if (Price == null) Price = "close";
        if (Length == null) Length = 20;
    }    


    if ( bInit == false ) { 
        xMyPrice = eval(Price)();
        xStdDev = efsInternal("StdDev", xMyPrice, Length); 
        xStdDevAvg = sma(Length, xStdDev);
        bInit = true; 
    } 


    if (nRef == null) nRef = 1;

    nStdDev = xStdDev.getValue(0);
    nStdDevAvg = xStdDevAvg.getValue(0);
    nPrice = xMyPrice.getValue(0);


    if(nBarCount>Length)
        nStdDevVidya = (Alpha * (nStdDev / nStdDevAvg) * nPrice) +
            ((1 - (Alpha * (nStdDev / nStdDevAvg))) * nRef);
    else if (nBarCount==Length) nStdDevVidya = nPrice;
        else return;

    return nStdDevVidya;
}



function StdDev(DataArray ,Period) {
var sum = 0;
var avg = 0;
var res = 0;
  
    if (getCurrentBarCount() < Period) return DataArray.getValue(0);
 
    for (var barsBack = Period-1; barsBack >= 0; barsBack--) {
        sum += DataArray.getValue(barsBack*(-1));
    }

    avg = sum / Period;
    sum = 0;

    for (var barsBack = Period - 1; barsBack >= 0; barsBack--) {
        sum += (DataArray.getValue(barsBack*(-1))-avg)*(DataArray.getValue(barsBack*(-1))-avg);
    }

    res = Math.sqrt(sum / Period);

 
    return res; 
}