//@Name:Alarm:StocOsc X //@Description:An alarm that triggers when the %K line of the stochastic oscillator crosses the %D line while above or below a set level //@Returns:Text //@Width:90 //@Env:Production //@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 var SOperiod = 20; var slowing = 2; var signalPeriod = 9; var dataSource = 15; var dataList = ["1m","2m","2.5m","3m","4m","5m","6m","10m","15m","20m","30m","1h","2h","3h","4h","Daily","Weekly","Monthly"]; var topLevel = 75; var bottomLevel = 25; function init(status) { if (status == Loading || status == Editing) { SOperiod = storage.getAt(0); slowing = storage.getAt(1); signalPeriod = storage.getAt(2); dataSource = storage.getAt(3); topLevel = storage.getAt(4); bottomLevel = storage.getAt(5); } if (status == Adding || status == Editing) { var dlg = new Dialog("Stochastic Oscillator", 280, 130); dlg.addOkButton(); dlg.addCancelButton(); dlg.addIntEdit("VAL1", 8, -1, -1, -1, "","indicator period",SOperiod,2,1000); dlg.addIntEdit("VAL2", 8, -1, -1, -1, "","slowing period",slowing,0,100); dlg.addIntEdit("VAL3", 8, -1, -1, -1, "","Signal Period",signalPeriod,2,1000); dlg.addDropList("VAL4",8, -1,50,-1,dataList, "","Data Source",dataSource); dlg.addNumEdit("VAL5", 8, -1, -1, -1, "","Upper Level",topLevel,0,100); dlg.addNumEdit("VAL6", 8, -1, -1, -1, "","Lower Level",bottomLevel,0,100); dlg.addText(8, 100, 190, 27, "The alarm will trigger if the %K line crosses above the %D line while below the lower level, or if the %K crosses below the %D while above the upper level."); if (dlg.show() == Dialog.Ok) { SOperiod=dlg.getValue("VAL1"); slowing=dlg.getValue("VAL2"); signalPeriod=dlg.getValue("VAL3"); dataSource=dlg.getValue("VAL4"); topLevel=dlg.getValue("VAL5"); bottomLevel = dlg.getValue("VAL6"); storage.setAt(0, SOperiod); storage.setAt(1, slowing); storage.setAt(2, signalPeriod); storage.setAt(3, dataSource); storage.setAt(4, topLevel); storage.setAt(5, bottomLevel); } } setTitle(SOperiod+","+slowing+","+signalPeriod+" Stoc. Osc. cross ("+dataList[dataSource]+")"); } function getVal(share) { var data = getData(share,dataSource,1,SOperiod*10) if (data.length<2) return; var SO1 = new StochOsc(SOperiod,slowing,signalPeriod); var stochVal = []; var signalVal = []; for (var i=0;isignalVal[a] && stochVal[a]signalVal[b] && stochVal[a]topLevel) { setValueForShare(share, -1); alarmText = "Bear cross - StocOsc "+SOperiod+","+slowing+","+signalPeriod+"("+dataList[dataSource]+")" } } else { if ((stochVal[b]>signalVal[b] && stochVal[a]>signalVal[a]) || (stochVal[b]=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