//@Name:Fisher Transformation Value //@Description: Returns the Fisher Transformation value. //@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: Paul Hall, ShareScope Support var outputType=0; var fishList = ["Line 1","Line 2","Signal"]; 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; var sigPeriod = 9; var sigType = 0; var sigList = ["Simple","Exponential","Weighted","VariableVHF","VariableCMO","VIDYA"]; function init(status) { if (status == Loading || status == Editing) { dataSource = storage.getAt(0); outputType = storage.getAt(1); useIntra = storage.getAt(2); sigPeriod = storage.getAt(3); sigType = storage.getAt(4); } if (status == Adding || status == Editing) { var dlg = new Dialog("Fisher Transformation", 200, 70); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",65,5,-1,-1, dataList,"Data type: ","",dataSource); dlg.addDropList("OUTType",65,22,-1,-1, fishList, "Return value of: ","",outputType); dlg.addTickBox("TB1",7,39,130,-1,"use latest intraday data (daily only)", useIntra); dlg.addIntEdit("INT1",65,54,-1,-1,"Signal period: ","", sigPeriod); dlg.addDropList("DL2",100,54,-1,-1, sigList,"","",sigType); if (dlg.show() == Dialog.Ok) { dataSource=dlg.getValue("DL1"); outputType=dlg.getValue("OUTType"); useIntra=dlg.getValue("TB1"); sigPeriod = dlg.getValue("INT1"); sigType = dlg.getValue("DL2"); storage.setAt(0, dataSource); storage.setAt(1, outputType); storage.setAt(2, useIntra); storage.setAt(3, sigPeriod); storage.setAt(4, sigType); } else { return false; } } if (outputType == 0) var text = "Line 1"; if (outputType == 1) var text = "Line 2"; if (outputType == 2) var text = "Signal "+sigPeriod+" "+sigList[sigType]; setTitle(" Fisher Trans ("+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 len=8; var fish = new Array(); var fish2 = new Array(); var fishSig = new Array(); var fishSigCalc = new MA (sigPeriod,sigType) var h1 = 0; var l1 = 0; var v1 = new Array(); var v2 = new Array(); v1[len-2]=0; fish[len-2]=0; for (var i=len-1; idata[i-j].close) l1 = data[i-j].close; } v1[i] = 0.330*2*((data[i].close-l1)/(h1-l1+0.0001)-0.5)+0.67*v1[i-1]; if (v1[i]>0.99) v2[i]=0.999; else if (v1[i]<-0.99) v2[i]=-0.999; else v2[i]=v1[i]; fish[i] = 0.5*Math.log((1+v2[i])/(1-v2[i]))+0.5*fish[i-1]; fish2[i] = fish[i-1]; fishSig[i] = fishSigCalc.getNext(fish[i]); } if (outputType==0) { output = fish[fish.length-1]; } else if (outputType==1) { output = fish2[fish2.length-1]; } else { output = fishSig[fishSig.length-1]; } return output.toFixed(2); }