//@Name:Vol Spike Finder //@Description:Returns 1 if there has been a volume spike within the defined lookback period //@Returns:Number //@Width:150 // 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. var lookback = 8; var minDiff = 100; var sigPeriod = 20; var sigType = 0; var dataType = 0; var useIntra = 0; var dataList = ["Daily","Weekly","Monthly"]; var sigList = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO","VIDYA"]; var sigList2 = ["SMA","EMA","WMA","TMA","VVHF","VCMO","VIDYA"]; var titleList = ["days","weeks","months"]; function init(status) { if (status == Loading || status == Editing) { lookback = storage.getAt(0); minDiff = storage.getAt(1); sigPeriod = storage.getAt(2); dataType = storage.getAt(3); sigType = storage.getAt(4); useIntra = storage.getAt(5); } if (status == Adding || status == Editing) { dlg = new Dialog("Volume spike finder...",250,80); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("VAL4",65,5,25,-1,"Spike =","% rise above average volume",minDiff,1,9999); dlg.addIntEdit("VAL3",65,22,25,-1,"Check back:","periods",lookback,0,999); dlg.addIntEdit("VAL5",65,39,25,-1,"Average settings:","",sigPeriod,2,500); dlg.addDropList("VAL1",96,39,60,-1,sigList,"","",sigType); dlg.addDropList("VAL2",65,56,45,-1,dataList,"Data source: ","",dataType); dlg.addTickBox("VAL6",115,57,100,-1,"incl. intraday data",useIntra); if (dlg.show()==Dialog.Cancel) return false; sigType = dlg.getValue("VAL1"); dataType = dlg.getValue("VAL2"); lookback = dlg.getValue("VAL3"); minDiff = dlg.getValue("VAL4"); sigPeriod = dlg.getValue("VAL5"); useIntra = dlg.getValue("VAL6"); storage.setAt(0, lookback); storage.setAt(1, minDiff); storage.setAt(2, sigPeriod); storage.setAt(3, dataType); storage.setAt(4, sigType); storage.setAt(5, useIntra); } setTitle("Vol spike (min: "+minDiff+"%) (lookback: "+lookback+" "+titleList[dataType]+") (sig:"+sigPeriod+" "+sigList2[sigType]+")"); } function getVal(share) { var data = getData(share,dataType,useIntra); if (data.length<2||data.length=minDiff) return 1; else continue; } return; } function getData(share,dataType,useIntra) { if (dataType==0)var data = share.getPriceArray(); if (dataType==1)var data = share.getWeeklyBarArray(); if (dataType==2)var data = share.getMonthlyBarArray(); if (data.length<2) return []; if (dataType==0 && useIntra==1) { 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}; } } if (dataType==1 && useIntra==1) { 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].low