Demand Index - tweaked

ICE Data Services -

DemandIndex.efs  
EFSLibrary - Discussion Board  

File Name: DemandIndex.efs

Description:
Demand Index - tweaked

Formula Parameters:

  • Length: 5

Notes:
The Demand Index, developed by James Sibbet, combines price and volume in such a way that it is often a leading indicator of price change. The Demand Index calculations are too complex, however, for this text. The calculations require 21-column accounting paper to calculate manually.

Download File:
DemandIndex.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:        
   Demand Index - tweaked

Version:            1.0  11/10/2008

Formula Parameters:                     Default:
    Length                               5

Notes:
    The Demand Index, developed by James Sibbet, combines price and volume
    in such a way that it is often a leading indicator of price change. 
    The Demand Index calculations are too complex, however, for this text. 
    The calculations require 21-column accounting paper to calculate manually.    

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

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

function preMain()
{
    setStudyTitle("Demand Index - tweaked");
    setCursorLabelName("Demand Index", 0);
    setDefaultBarFgColor(Color.blue, 0);
    addBand(0, PS_SOLID, 1, Color.black);
    
    var x=0;
    fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);
	with(fpArray[x++]){
        setLowerLimit(1);		
        setDefault(5);
    }
}

var xTR = null;
var xAvgTR = null;

var nBuyPres_1 = 1;
var nSellPres_1 = 1;
var nSellPres = 1;
var nBuyPres = 1;
var nVolAvg_1 = 0;
var nVolAvg = 0;
var nWghtClose_1 = 0;
var nWghtClose = 0;

function main(Length) {
var nWtCRatio = 1;
var nVolRatio = 1;
var nBuyP = 1;
var nSellP = 1;
var nSign = 1;
var nConstant = 1;
var nTempDI = 1;
var nDMI = 1;
var nState = getBarState();
   
    if (nState == BARSTATE_ALLBARS) {
        if(Length == null)	Length = 5;
	}
	
    if (nState == BARSTATE_NEWBAR) {
        nBuyPres_1 = nBuyPres;
        nSellPres_1 = nSellPres;
        nVolAvg_1 = nVolAvg;
        nWghtClose_1 = nWghtClose;
	}

    if ( bInit == false ) { 
        xTR = efsInternal("TrueRange");
        xAvgTR = sma(Length, xTR);
        bInit = true; 
    } 

    if (getCurrentBarCount() < Length) return;

	nWghtClose = (high(0) + low(0) + 2 * close(0)) * 0.25;

    nVolAvg = ((nVolAvg_1 * (Length - 1)) + volume(0)) / Length;

	if (nWghtClose != 0 && nWghtClose_1 != 0) {
		nWtCRatio = (nWghtClose - nWghtClose_1) / Math.min(nWghtClose, nWghtClose_1); 
       	nVolRatio = volume(0) /  nVolAvg;
       	nConstant = ((nWghtClose * 3) / xAvgTR.getValue(0)) * Math.abs(nWtCRatio); 
		if(nConstant > 88)
			nConstant = 88;
		nConstant = nVolRatio / Math.exp(nConstant);
       	if(nWtCRatio > 0){
            nBuyP = nVolRatio; 
       	    nSellP = nConstant; 
       	} else {
            nBuyP = nConstant; 
      	    nSellP = nVolRatio; 
       	}
		nBuyPres = ((nBuyPres_1 * (Length - 1)) + nBuyP) / Length; 
       	nSellPres = ((nSellPres_1 * (Length - 1)) + nSellP) / Length; 
		nTempDI = +1; 
       	if(nSellPres  > nBuyPres){
            nSign  =  -1; 
       	    if(nSellPres != 0)
      	    	nTempDI = nBuyPres / nSellPres; 
        } else {
            nSign  =  +1; 
          	if(nBuyPres != 0)
           	  	nTempDI = nSellPres / nBuyPres; 
        }
		nTempDI = nTempDI * nSign; 
        if(nTempDI < 0)
	        nDMI = -1 - nTempDI; 
        else 
          	nDMI = +1 - nTempDI; 
	}
	
    return nDMI; 
}

function TrueRange(){
    return Math.max((high(0)-low(0)),Math.abs(close(-1)-high(0)),Math.abs(close(-1)-low(0)));
}