Announcement

Collapse
No announcement yet.

BtDonchian_ProfitTargets.efs

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

  • BtDonchian_ProfitTargets.efs

    File Name: BtDonchian_ProfitTargets.efs

    Description:
    This formula is a back testing example of how to code a strategy that closes positions with a profit target.

    Formula Parameters:
    NA


    Notes:
    This formula is a back testing formula to be used in conjunction with the Strategy Analyzer. It is not intended for real time analysis. This formula requires version 7.9.1 or later.

    This strategy enters a position when a 10-period Donchian makes a new high on the upper channel or new low on the lower channel going long and short, respectively. The exit strategy for this sample uses a fixed target that is set to 1.5X the difference between the entry price and the Middle Donchian channel. Positions will also be closed upon a reversing trade signal.

    Download File:
    BtDonchian_ProfitTargets.efs



    EFS Code:
    PHP Code:
    /*********************************
    Copyright © eSignal, a division of Interactive Data Corporation. 2006. All rights reserved. 
    This sample eSignal Formula Script (EFS) may be modified and saved under a new 
    filename; however, eSignal is no longer responsible for the functionality once modified.
    eSignal reserves the right to modify and overwrite this EFS file with each new release.

    This sample is for educational purposes only.  It is not intended for trading.

    Strategy Logic:
        This Strategy example is a basic strategy that goes long when a new
        10 period Donchian high occurs and goes short when a new 10 period Donchian
        low occurs.  The exit strategy for this sample uses a fixed target that is ...  
        This profit target will initially be set to 1.5X the difference between the entry 
        price and the Middle Donchian channel.  Positions will also be closed upon a reversing
        trade signal.
    *********************************/

    function preMain() {
        
    setPriceStudy(true);
        
    setStudyTitle("Back Test: Donchian with Profit Targets");
        
    setCursorLabelName("Upper Donchian"0);
        
    setCursorLabelName("Lower Donchian"1);
        
    setCursorLabelName("Profit Target"2);
        
    setDefaultBarFgColor(Color.blue0);
        
    setDefaultBarFgColor(Color.blue1);
        
    setDefaultBarFgColor(Color.khaki2); // Profit Target color
        
    setDefaultBarThickness(22);         // Profit Target Thickness
        
    setPlotType(PLOTTYPE_FLATLINES2);   // Profit Target plot type
    }

    // Global Variables
    var xUpper null;
    var 
    xMiddle null;
    var 
    xLower null;
    var 
    nTarget  null;
    var 
    bInit  false;  // initialization flag


    function main() {
        
    // Back Testing formulas are not for real time analysis.
        // Therefore, prevent processing and exit at bar 0.
        
    if (getCurrentBarIndex() == 0) return;
        
        if(
    bInit == false) {
            
    // This code block executes only once at the beginning of initialization.
            // Initialize Donchian Series Objects.
            
    xUpper  upperDonchian(10);
            
    xMiddle middleDonchian(10);
            
    xLower  lowerDonchian(10);
            
    bInit   true;  // Prevents this code block from executing again.
        
    }
        
        
    // Retrieve series values of Donchian Series for back testing conditions.
        
    var nU   xUpper.getValue(-1);
        var 
    nM   xMiddle.getValue(0);
        var 
    nL   xLower.getValue(-1);
        
    // Set Boolean exit flag to flase to indicate that a target exit has not occured on this bar.
        
    var bExitFlag false;
        
        
    // Validate the study variables to ensure they contain valid data.
        
    if(nU == null || nM == null || nL == null) {
            return;  
    // Exit the formula if variables contain invalid data.
        
    }

        
    // Reset nTarget to null so that it does not plot if no longer in a position.
        
    if (Strategy.isInTrade() == false) {
            
    nTarget null;
        }

        
    // Profit Target Exit Strategy
        
    if (Strategy.isInTrade() == true) {
            
    /*****
            First check for a profit target breach before looking for entry signals.
            If a target exit occurs on the current bar, prevent a new entry from occuring
            on the same bar.  This is accomplished by setting the value of the bExitFlag
            to true if a profit target trade occurs on the current bar.  The flag is then
            used in the entry logic that follows.  If the flag is true, no new entry
            conditions will be evaluated until the next bar, or execution of main.
            ******/
            
    if (Strategy.isLong() == true) {  // Long Profit Target Exit
                /*****
                First check to see if the bar opened above the target price.  If so,
                exit at the open of the bar and set the bExitFlag to true.
                *****/
                
    if (open(0) >= nTarget) {
                    
    Strategy.doSell("Long Target"Strategy.MARKETStrategy.THISBAR);
                    
    bExitFlag true;  // Exit trade occured on the current bar.
                
    } else if (high(0) >= nTarget) {
                    
    /*****
                    Next, check to see if the high of the bar breached the target price.
                    If so, exit with a limit order at the target price.
                    *****/
                    
    Strategy.doSell("Long Target"Strategy.LIMITStrategy.THISBARStrategy.ALLnTarget);
                    
    bExitFlag true;  // Exit trade occured on the current bar.
                
    }
            }
            if (
    Strategy.isShort() == true) { // Short Profit Target Exit
                /*****
                First check to see if the bar opened below the target price.  If so, exit
                at the open of the bar.
                *****/
                
    if (open(0) <= nTarget) {
                    
    Strategy.doCover("Short Target"Strategy.MARKETStrategy.THISBAR);
                    
    bExitFlag true;  // Exit trade occured on the current bar.
                
    } else if (low(0) <= nTarget) {
                    
    /*****
                    Next, check to see if the low of the bar breached the target price.
                    If so, exit with a limit order at the target price.
                    *****/
                    
    Strategy.doCover("Short Target"Strategy.LIMITStrategy.THISBARStrategy.ALLnTarget);
                    
    bExitFlag true;  // Exit trade occured on the current bar.
                
    }
            }
        } 
        
        
    // Entry Strategy
        
    if (bExitFlag == false) {
            
    /*****
            Look for new entry only if a profit target exit has not occured on this bar.  By 
            including this entry logic inside this condition, we ensure that we do not enter 
            a new position on the same bar that an exit occurs.
            *****/
            
    if (Strategy.isLong() == false && high(0) >= nU) { // Long Trade Signal
                /*****
                If the current bar's high is equal to or greater than the previous bar's Upper
                Donchian channel, go long with a limit order at the value of the previous bar's 
                Upper Donchian value or the open of the bar, which ever is greater.
                If the strategy is currently short, doLong() will also close the short position 
                at the same price as the long entry.
                *****/
                
                
    var nEntry Math.max(nUopen(0));
                
    Strategy.doLong("Long Signal"Strategy.LIMITStrategy.THISBARStrategy.DEFAULT, nEntry );            
                
                
    // Set the profit target value at 1.5X the difference between the entry 
                //      price and the current Middle Donchian channel.
                
    nTarget nEntry + (1.5 * (nEntry nM));
            } else if (
    Strategy.isShort() == false && low(0) <= nL) {  // Short Trade Signal
                /*****
                If the current bar's low is equal to or lower than the previous bar's Lower 
                Donchian channel, go short with a limit order at the value of the previous bar's
                Lower Donchian value or the open of the bar, which ever is smaller.
                If the strategy is currently long, doShort() will also close the long position 
                at the same price as the short entry.
                *****/
                
                
    var nEntry Math.min(nLopen(0));
                
    Strategy.doShort("Short Signal"Strategy.LIMITStrategy.THISBARStrategy.DEFAULT, nEntry );
                
                
    // Set the profit target value at 1.5X the difference between the entry 
                //      price and the current Middle Donchian channel.
                
    nTarget nEntry - (1.5 * (nM nEntry));
            }
        }
        
        if(
    Strategy.isLong()) {
            
    setBarBgColor(Color.darkgreen);
        } else if(
    Strategy.isShort()) {
            
    setBarBgColor(Color.maroon);
        }

        
    // Plot the current bar's Donchian Channel values and the trailing stop.
        
    return new Array(xUpper.getValue(0), xLower.getValue(0), nTarget);

    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