2011 Nov: Constructing The Put/Call Ratio Indicator by Sylvain Vervoort

ICE Data Services -

PCRI_Fast.efs, PCRI_Slow.efs, PCRI_Slow_IFT.efs  

EFSLibrary - Discussion Board  

 

File Name: PCRI_Fast.efs, PCRI_Slow.efs, PCRI_Slow_IFT.efs

 

Description:
Constructing The Put/Call Ratio Indicator by Sylvain Vervoort

 

Formula Parameters:

PCRI_Fast.efs

  • TEMA period: 5
  • PC ratio RSI period: 5
  • PCRI Indicator Period: 5
  • PC ratio rainbow average period: 2
  • Base Period: 200
  • Offset Period: 200


PCRI_Slow.efs

  • PC ratio rainbow average period: 5
  • PCRI period: 1


PCRI_Slow_IFT.efs

  • PC ratio rainbow average period: 4
  • PCRI period: 2
  • RSI period: 8

 

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

 

Download File:
PCRI_Fast.efs
PCRI_Slow.efs
PCRI_Slow_IFT.efs

PCRI_Fast.efs, PCRI_Slow.efs


PCRI_Slow.efs, PCRI_Slow_IFT.efs



EFS Code:

PCRI_Fast.efs

/*********************************
Provided By:  
    Interactive Data Corporation (Copyright © 2010) 
    All rights reserved. This sample eSignal Formula Script (EFS)
    is for educational purposes only. Interactive Data Corporation
    reserves the right to modify and overwrite this EFS file with 
    each new release. 

Description:        
    Fast Put/Call Ratio Indicator
	
Version:            1.00  15/09/2011

Formula Parameters:                     Default:
TEMA period                             5
PC ratio RSI period                     5
PCRI Indicator Period                   5
PC ratio rainbow average period         2
Base Period                             200
Offset Period                           200


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

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

// predefined constants
var PCRATIO_LOW = 0.45;
var PCRATIO_HIGH = 0.9;

var fpArray = new Array();

function preMain()
{      
    setPriceStudy(false);
    
    setCursorLabelName("PCRI_Fast", 0);
    setCursorLabelName("high", 1);
    setCursorLabelName("low", 2);
    setCursorLabelName("base", 3);
    
    setDefaultBarFgColor(Color.green, 1);
    setDefaultBarFgColor(Color.green, 2);
    setDefaultBarFgColor(Color.grey, 3);
    
    setDefaultBarThickness(0, 1);
    setDefaultBarThickness(0, 2);
    setDefaultBarThickness(1, 3);
    
    
    var x=0;
    fpArray[x] = new FunctionParameter("temaPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("TEMA Period");
	setLowerLimit(1);
        setUpperLimit(100);
        setDefault(5);
    }
 
    fpArray[x] = new FunctionParameter("rsiPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("PC Ratio RSI Period");
	setLowerLimit(2);
        setUpperLimit(100);
        setDefault(5);
    }
    
    fpArray[x] = new FunctionParameter("pcriPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("PCRI Indicator Period");
	setLowerLimit(1);
        setUpperLimit(100);
        setDefault(5);
    }
    
    fpArray[x] = new FunctionParameter("rainbPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("PC ratio rainbow average period");
	setLowerLimit(1);
        setUpperLimit(10);
        setDefault(2);
    }
    
    fpArray[x] = new FunctionParameter("basePeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("Base Period");
	setLowerLimit(1);
        setUpperLimit(500);
        setDefault(200);
    }
    
    fpArray[x] = new FunctionParameter("offsetPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("Offset Period");
	setLowerLimit(1);
        setUpperLimit(500);
        setDefault(200);
    }
    
}

var bInit = false;
var bVersion = null;

var xPCratio = null;
var xPC = null;
var xPCtema = null;
var xRainb = null;
var xPCRI = null;

var xBase = null;
var xOffset = null;

function main(temaPeriod, rsiPeriod, pcriPeriod, rainbPeriod, basePeriod, offsetPeriod)
{
    if (bVersion == null) bVersion = verify();
    if (bVersion == false) return;      
    
    if (!bInit)
    {
        xPCratio = close(sym("$PCCE-ST"));
        
        xPC = efsInternal("LimitPC", PCRATIO_LOW, PCRATIO_HIGH, xPCratio);
        
        xPCtema = efsInternal("TEMA", temaPeriod, xPC);
        
        xRainb = efsInternal("RainbowAverage", rainbPeriod, xPCtema);
        
        xPCRI = wma(pcriPeriod, rsi(rsiPeriod, xRainb));
        
        xBase = sma(basePeriod, xPCRI);
        xOffset = efsInternal("MSTD", offsetPeriod, xPCRI);
        
        bInit = true;
    }    
      
    var vBase = xBase.getValue(0);
    var vOffset = xOffset.getValue(0);
    
    var lowLine = null;
    var highLine = null;
    
    if (vBase != null && vOffset != null) 
    {
        lowLine = vBase - 1.3 * vOffset;
        highLine = vBase + 1.3 * vOffset;
    }
    
    var baseLine = 50;
    
    var vPCRI = xPCRI.getValue(0);
    
    if (vPCRI == null) 
        return null;   
    
    return new Array(vPCRI, highLine, lowLine, baseLine);
}

/*************************************************
             SUPPORT FUNCTIONS                    
**************************************************/   

