/*********************************Provided By: eSignal (Copyright ) eSignal), a division of Interactive Data Corporation. 2007. 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: RSI Bands by Frangois BertrandVersion: 1.0 2/5/2008Notes:* April 2008 Issue of Stocks and Commodities Magazine* Study requires version 8.0 or later.Formula Parameters: Defaults:Periods 14Upper Band 70Lower Band 30Band Color BlueBand Thickness 2Enable Clamping false**********************************/function preMain() { setPriceStudy(true); setStudyTitle("RSI Bands "); setCursorLabelName("RSIB70", 0); setCursorLabelName("RSIB30", 1); setShowTitleParameters(false); var fp1 = new FunctionParameter("nPeriods", FunctionParameter.NUMBER); fp1.setName("Periods"); fp1.setLowerLimit(0); fp1.setDefault(14); var fp2 = new FunctionParameter("nUpper", FunctionParameter.NUMBER); fp2.setName("Upper Band"); fp2.setLowerLimit(0); fp2.setDefault(70); var fp3 = new FunctionParameter("nLower", FunctionParameter.NUMBER); fp3.setName("Lower Band"); fp3.setLowerLimit(0); fp3.setDefault(30); var fp4 = new FunctionParameter("cColor", FunctionParameter.COLOR); fp4.setName("Band Color"); fp4.setDefault(Color.blue); var fp5 = new FunctionParameter("nThick", FunctionParameter.NUMBER); fp5.setName("Band Thickness"); fp5.setLowerLimit(1); fp5.setDefault(2); var fp6 = new FunctionParameter("bClamp", FunctionParameter.BOOLEAN); fp6.setName("Enable Clamping"); fp6.setDefault(false);}// Global Variablesvar bVersion = null; // Version flagvar bInit = false; // Initialization flagvar xUpperRSI = null;var xLowerRSI = null;function main(nPeriods, nUpper, nLower, cColor, nThick, bClamp) { var nState = getBarState(); var nIndex = getCurrentBarIndex(); if (bVersion == null) bVersion = verify(); if (bVersion == false) return; if (bInit == false) { setStudyTitle("RSI Bands (" + nPeriods + ", " + nUpper + ", " + nLower + ")"); setCursorLabelName("RSIB"+nUpper, 0); setCursorLabelName("RSIB"+nLower, 1); setDefaultBarFgColor(cColor, 0); setDefaultBarFgColor(cColor, 1); setDefaultBarThickness(nThick, 0); setDefaultBarThickness(nThick, 1); xUpperRSI = efsInternal("RSI_Band", nPeriods, nUpper, bClamp ); xLowerRSI = efsInternal("RSI_Band", nPeriods, nLower, bClamp ); bInit = true; } var nUpperRSI = xUpperRSI.getValue(0); var nLowerRSI = xLowerRSI.getValue(0); if (nUpperRSI == null || nLowerRSI == null) return; return new Array(nUpperRSI, nLowerRSI); }var result = null;var result_1 = null;var P = 0;var N = 0;var P_1 = 0;var N_1 = 0;function RSI_Band( period, TargetRSILevel, clamp ) { var diff = null; var HypotheticalCloseToMatchRSITarget = 0; var nState = getBarState(); if (nState == BARSTATE_NEWBAR) { result_1 = result; P_1 = P; N_1 = N; } if (close(-period) == null) return; var W = 0; var S = 0; var diff = close(0) - close(-1); if( diff > 0 ) W = diff; if( diff < 0 ) S = -diff; // Compute the hypothetical price close to reach the target RSI level // based on yesterdays RSI and close // Depending on if we would need the price to increase or decrease, // we use a different formula if (result_1 != null && result_1 > close(-1)) { HypotheticalCloseToMatchRSITarget = close(-1)+P_1-P_1*period-((N_1*period)-N_1)*TargetRSILevel /(TargetRSILevel - 100); } else { HypotheticalCloseToMatchRSITarget = close(-1)-N_1-P_1+N_1*period+P_1*period+(100*P_1)/TargetRSILevel -(100*P_1*period)/TargetRSILevel; } if (clamp == true) { // Optional clamping code // Enable the clamping option in Edit Studies if parameters used cause too much volatility. // (generally caused by using a very short period) This will keep the RSI Bands // within roughly 10% of the price if ( (HypotheticalCloseToMatchRSITarget - close(-1)) > 0.1*close(-1)) { HypotheticalCloseToMatchRSITarget = close(-1)*1.1; } else if ( (HypotheticalCloseToMatchRSITarget - close(-1)) < -0.1*close(-1)) { HypotheticalCloseToMatchRSITarget = close(-1)*0.9; } // Resume standard RSI code to update the running P and N averages } P = ( ( period -1 ) * P_1 + W ) / period; N = ( ( period -1 ) * N_1 + S ) / period; if (getCurrentBarCount() >= period) { result = HypotheticalCloseToMatchRSITarget; return result; } else { return null; }}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;} |