/***************************************Provided By : eSignal (c) Copyright 2005Description: Shorting Moving Average Pullback System - by Steve PalmquistVersion 1.0 7/8/2005Notes:September 2005 Issue - "Different Systems for Different Markets - Shorting Moving Average Pullbacks"Formula Parameters: Defaults:MA Length 35MA Source CloseMA Type SIMPLEPullback Percent Envelope 1%Enable Long Positions trueEnable Short Positions trueLong Entry Trend Bars 30Short Entry Trend Bars 15Average Volume Filter 200000Average Volume Periods 10Price Filter 15Stochastic K Long Filter 20Stochastic K Short Filter 80Stochastic K Length 14Stochastic K Smoothing 1Stochastic D Length 3***************************************/function preMain() { setPriceStudy(true); setStudyTitle("Short Moving Average Pullback System "); setShowTitleParameters(false); setCursorLabelName("+1\%", 0); setCursorLabelName("MA", 1); setCursorLabelName("-1\%", 2); setCursorLabelName("Trend Count", 3); setDefaultBarFgColor(Color.blue, 0); setDefaultBarFgColor(Color.maroon, 1); setDefaultBarFgColor(Color.blue, 2); setDefaultBarFgColor(Color.grey, 3); var fp1 = new FunctionParameter("nLength", FunctionParameter.NUMBER); fp1.setName("MA Length"); fp1.setDefault(35); fp1.setLowerLimit(1); var fp2 = new FunctionParameter("sSource", FunctionParameter.STRING); fp2.setName("MA Source"); fp2.setDefault("Close"); fp2.addOption("Open"); fp2.addOption("High"); fp2.addOption("Low"); fp2.addOption("Close"); fp2.addOption("HL/2"); fp2.addOption("HLC/3"); fp2.addOption("OHLC/4"); var fp3 = new FunctionParameter("type", FunctionParameter.STRING); fp3.setName("MA Type"); fp3.setDefault("Simple"); fp3.addOption("Simple"); fp3.addOption("Exponential"); fp3.addOption("Weighted"); fp3.addOption("Volume Weighted"); var fp4 = new FunctionParameter("nPBpercent", FunctionParameter.NUMBER); fp4.setName("Pullback Percent Envelope"); fp4.setDefault(1); fp4.setLowerLimit(0); fp4.setUpperLimit(100); var fp5 = new FunctionParameter("bLong", FunctionParameter.STRING); fp5.setName("Enable Long Positions"); fp5.setDefault("true"); fp5.addOption("true"); fp5.addOption("false"); var fp6 = new FunctionParameter("bShort", FunctionParameter.STRING); fp6.setName("Enable Short Positions"); fp6.setDefault("true"); fp6.addOption("true"); fp6.addOption("false"); var fp7 = new FunctionParameter("nLTrendBars", FunctionParameter.NUMBER); fp7.setName("Number of Bars for Long Trend"); fp7.setDefault(30); fp7.setLowerLimit(1); var fp8 = new FunctionParameter("nSTrendBars", FunctionParameter.NUMBER); fp8.setName("Number of Bars for Short Trend"); fp8.setDefault(15); fp8.setLowerLimit(1); var fp9 = new FunctionParameter("nVFilter", FunctionParameter.NUMBER); fp9.setName("Average Volume Filter"); fp9.setDefault(200000); fp9.setLowerLimit(0); var fp10 = new FunctionParameter("nAvgVolLen", FunctionParameter.NUMBER); fp10.setName("Average Volume Periods"); fp10.setDefault(10); fp10.setLowerLimit(1); var fp11 = new FunctionParameter("nPFilter", FunctionParameter.NUMBER); fp11.setName("Price Filter"); fp11.setDefault(15); fp11.setLowerLimit(0); var fp12 = new FunctionParameter("nStochKLFilter", FunctionParameter.NUMBER); fp12.setName("Stochastic K Long Filter"); fp12.setDefault(20); fp12.setLowerLimit(0); var fp13 = new FunctionParameter("nStochKSFilter", FunctionParameter.NUMBER); fp13.setName("Stochastic K Short Filter"); fp13.setDefault(80); fp13.setLowerLimit(0); var fp14 = new FunctionParameter("nStochKLen", FunctionParameter.NUMBER); fp14.setName("Stochastic K Length"); fp14.setDefault(14); fp14.setLowerLimit(1); var fp15 = new FunctionParameter("nStochKSmooth", FunctionParameter.NUMBER); fp15.setName("Stochastic K Smoothing"); fp15.setDefault(1); fp15.setLowerLimit(1); var fp16 = new FunctionParameter("nStochDLen", FunctionParameter.NUMBER); fp16.setName("Stochastic D Length"); fp16.setDefault(3); fp16.setLowerLimit(1);}var bVersion = null;var study = null; // MAvar study2 = null; // Daily Avg Volumevar study3 = null; // StochKvar bt = true; // back testing onvar nTrendCntr = 0;var nTrendCntr1 = 0;// previous bar's nTrendCntrvar sSide = 0; // 1 = obove MA, -1 = below MAvar sSide1 = 0; // previous bar's sSidevar bInit = true; // initialization routine.var bLongTrigger = false;var bShortTrigger = false;var vPosition = 0; // 0 = no position, 1 = long, -1 = shortvar nTriggerIndex = null;var nBarCount = 0; // bar counter for exit strategyfunction main(nLength, sSource, type, nPBpercent, bLong, bShort, nLTrendBars, nSTrendBars, nVFilter, nAvgVolLen, nPFilter, nStochKLFilter, nStochKSFilter, nStochKLen, nStochKSmooth, nStochDLen) { if (bVersion == null) bVersion = verify(); if (bVersion == false) return; var nState = getBarState(); if (nState == BARSTATE_ALLBARS || bInit == true) { var xSource = close(); switch (sSource) { case "Open" : xSource = open(); break; case "High" : xSource = high(); break; case "Low" : xSource = low(); break; case "Close" : xSource = close(); break; case "HL/2" : xSource = hl2(); break; case "HLC/3" : xSource = hlc3(); break; case "OHLC/4" : xSource = ohlc4(); break; default : xSource = close(); } switch (type) { case "Simple" : study = sma(nLength, xSource); break; case "Exponential" : study = ema(nLength, xSource); break; case "Weighted" : study = wma(nLength, xSource); break; case "Volume Weighted" : study = vwma(nLength, xSource); break; default : study = sma(nLength, xSource); } study2 = sma(nAvgVolLen, volume()); study3 = stochK(nStochKLen, nStochKSmooth, nStochDLen); if (close(0) > study.getValue(0)) sSide = 1; else sSide = -1; setCursorLabelName("+" + nPBpercent + "\%", 0); setCursorLabelName("-" + nPBpercent + "\%", 2); bt = true; bInit = false; } var bL = eval(bLong); var bS = eval(bShort); var vMA = study.getValue(0); var vMA1 = study.getValue(-1); if (vMA == null || vMA1 == null) return; if (nState == BARSTATE_NEWBAR) { nTrendCntr1 = nTrendCntr; nTrendCntr += 1; sSide1 = sSide; nBarCount += 1; if (getCurrentBarIndex() < 0) bt = true; else bt = false; } if (sSide == 1 && low(-1) < vMA1) sSide = -1; else if (sSide == -1 && high(-1) > vMA1) sSide = 1; if (nState == BARSTATE_NEWBAR && bLongTrigger == false && bShortTrigger == false) { if (study2.getValue(0) > nVFilter && close(0) >= nPFilter) { if (bL && nTrendCntr1 >= nLTrendBars && sSide1 == 1 && vPosition != 1 && study3.getValue(0) > nStochKLFilter) { if ( Math.abs((close(-1) - vMA1)/vMA1) <= (nPBpercent/100) ) { bLongTrigger = true; nTriggerIndex = getCurrentBarIndex(); } } else if (bS && nTrendCntr1 >= nSTrendBars && sSide1 == -1 && vPosition != -1 && study3.getValue(0) < nStochKSFilter) { if ( Math.abs((vMA1 - close(-1))/vMA1) <= (nPBpercent/100) ) { bShortTrigger = true; nTriggerIndex = getCurrentBarIndex(); } } } } // Position Exit if (vPosition != 0 && nBarCount == 3) { if (bL && vPosition == 1) { longExit(); } else if (bS && vPosition == -1) { shortExit(); } } // Position Entry if (getCurrentBarIndex() == nTriggerIndex) { if (bLongTrigger == true) { if (high(0) > high(-1)) longEntry(); } else if (bShortTrigger == true) { if (low(0) < low(-1)) shortEntry(); } } else { bLongTrigger = false; bShortTrigger = false; } if (vPosition == 1) setBarBgColor(Color.green); if (vPosition == -1) setBarBgColor(Color.red); if (sSide1 != sSide) { // reset trend nTrendCntr = 0; //nSTrendCntr = 0; } return new Array(((nPBpercent/100)*vMA)+vMA, vMA, vMA-((nPBpercent/100)*vMA), nTrendCntr+"");}/***** Support Functions *****/function verify() { var b = false; if (getBuildNumber() < 700) { drawTextAbsolute(5, 35, "This study requires version 7.9 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;}function longEntry() { bLongTrigger = false; vPosition = 1; setBarBgColor(Color.green); var nEntryPrice = high(-1); if (open(0) > nEntryPrice) nEntryPrice = open(0); if (bt == true) { Strategy.doLong("Buy", Strategy.LIMIT, Strategy.THISBAR, null, nEntryPrice); } nBarCount = 0; return;}function shortEntry() { bShortTrigger = false; vPosition = -1 setBarBgColor(Color.red); var nEntryPrice = low(-1); if (open(0) < nEntryPrice) nEntryPrice = open(0); if (bt == true) { Strategy.doShort("Short", Strategy.LIMIT, Strategy.THISBAR, null, nEntryPrice); } nBarCount = 0; return;}function longExit() { vPosition = 0; //if (bt == true) Strategy.doSell("Long Stop", Strategy.MARKET, Strategy.THISBAR); if (bt == true) Strategy.doSell("Long Stop", Strategy.CLOSE, Strategy.THISBAR); return;}function shortExit() { vPosition = 0; //if (bt == true) Strategy.doCover("Short Stop", Strategy.MARKET, Strategy.THISBAR); if (bt == true) Strategy.doCover("Short Stop", Strategy.CLOSE, Strategy.THISBAR); return;} |