//@Name:Alarm:Trend Cross //@Description:An alarm that triggers when the mid price moves close to or crosses the confidence lines //@Update:Periodic, 30 //@Env:Production //@Returns:Text //@Width:200 // 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: Richard Chiesa, ShareScript Support var dataList = ["1m","2m","3m","4m","5m","6m","10m","15m","20m","30m","1h","2h","3h","4h","Daily","Weekly","Monthly"]; var dataType = 14; var period = 20; var devs = 1.5; var trigger = 0.5; function init(status) { if (status == Loading || status == Editing) { dataType = storage.getAt(0); period = storage.getAt(1); devs = storage.getAt(2); trigger = storage.getAt(3); } if (status == Adding || status == Editing) { var dlg = new Dialog("Settings...",160,135); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",8,-1,80,-1,dataList,"","",dataType); dlg.addNumEdit("INT1",8,-1,-1,-1,"","Period",period,2,1000); dlg.addNumEdit("NUM1",8,-1,-1,-1,"","St. Devs.",devs,0.5,5); dlg.addNumEdit("NUM2",8,-1,-1,-1,"","% trigger",trigger,0,10); dlg.addText(8,70,144,70,"The script finds shares that are trading close (but haven't crossed) the trend confidence lines."+ " The Trigger determines how close the price needs to be for the alarm to go off. However setting the Trigger to 0%"+ " will find shares that are trading outside the confidence lines."); if (dlg.show()==Dialog.Cancel) return false; dataType = dlg.getValue("DL1"); period = dlg.getValue("INT1"); devs = dlg.getValue("NUM1"); trigger = dlg.getValue("NUM2"); storage.setAt(0, dataType); storage.setAt(1, period); storage.setAt(2, devs); storage.setAt(3, trigger); } } function getVal(share) { // gets the correct PriceData object if (dataType<14) { switch (dataType) { case 0: var dataPeriod = 1; break; case 1: var dataPeriod = 2; break; case 2: var dataPeriod = 3; break; case 3: var dataPeriod = 4; break; case 4: var dataPeriod = 5; break; case 5: var dataPeriod = 6; break; case 6: var dataPeriod = 10; break; case 7: var dataPeriod = 15; break; case 8: var dataPeriod = 20; break; case 9: var dataPeriod = 30; break; case 10: var dataPeriod = 60; break; case 11: var dataPeriod = 120; break; case 12: var dataPeriod = 180; break; case 13: var dataPeriod = 240; break; } var daysNeeded = Math.ceil(dataPeriod * period / 510); var eodData = share.getPriceArray(period); 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 (dataType==14) { var data = share.getPriceArray(period); 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 (dataType==15) var data = share.getWeeklyBarArray(period); if (dataType==16) var data = share.getMonthlyBarArray(period); if (data==undefined || data.length<2) return; var trend1 = new Trend(period); for (var i=0; i= 0) || (trigger==0 && price>upConf)) { setValueForShare(share, 1); alarmText = "Price within "+Math.abs((upConf/price-1)*100).toFixed(2)+"% of upper band"; } if ((trigger!=0 && Math.abs(downConf/price-1) <= trigger/100 && Math.abs(downConf/price-1) >= 0) || (trigger==0 && pricedownConf) setValueForShare(share, undefined); } return alarmText; }