var bInitRainbow = false;
var xWMA1 = null;
var xWMA2 = null;
var xWMA3 = null;
var xWMA4 = null;
var xWMA5 = null;
var xWMA6 = null;
var xWMA7 = null;
var xWMA8 = null;
var xWMA9 = null;
var xWMA10 = null;

// rainbow averaging technique
function RainbowAverage(period, series)
{
    if (!bInitRainbow)
    {
            xWMA1 = wma(period, series);
            xWMA2 = wma(period, xWMA1);
            xWMA3 = wma(period, xWMA2);
            xWMA4 = wma(period, xWMA3);
            xWMA5 = wma(period, xWMA4);
            xWMA6 = wma(period, xWMA5);
            xWMA7 = wma(period, xWMA6);
            xWMA8 = wma(period, xWMA7);
            xWMA9 = wma(period, xWMA8);
            xWMA10 = wma(period, xWMA9);
        
            bInitRainbow = true;
    }
    
    var vWMA1 = xWMA1.getValue(0);
    var vWMA2 = xWMA2.getValue(0);
    var vWMA3 = xWMA3.getValue(0);
    var vWMA4 = xWMA4.getValue(0);
    var vWMA5 = xWMA5.getValue(0);
    var vWMA6 = xWMA6.getValue(0);
    var vWMA7 = xWMA7.getValue(0);
    var vWMA8 = xWMA8.getValue(0);
    var vWMA9 = xWMA9.getValue(0);
    var vWMA10 = xWMA10.getValue(0);
    
    if (vWMA10 == null) 
        return null;
    
    var nRes = (vWMA1 + vWMA2 + vWMA3 + vWMA4 + vWMA5 + vWMA6 + vWMA7 + vWMA8 + vWMA9 + vWMA10)/10; 
    
    return nRes;
}


// Limited Put/Call ratio
function LimitPC(lowLevel, highLevel, PCratio)
{   
    var PCLim = PCratio.getValue(0);
    
    if (PCLim == null) return null;
    
    if(PCLim > highLevel)
        PCLim = highLevel;
    else if (PCLim < lowLevel)
        PCLim = lowLevel;
    
   return PCLim;
}

var bInitTEMA = false;
var xEma1 = null;
var xEma2 = null;
var xEma3 = null;

// Triple Exponential Moving Average
function TEMA(period, series)
{   
    if(!bInitTEMA)
    {
        xEma1 = ema(period, series);
        xEma2 = ema(period, xEma1);
        xEma3 = ema(period, xEma2);
        
        bInitTEMA = true;    
    }   
    
    var vEma1 = xEma1.getValue(0);
    var vEma2 = xEma2.getValue(0);
    var vEma3 = xEma3.getValue(0);
    
    if (vEma3 == null) 
        return null;
    
    return 3 * vEma1 - 3 * vEma2 + vEma3;
}



// Moving Standard Deviation (MSTD)
var aPr = new Array();  
var sPr = 0;            
var sPr2 = 0;           

function MSTD(period, series)
{
        var vPr0 = series.getValue(0);

        
        if ( getBarState() == BARSTATE_ALLBARS )
        {
            aPr.length = 0;
            sPr = 0; 
            sPr2 = 0;
        }

        if ( getBarState() == BARSTATE_NEWBAR )
        {
            if (aPr.length >= period )
            {
                sPr-=aPr[0];
                sPr2-=aPr[0]*aPr[0];
                aPr.shift();
            }
            sPr+=vPr0;
            sPr2+=vPr0*vPr0;
            aPr.push(vPr0);
        }
        if ( getBarState() == BARSTATE_CURRENTBAR ) 
        {
            sPr-=aPr[aPr.length-1];
            sPr2-=aPr[aPr.length-1]*aPr[aPr.length-1];
            sPr+=vPr0;
            sPr2+=vPr0*vPr0;
            aPr[aPr.length-1] = vPr0;    
        }

        var stdDev = null;
        if (aPr.length == period )
        {
            stdDev = Math.sqrt( ( period*sPr2 - sPr*sPr )/( period*( period-1 )) );
        }           
        
        return stdDev;
}



