NonLinear Exits

ICE Data Services -


NonLinearExits.efs  EFSLibrary - Discussion Board
  

File Name: NonLinearExits.efs


Description:
NonLinear Exits


Formula Parameters:
Fraction of ATR for entry : 1
Length of channel for breakout : 20
Length of moving average : 30
Length of ATR, short-term : 10
Length of ATR, long-term : 200
Number of bars from entry to exit : 20
Constants for nonlinear exits a0 : 1
Constants for nonlinear exits a2 : 1
Constants for nonlinear exits a3 : 0.02
Constants for nonlinear exits b0 : 1
Constants for nonlinear exits b2 : 1
Constants for nonlinear exits b3 : 0.02

Notes:
This system illustrates different kinds of nonlinear
exits based on volatility, as given by the average
true range (ATR).

Mike Bryant
Breakout Futures
www.breakoutfutures.com/Newsletters/Newsletter0608.htm
www.BreakoutFutures.com

Download File:
NonLinearExits.efs




EFS Code:






/*********************************Provided By:      eSignal (Copyright c eSignal), a division of Interactive Data     Corporation. 2009. 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 responsible    for the functionality once modified.  eSignal reserves the right     to modify and overwrite this EFS file with each new release.Description:            NonLinear ExitsVersion:            1.01  11/16/2009Formula Parameters:                     Default:    Fraction of ATR for entry           1    Length of channel for breakout      20    Length of moving average            30    Length of ATR, short-term           10    Length of ATR, long-term            200    Number of bars from entry to exit   20        Constants for nonlinear exits a0    1    Constants for nonlinear exits a2    1    Constants for nonlinear exits a3    0.02    Constants for nonlinear exits b0    1    Constants for nonlinear exits b2    1    Constants for nonlinear exits b3    0.02    Notes:  This system illustrates different kinds of nonlinear  exits based on volatility, as given by the average  true range (ATR).  Mike Bryant  Breakout Futures  www.breakoutfutures.com/Newsletters/Newsletter0608.htm  www.BreakoutFutures.com**********************************/var fpArray = new Array();var bInit = false;function preMain() {    setPriceStudy(true);    setShowCursorLabel(true);    setShowTitleParameters(false);    setStudyTitle("NonLinear Exits");    setDefaultPriceBarColor(Color.black);        setCursorLabelName("Open Price", 0);       setDefaultBarFgColor(Color.blue, 0);    setPlotType(PLOTTYPE_FLATLINES, 0);     setDefaultBarThickness(1, 0);    setCursorLabelName("Take Profit Price", 1);       setDefaultBarFgColor(Color.green, 1);    setPlotType(PLOTTYPE_FLATLINES, 1);     setDefaultBarThickness(1, 1);    setCursorLabelName("Stop Loss Price", 2);       setDefaultBarFgColor(Color.red, 2);    setPlotType(PLOTTYPE_FLATLINES, 2);     setDefaultBarThickness(1, 2);    setColorPriceBars(true);            askForInput();    var x=0;    fpArray[x] = new FunctionParameter("EntFr", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Fraction of ATR for entry");        setLowerLimit(1);		        setDefault(1);    }    fpArray[x] = new FunctionParameter("NChan", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Length of channel for breakout");        setLowerLimit(1);		        setDefault(20);    }    fpArray[x] = new FunctionParameter("NMA", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Length of moving average");        setLowerLimit(1);		        setDefault(30);    }    fpArray[x] = new FunctionParameter("NATRst", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Length of ATR, short-term");        setLowerLimit(1);		        setDefault(10);    }    fpArray[x] = new FunctionParameter("NATRlt", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Length of ATR, long-term");        setLowerLimit(1);		        setDefault(200);    }    fpArray[x] = new FunctionParameter("NBExit", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Number of bars from entry to exit");        setLowerLimit(1);		        setDefault(20);    }    fpArray[x] = new FunctionParameter("a0", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Constants for nonlinear exits a0");        setLowerLimit(0);		        setDefault(1);    }    fpArray[x] = new FunctionParameter("a1", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Constants for nonlinear exits a1");        setLowerLimit(0);		        setDefault(1);    }    fpArray[x] = new FunctionParameter("a2", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Constants for nonlinear exits a2");        setLowerLimit(0);		        setDefault(0.02);    }    fpArray[x] = new FunctionParameter("b0", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Constants for nonlinear exits b0");        setLowerLimit(0);		        setDefault(1);    }    fpArray[x] = new FunctionParameter("b1", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Constants for nonlinear exits b1");        setLowerLimit(0);		        setDefault(1);    }    fpArray[x] = new FunctionParameter("b2", FunctionParameter.NUMBER);	with(fpArray[x++]){        setName("Constants for nonlinear exits b2");        setLowerLimit(0);		        setDefault(0.02);    }}var xATRst = null;var xATRlt = null;var xMA = null;var xHH = null;var xLL = null;var xClose = null;var xOpen = null;var nEntryBar = 0;var nPriceEntry = 0;var nPriceProfit = 0;var nPriceLoss = 0;var bOut = false;function main(EntFr, NChan, NMA, NATRst, NATRlt, NBExit, a0, a1, a2, b0, b1, b2) {var nBarState = getBarState();var EntLong = false;    var EntShort = false;var nMA = 0;var nHH1 = 0;var nLL1 = 0;var nClose = 0;var nOpen = 0;var ExitSz1 = 0;var ExitSz2 = 0;var ATRst = 0;var ATRlt = 0;    if (nBarState == BARSTATE_ALLBARS) {        if (EntFr == null) EntFr = 1;        if (NChan == null) NChan = 20;        if (NMA == null) NMA = 30;        if (NATRst == null) NATRst = 10;        if (NATRlt == null) NATRlt = 200;        if (NBExit == null) NBExit = 20;        if (a0 == null) a0 = 1;        if (a1 == null) a1 = 1;        if (a2 == null) a2 = 0.02;        if (b0 == null) b0 = 1;        if (b1 == null) b1 = 1;        if (b2 == null) b2 = 0.02;    }        if (bInit == false) {         xATRst = sma(NATRst, atr(1));        xATRlt = sma(NATRlt, atr(1));        xMA = sma(NMA);        xHH = upperDonchian(NChan);        xLL = lowerDonchian(NChan);        xClose = close();        xHigh = high();        xLow = low();        xOpen = open();        bInit = true;     }    nMA = xMA.getValue(-1);    nHH1 = xHH.getValue(-2);    nLL1 = xLL.getValue(-2);    nClose = xClose.getValue(-1);    ATRst = xATRst.getValue(-1);    ATRlt = xATRlt.getValue(-1);    nOpen = xOpen.getValue(0);    if (getCurrentBarIndex() == 0) return;            if (nHH1 == null || nMA == null || ATRst == null || ATRlt == null) return;    if (nClose > nMA && nClose > (nHH1 + EntFr * ATRst )) {        EntLong = true;    } else {        EntLong = false;    }    if (nClose < nMA && nClose < (nLL1 - EntFr * ATRst )) {        EntShort = true;    } else {        EntShort = false;    }     ExitSz1 = ATRlt * (a0 + a1 * (ATRst / ATRlt) + a2 * Math.pow((ATRst / ATRlt), 2));    ExitSz2 = ATRlt * (b0 + b1 * (ATRst / ATRlt) + b2 * Math.pow((ATRst / ATRlt), 2));     if (EntLong && !Strategy.isLong()) {        Strategy.doLong("Long", Strategy.MARKET, Strategy.THISBAR);        nEntryBar = getCurrentBarCount();        nPriceProfit = nClose + ExitSz2;        nPriceLoss = nClose - ExitSz1;        nPriceEntry = nClose;                setPriceBarColor(Color.green);    } else {          if (EntShort && !Strategy.isShort()) {            Strategy.doShort("Short", Strategy.MARKET, Strategy.THISBAR);            nEntryBar = getCurrentBarCount();            nPriceProfit = nClose - ExitSz2;            nPriceLoss = nClose + ExitSz1;            nPriceEntry = nClose;            setPriceBarColor(Color.red);        } else {            if(Strategy.isLong()) {                setPriceBarColor(Color.green);                if (getCurrentBarCount() - nEntryBar >= NBExit) {                    Strategy.doSell("NBar-L", Strategy.CLOSE, Strategy.THISBAR);                } else {                    Strategy.doSell("Targ-L", Strategy.LIMIT, Strategy.THISBAR, Strategy.ALL, Math.max(nPriceProfit, nOpen));                    Strategy.doSell("MM-L", Strategy.STOP, Strategy.THISBAR, Strategy.ALL, Math.min(nPriceLoss, nOpen));                }                    if (!Strategy.isLong()) bOut = true;            } else {                if(Strategy.isShort()) {                    setPriceBarColor(Color.red);                    if (getCurrentBarCount() - nEntryBar >= NBExit) {                        Strategy.doCover("NBar-S", Strategy.CLOSE, Strategy.THISBAR);                    } else {                        Strategy.doCover("Targ-S", Strategy.LIMIT, Strategy.THISBAR, Strategy.ALL, Math.min(nPriceProfit, nOpen));                        Strategy.doCover("MM-S", Strategy.STOP, Strategy.THISBAR, Strategy.ALL, Math.max(nPriceLoss, nOpen));                    }                    if (!Strategy.isShort()) bOut = true;                }                           }           }     }            if (bOut == true) {        nPriceEntry = 0;        nPriceProfit = 0;        nPriceLoss = 0;        bOut = false;    }        if (nPriceEntry != 0) {        return new Array(nPriceEntry, nPriceProfit, nPriceLoss);    } else {        return;    }}