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:
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:
PHP 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)));
}