//@Name:Alarm:CCI Cross //@Description:An alarm that triggers when the CCI crosses the set trigger level //@Update:Periodic, 60 //@Env:Production //@Returns:Text //@Width:120 // 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","2.5m","3m","4m","5m","6m","10m","15m","20m","30m","1h","2h","3h","4h","Daily","Weekly","Monthly"]; var dataSource = 15; var period = 20; var trigger = 100.0; var crossType = 0 function init(status) { if (status == Loading || status == Editing) { dataSource = storage.getAt(0); period = storage.getAt(1); trigger = storage.getAt(2); crossType = storage.getAt(3); } if (status == Adding || status == Editing) { dlg = new Dialog("CCI Alarm",150,125); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",8,-1,80,-1,dataList,"","",dataSource); dlg.addIntEdit("INT1",8,-1,-1,-1,"","Period",period,2,1000); dlg.addNumEdit("NUM1",8,-1,-1,-1,"","Trigger level",trigger,0,500.0); dlg.addDropList("DL2",8,-1,80,-1,["Inside to Outside","Outside to Inside"],"","",crossType); dlg.addText(8,70,134,50,"\"Inside to Outside\" will trigger the alarm when the CCI moves from inside the"+ " trigger levels (i.e. between 100 and -100) to outside (i.e. above 100 or below -100). "+ "\"Outside to Inside\" triggeres when the opposite occurs."); if (dlg.show()==Dialog.Cancel) return false; dataSource = dlg.getValue("DL1"); period = dlg.getValue("INT1"); trigger = dlg.getValue("NUM1"); crossType = dlg.getValue("DL2"); storage.setAt(0, dataSource); storage.setAt(1, period); storage.setAt(2, trigger); storage.setAt(3, crossType); } } function getVal(share) { var data = getData(share, dataSource, 1, period*5) if (data==undefined || data.length<2) return; var cci = new CCI(period); var CCI0 = cci.getNext(data); data.length--; var CCI1 = cci.getNext(data); var oldAlarm = getValueForShare(share); var alarmText; if (oldAlarm == undefined || !isAlarmContext) { if ((!crossType && CCI1trigger) || (crossType && CCI1>trigger && CCI0-trigger && CCI0<-trigger) || (crossType && CCI1<-trigger && CCI0>-trigger)) { setValueForShare(share, -1); if (!crossType) alarmText = period+" CCI crossed outside -"+trigger; else alarmText = period+" CCI crossed inside -"+trigger; } } else { if ((!crossType && CCI0-trigger) || (crossType && (CCI0>trigger || CCI0<-trigger))) setValueForShare(share, undefined); } return alarmText; } function getData(share,dataType,useIntra,arrayLength) { if (dataType<15) { switch (dataType) { 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; } if (arrayLength) var daysNeeded = Math.ceil(dataPeriod * arrayLength/ 510); else var daysNeeded = 1; 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<2) return []; } else if (dataType==15 && useIntra==0) var data = share.getPriceArray(); else if (dataType==16 && useIntra==0) var data = share.getWeeklyBarArray(); else if (dataType==17 && useIntra==0) var data = share.getMonthlyBarArray(); //daily else if (dataType==15 && useIntra==1) { var data = share.getPriceArray(); 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()) { 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}; } } //weekly else if (dataType==16 && useIntra==1) { var data = share.getWeeklyBarArray(); 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()) { 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].lowtempData[tempData.length-1].high?idata[0].high:tempData[tempData.length-1].high), low:(idata[0].lowdata[data.length-1].high?tempData[i].high:data[data.length-1].high), low:(tempData[i].low