File Name: BidAskAnalysis.efs

Description:
This study is set up to analyze Bid Ask data in a variety of ways, which can be configured by the user through the Edit Studies option. The study can be used to analyze tick or volume data for each bar or on a cumulative basis. The displayed results can also be viewed as the raw outputs or on a relative percentage basis to the total.

Formula Parameters:
Analysis: Bar [Bar, Cumulative]
Study Output: Raw Data [Relative Percent, Raw Data]
Source: Volume [Tick, Volume]
Trade Volume Filter: 0
Ask Color: green
Inside Color: black
Bid Color: red
Total Color: lime
Ask Thickness: 8
Inside Thickness: 6
Bid Thickness: 4
Display Ask: Yes [Yes, No]
Display Inside: Yes [Yes, No]
Display Bid: Yes [Yes, No]
Display Total: Yes [Yes, No]

Notes:
This study only processes real time data. Historical Bid/Ask information is not currently exposed for historical processing in EFS. The study will collect and display its results going forward in time from bar zero after it has been applied to the Advanced chart.
Some other possible combinations include:
Raw Data: Volume (Cumulative)
Raw Data: Tick (Bar)
Raw Data: Tick (Cumulative)
Relative Percent: Volume (Bar)
Relative Percent: Volume (Cumulative)
Relative Percent: Tick (Bar)
Relative Percent: Tick (Cumulative)

Version 2.0 11/26/2004
Added Trade Volume Filter. Trade Volume less than the Filter number will be excluded when Srouce is set to Volume.

Download File:
BidAskAnalysis.efs



EFS Code:
PHP Code:
/**************
Provided By : eSignal (c) Copyright 2004
Description: Bid/Ask Analysis

Version 2.0

Notes:
*** 2.0 - 11/26/2004 ***
    - Added Trade Volume Filter.  Trade Volume less than the Filter
      number will be excluded when Srouce is set to Volume.
    - 5/27/05 - Fix for Trade Volume Filter.  Wasn't properly 
      reseting the total at new bar.

Formula Parameters:                 Defaults:
Analysis                            Bar
    [Bar, Cumulative]
Study Output                        Raw Data
    [Relative Percent, Raw Data]
Source                              Volume
    [Tick, Volume]
Trade Volume Filter                 0
Ask Color                           green
Inside Color                        black
Bid Color                           red
Total Color                         lime
Ask Thickness                       8
Inside Thickness                    6
Bid Thickness                       4
Display Ask                         Yes
    [Yes, No]
Display Inside                      Yes
    [Yes, No]
Display Bid                         Yes
    [Yes, No]
Display Total                       Yes
    [Yes, No]
*************/

function preMain() {
    
setStudyTitle("Bid\/Ask Analysis ");
    
setCursorLabelName("Total"0);
    
setCursorLabelName("Ask %"1);
    
setCursorLabelName("Inside %"2);
    
setCursorLabelName("Bid %"3);
    
setDefaultBarFgColor(Color.lime0);
    
setDefaultBarFgColor(Color.green1);
    
setDefaultBarFgColor(Color.black2);
    
setDefaultBarFgColor(Color.red3);
    
setDefaultBarThickness(80);
    
setDefaultBarThickness(81);
    
setDefaultBarThickness(62);
    
setDefaultBarThickness(43);
    
setPlotType(PLOTTYPE_HISTOGRAM0);
    
setPlotType(PLOTTYPE_HISTOGRAM1);
    
setPlotType(PLOTTYPE_HISTOGRAM2);
    
setPlotType(PLOTTYPE_HISTOGRAM3);
    
setShowTitleParameters(false);
    
setStudyMin(0);
    
    var 
fp0 = new FunctionParameter("sType"FunctionParameter.STRING);
        
fp0.setName("Analysis");
        
fp0.addOption("Bar");
        
fp0.addOption("Cumulative");
        
fp0.setDefault("Bar");
    var 
fp1 = new FunctionParameter("sOutput"FunctionParameter.STRING);
        
fp1.setName("Study Output");
        
fp1.addOption("Relative Percent");
        
fp1.addOption("Raw Data");
        
fp1.setDefault("Raw Data");
    var 
fp2 = new FunctionParameter("sSource"FunctionParameter.STRING);
        
fp2.setName("Source");
        
fp2.addOption("Tick");
        
fp2.addOption("Volume");
        
fp2.setDefault("Volume");
    var 
fp2a = new FunctionParameter("nFilter"FunctionParameter.NUMBER);
        
fp2a.setName("Trade Volume Filter");
        
fp2a.setLowerLimit(0);
        
fp2a.setDefault(0);
    var 
fp3 = new FunctionParameter("cAsk"FunctionParameter.COLOR);
        
fp3.setName("Ask Color");
        
fp3.setDefault(Color.green);
    var 
fp4 = new FunctionParameter("cInside"FunctionParameter.COLOR);
        
fp4.setName("Inside Color");
        
fp4.setDefault(Color.black);
    var 
fp5 = new FunctionParameter("cBid"FunctionParameter.COLOR);
        
fp5.setName("Bid Color");
        
fp5.setDefault(Color.red);
    var 
fp6 = new FunctionParameter("cTotal"FunctionParameter.COLOR);
        
fp6.setName("Total Color");
        
fp6.setDefault(Color.lime);
    var 
fp7 = new FunctionParameter("nAskThickness"FunctionParameter.NUMBER);
        
fp7.setName("Ask Thickness");
        
fp7.setDefault(8);
    var 
fp8 = new FunctionParameter("nInsideThickness"FunctionParameter.NUMBER);
        
fp8.setName("Inside Thickness");
        
fp8.setDefault(6);
    var 
fp9 = new FunctionParameter("nBidThickness"FunctionParameter.NUMBER);
        
fp9.setName("Bid Thickness");
        
fp9.setDefault(4);
    var 
fp10 = new FunctionParameter("sAskDisplay"FunctionParameter.STRING);
        
fp10.setName("Display Ask");
        
fp10.addOption("Yes");
        
fp10.addOption("No");
        
fp10.setDefault("Yes");
    var 
fp11 = new FunctionParameter("sInsideDisplay"FunctionParameter.STRING);
        
fp11.setName("Display Inside");
        
fp11.addOption("Yes");
        
fp11.addOption("No");
        
fp11.setDefault("Yes");
    var 
fp12 = new FunctionParameter("sBidDisplay"FunctionParameter.STRING);
        
fp12.setName("Display Bid");
        
fp12.addOption("Yes");
        
fp12.addOption("No");
        
fp12.setDefault("Yes");
    var 
fp13 = new FunctionParameter("sTotalDisplay"FunctionParameter.STRING);
        
fp13.setName("Display Total");
        
fp13.addOption("Yes");
        
fp13.addOption("No");
        
fp13.setDefault("Yes");
}

