/*********************************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: Does Fully Automated Trading Software Work? by James BreenVersion: 1.00 09/06/2016Formula Parameters: Default:MA Length 10Entry Trigger % 3Exit Trigger % 4Initial Stop Loss % 2Trailing Stop Trigger % 6Trailing Stop % 2Notes: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(true); setStudyTitle("MA"); var x=0; fpArray[x] = new FunctionParameter("Length", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(1); setUpperLimit(1000); setDefault(10); setName("MA Length"); } fpArray[x] = new FunctionParameter("EntTrigger", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0.1); setUpperLimit(100); setDefault(3); setName("Entry Trigger %"); } fpArray[x] = new FunctionParameter("ExtTrigger", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0.1); setUpperLimit(100); setDefault(4); setName("Exit Trigger %"); } fpArray[x] = new FunctionParameter("InStopLoss", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0.1); setUpperLimit(100); setDefault(2); setName("Initial Stop Loss %"); } fpArray[x] = new FunctionParameter("TrlStopTrigger", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0.1); setUpperLimit(100); setDefault(6); setName("Trailing Stop Trigger %"); } fpArray[x] = new FunctionParameter("TrlStop", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0.1); setUpperLimit(100); setDefault(2); setName("Trailing Stop %"); } fpArray[x] = new FunctionParameter("MaxLoss", FunctionParameter.NUMBER); with(fpArray[x++]){ setLowerLimit(0); setDefault(500); setName("Max Daily Loss $"); }}var bInit = false;var bVersion = null;var xSMA = null;var xClose = null;var xHigh = null;var xLow = null;var nInv = null;var nShares = 0;var nEntryPrice = 0;var nTrlStop = null;var nHighestHigh = null;var nLowestLow = null;var nCumProfit = 0;var bMaxLost = false;function main(Length, EntTrigger, ExtTrigger, InStopLoss, TrlStopTrigger, TrlStop, MaxLoss){ if (bVersion == null) bVersion = verify(); if (bVersion == false) return; if (getCurrentBarCount() <= Length) return; if (getBarState() == BARSTATE_ALLBARS){ xSMA = null; xClose = null; xHigh = null; xLow = null; nInv = null; nShares = 0; nEntryPrice = 0; nTrlStop = null; nHighestHigh = null; nLowestLow = null; nCumProfit = 0; bMaxLost = false; bInit = false; } if (!bInit){ xClose = close(); xHigh = high(); xLow = low(); xSMA = sma(Length, xClose); nHighestHigh = xHigh.getValue(0); nLowestLow = xLow.getValue(0); bInit = true; } var nSMA = xSMA.getValue(0); var nClose = xClose.getValue(0); var nHigh = xHigh.getValue(0); var nLow = xLow.getValue(0); var nTradeProfit = 0; if (day(0) != day(-1) && !Strategy.isInTrade()){ bMaxLost = false; nCumProfit = 0; } if (getCurrentBarIndex() != 0){ if (Strategy.isLong()) nTradeProfit = nClose * nShares - nInv; else if (Strategy.isShort()) nTradeProfit = nInv - nClose * nShares; if ((nCumProfit + nTradeProfit) <= -MaxLoss){ if (Strategy.isLong()) Strategy.doSell("Loss Limit exceeded", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); else Strategy.doCover("Loss Limit exceeded", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); nCumProfit = 0; bMaxLost = true; } if (nShares == 0) nShares = Strategy.getDefaultLotSize(); if (Strategy.isLong()){ if (nTrlStop == null && (nHigh * nShares) >= (nEntryPrice * nShares * (1 + TrlStopTrigger/100))){ nTrlStop = nHigh * (1 - TrlStop/100); nHighestHigh = nHigh; } if (nTrlStop != null && nHigh > nHighestHigh){ nHighestHigh = nHigh; nTrlStop = nHighestHigh * (1 - TrlStop/100); } if (nClose < (nSMA * (1 - ExtTrigger/100))) Strategy.doSell("Exit Long", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); else if (nClose * nShares < (nInv * (1 - InStopLoss/100))) Strategy.doSell("Stop Loss Long", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); else if (nTrlStop != null && nClose < nTrlStop) Strategy.doSell("Trl Stop Long", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); if (!Strategy.isLong()){ nCumProfit += nClose * nShares - nInv; nTrlStop = null; } } else if (Strategy.isShort()){ if (nTrlStop == null && (nLow * nShares) <= (nEntryPrice * nShares * (1 - TrlStopTrigger/100))){ nTrlStop = nLow * (1 + TrlStop/100); nLowestLow = nLow; } if (nTrlStop != null && nLow < nLowestLow){ nLowestLow = nLow; nTrlStop = nLowestLow * (1 + TrlStop/100); } if (nClose > (nSMA * (1 + ExtTrigger/100))) Strategy.doCover("Exit Short", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); else if (nClose * nShares > (nInv * (1 + InStopLoss/100))){ Strategy.doCover("Stop Loss Short", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); } else if (nTrlStop != null && nClose > nTrlStop) Strategy.doCover("Trl Stop Short", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); if (!Strategy.isShort()){ nCumProfit += nInv - nClose * nShares; nTrlStop = null; } } if (!Strategy.isInTrade() && !bMaxLost){ nTrlStop = null; if (nClose > (nSMA * (1 + EntTrigger/100))){ Strategy.doLong("Long", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); } else if (nClose < (nSMA * (1 - EntTrigger/100))){ Strategy.doShort("Short", Strategy.CLOSE, Strategy.THISBAR, Strategy.DEFAULT); } if (Strategy.isInTrade()){ nEntryPrice = nClose; nInv = nShares * nEntryPrice; } } if (Strategy.isLong()) setBarBgColor(Color.RGB(0,60,0)); else if (Strategy.isShort()) setBarBgColor(Color.RGB(170,46,46)) } if (nSMA != null) return nSMA;}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;} |