PriceAndStoch.efs

ICE Data Services -

PriceAndStoch.efs   

File Name: PriceAndStoch.efs

Description:

This formula converts the Stochastic outputs to the price scale of the chart to create an overlay of the Stochastic where the study shares the same y-axis as price. This creates a fixed, or scaled, relationship between the price and the Stochastic study.

Formula Parameters:

  • %K Length: 14
  • %K Smoothing: 1
  • %D Length: 3
  • Length for Scaling: 50

Notes:
The "Length for Scaling" parameter determines the conversion factor for the Stochastic outputs. The basic rule of thumb here is to enter a number equal to the number of visible bars in your chart.

Download File:
PriceAndStoch.efs


EFS Code:

/*****************************************************************
Provided By : eSignal. (c) Copyright 2003
*****************************************************************/

function preMain() {
    setPriceStudy(true);
    setStudyTitle("Price And Stochastics ");
    setCursorLabelName("%K", 0);
    setCursorLabelName("%D", 1);

    setDefaultBarThickness(1, 0);
    setDefaultBarThickness(1, 1);

    setDefaultBarFgColor(Color.blue, 0);
    setDefaultBarFgColor(Color.red, 1);
    
    var fp1 = new FunctionParameter("nKlength", FunctionParameter.NUMBER);
    fp1.setName("%K Length");
    fp1.setLowerLimit(1);
    fp1.setDefault(14);

    var fp2 = new FunctionParameter("nKsmooth", FunctionParameter.NUMBER);
    fp2.setName("%K Smoothing");
    fp2.setLowerLimit(1);
    fp2.setDefault(1);

    var fp3 = new FunctionParameter("nDlength", FunctionParameter.NUMBER);
    fp3.setName("%D Length");
    fp3.setLowerLimit(1);
    fp3.setDefault(3);

    var fp4 = new FunctionParameter("nScaleLength", FunctionParameter.NUMBER);
    fp4.setName("Length for Scaling");
    fp4.setLowerLimit(1);
    fp4.setDefault(50);
}

var aHighs = null;
var aLows = null;

var study = null;
var vHH = null;
var vLL = null;

function main(nKlength, nKsmooth, nDlength, nScaleLength) {
    var nState = getBarState();
    var vK = null;
    var vD = null;
    
    if (study == null) {
        study = new StochStudy(nKlength, nKsmooth, nDlength);
        aHighs = new Array(nScaleLength);
        aLows = new Array(nScaleLength);
    }
    
    if (nState == BARSTATE_NEWBAR) {
        aHighs.pop();
        aLows.pop();
        aHighs.unshift(high());
        aLows.unshift(low());
    } else {
        aHighs[0] = high();
        aLows[0] = low();
    }

    if (aHighs[nScaleLength-1] == null) return; // arrays are not filled yet

    vK = study.getValue(StochStudy.FAST);
    vD = study.getValue(StochStudy.SLOW);
    if (vK == null || vD == null) return;
    
    //define price scale from Highest High and Lowest Low from the last nScaleLength bars.
    vHH = high();
    vLL = low();
    for (i = 0; i < nScaleLength; ++i) {
        vHH = Math.max(vHH, aHighs[i]);
        vLL = Math.min(vLL, aLows[i]);
    }
    
    /*** convert stochastics to price scale (rsy equation:  
        old stock value * ((price scale max - price scale min) / 100) + price scale min
    ************/
    vK = ( vK * (( vHH - vLL )/100) ) + vLL;
    vD = ( vD * (( vHH - vLL )/100) ) + vLL;

    return new Array(vK, vD);
}