2004 Oct: SwingPrediction.efs

ICE Data Services -


SwingPrediction.efs  EFSLibrary - Discussion Board
  

File Name: SwingPrediction.efs


Description:
This formula is based on Fibonacci And Gann Projections by Dennis Peterson, which appeared in the October 2004 issue of Stocks & Commodities.


Formula Parameters:
* Swing # of Bars - 1
This is the minimum number of bars required to define a swing point. This number is for both sides of the swing point (i.e. 5 bars on the left and right of the swing bar).

* Swing Wave Type - % Change in Price
(% Retracement, % Change in Price)

* Swing Wave Percentage - 5
The number 5 will be treated as 5.0%. The number 0.05 will be treated as 0.0005%.

* Swing High Price Source - Close
* Swing Low Price Source - Close
* Line Thickness - 2
* Confirmed Swing Line Color - Blue
* Developing Swing Line Color - Yellow
* Number of Swings for Gann - 1
The number of previous swings points to be included in the Gann projections

* Gann Increment - 0.25
The +/- increment for Gann calculation above and below the base calculation for Gann.

* Number of Gann Increments - 2
The number of Gann increments to be calculated above and below the Gann basis calculation. 2 will draw one above and one low
the basis.

* Fibonacci: DR 1 - 0.382
* Fibonacci: DR 2 - 1.618
* Fibonacci: A1 1 - 0.5
* Fibonacci: A1 2 - 1.732
* Fibonacci: A2 1 - 0.618
* Fibonacci: A2 2 - 2.0
* Fibonacci: C 1 - 0.707
* Fibonacci: C 2 - 2.618
* Fibonacci: DC 1 - 1.0
* Fibonacci: DC 2 - 3.0

Notes:
The current version has one added modification since the formula went into publication. Per Dennis Peterson's request, a third label has been added to show a second percent retracement figure. The top %Rtmt label is the percent retracement of the developing swing (green Sept peak) to the second previous confirmed swing (blue June peak). The second %Rtmt label is the percent retracement of the right-most developing swing line (current bar) to the previous confirmed swing (Aug valley). The last %Chg label is the percent change in price of the righ-most developing swing line (current bar) from the developing swing (green Sept peak). The related article is copyrighted material. If you are not a subscriber of Stocks & Commodities, please visit www.traders.com.

Download File:
SwingPrediction.efs




EFS Code:






