//@Name:Inverse Fisher RSI Filter //@Description:A script that returns 1 or -1 when the Inverse Fisher Transform of a smoothed RSI crosses a given level. //@Returns:Number //@Width:80 //@Update:Periodic,15 //@Env:Production // 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, ShareScript Support var period = 5; var period2 = 9; var LineCol = Colour.Red; var LineStyle = 0; var LineWidth = 0; var triggerLevel = 0; var triggerType = 0; var useIntra = 0; var dataList = ["Daily","Weekly","Monthly"]; var dataType = 0; var crossList = ["Crosses Above","Crosses Below"]; function init(status) { if (status == Loading || status == Editing) { period = storage.getAt(0); period2 = storage.getAt(1); triggerLevel = storage.getAt(2); triggerType = storage.getAt(3); dataType = storage.getAt(4); useIntra = storage.getAt(5); } if (status == Adding || status == Editing) { dlg = new Dialog((status==Adding?"Add":"Edit")+" indicator", 180, 110); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("VAL1",78,5,-1,-1,"RSI Period","",period,2,1000); dlg.addIntEdit("VAL2",78,22,-1,-1,"Smoothing period","",period2,2,1000); dlg.addNumEdit("VAL3",78,39,-1,-1,"","",triggerLevel,-1,1); dlg.addDropList("VAL4",9,39,-1,-1,crossList,"","",triggerType); dlg.addDropList("VAL5",9,56,50,-1,dataList,"","",dataType); dlg.addTickBox("VAL6",65,58,75,-1,"Use Intraday Data",useIntra); dlg.addText(5,73,175,40,"Note: The Use Intraday option can only be used when the script is set as an alarm or a column"); if (dlg.show()==Dialog.Cancel) return false; period = dlg.getValue("VAL1"); period2 = dlg.getValue("VAL2"); triggerLevel = dlg.getValue("VAL3"); triggerType = dlg.getValue("VAL4"); dataType = dlg.getValue("VAL5"); useIntra = dlg.getValue("VAL6"); storage.setAt(0, period); storage.setAt(1, period2); storage.setAt(2, triggerLevel); storage.setAt(3, triggerType); storage.setAt(4, dataType); storage.setAt(5, useIntra); } setTitle("InvFisherTrans: "+crossList[triggerType]+" "+triggerLevel+" ("+(useIntra?"i":"")+dataList[dataType]+")"); } function getVal(share) { var data = getData(share,dataType,useIntra); if (data==undefined || data.length<1) return; var rsi1 = new RSI(period); var ma1 = new MA(period2,MA.Weighted); var value1 = []; var value2 = []; var iFish = []; for (var i=0;itriggerLevel) { setValueForShare(share,1); return 1; } } if (triggerType==1 && getValueForShare(share)!=1) { if (iFish[iFish.length-2]>triggerLevel && iFish[iFish.length-1]triggerLevel) { return 1; } } if (triggerType==1) { if (iFish[iFish.length-2]>triggerLevel && iFish[iFish.length-1]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].low