//@Name:RMO Arrow //@Description: Returns 1 if an up arrow is created and -1 if a down arrow is created - used with the RMO study. Can be used as an alarm. //@Description:Shows the Highest High or Lowest Low value over a specified period. //@Returns:Number //@Width:80 //@Update:Periodic //@DefaultRangeMax:1 //@DefaultRangeMin:-1 //@Env:Production // 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 useIntra=0; var dataList = ["1m","2m","2.5m","3m","4m","5m","6m","10m","15m","20m","30m","1h","2h","3h","4h","Daily","Weekly","Monthly"]; var dataSource = 15; function init(status) { if (status == Loading || status == Editing) { dataSource = storage.getAt(0); useIntra = storage.getAt(1); } if (status == Adding || status == Editing) { var dlg = new Dialog("Chose data source", 250, 40); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("VAL1", 5, 5, -1, -1, dataList,"","",dataSource); dlg.addTickBox("VAL2",80,7,75,-1,"Use Intraday data",useIntra); if (dlg.show() == Dialog.Cancel) return false; dataSource = dlg.getValue("VAL1"); useIntra = dlg.getValue("VAL2"); storage.setAt(0, dataSource); storage.setAt(1, useIntra); } setTitle("RMO Arrows "+(useIntra?"(i":"(")+dataList[dataSource]+")") } function getVal(share) { // gets the correct PriceData array if (dataSource<15) { switch (dataSource) { 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; } var daysNeeded = Math.ceil(dataPeriod * 81*4/510); 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<3) return; } if (dataSource==15) var data = getData(share,0,useIntra) if (dataSource==16) var data = getData(share,1,useIntra) if (dataSource==17) var data = getData(share,2,useIntra) if(data == undefined || data.length<25) return 1000; var maCalc1 = new MA(2,MA.Simple); var maCalc2 = new MA(2,MA.Simple); var maCalc3 = new MA(2,MA.Simple); var maCalc4 = new MA(2,MA.Simple); var maCalc5 = new MA(2,MA.Simple); var maCalc6 = new MA(2,MA.Simple); var maCalc7 = new MA(2,MA.Simple); var maCalc8 = new MA(2,MA.Simple); var maCalc9 = new MA(2,MA.Simple); var maCalc10 = new MA(2,MA.Simple); var maRes1 = 0; var maRes2 = 0; var maRes3 = 0; var maRes4 = 0; var maRes5 = 0; var maRes6 = 0; var maRes7 = 0; var maRes8 = 0; var maRes9 = 0; var maRes10 = 0; var maAvg = 0; var emaCalc1 = new MA(30,MA.Exponential); var emaCalc2 = new MA(30,MA.Exponential); var emaCalc3 = new MA(81,MA.Exponential); var minMaxCalc = new MinMax(10); var HHV = 0; var LLV = 0; var HLdiff = 0; var swingTrd1 = new Array; var swingTrd2 = new Array; var swingTrd3 = new Array; var RMO = new Array; var Bull_Trend=0; var Bear_Trend=0; var Impulse_UP=0; var Impulse_Down=0; var Buy; var Sell; for (var i=0;iswingTrd3[i]) { arrows[i] = 1; continue; } else if (swingTrd3[i-1]swingTrd2[i]) { arrows[i] = -1; continue; } else arrows[i] = 0; } if(!isAlarmContext) { return arrows[arrows.length-1] } else { if(getValueForShare(share)!=1 && arrows[arrows.length-1]==1) { setValueForShare(share,1); return arrows[arrows.length-1]; } if(getValueForShare(share)!=-1 && arrows[arrows.length-1]==-1) { setValueForShare(share,-1); return arrows[arrows.length-1]; } if(getValueForShare(share)==1 && arrows[arrows.length-1]!=1) { setValueForShare(share,0); } if(getValueForShare(share)==-1 && arrows[arrows.length-1]!=-1) { setValueForShare(share,0); } } } function getData(share,dataSource,useIntra) { if (dataSource == 0)var data = share.getPriceArray(); if (dataSource == 1)var data = share.getWeeklyBarArray(); if (dataSource == 2)var data = share.getMonthlyBarArray(); if (data.length<2) return; if (dataSource==0 && useIntra==1) { //get a 24hour intraday bar var idata = share.getIBarArray(0,86400); //Check the bar is not undefined and has the correct length. //Check the date of the intraday data is today's date. //Check the date of the end-of-day data is not today's date. if (idata!=undefined && idata.length==1 && new Date().getDate()==idata[0].date.getDate() && new Date().getDate()!=data[data.length-1].date.getDate()) {//Add a new bar to the end of the current data array that adds the intraday Open,High,Low & Close data[data.length]={ open:share.getIOpen(), 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 (dataSource==1 && useIntra==1) { //get a 24hour intraday bar var idata = share.getIBarArray(0,86400); //Check the bar is not undefined and has the correct length. //Check the date of the intraday data is today's date. //Check the date of the end-of-day data is not today's date. 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