BidAskRatio.efs
File Name: BidAskRatio.efs
Description:
Analyzes Bid/Ask tick or volume data by calculating various ratios selected by the user through the Edit Studies options.
Formula Parameters:
- Analysis: Cumulative [Bar, Cumulative]
- Study Output: Ask/Bid [Ask/Bid, Ask/Total, Bid/Total, Ask-Bid]
- Source: Volume [Tick, Volume]
- Trade Volume Filter: 0 (Exlcudes trades below specified filter)
- Positive Color: blue
- Negative Color: red
- Thickness: 2
- Plot Type: Line [Line, Histogram]
Notes:
This study may only collect and display data in real time only. It will collect and display data after the study has completely loaded. A reload of the study will start the analysis over because Bid/Ask data in not exposed to EFS for historical bars.
Download File:
BidAskRatio.efs
EFS Code:
/***************************************************************** Provided By : eSignal (c) Copyright 2004 Description: Bid/Ask Ratio 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 Cumulative [Bar, Cumulative] Study Output Ask/Bid [Ask/Bid, Ask/Total, Bid/Total, Ask-Bid] Source Volume [Tick, Volume] Trade Volume Filter 0 Positive Color blue Negative Color red Thickness 2 Plot Type Line [Line, Histogram] *****************************************************************/ function preMain() { setStudyTitle("Bid\/Ask Ratio "); setCursorLabelName("Ask/Bid", 0); setDefaultBarThickness(2, 0); setShowTitleParameters(false); addBand(1, PS_SOLID, 1, Color.black, "even"); var fp0 = new FunctionParameter("sType", FunctionParameter.STRING); fp0.setName("Analysis"); fp0.addOption("Bar"); fp0.addOption("Cumulative"); fp0.setDefault("Cumulative"); var fp1 = new FunctionParameter("sOutput", FunctionParameter.STRING); fp1.setName("Study Output"); fp1.addOption("Ask/Bid"); fp1.addOption("Ask/Total"); fp1.addOption("Bid/Total"); fp1.addOption("Ask-Bid"); fp1.setDefault("Ask/Bid"); 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("cPos", FunctionParameter.COLOR); fp3.setName("Positive Color"); fp3.setDefault(Color.blue); var fp4 = new FunctionParameter("cNeg", FunctionParameter.COLOR); fp4.setName("Negative Color"); fp4.setDefault(Color.red); var fp5 = new FunctionParameter("nThickness", FunctionParameter.NUMBER); fp5.setName("Thickness"); fp5.setDefault(2); var fp6 = new FunctionParameter("sPlotType", FunctionParameter.STRING); fp6.setName("Plot Type"); fp6.addOption("Line"); fp6.addOption("Histogram"); fp6.setDefault("Line"); } var nAsk = null; var nBid = null; var nRet = 1; var aReturn = new Array(1); // 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(sType, sOutput, sSource, nFilter, cPos, cNeg, nThickness, sPlotType) { if (bEdit == true) { setStudyTitle("BidAskRatio: " + sOutput + ": " + sSource + " (" + sType + ")"); setDefaultBarThickness(nThickness, 0); setCursorLabelName(sOutput, 0); if (sPlotType == "Histogram") setPlotType(PLOTTYPE_HISTOGRAM, 0); if (sOutput == "Ask-Bid") { addBand(0, PS_SOLID, 1, Color.black, "even"); nRet = 0; } bEdit = false; } if (getCurrentBarIndex() < 0) return nRet; var nState = getBarState(); 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; } } var vPrevVol = 0; if (vVol != 0 && bPrimed == true) vPrevVol = vVol; var nTempAsk = getMostRecentAsk(); var nTempBid = getMostRecentBid(); if (nTempAsk != null && nTempAsk != 0) nAsk = nTempAsk; if (nTempBid != null && nTempBid != 0) nBid = 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; } } var nTempAsk = getMostRecentAsk(); var nTempBid = getMostRecentBid(); if (nTempAsk != null && nTempAsk != 0) nAsk = nTempAsk; if (nTempBid != null && nTempBid != 0) nBid = nTempBid; var vClose = close(); nTotalTick++; if (vClose <= nBid) { nBidTick++; } else if (vClose >= nAsk) { nAskTick++; } /*else { nInsideTick++; }*/ } // Return Data var nReturn = 1; switch (sSource) { case "Volume" : switch (sOutput) { case "Ask/Bid" : if (nBidVol == 0) nReturn = 1; else nReturn = (nAskVol/nBidVol); break; case "Ask/Total" : if (nTotalVol == 0) nReturn = 1; else nReturn = (nAskVol/nTotalVol); break; case "Bid/Total" : if (nTotalVol == 0) nReturn = 1; else nReturn = (nBidVol/nTotalVol); break; case "Ask-Bid" : nReturn = (nAskVol-nBidVol); break; default : nReturn = 1; } break; case "Tick" : switch (sOutput) { case "Ask/Bid" : if (nBidTick == 0) nReturn = 1; else nReturn = (nAskTick/nBidTick); break; case "Ask/Total" : if (nTotalTick == 0) nReturn = 1; else nReturn = (nAskTick/nTotalTick); break; case "Bid/Total" : if (nTotalTick == 0) nReturn = 1; else nReturn = (nBidTick/nTotalTick); break; case "Ask-Bid" : nReturn = (nAskTick-nBidTick); break; default : nReturn = 1; } break; default: nReturn = 1; } if (nReturn >= 1) setBarFgColor(cPos, 0); else setBarFgColor(cNeg, 0); aReturn[0] = nReturn; return nReturn; }