//@Name:RSI Value //@Description: Calculates the RSI value for a specified period. //@Returns:Number //@Width:90 //@Env:Production //@Update:Periodic,60 // Care has been taken in preparing this code but it is provided without guarantee. // You are welcome to modify and extend it. Please add your name as a modifier if you distribute it. // Coded by: Phil Tolhurst, ShareScope Support var Value1=20 var RSIType=0; var RSIList = ["Wilder","Exponential","Simple"]; var periodList = ["Daily","Weekly","Monthly"]; var dataList = ["1m","2m","2.5m","3m","4m","5m","6m","10m","15m","20m","30m","1h","2h","3h","4h","Daily","Weekly","Monthly"]; var dataSource = 15; var useIntra = 0; function init(status) { if (status == Loading || status == Editing) { Value1 = storage.getAt(0); dataSource = storage.getAt(1); RSIType = storage.getAt(2); useIntra = storage.getAt(3); } if (status == Adding || status == Editing) { var dlg = new Dialog("Enter Value", 200, 70); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("Value1", 65, -1, -1, -1, "Period", "",Value1); dlg.addDropList("DL1",65,-1,-1,-1, dataList,"","",dataSource); dlg.addDropList("RSIType",65,-1,-1,-1, RSIList, "RSI Type","",RSIType); dlg.addTickBox("TB1",50,-1,130,-1,"use latest intraday data (daily only)", useIntra); if (dlg.show() == Dialog.Ok) { Value1=dlg.getValue("Value1"); dataSource=dlg.getValue("DL1"); RSIType=dlg.getValue("RSIType"); useIntra=dlg.getValue("TB1"); storage.setAt(0, Value1); storage.setAt(1, dataSource); storage.setAt(2, RSIType); storage.setAt(3, useIntra); } else { return false; } } if (RSIType == 0) var text = "Wilder"; if (RSIType == 1) var text = "Exponential"; if (RSIType == 2) var text = "Simple"; setTitle(Value1+" RSI ("+text+") "+dataList[dataSource]) } function getVal(share) { if (dataSource<15) { switch (dataSource) { case 0: var dataPeriod = 1; break; case 1: var dataPeriod = 2; break; case 2: var dataPeriod = 2.5; break; case 3: var dataPeriod = 3; break; case 4: var dataPeriod = 4; break; case 5: var dataPeriod = 5; break; case 6: var dataPeriod = 6; break; case 7: var dataPeriod = 10; break; case 8: var dataPeriod = 15; break; case 9: var dataPeriod = 20; break; case 10: var dataPeriod = 30; break; case 11: var dataPeriod = 60; break; case 12: var dataPeriod = 120; break; case 13: var dataPeriod = 180; break; case 14: var dataPeriod = 240; break; } var daysNeeded = Math.ceil(dataPeriod * Math.max(Value1)*2/ 510); var eodData = share.getPriceArray(); if (eodData.length=0;i--) { tempData = share.getIBarArray(i,dataPeriod*60); if (tempData==undefined || tempData.length<1) continue; data = data.concat(share.getIBarArray(i,dataPeriod*60)); } if (data==undefined || data[0]==undefined || data.length<3) return; } if (dataSource==15) { var data = share.getPriceArray(); } if (dataSource==16) var data = share.getWeeklyBarArray(); if (dataSource==17) var data = share.getMonthlyBarArray(); if (data==undefined) return; //if Use Intraday is selected, calculate today's intraday bar and add it to the data array. if (dataSource==15 && useIntra) { if (data.length<2) return; var idata = share.getIBarArray(0,86400); if (idata!=undefined && idata.length==1 && new Date().getDate()==idata[0].date.getDate() && new Date().getDate()!=data[data.length-1].date.getDate()) { var tclose = share.getIClose(); var topen = share.getIOpen(); data[data.length]={open:(topen==null?idata[0].open:topen),high:idata[0].high,low:idata[0].low,close:(tclose==null?share.getIMid():tclose),volume:idata[0].volume}; } } if (data.length<2) return; var output = 0; var RES1=new Array(); var RSI1 = new RSI(Value1,RSIType); for (var i=0;i