2004 Sept: StochOfCCI.efs

ICE Data Services -

StochOfCCI.efs  
EFSLibrary - Discussion Board  

File Name: StochOfCCI.efs

Description:
This study is based on The CCI Stochastic by Barbara Star, PH.D., which appeared in the September 2004 issue of Active Trader Magazine.

Formula Parameters:

  • nCCILength - 14
  • CCISource - Close - [Close, High, Low, Open, HL/2, HLC/3, OHLC/4]
  • Stoch2 %K Length - 5
  • Stoch2 %K Smoothing - 3
  • Stoch2 %D Length - 3
  • Upper Band - 80
  • Lower Band - 20
  • Band's Color - Black
  • Display Bands - True - [True, False]
  • Line Thickness - 2
  • Line Color - Blue
  • Arrow Size - 10
  • Display Arrows - True - [True, False]

Notes:
The related article is copyrighted material. If you are not a subscriber of Active Trader Magazine, please visit www. activetradermag.com.

Download File:
StochOfCCI.efs


EFS Code:

/*****************************************************************
Provided By : eSignal. (c) Copyright 2004
Study:  Stochastic of CCI - Barbara Star


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

function preMain() {
    setStudyTitle("Stochastic of CCI");
    setCursorLabelName("SoCCI \%K", 0);

    setDefaultBarFgColor(Color.blue, 0);
    
    setStudyMax(110);
    setStudyMin(-5);
    
    // Study Parameters
    var sp1 = new FunctionParameter("nCCILength", FunctionParameter.NUMBER);
	sp1.setLowerLimit(1);		
	sp1.setDefault(14); //Edit this value to set a new default
	
	var sp2 = new FunctionParameter("nCCISource", FunctionParameter.STRING);
	sp2.setName("CCISource");
	sp2.addOption("Close");
	sp2.addOption("High");
	sp2.addOption("Low");
	sp2.addOption("Open"); 
	sp2.addOption("HL/2");
	sp2.addOption("HLC/3");
	sp2.addOption("OHLC/4"); 
	sp2.setDefault("Close"); //Edit this value to set a new default
	
    var sp4 = new FunctionParameter("nKlength2", FunctionParameter.NUMBER);
    sp4.setName("Stoch2 \%K Length");
    sp4.setLowerLimit(1);
    sp4.setDefault(5);

    var sp5 = new FunctionParameter("nKsmooth2", FunctionParameter.NUMBER);
    sp5.setName("Stoch2 \%K Smoothing");
    sp5.setLowerLimit(1);
    sp5.setDefault(3);

    var sp6 = new FunctionParameter("nDlength2", FunctionParameter.NUMBER);
    sp6.setName("Stoch2 \%D Length");
    sp6.setLowerLimit(1);
    sp6.setDefault(3);

    // Formula Parameters
    var fp1 = new FunctionParameter("nBand1", FunctionParameter.NUMBER);
    fp1.setName("Upper Band");
    fp1.setDefault(80);

    var fp2 = new FunctionParameter("nBand2", FunctionParameter.NUMBER);
    fp2.setName("Lower Band");
    fp2.setDefault(20);
    
    var fp3 = new FunctionParameter("cBands", FunctionParameter.COLOR);
    fp3.setName("Band's Color");
    fp3.setDefault(Color.black);
    
    var fp4 = new FunctionParameter("bBands", FunctionParameter.STRING);
    fp4.setName("Display Bands");
    fp4.addOption("True");
    fp4.addOption("False");
    fp4.setDefault("True");
    
    var fp5 = new FunctionParameter("nThickness", FunctionParameter.NUMBER);
    fp5.setName("Line Thickness");
    fp5.setLowerLimit(1);
    fp5.setDefault(2);
    
    var fp6 = new FunctionParameter("cLineColor", FunctionParameter.COLOR);
    fp6.setName("Line Color");
    fp6.setDefault(Color.blue);

    var fp7 = new FunctionParameter("nArrowSize", FunctionParameter.NUMBER);
    fp7.setName("Arrow Size");
    fp7.setLowerLimit(1);
    fp7.setDefault(10);
    
    var fp4 = new FunctionParameter("bArrows", FunctionParameter.STRING);
    fp4.setName("Display Arrows");
    fp4.addOption("True");
    fp4.addOption("False");
    fp4.setDefault("True");    
}

var bEdit = true;
var study = null;
var vCCI = null;
var vK2 = null;   
var vK2_1 = null;  
var vD2 = null;
var aCCI = null;
var aStochK2 = null;
var cntr = 0;

function main(nCCILength, nCCISource, nKlength2, nKsmooth2, nDlength2, 
    nBand1, nBand2, cBands, bBands, nThickness, cLineColor, nArrowSize, bArrows) {
    var nState = getBarState();
    
    if (bEdit == true) {
        addBand(nBand1, PS_SOLID, 1, cBands, "SoS Upper");
        addBand(nBand2, PS_SOLID, 1, cBands, "SoS Lower");
        setDefaultBarThickness(nThickness);
        setDefaultBarFgColor(cLineColor);
        if (bBands == "False") {
            removeBand("SoS Upper");
            removeBand("SoS Lower");
        }
        if (aCCI == null) aCCI = new Array((Math.round(nKlength2) + Math.round(nKsmooth2) -1));
        if (aStochK2 == null) aStochK2 = new Array(Math.round(nDlength2));
        bEdit = false;
    }

    if (nState == BARSTATE_NEWBAR) {
        cntr += 1;
        if (cntr == 300) cntr = 0;
        if (vCCI != null) {
            aCCI.pop();
            aCCI.unshift(vCCI);
        }
        if (vK2 != null) {
            vK2_1 = vK2;
            aStochK2.pop();
            aStochK2.unshift(vK2);
        }
    }
    
    if (study == null) study =  new CCIStudy(Math.round(nCCILength), nCCISource);
    if (study == null) return;

    vCCI = study.getValue(CCIStudy.CCI);
    if (vCCI == null) return;
    aCCI[0] = vCCI;

    if (aCCI[Math.round(nKlength2) - 1] == null) return;
    
    vK2 = StochK2(Math.round(nKlength2), Math.round(nKsmooth2));
    if (vK2 == null) return;
    aStochK2[0] = vK2;
    
    if (bArrows == "True") {
        // Short signal
        if (vK2_1 > nBand1 && vK2 < nBand1) {
            drawTextRelative(0,vK2+10,"ê",Color.red,null,
                Text.BOTTOM|Text.CENTER|Text.BOLD,
                "Wingdings",Math.round(nArrowSize),"S"+cntr);
        }
        // Long signal
        if (vK2_1 < nBand2 && vK2 > nBand2) {
            drawTextRelative(0,vK2-10,"é",Color.green,null,
                Text.TOP|Text.CENTER|Text.BOLD,
                "Wingdings",Math.round(nArrowSize),"B"+cntr);
        }
    }
    
    return vK2;
}


/*********************/
/***** Functions *****/
/*********************/

