Osc Normalization

ICE Data Services -

Normaliz.efs  

EFSLibrary - Discussion Board  

File Name: Normaliz.efs

Description:
Osc Normalization

Formula Parameters:

  • NormType : 1
  • OscLength : 10
  • NormLength : 10
  • Source of Normalizing : Close
  • Source of Oscillator : Close

Notes:
This indicator is created for normalizing any other indicators using its functions.
The first function to be created is one based on Bell's technique for normalizing to average price. This function has three input values. OscValue represents the value of the oscillator to be normalized. This input is included in each of the four functions. The NormPrice and NormLength inputs represent the price and length values used to calculate the average that is used in the normalization.
The second function is for Bell's technique for normalizing to standard deviation of prices. This function also has three input values. I already described the OscValue input. The NormPrice and NormLength inputs represent the price and length values used to calculate the standard deviation that is used in the normalization.
The third function is for Bell's techniques for normalizing to average range of prices. Unlike the two previous functions, this function only has two inputs: the OscValue input, and the NormLength input, which represents the number of bars to use in the calculation of the average true range that is used in the normalization. 
The fourth function is for Bell's technique for normalizing to range. This function also has only two inputs: the OscValue input, and a NormLength input, which represents the number of bars to use for the historical range that is used in the normalization.

Download File:
Normaliz.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:        
    Osc Normalization
    
Version:            1.0  04/22/2009
    
Formula Parameters:                     Default:
    NormType                            1
    OscLength                           10
    NormLength                          10
    Source of Normalizing               Close
    Source of Oscillator                Close
    
Notes:
    This indicator is created for normalizing any other indicators using its functions.
    The first function to be created is one based on Bell's technique for 
    normalizing to average price. This function has three input values. OscValue 
    represents the value of the oscillator to be normalized. This input is included 
    in each of the four functions. The NormPrice and NormLength inputs represent the 
    price and length values used to calculate the average that is used in the normalization.
    The second function is for Bell's technique for normalizing to standard deviation 
    of prices. This function also has three input values. I already described the OscValue 
    input. The NormPrice and NormLength inputs represent the price and length values used 
    to calculate the standard deviation that is used in the normalization.
    The third function is for Bell's techniques for normalizing to average range of prices. 
    Unlike the two previous functions, this function only has two inputs: the OscValue input, 
    and the NormLength input, which represents the number of bars to use in the calculation of 
    the average true range that is used in the normalization.
    The fourth function is for Bell's technique for normalizing to range. This function also 
    has only two inputs: the OscValue input, and a NormLength input, which represents the number 
    of bars to use for the historical range that is used in the normalization.

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

function preMain() {
    setStudyTitle("Osc Normalization");
    setCursorLabelName("Norm Osc", 0);
    setCursorLabelName("Balance", 1);
    setDefaultBarFgColor(Color.blue, 0);
    setDefaultBarFgColor(Color.red, 1);
    var x = 0;
    fpArray[x] = new FunctionParameter("NormType", FunctionParameter.STRING);
    with(fpArray[x++]) {
        setName("Type of Normalization");
        addOption("Average"); 
        addOption("StdDev");
        addOption("ATR");
        addOption("Range");   
        setDefault("Average");
    }
    fpArray[x] = new FunctionParameter("OscLength", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setName("Length of Oscillator");
        setLowerLimit(1);
        setDefault(10);
    }
    fpArray[x] = new FunctionParameter("NormLength", FunctionParameter.NUMBER);
    with(fpArray[x++]) {
        setName("Length of Normalization");
        setLowerLimit(1);
        setDefault(8);
    }
    fpArray[x] = new FunctionParameter("sNormPrice", FunctionParameter.STRING);
	with(fpArray[x++]){
        setName("Source of Normalization");
        addOption("open"); 
        addOption("high");
        addOption("low");
        addOption("close");
        addOption("hl2");
        addOption("hlc3");
        addOption("ohlc4"); 
        setDefault("close"); 
    }    
    fpArray[x] = new FunctionParameter("sOscPrice", FunctionParameter.STRING);
	with(fpArray[x++]){
        setName("Source of Oscillator");
        addOption("open"); 
        addOption("high");
        addOption("low");
        addOption("close");
        addOption("hl2");
        addOption("hlc3");
        addOption("ohlc4"); 
        setDefault("close"); 
    }    
}

var xMOM = null;
var xHHMOM = null;
var xLLMOM = null;
var xMA = null;
var xPriceOsc = null;
var xPriceNorm = null;
var xNormStdDev = null;

function main(NormType, sOscPrice, OscLength, sNormPrice, NormLength) {
var nBarState = getBarState();
    if (nBarState == BARSTATE_ALLBARS) {
        if (NormType == null) NormType = "Average";
        if (sOscPrice == null) sOscPrice = "close";
        if (OscLength == null) OscLength = 10;
        if (sNormPrice == null) sNormPrice = "close";
        if (NormLength == null) NormLength = 8;
    } 
    if (bInit == false) {
        xPriceOsc = eval(sOscPrice)();    
        xPriceNorm = eval(sNormPrice)();    
        xMOM = mom(OscLength, xPriceOsc);
        xHHMOM = upperDonchian(NormLength, xMOM);
        xLLMOM = lowerDonchian(NormLength, xMOM);
        xMA = sma(NormLength, xPriceNorm);
        xNormStdDev = efsInternal("Calc_StdDev", NormLength, xPriceNorm, xMA)
        xATR = atr(NormLength); 
        setCursorLabelName(NormType, 0);          
        if (NormType != "Range") {
            addBand(0, PS_SOLID, 1, Color.red, "Line");
        } else {
            addBand(50, PS_SOLID, 1, Color.red, "Line");
        }
        bInit = true;
    }
    var OscValue = xMOM.getValue(0);
    var AvgValue = xMA.getValue(0);
    var NormAvg = 0;
    if (AvgValue != 0) NormAvg = OscValue / AvgValue;
    var StdDev = xNormStdDev.getValue(0);
    var NormStdDev = 0;
    if (StdDev != 0) NormStdDev = OscValue / StdDev;
    var ATR = xATR.getValue(0);   
    var NormATR = 0;
    if (ATR != 0) NormATR = OscValue / ATR;
    var HiHi = xHHMOM.getValue(0);
    var LoLo = xLLMOM.getValue(0);
    if (HiHi == null) return;
    var HighLowDiff = HiHi - LoLo;
    var NormRange = 0;
    if (HighLowDiff != 0) NormRange = (((OscValue - LoLo) / HighLowDiff) * 100);
    var nRes = 0;
    if (NormType == "Average") {
        nRes = (NormAvg);
    }
    else if (NormType == "StdDev") {
        nRes = (NormStdDev);
    }
    else if (NormType == "ATR") {
        nRes = (NormATR);
    }
    else if (NormType == "Range") {
        nRes = (NormRange);
    }
    return nRes;
}

function Calc_StdDev(Period, xSeries1, xSeries2) {
    var nRes = 0;
    var sum = 0;
    var barsBack = 0;
    var nSeries1 = xSeries1.getValue(0);
    if (nSeries1 == null) return;
    for (barsBack = 0; barsBack < Period; barsBack++) {
        sum += (xSeries1.getValue( - barsBack) - xSeries2.getValue(0)) * (xSeries1.getValue( - barsBack) - xSeries2.getValue(0));
    }
    nRes = Math.sqrt(sum / Period);
    return nRes;
}