File Name: Mean_Reversion_Swing.efs

Description:
Mean-Reversion Swing Trading by Ken Calhoun

Formula Parameters:

Mean_Reversion_Swing.efs
Slope: 1
Trigger: 0.5

Notes:
The related article is copyrighted material. If you are not a subscriber
of Stocks & Commodities, please visit www.traders.com.

Download File:
Mean_Reversion_Swing.efs

Mean_Reversion_Swing.efs


EFS Code:
PHP Code:
/*********************************
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 responsible
for the functionality once modified.  eSignal reserves the right
to modify and overwrite this EFS file with each new release.

Description:        
    Mean-Reversion Swing Trading by Ken Calhoun

Version:            1.00  11/09/2016

Formula Parameters:                     Default:
Slope                                   1
Trigger                                 0.5



Notes:
The related article is copyrighted material. If you are not a subscriber
of Stocks & Commodities, please visit www.traders.com.

**********************************/

var fpArray = new Array();

function 
preMain(){
    
setPriceStudy(true);
    
setStudyTitle("MR Swing");

    var 
0;
    
fpArray[x] = new FunctionParameter("Slope"FunctionParameter.NUMBER);
    
with(fpArray[x++]){
        
setLowerLimit(0.01);
        
setUpperLimit(100);  
        
setDefault(1);
        
setName("Slope");
    }
    
fpArray[x] = new FunctionParameter("Trigger"FunctionParameter.NUMBER);
    
with(fpArray[x++]){
        
setLowerLimit(0.000001);
        
setDefault(0.5);
        
setName("Trigger");
    }
}

var 
bInit false;
var 
bVersion null;
var 
xDHigh null;
var 
xHigh null;
var 
xDLow null;
var 
xLow null;
var 
xDDateTime null;
var 
bInSwing false;
var 
bSwFinished false;
var 
nSwBarsBack 0;
var 
nMeanRev 0;
var 
nMeanHigh 0;
var 
nSwHigh 0;
var 
bMRFound false;
var 
dMeanRevD null;
var 
bFindBO false;

function 
main(SlopeTrigger){
    if (
bVersion == nullbVersion verify();
    if (
bVersion == false) return;

    if (
getBarState() == BARSTATE_ALLBARS){
        
bInSwing false;
        
bSwFinished false;
        
nSwBarsBack 0;
        
nMeanRev 0;
        
nMeanHigh 0;
        
nSwHigh 0;
        
bMRFound false;
        
dMeanRevD null;
        
bFindBO false;
        
bInit false;
    }

    if (!
bInit){
        
xDHigh high(inv("D"));
        
xDLow low(inv("D"));
        
xDDateTime rawtime(inv("D"));
        
xLow low();
        
xHigh high();
    }

    
nDHigh xDHigh.getValue(0);
    var 
slopeFinished false;
    var 
0;
    var 
swingLen 0;

    while (!
slopeFinished){
        if (
xDHigh.getValue(i) > xDHigh.getValue(i-1)){
            
swingLen++;
            
i--;
        }
        else 
slopeFinished true;
    }

    if (
bInSwing && swingLen == 0){
        
nSwBarsBack 0;
        
bSwFinished true;
        
bInSwing false;
    }

    if (
bSwFinished && nMeanRev != 0){
        
nSwBarsBack++;
        if (
xDLow.getValue(-1) < nMeanRev && day(0) != day(-1)){
            
drawLineRelative(-1nMeanRev, -nSwBarsBacknSwHighPS_SOLID3Color.red,
                            (
"Mean rev. " + (rawtime(-nSwBarsBack))));
            
dMeanRevD xDDateTime.getValue(-1);
            
nMeanHigh nSwHigh;
            
nSwBarsBack 0;
            
bSwFinished false;
            
bMRFound false;
        }
    }

    if (!
bSwFinished && !bInSwing && !bMRFound  && nMeanRev != && xDDateTime.getValue(-1) == dMeanRevD){
        if (
xHigh.getValue(0) >= nMeanRev Trigger){
            
drawTextRelative(0BelowBar1"\u00E9"Color.greennull,
                            
Text.PRESET|Text.CENTER"Wingdings"10"Entry"+rawtime(0));
            
drawTextRelative(0BelowBar2"MR"Color.greennull,
                            
Text.PRESET|Text.CENTER|Text.BOLD"Arial"8"Entry text"+rawtime(0));
            
bMRFound true;
            
bFindBO true;
            
nMeanRev 0;
        }
    }

    if (
bFindBO &&  xHigh.getValue(0) >= nMeanHigh){
        
drawTextRelative(0AboveBar1"\u00E9"Color.greennull,
                            
Text.PRESET|Text.CENTER"Wingdings"10"2nd Entry"+rawtime(0));
        
drawTextRelative(0AboveBar2"BO"Color.greennull,
                            
Text.PRESET|Text.CENTER|Text.BOLD"Arial"8"2nd Entry text"+rawtime(0));
        
bFindBO false;
    }

    if (
swingLen >=4){
        var 
nSStart getFirstBarIndexOfDay(xDDateTime.getValue(-(swingLen)));

        if(
nSStart != null){
            if (((
nDHigh xDHigh.getValue(-(swingLen)))/(xDLow.getValue(0) - xDLow.getValue(-(swingLen)))) > Slope){
                
nSwHigh nDHigh;
                var 
nSwLow xDLow.getValue(-(swingLen));
                
nMeanRev = (nSwHigh nSwLow)/2;
                
drawLineRelative(0nDHigh, (nSStart getCurrentBarIndex()), xDLow.getValue(-(swingLen)),
                                
PS_SOLID3Color.green"Uptrend" xDDateTime.getValue(-(swingLen)));
                
bInSwing true;
                
bSwFinished false;
                
nSwBarsBack 0;
            }
            else{
                
bInSwing false;
                
bSwFinished true;
            }
        }
    }    
}

function 
verify(){
    var 
false;
    if (
getBuildNumber() < 779){

        
drawTextAbsolute(535"This study requires version 10.6 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;