var 
nAsk null;
var 
nBid null;
var 
nMax 0;
var 
aReturn = new Array(4); // return array;

// Volume
var nBidVol 0;
var 
nInsideVol 0;
var 
nAskVol 0;
var 
nTotalVol 0;
var 
vVol null;
var 
bPrimed false;

// Tick
var nBidTick 0;
var 
nInsideTick 0;
var 
nAskTick 0;
var 
nTotalTick 0;

var 
bEdit true;

function 
main(sTypesOutputsSourcenFiltercAskcInsidecBid
        
nAskThicknessnInsideThicknessnBidThickness,
        
sAskDisplaysInsideDisplaysBidDisplaysTotalDisplay) {
    if (
getCurrentBarIndex() < 0) return;

    if (
bEdit == true) {
        
setStudyTitle("Bid\/Ask " sOutput ": " sSource " (" sType ")");
        
setDefaultBarFgColor(cAsk1);
        
setDefaultBarFgColor(cInside2);
        
setDefaultBarFgColor(cBid3);
        
setDefaultBarThickness(nAskThickness1);
        
setDefaultBarThickness(nInsideThickness2);
        
setDefaultBarThickness(nBidThickness3);
        
setDefaultBarThickness(Math.max(nAskThicknessnInsideThicknessnBidThickness), 0);
        if (
sOutput == "Raw Data") {
            
setCursorLabelName("Ask Total"1);
            
setCursorLabelName("Inside Total"2);
            
setCursorLabelName("Bid Total"3);
            
removeBand("0");
            
removeBand("25");
            
removeBand("50");
            
removeBand("75");
            
removeBand("100");
            
nMax 0;
        } else {    
// Percent
            
setCursorLabelName("Ask %"1);
            
setCursorLabelName("Inside %"2);
            
setCursorLabelName("Bid %"3);
            
addBand(0PS_SOLID1Color.black"0");
            
addBand(25PS_SOLID1Color.black"25");
            
addBand(50PS_SOLID1Color.black"50");
            
addBand(75PS_SOLID1Color.black"75");
            
addBand(100PS_SOLID1Color.black"100");
            
setStudyMax(115);
        }
        
bEdit false;
    }
    
    var 
nState getBarState();

    if (
nState == BARSTATE_NEWBAR && getDay(0) != getDay(-1)) nMax 0;

    if (
sSource == "Volume") {
        if (
nState == BARSTATE_NEWBAR) {
            
vVol 0;
            if (
sType == "Bar" || getDay(0) != getDay(-1)) {
                
nBidVol 0;
                
nInsideVol 0;
                
nAskVol 0;
                
vVol 0;
                
nTotalVol 0;
                
aReturn[0] = 0;
                
aReturn[1] = 0;
                
aReturn[2] = 0;
                
aReturn[3] = 0;
            }
        }
        
        var 
vPrevVol 0;
        if (
vVol != && bPrimed == truevPrevVol vVol;
        
        var 
nTempAsk getMostRecentAsk();
        var 
nTempBid getMostRecentBid();
        if (
nTempAsk != null && nTempAsk != 0nAsk nTempAsk;
        if (
nTempBid != null && nTempBid != 0nBid nTempBid;
        var 
vClose close();
        
vVol volume();
        
        var 
vTradeVol vVol vPrevVol;
        if (
vTradeVol nFilter) return aReturn;
        
        if (
bPrimed == false && vVol != null) {
            
bPrimed true;
            return;
        } else {
            
nTotalVol += vTradeVol;
            if (
vClose <= nBid) {
                
nBidVol += vTradeVol;
            } else if (
vClose >= nAsk) {
                
nAskVol += vTradeVol;
            } else {
                
nInsideVol += vTradeVol;
            }
        }
    } else if (
sSource == "Tick") {
        if (
nState == BARSTATE_NEWBAR) {
            if (
sType == "Bar" || getDay(0) != getDay(-1)) {
                
nBidTick 0;
                
nInsideTick 0;
                
nAskTick 0;
                
nTotalTick 0;                
                
aReturn[0] = 0;
                
aReturn[1] = 0;
                
aReturn[2] = 0;
                
aReturn[3] = 0;
            }
        }
        
        var 
nTempAsk getMostRecentAsk();
        var 
nTempBid getMostRecentBid();
        if (
nTempAsk != null && nTempAsk != 0nAsk nTempAsk;
        if (
nTempBid != null && nTempBid != 0nBid nTempBid;
        var 
vClose close();
        
        
nTotalTick++;
        if (
vClose <= nBid) {
            
nBidTick++;
        } else if (
vClose >= nAsk) {
            
nAskTick++;
        } else {
            
nInsideTick++;
        }        
    }
    
    
// Return Data
    
var nDtotal;
    var 
nDask;
    var 
nDinside;
    var 
nDbid;
    if (
sSource == "Volume") {
        if (
sOutput == "Relative Percent") {
            
nDtotal 100; if (sTotalDisplay == "No"nDtotal nDtotal+"";
            
nDask = (nAskVol/nTotalVol)*100; if (sAskDisplay == "No"nDask nDask.toFixed(4);
            
nDinside = (nInsideVol/nTotalVol)*100; if (sInsideDisplay == "No"nDinside nDinside.toFixed(4);
            
nDbid = (nBidVol/nTotalVol)*100; if (sBidDisplay == "No"nDbid nDbid.toFixed(4);
            
//return new Array(100, (nAskVol/nTotalVol)*100, (nInsideVol/nTotalVol)*100, (nBidVol/nTotalVol)*100);
        
} else if (sOutput == "Raw Data") {
            
nMax Math.max(nMaxnTotalVol);
            
setStudyMax(nMax);
            
nDtotal nTotalVol; if (sTotalDisplay == "No"nDtotal nDtotal+"";
            
nDask nAskVol; if (sAskDisplay == "No"nDask nDask.toFixed(4);
            
nDinside nInsideVol; if (sInsideDisplay == "No"nDinside nDinside.toFixed(4);
            
nDbid nBidVol; if (sBidDisplay == "No"nDbid nDbid.toFixed(4);
            
//return new Array(nTotalVol, nAskVol, nInsideVol, nBidVol);
        
}
    } else if (
sSource == "Tick") {
        if (
sOutput == "Relative Percent") {
            
nDtotal 100; if (sTotalDisplay == "No"nDtotal nDtotal+"";
            
nDask = (nAskTick/nTotalTick)*100; if (sAskDisplay == "No"nDask nDask.toFixed(4);
            
nDinside = (nInsideTick/nTotalTick)*100; if (sInsideDisplay == "No"nDinside nDinside.toFixed(4);
            
nDbid = (nBidTick/nTotalTick)*100; if (sBidDisplay == "No"nDbid nDbid.toFixed(4);
            
//return new Array(100, (nAskTick/nTotalTick)*100, (nInsideTick/nTotalTick)*100, (nBidTick/nTotalTick)*100);
        
} else if (sOutput == "Raw Data") {
            
nMax Math.max(nMaxnTotalTick);
            
setStudyMax(nMax);
            
nDtotal nTotalTick; if (sTotalDisplay == "No"nDtotal nDtotal+"";
            
nDask nAskTick; if (sAskDisplay == "No"nDask nDask.toFixed(4);
            
nDinside nInsideTick; if (sInsideDisplay == "No"nDinside nDinside.toFixed(4);
            
nDbid nBidTick; if (sBidDisplay == "No"nDbid nDbid.toFixed(4);
            
//return new Array(nTotalTick, nAskTick, nInsideTick, nBidTick);
        
}
    }
    
    
aReturn[0] = nDtotal;
    
aReturn[1] = nDask;
    
aReturn[2] = nDinside;
    
aReturn[3] = nDbid;
    return new Array(
nDtotalnDasknDinsidenDbid);