//@Name:Intra Vol Spike //@Description:Finds shares whose volume has just spiked above the average. //@Returns:Number //@Env:Production //@Width:90 //@Update:Periodic, 600 //@StandardAlarmOutput:Yes var maList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA","TEMA"]; var maTitleList = ["SMA","EMA","WMA","TMA","VVHF","VCMO","VIDYA","TEMA"]; var MAtype = 0; var periodLength = 10; var trigger = 500; var period = 20; var lookback = 0; function init(status) { if (status == Loading || status == Editing) { periodLength = storage.getAt(0); trigger = storage.getAt(1); period = storage.getAt(2); MAtype = storage.getAt(3); lookback = storage.getAt(4); } if (status == Adding || status == Editing) { dlg = new Dialog("Intraday Volume Spike",250,110); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("INT1",60,-1,-1,-1,"Period length ","min",periodLength,1,1440); dlg.addIntEdit("INT2",60,-1,-1,-1,"Trigger level ","%",trigger,1,3000); dlg.addDropList("DL1",60,36,80,-1,maList,"Vol Signal","",MAtype); dlg.addIntEdit("INT3",145,36,-1,-1,"","",period,2,1000); dlg.addIntEdit("INT4",60,-1,-1,-1,"Lookback","",lookback,0,1000); dlg.addText(8,70,200,36,"Lookback indicates how many past bars the script will look into for a spike. "+ "Setting the lookback to 5, for example, will return a positive result if a spike occurred on the latest bar or on any of the previous 5 bars."); if (dlg.show()==Dialog.Cancel) return false; periodLength = dlg.getValue("INT1"); trigger = dlg.getValue("INT2"); period = dlg.getValue("INT3"); MAtype = dlg.getValue("DL1"); lookback = dlg.getValue("INT4"); storage.setAt(0, periodLength); storage.setAt(1, trigger); storage.setAt(2, period); storage.setAt(3, MAtype); storage.setAt(4, lookback); } setTitle(periodLength+"m, "+trigger+"% of "+period+" "+maTitleList[MAtype]+" Vol Spike"); } function getVal(share) { var numDays = Math.ceil(periodLength*period*60/30600) //how many days of data are required var data = []; //var checkData = []; for (i=numDays;i>=0;i--) { //checkData = checkData.concat(getShare("UKI:UKX").getIBarArray(i, periodLength*60)); data = data.concat(share.getIBarArray(i, periodLength*60)) } if (data==undefined || data.length<2) return 0; var ma1 = new MA(period, MAtype); var volMA; for (i=0;i0) volMA = ma1.getNext(data[i].volume); } for (i=1;i<=lookback;i++) { //print(share.getName()+" "+checkData[checkData.length-i].timeNum+" "+data[data.length-1].timeNum+" "+(lookback*periodLength*60)); if (((data[data.length-i].volume/volMA-1)*100) > trigger)/* && checkData[checkData.length-i].timeNum >= data[data.length-1].timeNum-(lookback*periodLength*60))*/ { //print(share.getName()+" "+data[data.length-i].date); //print(data[data.length-i].volume+" "+volMA); return 1; } } return 0; }