/*****************************************************************Provided By : eSignal. (c) Copyright 2004Study:        Swing PredictionVersion:      1.0Formula Parameters:                 Default:    * Swing: # of Bars              1        This is the minimum number of bars required to define a         swing point.  This number is for both sides of the swing         point (i.e. 5 bars on the left and right of the swing bar).    * Swing: Wave Type              % Change in Price        (% Retracement, % Change in Price)    * Swing: Wave Percentage        5        The number 5 will be treated as 5.0%.  The number 0.05 will         be treated as 0.0005%.    * Swing High Price Source       Close    * Swing Low Price Source        Close    * Line Thickness                2    * Confirmed Swing Line Color    Blue    * Developing Swing Line Color   Yellow    * Number of Swings for Gann     1        The number of previous swings points to be included in the        Gann projections    * Gann Increment                0.25        The +/- increment for Gann calculation above and below the base        calculation for Gann.    * Number of Gann Increments     2        The number of Gann increments to be calculated above and below        the Gann basis calculation.  2 will draw one above and one below        the basis.    * Fibonacci: DR 1               0.382    * Fibonacci: DR 2               1.618    * Fibonacci: A1 1               0.5    * Fibonacci: A1 2               1.732    * Fibonacci: A2 1               0.618    * Fibonacci: A2 2               2.0    * Fibonacci: C 1                0.707    * Fibonacci: C 2                2.618    * Fibonacci: DC 1               1.0    * Fibonacci: DC 2               3.0*****************************************************************/function preMain() {    setPriceStudy(true);    setStudyTitle("Swing Prediction ");    setShowCursorLabel(false);    setShowTitleParameters(false);        var fp1 = new FunctionParameter("nNum", FunctionParameter.NUMBER);    fp1.setName("Swing: # of Bars");    fp1.setLowerLimit(1);    fp1.setDefault(1);        var fp2a = new FunctionParameter("sWaveType", FunctionParameter.STRING);    fp2a.setName("Swing: Wave Type");    fp2a.addOption("% Retracement");    fp2a.addOption("% Change in Price");    fp2a.setDefault("% Change in Price");        var fp2 = new FunctionParameter("nRet", FunctionParameter.NUMBER);    fp2.setName("Swing: Wave Percentage");    fp2.setLowerLimit(0);    fp2.setDefault(5);    var fp3 = new FunctionParameter("sHighSource", FunctionParameter.STRING);    fp3.setName("Swing High Price Source");    fp3.addOption("Open");    fp3.addOption("High");    fp3.addOption("Low");    fp3.addOption("Close");    fp3.setDefault("Close");    var fp4 = new FunctionParameter("sLowSource", FunctionParameter.STRING);    fp4.setName("Swing Low Price Source");    fp4.addOption("Open");    fp4.addOption("High");    fp4.addOption("Low");    fp4.addOption("Close");    fp4.setDefault("Close");    var fp5 = new FunctionParameter("nThickness", FunctionParameter.NUMBER);    fp5.setName("Line Thickness");    fp5.setLowerLimit(1);    fp5.setDefault(2);    var fp6 = new FunctionParameter("cColor1", FunctionParameter.COLOR);    fp6.setName("Confirmed Swing Line Color");    fp6.setDefault(Color.blue);    var fp7 = new FunctionParameter("cColor2", FunctionParameter.COLOR);    fp7.setName("Developing Swing Line Color");    fp7.setDefault(Color.yellow);        var fp19 = new FunctionParameter("nGann", FunctionParameter.NUMBER);    fp19.setName("Number of Swings for Gann");    fp19.setLowerLimit(1);    fp19.setUpperLimit(6);    fp19.setDefault(1);        var fp19b = new FunctionParameter("nGannInc", FunctionParameter.NUMBER);    fp19b.setName("Gann Increment");    fp19b.setLowerLimit(0);    fp19b.setDefault(0.25);    var fp19c = new FunctionParameter("nGannNum", FunctionParameter.NUMBER);    fp19c.setName("Number of Gann Increments");    fp19c.setLowerLimit(0);    fp19c.setDefault(2);    var fp20 = new FunctionParameter("fib0", FunctionParameter.NUMBER);    fp20.setName("Fibonacci: DR 1");    fp20.setLowerLimit(0);    fp20.setDefault(0.382);    var fp21 = new FunctionParameter("fib1", FunctionParameter.NUMBER);    fp21.setName("Fibonacci: DR 2");    fp21.setLowerLimit(0);    fp21.setDefault(1.618);    var fp22 = new FunctionParameter("fib2", FunctionParameter.NUMBER);    fp22.setName("Fibonacci: A1 1");    fp22.setLowerLimit(0);    fp22.setDefault(0.5);    var fp23 = new FunctionParameter("fib3", FunctionParameter.NUMBER);    fp23.setName("Fibonacci: A1 2");    fp23.setLowerLimit(0);    fp23.setDefault(1.732);    var fp24 = new FunctionParameter("fib4", FunctionParameter.NUMBER);    fp24.setName("Fibonacci: A2 1");    fp24.setLowerLimit(0);    fp24.setDefault(0.618);    var fp25 = new FunctionParameter("fib5", FunctionParameter.NUMBER);    fp25.setName("Fibonacci: A2 2");    fp25.setLowerLimit(0);    fp25.setDefault(2);    var fp26 = new FunctionParameter("fib6", FunctionParameter.NUMBER);    fp26.setName("Fibonacci: C 1");    fp26.setLowerLimit(0);    fp26.setDefault(0.707);    var fp27 = new FunctionParameter("fib7", FunctionParameter.NUMBER);    fp27.setName("Fibonacci: C 2");    fp27.setLowerLimit(0);    fp27.setDefault(2.618);    var fp28 = new FunctionParameter("fib8", FunctionParameter.NUMBER);    fp28.setName("Fibonacci: DC 1");    fp28.setLowerLimit(0);    fp28.setDefault(1.0);    var fp29 = new FunctionParameter("fib9", FunctionParameter.NUMBER);    fp29.setName("Fibonacci: DC 2");    fp29.setLowerLimit(0);    fp29.setDefault(3.0);}var bEdit = true;       // tracks change of user inputsvar cntr = 0;           // image counter for swing linesvar bInit = false;      // initialization routine completionvar nNumBars = null;    // number of bars for defining swingsvar sWaveTypeG = null;  // wave type for confirming swingsvar nRetpcnt = null;    // percent retracement for defining swingsvar nThicknessG = null; // line thicknessvar cColorCon = null;   // confirmed swing colorvar cColorDev = null;   // developing swing colorvar nGannG = 1;         // number of swings for Gann calculationsvar nGannIncG = null;   // increment value for Gann calculationsvar nGannNumG = null;   // number of increments for Gann calculationsvar sHSource = null;    // price source for high swingsvar sLSource = null;    // price source for low swingsvar x1a = null;         // x-coordinate for point a of developing line 1var x1b = null;         // x-coordinate for point b of developing line 1var x2a = null;         // x-coordinate for point a of developing line 2var x2b = null;         // x-coordinate for point b of developing line 2var y1a = null;         // y-coordinate for point a of developing line 1var y1b = null;         // y-coordinate for point b of developing line 1var y2a = null;         // y-coordinate for point a of developing line 2var y2b = null;         // y-coordinate for point b of developing line 2var aY2A = new Array(7);// array of current 7 swing prices var vLastSwing = null;  // tracking swing type of last confirmed swingvar nScntr = 0;         // bar counter for swing confirmationvar aSwingsIndex = new Array(7); // tracks current swings for DR, C, DC, A1, A2 periodsvar aSwingsPrice = new Array(7); // tracks current swing prices for Gann projectionsvar aFibs = new Array(10);       // Fibonacci numbers for Swing Predictionsvar bProjCon = false;var bProjDev = false;var tCntr = 0;function main(nNum, sWaveType, nRet, sHighSource, sLowSource, nThickness, cColor1, cColor2,              nGann, nGannInc, nGannNum, fib0, fib1, fib2, fib3, fib4, fib5, fib6, fib7, fib8, fib9) {    var nState = getBarState();    var nIndex = getCurrentBarIndex();    var h = getValue(sHighSource);    var l = getValue(sLowSource);    var c = close();    var i = 0;    // record keeping    if (nState == BARSTATE_NEWBAR) {        if (cntr > 100) cntr = 0;        if (x1a != null) x1a -= 1;        if (x1b != null) x1b -= 1;        if (x2a != null) x2a -= 1;        if (x2b != null) x2b -= 1;        i = 0;        for (i = 0; i < 7; ++i) {            if (aSwingsIndex[i] != null) aSwingsIndex[i] -= 1;        }    }    //Initialization    if (bEdit == true) {        if (nNumBars == null) nNumBars = nNum;        if (sWaveTypeG == null) sWaveTypeG = sWaveType;        if (nRetpcnt == null) nRetpcnt = nRet/100;        if (nThicknessG == null) nThicknessG = nThickness;        if (cColorCon == null) cColorCon = cColor1;        if (cColorDev == null) cColorDev = cColor2;        if (nGann != null) nGannG = nGann;        if (nGannIncG == null) nGannIncG = nGannInc;        if (nGannNumG == null) nGannNumG = Math.round(nGannNum);        if (sHSource == null) sHSource = sHighSource;        if (sLSource == null) sLSource = sLowSource;        if (x1a == null) x1a = 0;        if (y1a == null) y1a = c;        i = 0;        for (i = 0; i < 10; ++i) {            aFibs[i] = eval("fib"+i);        }        bEdit = false;    }    if (bInit == false) {        bInit = Init(h,l,c);    }    // Swings    if (nState == BARSTATE_NEWBAR) {        nScntr += 1;        // confirmed Swings        if (nScntr > nNumBars) {            confirmSwings();            if (bInit == true) {                doLine("dev1");                doLine("dev2");            }        }    }    checkSwings(h, l);    if (bProjCon == true) {        bProjCon = false;        doProjections("con");    }    if (bProjDev == true) {        bProjDev = false;        doProjections("dev1");    }    if (nIndex >= -1) {        var nWaveRet = (Math.abs(aSwingsPrice[0]-aSwingsPrice[1]) / Math.abs(aSwingsPrice[1]-aSwingsPrice[2]))*100;        var sWaveRetText = " \%Rtmt: " + nWaveRet.toFixed(2) + " ";        var nWaveRet2 = (Math.abs(y2b-aSwingsPrice[0]) / Math.abs(aSwingsPrice[0]-aSwingsPrice[1]))*100;        var sWaveRetText2 = " \%Rtmt: " + nWaveRet2.toFixed(2) + " ";        var nWaveChg = (Math.abs(y2a-y2b) / y1b)*100;        var sWaveChgText = " \%Chg: " +  nWaveChg.toFixed(2) + " ";        drawTextRelative(2, 45, sWaveRetText, cColor1, Color.lightgrey,            Text.BOLD|Text.LEFT|Text.VCENTER|Text.FRAME|Text.RELATIVETOBOTTOM,             null, 12, "Ret");   // Developing peak/valley %Ret of previous confirmed peak/valley        drawTextRelative(2, 25, sWaveRetText2, cColor2, Color.lightgrey,            Text.BOLD|Text.LEFT|Text.VCENTER|Text.FRAME|Text.RELATIVETOBOTTOM,             null, 12, "Ret2");  // Current bar %Ret of current developing peak/valley        drawTextRelative(2, 5, sWaveChgText, cColor2, Color.lightgrey,            Text.BOLD|Text.LEFT|Text.VCENTER|Text.FRAME|Text.RELATIVETOBOTTOM,             null, 12, "Chg");  // %Change in price of current bar from current developing peak/valley    }    return;}/***********************//******  Functions *****//***********************/function Init(h,l,c) {    if (close(-(nNumBars*2)) == null) {        return false;    } else {        // Find initial line.        // The initial line will be the first high or low swing,        // which has the greater difference of the swing point to        // the close of the first bar.        var Index = getCurrentBarIndex()        var hIndex = Index;        var lIndex = Index;        var j = nNumBars*2;        var aHigh = getValue(sHSource, 0, -j);        var aLow = getValue(sLSource, 0, -j);        var vHH = aHigh[0];        var vLL = aLow[0];        var tempIndex = Index;        var i = 0;        for (i = 0; i < j; ++i) {            if (aHigh[i] > vHH) {                vHH = aHigh[i];                hIndex = tempIndex;            }            if (aLow[i] < vLL) {                vLL = aLow[i];                lIndex = tempIndex;            }            tempIndex -= 1;        }        if (vHH - y1a > y1a - vLL) {            vLastSwing = "L";            x1b = hIndex - Index;            y1b = vHH;            doLine("dev1");            x2a = x1b;            y2a = vHH;            x2b = 0;            y2b = c;            doLine("dev2");        } else {            vLastSwing = "H";            x1b = lIndex - Index;            y1b = vLL;            doLine("dev1");            x2a = x1b;            y2a = vLL;            x2b = 0;            y2b = c;            doLine("dev2");        }            }        if (vLastSwing != null) {        return true;    } else {        return false;    }}function doLine(sType) {    //confirmed    if (sType == "con") {        cntr += 1;        drawLineRelative(x1a, y1a, x1b, y1b, PS_SOLID,             nThicknessG, cColorCon, sType+cntr);        x1a = x2a;        y1a = y2a;        x1b = x2b;        y1b = y2b;        x2a = x1b;        y2a = y1b;        aSwingsIndex.pop();        aSwingsIndex.unshift(x1b);        aSwingsPrice.pop();        aSwingsPrice.unshift(y1b);        if (vLastSwing == "H") y2b = getValue(sHSource);        if (vLastSwing == "L") y2b = getValue(sLSource);        aY2A.pop();        aY2A.unshift(y2a);        if (aSwingsIndex[6] != null) {            bProjCon = true;        }    }    // dev1    if (sType == "dev1") {        drawLineRelative(x1a, y1a, x1b, y1b, PS_SOLID,             nThicknessG, cColorDev, sType);        aSwingsIndex[0] = x1b;        aSwingsPrice[0] = y1b;        if (aSwingsIndex[6] != null && getCurrentBarIndex() >= -1) {            bProjDev = true;        }    }        // dev2        if (sType == "dev2") {        if (x2a != 0 && x2a != x2b) {            if ( (vLastSwing == "H" && sHSource == "Close") || (vLastSwing == "L" && sLSource == "Close") ) {                x2b = 0;                y2b = close();            }            drawLineRelative(x2a, y2a, x2b, y2b, PS_SOLID,                 nThicknessG, cColorDev, sType);        } else {            removeLine(sType);        }    }    return;}function confirmSwings() {    if (x1b != x2b) {   // underdeveloped dev1 line        if (sWaveTypeG == "% Retracement") {            var nWave = (Math.abs(y2a-y2b) / Math.abs(y1b-y1a));        } else {            var nWave = (Math.abs(y2a-y2b) / y1b);        }        if (vLastSwing == "L" && nWave >= nRetpcnt ) {            // Swing High            nScntr = 0;            vLastSwing = "H";            doLine("con");        } else if (vLastSwing == "H" && nWave >= nRetpcnt ) {            // Swing Low            nScntr = 0;            vLastSwing = "L";            doLine("con");        }    }        return;}function checkSwings(h, l) {    // dev1    if (vLastSwing == "L") {         // find Swing High        if (h >= y1b) {  // higher high, no swing            nScntr = 0;            x1b = 0;            y1b = h;            doLine("dev1");            x2a = 0;            y2a = h;        }    } else if (vLastSwing == "H") {  // find Swing Low        if (l <= y1b) {  // Lower low, no swing            nScntr = 0;            x1b = 0;            y1b = l;            doLine("dev1");            x2a = 0;            y2a = l;        }    }    // dev2    if (nScntr == 0) {        x2b = 0;        if (vLastSwing == "H") y2b = h;        if (vLastSwing == "L") y2b = l;    } else {        if (vLastSwing == "H" && h >= y2b) {            y2b = h; x2b = 0;        } else if (vLastSwing == "L" && l <= y2b) {            y2b = l; x2b = 0;        }    }    doLine("dev2");    return;}function doProjections(sName) {    var i = 0;    var j = 0;    var k = 0;    var nGannTot = (nGannNumG*2) + 1; // total number of Gann rows    var aX = new Array(10);    var aY = new Array(10);    var aSwingPeriods = new Array(10);    var nOffset = 0;  // 0 for developing swings, 1 for confirmed swings        if (sName == "con") nOffset = 1;    var DR = aSwingsIndex[0+nOffset] - aSwingsIndex[1+nOffset];    aSwingPeriods[0] = DR;    aSwingPeriods[1] = DR;    var C  = aSwingsIndex[1+nOffset] - aSwingsIndex[3+nOffset];    aSwingPeriods[2] = C;    aSwingPeriods[3] = C;    var DC = aSwingsIndex[1+nOffset] - aSwingsIndex[5+nOffset];    aSwingPeriods[4] = DC;    aSwingPeriods[5] = DC;    var A1 = aSwingsIndex[1+nOffset] - aSwingsIndex[2+nOffset];    aSwingPeriods[6] = A1;    aSwingPeriods[7] = A1;    var A2 = aSwingsIndex[3+nOffset] - aSwingsIndex[4+nOffset];    aSwingPeriods[8] = A2;    aSwingPeriods[9] = A2;        if (sName == "con") {        i = 0;        for (i = 0; i < nGannG; ++i) {            for (k = 0; k < 10; ++k) {                for (j = 0; j < nGannTot; ++j) {                    removeShape("dev1Proj"+i+k+j);                }            }        }    }        // X - Projections    // anchor is from end of DR wave for DR, A1 and A2    // anchor is from beginning of DR wave for C and DC    i = 0;    for (i = 0; i < 10; ++i) {        if (i >= 2 && i <= 5) { // C and DC            aX[i] = Math.round((aSwingPeriods[i] * aFibs[i]) + aSwingsIndex[1+nOffset]);        } else { // DR, A1 and A2            aX[i] = Math.round((aSwingPeriods[i] * aFibs[i]) + aSwingsIndex[0+nOffset]);        }    }        // Y - Projections    var aY = new Array(nGannG); // number of swings    i = 0;    for (i = 0; i < nGannG; ++i) {        aY[i] = new Array(nGannTot);    // number of rows per swing    }    i = 0;    for (i = 0; i < nGannG; ++i) {        var nBasis = Math.sqrt(aSwingsPrice[i+nOffset]);        var nNum = (nGannIncG * nGannNumG);        for (j = 0; j < nGannTot; ++j) {            aY[i][j] = (nBasis + nNum) * (nBasis + nNum);            nNum -= nGannIncG;        }    }        // plot Swing Predictions    i = 0;    for (i = 0; i < nGannG; ++i) {  // number of swings        for (k = 0; k < 10; ++k) {  // 10 swing periods (5 waves * 2 fibs for each)            for (j = 0; j < nGannTot; ++j) {  // total rows per swing                var ShapeFlags = null;                if (sName == "con") {                    var ProjColor = cColorDev;                    var vShape = "Shape.CIRCLE";                } else {                    var ProjColor = Color.red;                    var vShape = "Shape.DIAMOND";                }                if (j == ((nGannTot/2)-.5) ) {                    if (sName == "con") {                        ProjColor = cColorCon;                        vShape = "Shape.CIRCLE";                    } else {                        ProjColor = Color.green;                        vShape = "Shape.DIAMOND";                    }                    ShapeFlags = "Shape.ONTOP";                }                drawShapeRelative(aX[k], aY[i][j], eval(vShape), null, ProjColor,                    eval(ShapeFlags), sName + "Proj"+i+k+j);            }        }    }        return;}