//@LibraryID:994,0 //@Name:MFI Value //@Description:Returns the value of the Money Flow Index //@Returns:Number //@Update:Periodic, 120 // 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. //modified by: Paul Hall, ShareScope support. Added a lookback on 13/12/17. var period = 20; var lookback = 0; 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) { period = storage.getAt(0); dataSource = storage.getAt(1); lookback = storage.getAt(2); } if (status == Adding || status == Editing) { dlg = new Dialog("MFI Settings",180,75); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("INT1",50,-1,-1,-1,"","period",period,2,1000); dlg.addIntEdit("INT2",50,-1,-1,-1,"Lookback:","periods",lookback,0,500); dlg.addDropList("DL1",50,40,50,-1,dataList,"Period size:","",dataSource); if (dlg.show()==Dialog.Cancel) return false; period = dlg.getValue("INT1"); dataSource = dlg.getValue("DL1"); lookback = dlg.getValue("INT2"); storage.setAt(0, period); storage.setAt(1, dataSource); storage.setAt(2, lookback); } setTitle(period+" MFI ("+dataList[dataSource]+") (LB:"+lookback+")"); } function getVal(share) { var data = new Array; data = getData(share,dataSource,useIntra); if (data.length=period-lookback) { var pmf = 0; var nmf = 0; for (var j=0;jperiod;j++) { if (typ[i-j]>typ[i-j-1]) pmf += mf[i-j]; else if (typ[i-j]=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<2) return []; } else if (dataType==15 && useIntra==0) var data = share.getPriceArray(); else if (dataType==16 && useIntra==0) var data = share.getWeeklyBarArray(); else if (dataType==17 && useIntra==0) var data = share.getMonthlyBarArray(); //daily else if (dataType==15 && useIntra==1) { var data = share.getPriceArray(); 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()) { data[data.length]={ open:idata[0].open, high:idata[0].high, low:idata[0].low, close:(share.getIClose()==null?share.getIMid():share.getIClose()), volume:idata[0].volume, dateNum:idata[0].dateNum}; } } //weekly else if (dataType==16 && useIntra==1) { var data = share.getWeeklyBarArray(); 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()) { if (idata[0].date.getDay()data[data.length-1].high?idata[0].high:data[data.length-1].high), low:(idata[0].lowdata[data.length-1].high?idata[0].high:data[data.length-1].high), low:(idata[0].lowtempData[tempData.length-1].high?idata[0].high:tempData[tempData.length-1].high), low:(idata[0].lowdata[data.length-1].high?tempData[i].high:data[data.length-1].high), low:(tempData[i].low