2016 Oct: Which Trend Indicator Wins? by Markos Katsanos

ICE Data Services -


R2.efs, ADX.efs, ER.efs, VHF.efs  EFSLibrary - Discussion Board
  

File Name: R2.efs, ADX.efs, ER.efs, VHF.efs


Description:
Which Trend Indicator Wins? by Markos Katsanos


Formula Parameters:
R2.efs

Length: 18
R2 Smooth: 3
Trend: 0.42
Max R2: 0.85
Lag: 10
LR Crit: 10
MA Length: 50

ADX.efs

Length: 14
Trend: 30
Max ADX: 42
Lag: 12
Crit: 22
Mult: 1.8
MA Length: 50

ER.efs

Length: 24
ER Smooth: 3
Trend: 0.36
Max ER: 0.42
Lag: 3
Mult: 2.5
Crit: 0.26
MA Length: 50

VHF.efs

Length: 14
Trend: 30
Max VHF: 42
Lag: 12
Crit: 22
Mult: 1.8
MA Length: 50

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

Download File:
R2.efs
ADX.efs
ER.efs
VHF.efs


R2.efs, ADX.efs, ER.efs, VHF.efs



EFS Code:

R2.efs













/*********************************Provided By:  eSignal (Copyright c eSignal), a division of Interactive Data Corporation. 2016. All rights reserved. This sample eSignal Formula Script (EFS) is for educational purposes only and may be modified and saved under a new file name.  eSignal is not responsiblefor the functionality once modified.  eSignal reserves the right to modify and overwrite this EFS file with each new release.Description:            Which Trend Indicator Wins? by Markos KatsanosVersion:            1.00  08/10/2016Formula Parameters:                     Default:Length                                  18R2 Smooth                               3Trend                                   0.42Max R2                                  0.85Lag                                     10LR Crit                                 10MA Length                               50Notes:The related article is copyrighted material. If you are not a subscriberof Stocks & Commodities, please visit www.traders.com.**********************************/var fpArray = new Array();function preMain(){    setPriceStudy(false);    setDefaultBarFgColor(Color.RGB(0,148,255),0);        var x=0;    fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(18);        setName("Length");    }    fpArray[x] = new FunctionParameter("Smooth", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(3);        setName("R2 Smooth");    }    fpArray[x] = new FunctionParameter("Trend", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(1);          setDefault(0.42);        setName("Trend");    }    fpArray[x] = new FunctionParameter("R2Max", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(1);          setDefault(0.85);        setName("Max R2");    }    fpArray[x] = new FunctionParameter("Lag", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(10);        setName("Lag");    }    fpArray[x] = new FunctionParameter("LRcrit", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(10);        setName("LR Crit");    }    fpArray[x] = new FunctionParameter("MALength", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(50);        setName("MA Length");    }}var bInit = false;var bVersion = null;var xClose = null;var xR2Lin = null;var xSlope = null;var xR2 = null;var xSMA = null;function main(Length, Smooth, Trend, R2Max, Lag, LRcrit, MALength){    if (bVersion == null) bVersion = verify();    if (bVersion == false) return;        if (getCurrentBarCount() <= (Length + Smooth + Lag)) return;        if (getBarState() == BARSTATE_ALLBARS){        xClose = null;        xR2Lin = null;        xSlope = null;        xR2 = null;        xSMA = null;        bInit = false;    }        if (!bInit){        xClose = close();        xR2Lin = efsInternal("calc_R2", xClose, Length);        if (xR2Lin.getValue(0) != null){            xSlope = getSeries(xR2Lin, 0);            xR2 = getSeries(xR2Lin,1);        }        xR2 = sma(Smooth, xR2);        xSMA = sma(MALength, xClose);        addBand(Trend, PS_DASH, 1, Color.RGB(195,195,195),0);        bInit = true;    }     var nSlope = xSlope.getValue(0) * 100;    var nR2 = xR2.getValue(0);    if (getCurrentBarIndex() != 0){        nR2_1 = xR2.getValue(-1);        nR2_lag = xR2.getValue(-Lag);        nClose = xClose.getValue(0);        nClose_1 = xClose.getValue(-1);        nSMA = xSMA.getValue(0);        nSMA_1 = xSMA.getValue(-1);        if (Strategy.isLong() && nClose_1 > nSMA_1 && nClose < nSMA)            Strategy.doSell("MA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);        else if (Strategy.isShort() && nClose_1 < nSMA_1 && nClose > nSMA)            Strategy.doCover("XMA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);        if ((!Strategy.isInTrade()) && nR2_1 < Trend && nR2 >= Trend && nR2 < R2Max && nR2 > nR2_lag){            if (nClose > nSMA && nSlope > LRcrit)                Strategy.doLong("STRONGTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);            else if (nClose < nSMA && nSlope <= LRcrit)                Strategy.doShort("STRONGDOWNTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);        }        if (Strategy.isLong()) setBarBgColor(Color.RGB(0,60,0));        else if (Strategy.isShort()) setBarBgColor(Color.RGB(170,46,46));    }    return nR2;}function calc_R2(xClose, Length){    var X = 0, Y = 0, XY = 0, X2 = 0, Y2 = 0;        for (var i = 0; i < Length; i++){        var xVal = xClose.getValue(-i);        X += (i + 1);        Y += xVal;        XY += ((i + 1) * xVal);        X2 += ((i + 1) * (i + 1));        Y2 += (xVal * xVal);    }    var xAvg = X / Length;    var yAvg = Y / Length;    var aSum1 = 0, aSum2 = 0;    for (var i = 0; i < Length; i++){        aSum1 += (i-xAvg) * (xClose.getValue(-i)-yAvg);         aSum2 += (i-xAvg) * (i-xAvg);    }    var nSlope = aSum1 / aSum2;    var R2 = Math.pow((Length * XY - X * Y) / Math.sqrt((Length * X2 - X * X) * (Length * Y2 - Y*Y)),2);    return new Array(nSlope, R2);}function verify(){    var b = false;    if (getBuildNumber() < 779){                drawTextAbsolute(5, 35, "This study requires version 10.6 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;}
ADX.efs
/*********************************Provided By:  eSignal (Copyright c eSignal), a division of Interactive Data Corporation. 2016. All rights reserved. This sample eSignal Formula Script (EFS) is for educational purposes only and may be modified and saved under a new file name.  eSignal is not responsiblefor the functionality once modified.  eSignal reserves the right to modify and overwrite this EFS file with each new release.Description:            Which Trend Indicator Wins? by Markos KatsanosVersion:            1.00  08/10/2016Formula Parameters:                     Default:Length                                  14Trend                                   30Max ADX                                 42Lag                                     12Crit                                    22Mult                                    1.8MA Length                               50Notes:The related article is copyrighted material. If you are not a subscriberof Stocks & Commodities, please visit www.traders.com.**********************************/var fpArray = new Array();function preMain(){    setPriceStudy(false);    setDefaultBarFgColor(Color.RGB(0,148,255),0);        var x=0;    fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(14);        setName("Length");    }    fpArray[x] = new FunctionParameter("Trend", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(100);          setDefault(30);        setName("Trend");    }    fpArray[x] = new FunctionParameter("AdxMax", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(100);          setDefault(42);        setName("Max ADX");    }    fpArray[x] = new FunctionParameter("Lag", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(12);        setName("Lag");    }    fpArray[x] = new FunctionParameter("Crit", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(100);          setDefault(22);        setName("Crit");    }    fpArray[x] = new FunctionParameter("Mult", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0.01);        setUpperLimit(100);          setDefault(1.8);        setName("Mult");    }    fpArray[x] = new FunctionParameter("MALength", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(50);        setName("MA Length");    }}var bInit = false;var bVersion = null;var xClose = null;var xADX = null;var xSMA = null;var xLADX = null;function main(Length, Trend, AdxMax, Lag, Crit, Mult, MALength){    if (bVersion == null) bVersion = verify();    if (bVersion == false) return;        if (getCurrentBarCount() <= Length) return;        if (getBarState() == BARSTATE_ALLBARS){        xClose = null;        xADX = null;        xSMA = null;        xLADX = null;        bInit = false;    }        if (!bInit){        xClose = close();        xADX = adx(Length,Length);        xLADX = lowerDonchian(Lag, xADX);        xSMA = sma(MALength, xClose);        addBand(Trend, PS_DASH, 1, Color.RGB(195,195,195),1);        bInit = true;    }    var nADX = xADX.getValue(0);    if (getCurrentBarIndex() != 0){        var nSMA = xSMA.getValue(0);        var nSMA_1 = xSMA.getValue(-1);        var nADX_1 = xADX.getValue(-1);        var nClose = xClose.getValue(0);        var nClose_1 = xClose.getValue(-1);        var nLADX = xLADX.getValue(0);                if (Strategy.isLong() && nClose_1 > nSMA_1 && nClose < nSMA)            Strategy.doSell("MA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);        else if (Strategy.isShort() && nClose_1 < nSMA_1 && nClose > nSMA)            Strategy.doCover("XMA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                if (!Strategy.isInTrade()){            if (nADX_1 < Trend && nADX > Trend && nADX < AdxMax){                if (nClose > nSMA)                    Strategy.doLong("STRONGTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                else if (nClose < nSMA)                    Strategy.doShort("STRONGDOWNTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);            }            else if (nADX > (Mult * nLADX) && nADX_1 < Crit && nADX > Crit){                if (nClose > nSMA)                    Strategy.doLong("TREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                else if (nClose < nSMA)                    Strategy.doShort("DOWNTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);            }        }            if (Strategy.isLong()) setBarBgColor(Color.RGB(0,60,0));        else if (Strategy.isShort()) setBarBgColor(Color.RGB(170,46,46))    }    return xADX.getValue(0);}        function verify(){    var b = false;    if (getBuildNumber() < 779){                drawTextAbsolute(5, 35, "This study requires version 10.6 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;}
ER.efs
/*********************************Provided By:  eSignal (Copyright c eSignal), a division of Interactive Data Corporation. 2016. All rights reserved. This sample eSignal Formula Script (EFS) is for educational purposes only and may be modified and saved under a new file name.  eSignal is not responsiblefor the functionality once modified.  eSignal reserves the right to modify and overwrite this EFS file with each new release.Description:            Which Trend Indicator Wins? by Markos KatsanosVersion:            1.00  08/10/2016Formula Parameters:                     Default:Length                                  24ER Smooth                               3Trend                                   0.36Max ER                                  0.42Lag                                     3Mult                                    2.5Crit                                    0.26MA Length                               50Notes:The related article is copyrighted material. If you are not a subscriberof Stocks & Commodities, please visit www.traders.com.**********************************/var fpArray = new Array();function preMain(){    setPriceStudy(false);    setDefaultBarFgColor(Color.RGB(0,148,255),0);        var x=0;    fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(24);        setName("Length");    }    fpArray[x] = new FunctionParameter("Smooth", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(3);        setName("ER Smooth");    }    fpArray[x] = new FunctionParameter("Trend", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(1);          setDefault(0.36);        setName("Trend");    }    fpArray[x] = new FunctionParameter("ERMax", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(1);          setDefault(0.42);        setName("Max ER");    }    fpArray[x] = new FunctionParameter("Lag", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(3);        setName("Lag");    }    fpArray[x] = new FunctionParameter("Mult", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0.01);        setUpperLimit(100);          setDefault(2.5);        setName("Mult");    }    fpArray[x] = new FunctionParameter("Crit", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(1);          setDefault(0.26);        setName("Crit");    }    fpArray[x] = new FunctionParameter("MALength", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(50);        setName("MA Length");    }}var bInit = false;var bVersion = null;var xClose = null;var xER = null;var xSMA = null;var xLER = null;function main(Length, Smooth, Trend, ERMax, Lag, Mult, Crit, MALength){    if (bVersion == null) bVersion = verify();    if (bVersion == false) return;        if (getCurrentBarCount() <= (Length + Smooth + Lag)) return;        if (getBarState() == BARSTATE_ALLBARS){        xClose = null;        xER = null;        xSMA = null;        xLER = null;        bInit = false;    }        if (!bInit){        xClose = close();        xER = efsInternal("calc_ER",xClose,Length);        xER = sma(Smooth, xER);        xLER = lowerDonchian(Lag, xER);        xSMA = sma(MALength, xClose);        addBand(Trend, PS_DASH, 1, Color.RGB(195,195,195),1);        bInit = true;    }    var nER = xER.getValue(0);    if (getCurrentBarIndex() != 0){        var nER_1 = xER.getValue(-1);        var nER_lag = xER.getValue(-Lag);        var nLER = xLER.getValue(0);        var nSMA = xSMA.getValue(0);        var nSMA_1 = xSMA.getValue(-1);        var nClose = xClose.getValue(0);        var nClose_1 = xClose.getValue(-1);                if (Strategy.isLong() && nClose_1 > nSMA_1 && nClose < nSMA)            Strategy.doSell("MA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);        else if (Strategy.isShort() && nClose_1 < nSMA_1 && nClose > nSMA)            Strategy.doCover("XMA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                if (!Strategy.isInTrade()){            if (nER_1 < Trend && nER > Trend && nER < ERMax && nER > nER_lag){                if (nClose > nSMA)                    Strategy.doLong("STRONGTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                else if (nClose < nSMA)                    Strategy.doShort("STRONGDOWNTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);            }            else if (nER > (Mult * nLER) && nER_1 < Crit && nER > Crit){                if (nClose > nSMA)                    Strategy.doLong("TREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                else if (nClose > nSMA)                    Strategy.doShort("DOWNTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);            }        }            if (Strategy.isLong()) setBarBgColor(Color.RGB(0,60,0));        else if (Strategy.isShort()) setBarBgColor(Color.RGB(170,46,46));      }    return nER;}function calc_ER(Close,Length){    var nNetCh = Math.abs(Close.getValue(0) - Close.getValue(-Length));    var nSum = 0;    for (var i = 0; i < Length; i++){        nSum += Math.abs(Close.getValue(-i) - Close.getValue(-i-1));    }    if (nSum == 0) return;    ER = nNetCh / nSum;        return ER;}function verify(){    var b = false;    if (getBuildNumber() < 779){                drawTextAbsolute(5, 35, "This study requires version 10.6 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;}
VHF.efs
/*********************************Provided By:  eSignal (Copyright c eSignal), a division of Interactive Data Corporation. 2016. All rights reserved. This sample eSignal Formula Script (EFS) is for educational purposes only and may be modified and saved under a new file name.  eSignal is not responsiblefor the functionality once modified.  eSignal reserves the right to modify and overwrite this EFS file with each new release.Description:            Which Trend Indicator Wins? by Markos KatsanosVersion:            1.00  08/10/2016Formula Parameters:                     Default:Length                                  14Trend                                   30Max VHF                                 42Lag                                     12Crit                                    22Mult                                    1.8MA Length                               50Notes:The related article is copyrighted material. If you are not a subscriberof Stocks & Commodities, please visit www.traders.com.**********************************/var fpArray = new Array();function preMain(){    setPriceStudy(false);    setDefaultBarFgColor(Color.RGB(0,148,255),0);        var x=0;    fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(36);        setName("Length");    }    fpArray[x] = new FunctionParameter("Trend", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(1);          setDefault(0.38);        setName("Trend");    }    fpArray[x] = new FunctionParameter("VHFMax", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0);        setUpperLimit(1);          setDefault(0.45);        setName("Max VHF");    }    fpArray[x] = new FunctionParameter("Lag", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(10);        setName("Lag");    }    fpArray[x] = new FunctionParameter("Crit", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1);          setDefault(0.24);        setName("Crit");    }    fpArray[x] = new FunctionParameter("Mult", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(0.01);        setUpperLimit(100);          setDefault(1.5);        setName("Mult");    }    fpArray[x] = new FunctionParameter("MALength", FunctionParameter.NUMBER);	with(fpArray[x++]){        setLowerLimit(1);        setUpperLimit(1000);          setDefault(50);        setName("MA Length");    }}var bInit = false;var bVersion = null;var xClose = null;var xVHF = null;var xSMA = null;var xLVHF = null;function main(Length, Trend, VHFMax, Lag, Crit, Mult, MALength){    if (bVersion == null) bVersion = verify();    if (bVersion == false) return;        if (getCurrentBarCount() <= Length) return;        if (getBarState() == BARSTATE_ALLBARS){        xClose = null;        xVHF = null;        xSMA = null;        xLVHF = null;        xHighest = null;        xLowest = null;        bInit = false;    }        if (!bInit){        xClose = close();        xVHF = efsInternal("calc_VHF",xClose,Length);        xLVHF = lowerDonchian(Lag, xVHF);        xSMA = sma(MALength, xClose);        addBand(0.35, PS_DASH, 1, Color.RGB(195,195,195),1);        bInit = true;    }    nVHF = xVHF.getValue(0);    if (getCurrentBarIndex() != 0){        var nSMA = xSMA.getValue(0);        var nSMA_1 = xSMA.getValue(-1);        var nVHF_1 = xVHF.getValue(-1);        var nVHF_lag = xVHF.getValue(-Lag);        var nClose = xClose.getValue(0);        var nClose_1 = xClose.getValue(-1);        var nLVHF = xLVHF.getValue(0);                if (Strategy.isLong() && nClose_1 > nSMA_1 && nClose < nSMA)            Strategy.doSell("MA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);        else if (Strategy.isShort() && nClose_1 < nSMA_1 && nClose > nSMA)            Strategy.doCover("XMA", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                if (!Strategy.isInTrade()){            if (nVHF_1 < Trend && nVHF > Trend && nVHF < VHFMax && nVHF > nVHF_lag){                if (nClose > nSMA)                    Strategy.doLong("STRONGTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                else if (nClose < nSMA)                    Strategy.doShort("STRONGDOWNTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);            }            else if (nVHF > (Mult * nLVHF) && nVHF_1 < Crit && nVHF > Crit){                if (nClose > nSMA)                    Strategy.doLong("TREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);                else if (nClose < nSMA)                    Strategy.doShort("DOWNTREND", Strategy.MARKET, Strategy.NEXTBAR, Strategy.DEFAULT);            }        }            if (Strategy.isLong()) setBarBgColor(Color.RGB(0,60,0));        else if (Strategy.isShort()) setBarBgColor(Color.RGB(170,46,46))    }    return nVHF;}var xHighest = null;var xLowest = null;function calc_VHF(Close,Length){        if (getBarState() == BARSTATE_ALLBARS){        xHighest = upperDonchian(Length,Close);        xLowest = lowerDonchian(Length,Close);    }    var nHighest = xHighest.getValue(0);    var nLowest = xLowest.getValue(0);        if (nHighest == null || nLowest == null) return;        var nSum = 0;        for (var i = 0; i < Length; i++){        nSum += Math.abs(Close.getValue(-i) - Close.getValue(-i-1));    }    if (nSum == 0) return;    VHF = (nHighest - nLowest) / nSum;        return VHF;}function verify(){    var b = false;    if (getBuildNumber() < 779){                drawTextAbsolute(5, 35, "This study requires version 10.6 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;}