Announcement

Collapse
No announcement yet.

2007 Jan: Fourier Transform For Traders by John Ehlers

Collapse
This topic is closed.
X
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2007 Jan: Fourier Transform For Traders by John Ehlers

    File Name: TransformedDFT.efs

    Description:
    This study is based on the January 2007 article, Fourier Transform For Traders, by John Ehlers.

    Formula Parameters:
    Show Dominant Cycle: false
    Dominant Cycle Color: blue
    Dominant Cycle Size: 2

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

    Download File:
    TransformedDFT.efs



    EFS Code:
    PHP Code:
    /***************************************
    Provided By : eSignal (c) Copyright 2006
    Description:  Fourier Transform for Traders 
                  by John Ehlers

    Version 1.0  11/02/2006

    Notes:
    * Jan 2007 Issue of Stocks and Commodities Magazine
    * Study requires version 8.0 or later.


    Formula Parameters:                     Default:
    Show Dominant Cycle                     false
    Dominant Cycle Color                    blue
    Dominant Cycle Size                     2
    *****************************************************************/

    function preMain() {
        
    setStudyTitle("Transformed DFT ");
        
    setShowCursorLabel(false);
        
    setShowTitleParameters(false);    
        
    // Dominant Cycle properties
        
    setPlotType(PLOTTYPE_CIRCLE51);

        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 Variables
    var bVersion  null;    // Version flag
    var bInit     false;   // Initialization flag
    var xPrice null;
    var 
    xHP null;
    var 
    xCleanData null;
    var 
    nWindow 50;
    var 
    nAlpha = (Math.sin((2*Math.PI)/40)) / Math.cos((2*Math.PI)/40);
    var 
    aCosinePart = new Array(51);
    var 
    aSinePart = new Array(51);
    var 
    aPwr = new Array(51);
    var 
    aDB = new Array(51);
    var 
    aReturn = new Array(52);  // return array


    function main(bShowDCnDC_colornDC_thick) {
        if (
    bVersion == nullbVersion verify();
        if (
    bVersion == false) return;    

        var 
    nPeriod 0;
        var 
    0;
        var 
    nMaxPwr 0;
        var 
    nNum 0;
        var 
    nDenom 0;
        var 
    nDominantCycle 0;
        var 
    Color1 null;
        var 
    Color2 null;

        
    //Initialization
        
    if (bInit == false) {
            
    setDefaultBarFgColor(nDC_color51);
            
    setDefaultBarThickness(nDC_thick51);
            
    xPrice hl2();
            
    xHP efsInternal("calcHP"xPrice);
            
    xCleanData efsInternal("calcCleanData"xHP);
            
    bInit true;
        }

        var 
    nHP xHP.getValue(0);
        var 
    nCleanData xCleanData.getValue(-nWindow);
        if (
    nHP == null || nCleanData == null) return;
        

        
    //This is the DFT
        
    nPeriod 8;
        
    0;
        for (
    nPeriod 8nPeriod <= 50nPeriod++) {
            
    aCosinePart[nPeriod] = 0;
            
    aSinePart[nPeriod] = 0;
            
            for (
    0<= nWindown++) {
                var 
    nCD xCleanData.getValue(-n);
                
    aCosinePart[nPeriod] = aCosinePart[nPeriod] + 
                    
    nCD*Math.cos((2*Math.PI)*n/nPeriod);
                
    aSinePart[nPeriod] = aSinePart[nPeriod] + 
                    
    nCD*Math.sin((2*Math.PI)*n/nPeriod);
            }
            
            
    aPwr[nPeriod] = aCosinePart[nPeriod]*aCosinePart[nPeriod] + 
                
    aSinePart[nPeriod]*aSinePart[nPeriod];
        }


        
    //Find Maximum Power Level for Normalization
        
    nPeriod 8;
        
    nMaxPwr aPwr[nPeriod];
        for (
    nPeriod 8nPeriod <= 50nPeriod++) {
            if (
    aPwr[nPeriod] > nMaxPwrnMaxPwr aPwr[nPeriod];
        }

        
    //Normalize Power Levels and Convert to Decibels
        
    nPeriod 8;
        for (
    nPeriod 8nPeriod <= 50nPeriod++) {
            if (
    nMaxPwr && aPwr[nPeriod] > 0) { 
                
    aDB[nPeriod] = -10*Math.log(.01 
                    (
    .99*aPwr[nPeriod] / nMaxPwr))/Math.log(10);
            }
            if (
    aDB[nPeriod] > 20aDB[nPeriod] = 20;
        }
        

        
    //Find Dominant Cycle using CG algorithm 
        
    nPeriod 8;
        for (
    nPeriod 8nPeriod <= 50nPeriod++) {
            if (
    aDB[nPeriod] < 3) {
                
    nNum += nPeriod*(aDB[nPeriod]);
                
    nDenom += (aDB[nPeriod]);
            }
        }

        if (
    nDenom != 0) {
            
    nDominantCycle nNum/nDenom;
            if (
    bShowDC == true) {
                
    // Dominant Cycle
                
    aReturn[51] = nDominantCycle;
            }
        }

        
    //Plot the Spectrum as a Heatmap
        
    nPeriod 8;
        for (
    nPeriod 8nPeriod <= 50nPeriod++) {
            
    //Convert Decibels to RGB Color for Display
            
    if (aDB[nPeriod] > 10) {
                
    Color1 Math.round(255*(aDB[nPeriod]/10));
                
    Color2 0;
            } else if (
    aDB[nPeriod] <= 10) {
                
    Color1 255;
                
    Color2 Math.round(255*(aDB[nPeriod]/10));
            }
            
    aReturn[nPeriod] = nPeriod;
            
    setDefaultBarFgColor(Color.RGB(Color1 Color20), nPeriod);
            
    setDefaultBarThickness(4nPeriod);
        }
        
        
    //  aReturn[51]  // contains the Dominant Cycle value
        
        
    return aReturn;
    }


    // calcHP globals
    var nPrevHP null;
    var 
    nCurrHP null;

    function 
    calcHP(x) {
        if (
    getCurrentBarCount() <= ) {
            
    nCurrHP x.getValue(0);
            return 
    nCurrHP;
        } else {
            if (
    x.getValue(-1) == null) return null;
            if (
    getBarState() == BARSTATE_NEWBARnPrevHP nCurrHP;
            
    nCurrHP = ( 0.5*(nAlpha)*(x.getValue(0) - x.getValue(-1)) + nAlpha*nPrevHP );
            return 
    nCurrHP;
        }
    }

    function 
    calcCleanData(x) {
    //Get a detrended version of the data by High Pass Filtering 
    //with a 40 Period cutoff
        
    if (getCurrentBarCount() <= ) {
            return 
    x.getValue(0);
        } 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 
    verify() {
        var 
    false;
        if (
    getBuildNumber() < 779) {
            
    drawTextAbsolute(535"This study requires version 8.0 or later."
                
    Color.whiteColor.blueText.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,
                
    null13"error");
            
    drawTextAbsolute(520"Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp"
                
    Color.whiteColor.blueText.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,
                
    null13"upgrade");
            return 
    b;
        } else {
            
    true;
        }
        
        return 
    b;

    Jason K.
    Project Manager
    eSignal - an Interactive Data company

    EFS KnowledgeBase
    JavaScript for EFS Video Series
    EFS Beginner Tutorial Series
    EFS Glossary
    Custom EFS Development Policy

    New User Orientation
Working...
X