//@Name:Ichimoku Cross //@Description:Returns 1 for the Turning Line (Tenkan Sen) crossing above the Standard Line (Kijun Sen), -1 for Standard Line crossing below and 0 if the Standard Line crosses then crosses back in the lookback period. Can be used as an alarm. //@Returns:Number //@Width:70 //@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 // Modified by: Paul Hall, ShareScope Support var periods1 = 9 var periods2 = 26 var lookback2 = 1 var lookbark = 1; 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) { periods1 = storage.getAt(0); periods2 = storage.getAt(1); dataSource = storage.getAt(2); useIntra = storage.getAt(3); lookback = storage.getAt(4); } if (status == Adding || status == Editing) { var dlg = new Dialog("Ichimoku Cross", 150, 125); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",8,70,-1,-1,dataList,"","",dataSource); dlg.addGroupBox(5,5,80,30,"Turning Line"); dlg.addIntEdit("INT1",8,16,-1,-1,"","",periods1); dlg.addGroupBox(5,35,80,30,"Standard Line"); dlg.addIntEdit("INT2",8,46,-1,-1,"","",periods2); dlg.addTickBox("TK1",8,90,100,-1,"include intraday data",useIntra); dlg.addIntEdit("INT3",37,105,-1,-1,"lookback","",lookback2); if (dlg.show() == Dialog.Cancel) return false; periods1 = dlg.getValue("INT1"); periods2 = dlg.getValue("INT2"); dataSource = dlg.getValue("DL1"); useIntra = dlg.getValue("TK1"); lookback = dlg.getValue("INT3"); storage.setAt(0, periods1); storage.setAt(1, periods2); storage.setAt(2, dataSource); storage.setAt(3, useIntra); storage.setAt(4, lookback); } setTitle("Ichimoku Cross (" + lookback + ")"); } 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(periods1,periods2)*4/ 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 = getData(share,0,useIntra) if (dataSource==16) var data = getData(share,1,useIntra) if (dataSource==17) var data = getData(share,2,useIntra) if(data.length < 1 + lookback) return; var output; var KijunSen = new Array(); var TenkanSen = new Array(); //Tenkan Sen New Highs and Lows settings var TS1 = new MinMax(periods1); var TS2 = new MinMax(periods1); var newHighsTS = new Array; var newLowsTS = new Array; //Kijun Sen New Highs and Lows Settings var KS1 = new MinMax(periods2); var KS2 = new MinMax(periods2); var newLowsKS = new Array; var newHighsKS = new Array; //New Highs and Lows calculations. for (i=0;iKijunSen[t]) { hasCrossedUp = true; } else if (TenkanSen[y]>KijunSen[y] && TenkanSen[t]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