// verify version
function verify() {
    var b = false;
    if (getBuildNumber() < 779) {
        drawTextAbsolute(5, 35, "This study requires version 8.0 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;
}


PCRI_Slow.efs

/*********************************
Provided By:  
    Interactive Data Corporation (Copyright © 2010) 
    All rights reserved. This sample eSignal Formula Script (EFS)
    is for educational purposes only. Interactive Data Corporation
    reserves the right to modify and overwrite this EFS file with 
    each new release. 

Description:        
    Slow Put/Call Ratio Indicator
	
Version:            1.00  15/09/2011

Formula Parameters:                     Default:
PC ratio rainbow average period         5
PCRI period                             1

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

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

// predefined constants
var PCRATIO_LOW = 0.45;
var PCRATIO_HIGH = 0.9;

var fpArray = new Array();

function preMain()
{      
    setPriceStudy(false);
    setCursorLabelName("PCRI_Slow", 0);
    
    var x=0;
    fpArray[x] = new FunctionParameter("rainbPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("PC ratio rainbow average period");
	setLowerLimit(1);
        setUpperLimit(10);
        setDefault(5);
    }
 
    fpArray[x] = new FunctionParameter("pcriPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("PCRI period");
	setLowerLimit(1);
        setUpperLimit(100);
        setDefault(1);
    }    
}

var bInit = false;
var bVersion = null;

var xPCratio = null;
var xPC = null;
var xRainb = null;
var xPCRI = null;

function main(rainbPeriod, pcriPeriod)
{
    if (bVersion == null) bVersion = verify();
    if (bVersion == false) return;      
    
    if (!bInit)
    {
        xPCratio = close(sym("$PCCE-ST"));
        xPC = efsInternal("LimitPC",  PCRATIO_LOW, PCRATIO_HIGH, xPCratio);        
        xRainb = efsInternal("RainbowAverage", rainbPeriod, xPC);
        xPCRI = wma(pcriPeriod, xRainb);
        
        bInit = true;
    }           
    
    var vPCRI = xPCRI.getValue(0); 
    
    if (vPCRI == null ) 
        return null;
    
    return vPCRI;
}

/*************************************************
             SUPPORT FUNCTIONS                    
**************************************************/   


var bInitRainbow = false;
var xWMA1 = null;
var xWMA2 = null;
var xWMA3 = null;
var xWMA4 = null;
var xWMA5 = null;
var xWMA6 = null;
var xWMA7 = null;
var xWMA8 = null;
var xWMA9 = null;
var xWMA10 = null;

// rainbow averaging technique
function RainbowAverage(period, series)
{
    if (!bInitRainbow)
    {
            xWMA1 = wma(period, series);
            xWMA2 = wma(period, xWMA1);
            xWMA3 = wma(period, xWMA2);
            xWMA4 = wma(period, xWMA3);
            xWMA5 = wma(period, xWMA4);
            xWMA6 = wma(period, xWMA5);
            xWMA7 = wma(period, xWMA6);
            xWMA8 = wma(period, xWMA7);
            xWMA9 = wma(period, xWMA8);
            xWMA10 = wma(period, xWMA9);
        
            bInitRainbow = true;
    }
    
    var nRes = 0;
    var vWMA1 = xWMA1.getValue(0);
    var vWMA2 = xWMA2.getValue(0);
    var vWMA3 = xWMA3.getValue(0);
    var vWMA4 = xWMA4.getValue(0);
    var vWMA5 = xWMA5.getValue(0);
    var vWMA6 = xWMA6.getValue(0);
    var vWMA7 = xWMA7.getValue(0);
    var vWMA8 = xWMA8.getValue(0);
    var vWMA9 = xWMA9.getValue(0);
    var vWMA10 = xWMA10.getValue(0);
    
    if (vWMA10 == null) 
        return null;
    
    nRes = (vWMA1 + vWMA2 + vWMA3 + vWMA4 + vWMA5 + vWMA6 + vWMA7 + vWMA8 + vWMA9 + vWMA10)/10; 
    
    return nRes; 
}


// Limited Put/Call ratio
function LimitPC(lowLevel, highLevel, PCratio)
{   
    var PCLim = PCratio.getValue(0);
    
    if (PCLim == null) 
        return null;
    
    if(PCLim > highLevel)
        PCLim = highLevel;
    else if (PCLim < lowLevel)
        PCLim = lowLevel;
    
   return PCLim;
}

// verify version
function verify() {
    var b = false;
    if (getBuildNumber() < 779) {
        drawTextAbsolute(5, 35, "This study requires version 8.0 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;
}


PCRI_Slow_IFT.efs

/*********************************
Provided By:  
    Interactive Data Corporation (Copyright © 2010) 
    All rights reserved. This sample eSignal Formula Script (EFS)
    is for educational purposes only. Interactive Data Corporation
    reserves the right to modify and overwrite this EFS file with 
    each new release. 

Description:        
    PCRI Slow Inverse Fisher Transform Indicator
	
Version:            1.00  15/09/2011

Formula Parameters:                     Default:
PC ratio rainbow average period         4
PCRI period                             2
RSI period                              8

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

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

// predefined constants
var PCRATIO_LOW = 0.45;
var PCRATIO_HIGH = 0.9;

var fpArray = new Array();

function preMain()
{      
    setPriceStudy(false);
    setCursorLabelName("PCRI_Slow_IFT", 0);
    
    var x=0;
    fpArray[x] = new FunctionParameter("rainbPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("PC ratio rainbow average period");
	setLowerLimit(1);
        setUpperLimit(10);
        setDefault(4);
    }
 
    fpArray[x] = new FunctionParameter("pcriPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("PCRI period");
	setLowerLimit(1);
        setUpperLimit(100);
        setDefault(2);
    }  
  
    
       fpArray[x] = new FunctionParameter("rsiPeriod", FunctionParameter.NUMBER);
    with(fpArray[x++])
    {
	setName("RSI period");
	setLowerLimit(1);
        setUpperLimit(100);
        setDefault(8);
    }    
}

var bInit = false;
var bVersion = null;

var xPCratio = null;
var xPC = null;
var xRainb = null;
var xPcri = null;
var xPcriRsi = null;

function main(rainbPeriod, pcriPeriod, rsiPeriod)
{
    if (bVersion == null) bVersion = verify();
    if (bVersion == false) return;      
    
    if (!bInit)
    {
        xPCratio = close(sym("$PCCE-ST"));
        
        xPC = efsInternal("LimitPC", PCRATIO_LOW, PCRATIO_HIGH, xPCratio);        
        
        xRainb = efsInternal("RainbowAverage", rainbPeriod, xPC);
        
        xPcri = wma(pcriPeriod, xRainb);
        
        xPcriRsi = rsi(rsiPeriod, xPcri);
              
        bInit = true;
    }              
    
    var vPcriRsi = xPcriRsi.getValue(0);
    
    if(vPcriRsi == null)
        return null;
    
    var x = 0.1 * (vPcriRsi - 50);   
    
    var invfish = ((Math.exp(2*x)-1)/(Math.exp(2*x)+1)+1)*50;   
    
    return invfish;
}

/*************************************************
             SUPPORT FUNCTIONS                    
**************************************************/   

var bInitRainbow = false;
var xWMA1 = null;
var xWMA2 = null;
var xWMA3 = null;
var xWMA4 = null;
var xWMA5 = null;
var xWMA6 = null;
var xWMA7 = null;
var xWMA8 = null;
var xWMA9 = null;
var xWMA10 = null;

// rainbow averaging technique
function RainbowAverage(period, series)
{
    if (!bInitRainbow)
    {
            xWMA1 = wma(period, series);
            xWMA2 = wma(period, xWMA1);
            xWMA3 = wma(period, xWMA2);
            xWMA4 = wma(period, xWMA3);
            xWMA5 = wma(period, xWMA4);
            xWMA6 = wma(period, xWMA5);
            xWMA7 = wma(period, xWMA6);
            xWMA8 = wma(period, xWMA7);
            xWMA9 = wma(period, xWMA8);
            xWMA10 = wma(period, xWMA9);
        
            bInitRainbow = true;
    }
    
    var vWMA1 = xWMA1.getValue(0);
    var vWMA2 = xWMA2.getValue(0);
    var vWMA3 = xWMA3.getValue(0);
    var vWMA4 = xWMA4.getValue(0);
    var vWMA5 = xWMA5.getValue(0);
    var vWMA6 = xWMA6.getValue(0);
    var vWMA7 = xWMA7.getValue(0);
    var vWMA8 = xWMA8.getValue(0);
    var vWMA9 = xWMA9.getValue(0);
    var vWMA10 = xWMA10.getValue(0);
    
    if (vWMA10 == null) 
        return null;
    
    var nRes = (vWMA1 + vWMA2 + vWMA3 + vWMA4 + vWMA5 + vWMA6 + vWMA7 + vWMA8 + vWMA9 + vWMA10)/10;
    
    return nRes;
}


// Limited Put/Call ratio
function LimitPC(lowLevel, highLevel, PCratio)
{   
    var PCLim = PCratio.getValue(0);
    
    if (PCLim == null)
        return null;
    
    if(PCLim > highLevel)
        PCLim = highLevel;
    else if (PCLim < lowLevel)
        PCLim = lowLevel;
    
   return PCLim;
}

// verify version
function verify() {
    var b = false;
    if (getBuildNumber() < 779) {
        drawTextAbsolute(5, 35, "This study requires version 8.0 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;
}