Announcement

Collapse
No announcement yet.

2005 Sep: Shorting Moving Average Pullbacks (SMAPS.efs)

Collapse
This topic is closed.
X
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2005 Sep: Shorting Moving Average Pullbacks (SMAPS.efs)

    File Name: SMAPS.efs

    Description:
    This formula is based on the September 2005 article, Shorting Moving Average Pullbacks, by Steve Palmquist.

    Formula Parameters:
    MA Length: 35
    MA Source: Close
    MA Type: SIMPLE
    Pullback Percent Envelope: 1%
    Enable Long Positions: true
    Enable Short Positions: true
    Long Entry Trend Bars: 30
    Short Entry Trend Bars: 15
    Average Volume Filter: 200000
    Average Volume Periods: 10
    Price Filter: 15
    Stochastic K Long Filter: 20
    Stochastic K Short Filter: 80
    Stochastic K Length: 14
    Stochastic K Smoothing: 1
    Stochastic D Length: 3


    Notes:
    This study is similar to Palmquist's article from the April 2005 issue, Trading Moving Average Pullbacks. As we did with the April study, MAPS.efs, we've included the logic for taking long positions as well. This logic is a combination of the rules used from the April issue as well as the specifics from the current article. The study does have the ability to leave out the long entries by setting the "Enable Long Positions" formula parameter to false through the Edit Studies options if you wish to run back tests only on short positions. There is also an option to enable/disable short positions. The study is coded as a back testing study to generate the report with the Strategy Analyzer (Tools-->Back Testing). The study also has parameters to further optimize the study based on the market and interval of the Advanced Chart. You may adjust the MA Length, MA Source, MA Type, Pullback Percent Envelope, Long Entry Trend Bars (number of bars to define long trend), Short Entry Trend Bars (number of bars to define short trend), Average Volume Filter (level for x period average volume), Average Volume Periods, Price Filter (for chart symbol), Stochastic K Long Filter, Stochastic K Short Filter, Stochastic K Length, Stochastic K Smoothing and Stochastic D Length. The related article is copyrighted material. If you are not a subscriber of Stocks & Commodities, please visit www.traders.com.

    Download File:
    SMAPS.efs



    EFS Code:
    PHP Code:
    /***************************************
    Provided By : eSignal (c) Copyright 2005
    Description:  Shorting Moving Average Pullback System - by Steve Palmquist

    Version 1.0  7/8/2005

    Notes:
    September 2005 Issue - "Different Systems for Different Markets - 
                            Shorting Moving Average Pullbacks"

    Formula Parameters:                 Defaults:
    MA Length                           35
    MA Source                           Close
    MA Type                             SIMPLE
    Pullback Percent Envelope           1%
    Enable Long Positions               true
    Enable Short Positions              true
    Long Entry Trend Bars               30
    Short Entry Trend Bars              15
    Average Volume Filter               200000
    Average Volume Periods              10
    Price Filter                        15
    Stochastic K Long Filter            20
    Stochastic K Short Filter           80
    Stochastic K Length                 14
    Stochastic K Smoothing              1
    Stochastic 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.blue0);
        
    setDefaultBarFgColor(Color.maroon1);
        
    setDefaultBarFgColor(Color.blue2);
        
    setDefaultBarFgColor(Color.grey3);
        
        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;   // MA
    var study2 null;  // Daily Avg Volume
    var study3 null;  // StochK
    var bt true;      // back testing on
    var nTrendCntr 0;
    var 
    nTrendCntr1 0;// previous bar's nTrendCntr
    var sSide 0;      // 1 = obove MA, -1 = below MA
    var sSide1 0;     // previous bar's sSide
    var bInit true;   // initialization routine.
    var bLongTrigger false;
    var 
    bShortTrigger false;
    var 
    vPosition 0;  // 0 = no position, 1 = long, -1 = short
    var nTriggerIndex null;
    var 
    nBarCount 0;  // bar counter for exit strategy

    function main(nLengthsSourcetypenPBpercentbLongbShort
                  
    nLTrendBarsnSTrendBarsnVFilternAvgVolLennPFilter,
                  
    nStochKLFilternStochKSFilternStochKLennStochKSmoothnStochDLen) {    

        if (
    bVersion == nullbVersion 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(nLengthxSource); break;
                case 
    "Exponential" :        study ema(nLengthxSource); break;
                case 
    "Weighted" :           study wma(nLengthxSource); break;
                case 
    "Volume Weighted" :    study vwma(nLengthxSource); break;
                default :                   
    study sma(nLengthxSource);
            }
            
    study2 sma(nAvgVolLenvolume());
            
    study3 stochK(nStochKLennStochKSmoothnStochDLen);
            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() < 0bt true;
            else 
    bt false;
        }
        
        if (
    sSide == && low(-1) < vMA1sSide = -1;
        else if (
    sSide == -&& high(-1) > vMA1sSide 1;
        
        if (
    nState == BARSTATE_NEWBAR && bLongTrigger == false && bShortTrigger == false) {
            if (
    study2.getValue(0) > nVFilter && close(0) >= nPFilter) {
                if (
    bL && nTrendCntr1 >= nLTrendBars && sSide1 == && 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 == -&& vPosition != -
                        
    && study3.getValue(0) < nStochKSFilter) {
                    if ( 
    Math.abs((vMA1 close(-1))/vMA1) <= (nPBpercent/100) ) {
                        
    bShortTrigger true;
                        
    nTriggerIndex getCurrentBarIndex();
                    }
                }
            }
        }
        
        
    // Position Exit
        
    if (vPosition != && 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 == 1setBarBgColor(Color.green);
        if (
    vPosition == -1setBarBgColor(Color.red); 
        
        if (
    sSide1 != sSide) {  // reset trend
            
    nTrendCntr 0;  
            
    //nSTrendCntr = 0;  
        
    }
        
        return new Array(((
    nPBpercent/100)*vMA)+vMAvMAvMA-((nPBpercent/100)*vMA), nTrendCntr+"");
    }

    /***** Support Functions *****/

    function verify() {
        var 
    false;
        if (
    getBuildNumber() < 700) {
            
    drawTextAbsolute(535"This study requires version 7.9 or later."
                
    Color.whiteColor.blueText.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,
                
    null13"error");
            
    drawTextAbsolute(520"Click HERE to upgrade.@URL=http://www.esignal.com/download/default.asp"
                
    Color.whiteColor.blueText.RELATIVETOBOTTOM|Text.RELATIVETOLEFT|Text.BOLD|Text.LEFT,
                
    null13"upgrade");
            return 
    b;
        } else {
            
    true;
        }
        
        return 
    b;
    }

    function 
    longEntry() {
        
    bLongTrigger false;
        
    vPosition 1;
        
    setBarBgColor(Color.green);
        var 
    nEntryPrice high(-1);
        if (
    open(0) > nEntryPricenEntryPrice open(0);
        if (
    bt == true) {
            
    Strategy.doLong("Buy"Strategy.LIMITStrategy.THISBARnullnEntryPrice);
        }
        
    nBarCount 0;
        return;
    }

    function 
    shortEntry() {
        
    bShortTrigger false;
        
    vPosition = -1
        setBarBgColor
    (Color.red);
        var 
    nEntryPrice low(-1);
        if (
    open(0) < nEntryPricenEntryPrice open(0);
        if (
    bt == true) {
            
    Strategy.doShort("Short"Strategy.LIMITStrategy.THISBARnullnEntryPrice);
        }
        
    nBarCount 0;
        return;
    }

    function 
    longExit() {
        
    vPosition 0;
        
    //if (bt == true) Strategy.doSell("Long Stop", Strategy.MARKET, Strategy.THISBAR);
        
    if (bt == trueStrategy.doSell("Long Stop"Strategy.CLOSEStrategy.THISBAR);
        return;
    }

    function 
    shortExit() {
        
    vPosition 0;
        
    //if (bt == true) Strategy.doCover("Short Stop", Strategy.MARKET, Strategy.THISBAR);
        
    if (bt == trueStrategy.doCover("Short Stop"Strategy.CLOSEStrategy.THISBAR);
        return;

    Jason K.
    Project Manager
    eSignal - an Interactive Data company

    EFS KnowledgeBase
    JavaScript for EFS Video Series
    EFS Beginner Tutorial Series
    EFS Glossary
    Custom EFS Development Policy

    New User Orientation
Working...
X