J TPO Velocity

ICE Data Services -

J_TPO_Velocity.efs  
EFSLibrary - Discussion Board  

File Name: J_TPO_Velocity.efs

Description:
J TPO Velocity

Formula Parameters:

  • Length : 14
  • Point : 0.01

Notes:
J_TPO is in its original form, an oscillator between -1 and +1, a nonparametric statistic quantifying how well the prices are ordered in consecutive ups (+1) or downs (-1) or intermediate cases in between.

Download File:
J_TPO_Velocity.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:        
    J TPO Velocity
    
Version:            1.0  10/29/2009
 
Formula Parameters:                     Default:
    Length                              14
    Point                               0.01
    
Notes:
    J_TPO is in its original form, an oscillator between -1 and +1,                  
    a nonparametric statistic quantifying how well the prices are ordered            
    in consecutive ups (+1) or downs (-1) or intermediate cases in between.          
    
**********************************/
var fpArray = new Array();
var bInit = false;

function preMain(){
    setPriceStudy(false);
    setShowCursorLabel(true);
    setShowTitleParameters(false);
    setStudyTitle("J TPO Velocity");
    setCursorLabelName("JTPOVelocity", 0);
    setPlotType(PLOTTYPE_LINE, 0);
    setDefaultBarFgColor(Color.blue, 0);
    var x = 0;
    fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(1);
        setDefault(14);
    }    
    fpArray[x] = new FunctionParameter("Point", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setLowerLimit(0);
        setDefault(0.01);
    }            
}

var xJTPOV = null;

function main(Length, Point) {
var nBarState = getBarState();
var nJTPOV = 0;
    if (nBarState == BARSTATE_ALLBARS) {
        if(Length == null) Length = 14;
        if(Point == null) Point = 0.01;
	}
	if (bInit == false) {
        addBand(0, PS_SOLID, 1, Color.black, "Zero");	
        xJTPOV = efsInternal("Calc_xJTPOV", Length, Point);
        bInit = true;
	}
	nJTPOV = xJTPOV.getValue(0);
	if (nJTPOV == null) return;
    return nJTPOV;
}

var bSecondInit = false;
var xRange = null;
var xTPO = null;

function Calc_xJTPOV(Length, Point) {
var nRes = 0;
var nRange = 0;
var nTPO = 0;
    if (bSecondInit == false) {
        xRange = efsInternal("Calc_Range", Length, Point);
        xTPO = efsInternal("Calc_TPO", Length);
        bSecondInit = true;
    }
    nRange = xRange.getValue(0);
    nTPO = xTPO.getValue(0);
    if (nRange == null || nTPO == null) return;
    nRes = nTPO * nRange / Length;
    return nRes;
}

var bThirdInit = false;
var xHighest = null;
var xLowest = null;

function Calc_Range(Length, Point) {
var nRes = 0;
var nHighest = 0;
var nLowest = 0;
    if (bThirdInit == false) {
        xHighest = upperDonchian(Length, high());
        xLowest = lowerDonchian(Length, low());
        bThirdInit = true;
    }
    nHighest = xHighest.getValue(0);
    nLowest = xLowest.getValue(0);
    if (nHighest == null || nLowest == null) return;
    nRes = (nHighest - nLowest) / Point;
    return nRes;
}

var bFourInit = false;
var xClose = null;

function Calc_TPO(Length) {
var nRes = 0;
var normalization = 0;
var Lenp1half = 0;
var accum = 0;
var tmp = 0;
var maxval = 0;
var j = 0;
var maxloc = 0;
var m = 0;
var n = 0;
var arr1 = new Array();
var arr2 = new Array();
var arr3 = new Array();
var flag = false;
    if (bFourInit == false) {
        xClose = close();
        bFourInit = true;
    }
    if (xClose.getValue(-Length) == null) return;
    accum = 0;
    for(m = 1; m <= Length; m++) {
        arr2[m]=m;
        arr3[m]=m;
        arr1[m]= xClose.getValue(-(Length - m));
    }
    for(m = 1; m <= (Length - 1); m++) {
        maxval = arr1[m];
        maxloc = m;
        for(j = m+1; j <= Length; j++) {
            if (arr1[j] < maxval) {
                maxval=arr1[j];
                maxloc=j;
            }
        }
        tmp = arr1[m];
        arr1[m] = arr1[maxloc];
        arr1[maxloc] = tmp;
        tmp = arr2[m];
        arr2[m] = arr2[maxloc];
        arr2[maxloc] = tmp;
    }
    m=1;
    while(m < Length) {
        j = m + 1;
        flag = true;
        accum = arr3[m];
        while(flag) {
            if (arr1[m] != arr1[j]) {
                if ((j - m) > 1) {
                    accum = accum / (j - m);
                    for(n = m; n <= (j-1); n++) {
                        arr3[n] = accum;
                    }    
                }
                flag = false;
            } else {
                accum += arr3[j];
                j++;
            } 
        } 
        m=j;
     } 
    normalization = 12.0 / (Length * (Length - 1) * (Length + 1));
    Lenp1half = (Length + 1) * 0.5;
    for(accum = 0, m = 1; m <= Length; m++) {
        accum += (arr3[m] - Lenp1half) * (arr2[m] - Lenp1half);
    }
    nRes = normalization * accum;
    return nRes;
}