function StochHH(nInputOffset, nInputLength) {
    var nOffset = nInputOffset;
    var nLength = nInputLength;
    var hh = 0;
    var i = 0;
    
    for(i = 0; i < nLength; i++) {
        if(i == 0) {
            hh = aCCI[i+nOffset];
        } else {
            hh = Math.max(hh, aCCI[i+nOffset]);
        }
    }
    return hh;
}


function StochLL(nInputOffset, nInputLength) {
    var nOffset = nInputOffset;
    var nLength = nInputLength;
    var ll = 0;
    var i = 0;
    
    for(i = 0; i < nLength; i++) {
        if(i == 0) {
            ll = aCCI[i+nOffset];
        } else {
            ll = Math.min(ll, aCCI[i+nOffset]);
        }
    }
    return ll;
}


function StochK2(inputLength, inputSmoothing) {
    var percentK;
    var StochK;
    var ll, hh;
    var sum = 0;
    var i = 0;
    var nOffset = 0;
    var nDO;
    var nLength = inputLength;
    var nSmoothing = inputSmoothing;

    for(i = 0; i < nSmoothing; i++) {
        nDO = i + nOffset;
        StochK = aCCI[nDO];
        
        ll = StochLL(nDO, nLength);
        if(ll == null) return null;
        
        hh = StochHH(nDO, nLength);
        if(hh == null) return null;
        
        percentK = ((StochK - ll) / (hh - ll)) * 100;
        
        sum += percentK;
    }

    sum /= nSmoothing;
    return sum;
}