2008 Mar: Measuring Cycle Periods

ICE Data Services -


ChRSpectrum.efs, DCTunedBypassFilter.efs  EFSLibrary - Discussion Board
  

File Name: ChRSpectrum.efs, DCTunedBypassFilter.efs


Description:
These studies are based on the March 2008 article, Measuring CyclePeriods, by John F. Ehlers.


Formula Parameters:
ChRSpectrum.efs
Show Dominant Cycle: false
Dominant Cycle Color: blue
Dominant Cycle Size: 2

DCTunedBypassFilter.efs
Sine Color: red
Cosine Color: cyan
Sine Thickness: 2
Cosine Thickness: 2

Notes:
The related article is copyrighted material. If you are not a subscriber of Stocks & Commodities, please visit www.traders.com.

Download File:
ChRSpectrum.efs
DCTunedBypassFilter.efs




EFS Code:







/***************************************Provided By : eSignal (c) Copyright 2008Description:  Measuring Cycle Periods               by John EhlersVersion 1.0  1/04/2008Notes:* March 2008 Issue of Stocks and Commodities Magazine* Study requires version 8.0 or later.Formula Parameters:                     Default:Show Dominant Cycle                     falseDominant Cycle Color                    blueDominant Cycle Size                     2*****************************************************************/function preMain() {    setStudyTitle("Channelized Receiver Spectrum ");    setShowCursorLabel(false);    setShowTitleParameters(false);        // Dominant Cycle properties    setPlotType(PLOTTYPE_CIRCLE, 51);    setDefaultBarBgColor(Color.black, 0);    var fp1 = new FunctionParameter("bShowDC", FunctionParameter.BOOLEAN);        fp1.setName("Show Dominant Cycle");        fp1.setDefault(false);    var fp2 = new FunctionParameter("nDC_color", FunctionParameter.COLOR);        fp2.setName("Dominant Cycle Color");        fp2.setDefault(Color.blue);    var fp3 = new FunctionParameter("nDC_thick", FunctionParameter.NUMBER);        fp3.setName("Dominant Cycle Size");        fp3.setLowerLimit(1);        fp3.setDefault(2);    }// Global Variablesvar bVersion  = null;    // Version flagvar bInit     = false;   // Initialization flagvar xPrice = null;var xHP = null;var xCleanData = null;var aDB = new Array(51);var aReturn = new Array(52);  // return arrayvar nDelta = 0.1;var nBeta = 0;var nGamma = 0;var nAlpha = 0;var nMaxAmpl = 0;var nNum = 0;var nDenom = 0;var nDC = 0;var nDomCyc = 0;var aDC  = new Array(10);var aQ          = new Array(51);var aI          = new Array(51);var aReal       = new Array(51);var aOlderI     = new Array(51);var aOldReal    = new Array(51);var aOlderReal  = new Array(51);var aImag       = new Array(51);var aOldQ       = new Array(51);var aOlderQ     = new Array(51);var aOldImag    = new Array(51);var aOlderImag  = new Array(51);var aAmpl       = new Array(51);var aOldI       = new Array(51);var aOldAmpl    = new Array(51);for (var j = 0; j < 51; j++) {    aQ[j] = 0;              aI[j] = 0;              aReal[j] = 0;           aOlderI[j] = 0;         aOldReal[j] = 0;    aOlderReal[j] = 0;    aImag[j] = 0;    aOldQ[j] = 0;    aOlderQ[j] = 0;    aOldImag[j] = 0;    aOlderImag[j] = 0;    aAmpl[j] = 0;    aOldI[j] = 0;    aOldAmpl[j] = 0;}function main(bShowDC, nDC_color, nDC_thick) {    if (bVersion == null) bVersion = verify();    if (bVersion == false) return;        var nPeriod = 0;    var n = 0;    var nMaxPwr = 0;    var nNum = 0;    var nDenom = 0;    var nDominantCycle = 0;    var Color1 = null;    var Color2 = null;    var nState = getBarState();    //Initialization    if (bInit == false) {        drawTextPixel(0, 0, "                                                    ", null,             Color.lightgrey, Text.RELATIVETOTOP|Text.RELATIVETOLEFT, null, 12, "bkg");        setDefaultBarFgColor(nDC_color, 51);        setDefaultBarThickness(nDC_thick, 51);        xPrice = hl2();        xHP = efsInternal("calcHP", xPrice);        xCleanData = efsInternal("calcCleanData", xHP, xPrice);  // Smooth HP        bInit = true;    }    if (nState == BARSTATE_NEWBAR) {        aDC.pop();        aDC.unshift(nDC);    }    if (nState == BARSTATE_NEWBAR) {        nPeriod = 8;        for (nPeriod = 8; nPeriod <= 50; nPeriod++) {            aOlderI[nPeriod]    = aOldI[nPeriod];            aOldI[nPeriod]      = aI[nPeriod];            aOlderQ[nPeriod]    = aOldQ[nPeriod];            aOldQ[nPeriod]      = aQ[nPeriod];            aOlderReal[nPeriod] = aOldReal[nPeriod];            aOldReal[nPeriod]   = aReal[nPeriod];            aOlderImag[nPeriod] = aOldImag[nPeriod];            aOldImag[nPeriod]   = aImag[nPeriod];            aOldAmpl[nPeriod]   = aAmpl[nPeriod];        }    }    var nHP = xHP.getValue(0);    var nCleanData = xCleanData.getValue(-50);    if (nHP == null || nCleanData == null) return;        nDelta = -.015 * getCurrentBarCount() + .5;    if (nDelta < .15 ) {        nDelta = .15;    }        if (getCurrentBarCount() > 6 ) {        nPeriod = 8;        for (nPeriod = 8; nPeriod <= 50; nPeriod++) {            nBeta = Math.cos((2*Math.PI)/nPeriod);            nGamma = 1 / Math.cos((((2*Math.PI)+(2*Math.PI)) * nDelta) / nPeriod);            nAlpha = nGamma - Math.sqrt(nGamma*nGamma - 1);            aQ[nPeriod] = (nPeriod / 6.283185)*(xCleanData.getValue(0) - xCleanData.getValue(-1));            aI[nPeriod] = xCleanData.getValue(0);            aReal[nPeriod] = .5*(1 - nAlpha)*(aI[nPeriod] - aOlderI[nPeriod]) + nBeta*(1 + nAlpha)*aOldReal[nPeriod] - nAlpha*aOlderReal[nPeriod];            aImag[nPeriod] = .5*(1 - nAlpha)*(aQ[nPeriod] - aOlderQ[nPeriod]) + nBeta*(1 + nAlpha)*aOldImag[nPeriod] - nAlpha*aOlderImag[nPeriod];            aAmpl[nPeriod] = (aReal[nPeriod]*aReal[nPeriod] + aImag[nPeriod]*aImag[nPeriod]);        }    }                nMaxAmpl = aAmpl[10];    nPeriod = 8;    for (nPeriod = 8; nPeriod <= 50; nPeriod++) {        if (aAmpl[nPeriod] > nMaxAmpl) {            nMaxAmpl = aAmpl[nPeriod];        }    }            nPeriod = 8;    for (nPeriod = 8; nPeriod <= 50; nPeriod++) {        if (nMaxAmpl != 0 && (aAmpl[nPeriod] / nMaxAmpl) > 0 ) {            aDB[nPeriod] = -10 * Math.log(.01 / (1 - .99*aAmpl[nPeriod] / nMaxAmpl)) / Math.log(10);        }        if (aDB[nPeriod] > 20 ) {            aDB[nPeriod] = 20;        }           }    nNum = 0;    nDemon = 0;    nPeriod = 8;    for (nPeriod = 8; nPeriod <= 50; nPeriod++) {        if (aDB[nPeriod] <= 3 ) {            nNum = nNum + nPeriod*(20 - aDB[nPeriod]);            nDenom = nDenom + (20 - aDB[nPeriod]);        }        if (nDenom != 0 ) {            nDC = nNum / nDenom;            aDC[0] = nDC;        }    }    nDomCyc = Median(aDC, 10);    if (bShowDC == true) {        aReturn[51] = nDomCyc;    }    //Plot the Spectrum as a Heatmap    nPeriod = 8;    for (nPeriod = 8; nPeriod <= 50; nPeriod++) {        if (aDB[nPeriod] <= 10) {            Color1 = 255;            Color2 = Math.round(255*(1 - aDB[nPeriod]/10));        }        if (aDB[nPeriod] > 10) {            Color1 = Math.round(255*(2 - aDB[nPeriod]/10));            Color2 = 0;                    }                aReturn[nPeriod] = nPeriod;        setDefaultBarFgColor(Color.RGB(Color1 , Color2, 0), nPeriod);        setDefaultBarThickness(4, nPeriod);    }        //  aReturn[51]  // contains the Dominant Cycle value        return aReturn;}// calcHP globalsvar nPrevHP = null;var nCurrHP = null;function calcHP(x) {    var nAlpha1 = (1 - Math.sin((2*Math.PI)/40)) / Math.cos((2*Math.PI)/40);    var nHP = null;        if (getCurrentBarCount() <= 5 ) {        nCurrHP = x.getValue(0);        return nCurrHP;    } else {        if (x.getValue(-1) == null) return null;        if (getBarState() == BARSTATE_NEWBAR) nPrevHP = nCurrHP;        nCurrHP = ( 0.5*(1 + nAlpha1)*(x.getValue(0) - x.getValue(-1)) + nAlpha1*nPrevHP );        return nCurrHP;    }}function calcCleanData(x, xP) {  //SmoothHP    if (getCurrentBarCount() == 1 ) {        return 0;    } else if (getCurrentBarCount() <= 7 ) {        return xP.getValue(0) - xP.getValue(-1);    } else {        return (  x.getValue(0) +                   2*x.getValue(-1) +                   3*x.getValue(-2) +                   3*x.getValue(-3) +                   2*x.getValue(-4) +                   x.getValue(-5)    ) / 12;    }}function Median(myArray, Length) {    var aArray = new Array(Length);    var nMedian = null;        for (var i = 0; i < Length; i++) {        aArray[i] = myArray[i];    }        aArray = aArray.sort(compareNumbers);        nMedian = aArray[Math.round((Length-1)/2)];    return nMedian;}function compareNumbers(a, b) {   return a - b}function verify() {    var b = false;    if (getBuildNumber() < 779) {        drawTextAbsolute(5, 35, "This study requires version 8.0 or later.",             Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "error");        drawTextAbsolute(5, 20, "Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp",             Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "upgrade");        return b;    } else {        b = true;    }        return b;}


/***************************************Provided By : eSignal (c) Copyright 2008Description:  Measuring Cycle Periods              by John EhlersVersion 1.0  1/04/2008Notes:* March 2008 Issue of Stocks and Commodities Magazine* Study requires version 8.0 or later.Formula Parameters:                     Default:Sine Color                              redCosine Color                            cyanSine Thickness                          2Cosine Thickness                        2   *****************************************************************/function preMain() {    setStudyTitle("Dominant Cycle Tuned Bypass Filter ");    setShowTitleParameters(false);       setCursorLabelName("Sine", 0);    setCursorLabelName("Cosine", 1);    var fp1 = new FunctionParameter("nS_color", FunctionParameter.COLOR);        fp1.setName("Sine Color");        fp1.setDefault(Color.red);    var fp2 = new FunctionParameter("nC_color", FunctionParameter.COLOR);        fp2.setName("Cosine Color");        fp2.setDefault(Color.cyan);    var fp3 = new FunctionParameter("nS_thick", FunctionParameter.NUMBER);        fp3.setName("Sine Thickness");        fp3.setLowerLimit(1);        fp3.setDefault(2);       var fp4 = new FunctionParameter("nC_thick", FunctionParameter.NUMBER);        fp4.setName("Cosine Thickness");        fp4.setLowerLimit(1);        fp4.setDefault(2);   }// Global Variablesvar bVersion  = null;    // Version flagvar bInit     = false;   // Initialization flagvar xPrice = null;var xHP = null;var xCleanData = null;var aDB = new Array(51);var nDelta = 0.1;var nBeta = 0;var nGamma = 0;var nAlpha = 0;var nMaxAmpl = 0;var nNum = 0;var nDenom = 0;var nDC = 0;var nDomCyc = 0;var nValue1 = null;var nValue1_1 = null;var nValue1_2 = null;var nValue2 = null;var aDC  = new Array(10);var aQ          = new Array(51);var aI          = new Array(51);var aReal       = new Array(51);var aOlderI     = new Array(51);var aOldReal    = new Array(51);var aOlderReal  = new Array(51);var aImag       = new Array(51);var aOldQ       = new Array(51);var aOlderQ     = new Array(51);var aOldImag    = new Array(51);var aOlderImag  = new Array(51);var aAmpl       = new Array(51);var aOldI       = new Array(51);var aOldAmpl    = new Array(51);for (var j = 0; j < 51; j++) {    aQ[j] = 0;             aI[j] = 0;             aReal[j] = 0;          aOlderI[j] = 0;        aOldReal[j] = 0;    aOlderReal[j] = 0;    aImag[j] = 0;    aOldQ[j] = 0;    aOlderQ[j] = 0;    aOldImag[j] = 0;    aOlderImag[j] = 0;    aAmpl[j] = 0;    aOldI[j] = 0;    aOldAmpl[j] = 0;}function main(nS_color, nC_color, nS_thick, nC_thick) {    if (bVersion == null) bVersion = verify();    if (bVersion == false) return;       var nPeriod = 0;    var n = 0;    var nMaxPwr = 0;    var nNum = 0;    var nDenom = 0;    var nDominantCycle = 0;    var Color1 = null;    var Color2 = null;    var nState = getBarState();    //Initialization    if (bInit == false) {        setDefaultBarFgColor(nS_color, 0);        setDefaultBarFgColor(nC_color, 1);        setDefaultBarThickness(nS_thick, 0);        setDefaultBarThickness(nC_thick, 1);        xPrice = hl2();        xHP = efsInternal("calcHP", xPrice);        xCleanData = efsInternal("calcCleanData", xHP, xPrice);  // Smooth HP        bInit = true;    }    if (nState == BARSTATE_NEWBAR) {        aDC.pop();        aDC.unshift(nDC);        nValue1_2 = nValue1_1;        nValue1_1 = nValue1;    }    if (nState == BARSTATE_NEWBAR) {        nPeriod = 8;        for (nPeriod = 8; nPeriod <= 50; nPeriod++) {            aOlderI[nPeriod]    = aOldI[nPeriod];            aOldI[nPeriod]      = aI[nPeriod];            aOlderQ[nPeriod]    = aOldQ[nPeriod];            aOldQ[nPeriod]      = aQ[nPeriod];            aOlderReal[nPeriod] = aOldReal[nPeriod];            aOldReal[nPeriod]   = aReal[nPeriod];            aOlderImag[nPeriod] = aOldImag[nPeriod];            aOldImag[nPeriod]   = aImag[nPeriod];            aOldAmpl[nPeriod]   = aAmpl[nPeriod];        }    }    var nHP = xHP.getValue(0);    var nCleanData = xCleanData.getValue(-50);    if (nHP == null || nCleanData == null) return;       nDelta = -.015 * getCurrentBarCount() + .5;    if (nDelta < .15 ) {        nDelta = .15;    }       if (getCurrentBarCount() > 6 ) {        nPeriod = 8;        for (nPeriod = 8; nPeriod <= 50; nPeriod++) {            nBeta = Math.cos((2*Math.PI)/nPeriod);            nGamma = 1 / Math.cos((((2*Math.PI)+(2*Math.PI)) * nDelta) / nPeriod);            nAlpha = nGamma - Math.sqrt(nGamma*nGamma - 1);            aQ[nPeriod] = (nPeriod / 6.283185)*(xCleanData.getValue(0) - xCleanData.getValue(-1));            aI[nPeriod] = xCleanData.getValue(0);            aReal[nPeriod] = .5*(1 - nAlpha)*(aI[nPeriod] - aOlderI[nPeriod]) + nBeta*(1 + nAlpha)*aOldReal[nPeriod] - nAlpha*aOlderReal[nPeriod];            aImag[nPeriod] = .5*(1 - nAlpha)*(aQ[nPeriod] - aOlderQ[nPeriod]) + nBeta*(1 + nAlpha)*aOldImag[nPeriod] - nAlpha*aOlderImag[nPeriod];            aAmpl[nPeriod] = (aReal[nPeriod]*aReal[nPeriod] + aImag[nPeriod]*aImag[nPeriod]);        }    }          nMaxAmpl = aAmpl[10];    nPeriod = 8;    for (nPeriod = 8; nPeriod <= 50; nPeriod++) {        if (aAmpl[nPeriod] > nMaxAmpl) {            nMaxAmpl = aAmpl[nPeriod];        }    }       nPeriod = 8;    for (nPeriod = 8; nPeriod <= 50; nPeriod++) {        if (nMaxAmpl != 0 && (aAmpl[nPeriod] / nMaxAmpl) > 0 ) {            aDB[nPeriod] = -10 * Math.log(.01 / (1 - .99*aAmpl[nPeriod] / nMaxAmpl)) / Math.log(10);        }        if (aDB[nPeriod] > 20 ) {            aDB[nPeriod] = 20;        }          }    nNum = 0;    nDemon = 0;    nPeriod = 8;    for (nPeriod = 8; nPeriod <= 50; nPeriod++) {        if (aDB[nPeriod] <= 3 ) {            nNum = nNum + nPeriod*(20 - aDB[nPeriod]);            nDenom = nDenom + (20 - aDB[nPeriod]);        }        if (nDenom != 0 ) {            nDC = nNum / nDenom;            aDC[0] = nDC;        }    }    nDomCyc = Median(aDC, 10);    if (nDomCyc < 8 ) {        nDomCyc = 20;    }    nBeta = Math.cos((2*Math.PI)/nDomCyc);    nGamma = 1 / Math.cos((((2*Math.PI)+(2*Math.PI)) * nDelta) / nDomCyc);    nAlpha = nGamma - Math.sqrt(nGamma*nGamma - 1);    nValue1 = .5*(1 - nAlpha)*(xCleanData.getValue(0) - xCleanData.getValue(-1)) +        nBeta*(1 + nAlpha)*nValue1_1 - nAlpha*nValue1_2;    nValue2 = (nDomCyc / 6.28)*(nValue1 - nValue1_1);       return new Array(nValue1, nValue2);}// calcHP globalsvar nPrevHP = null;var nCurrHP = null;function calcHP(x) {    var nAlpha1 = (1 - Math.sin((2*Math.PI)/40)) / Math.cos((2*Math.PI)/40);    var nHP = null;       if (getCurrentBarCount() <= 5 ) {        nCurrHP = x.getValue(0);        return nCurrHP;    } else {        if (x.getValue(-1) == null) return null;        if (getBarState() == BARSTATE_NEWBAR) nPrevHP = nCurrHP;        nCurrHP = ( 0.5*(1 + nAlpha1)*(x.getValue(0) - x.getValue(-1)) + nAlpha1*nPrevHP );        return nCurrHP;    }}function calcCleanData(x, xP) {  //SmoothHP    if (getCurrentBarCount() == 1 ) {        return 0;    } else if (getCurrentBarCount() <= 7 ) {        return xP.getValue(0) - xP.getValue(-1);    } else {        return (  x.getValue(0) +                  2*x.getValue(-1) +                  3*x.getValue(-2) +                  3*x.getValue(-3) +                  2*x.getValue(-4) +                  x.getValue(-5)    ) / 12;    }}function Median(myArray, Length) {    var aArray = new Array(Length);    var nMedian = null;       for (var i = 0; i < Length; i++) {        aArray[i] = myArray[i];    }       aArray = aArray.sort(compareNumbers);       nMedian = aArray[Math.round((Length-1)/2)];    return nMedian;}function compareNumbers(a, b) {   return a - b}function verify() {    var b = false;    if (getBuildNumber() < 779) {        drawTextAbsolute(5, 35, "This study requires version 8.0 or later.",            Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "error");        drawTextAbsolute(5, 20, "Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp",            Color.white, Color.blue, Text.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,            null, 13, "upgrade");        return b;    } else {        b = true;    }       return b;}