//@Name:Countback line Value //@Description:Returns the current value of the Countback Line which is available as a ShareScript Indicator //@Returns:Number //@Width:90 //@Env:Production //@Update:Periodic,30 //This code by Roger Harmer //Put on main chart as a stop. The close finishes beyond the line to signal a change in direction. //@Future:Yes // Care has been taken in preparing this code but it is provided without guarantee. var countback = 3; var limit = 10; 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) { countback = storage.getAt(0); dataSource = storage.getAt(1); } if (status == Adding || status == Editing) { var dlg = new Dialog("Settings.....", 200, 50); dlg.addOkButton(); dlg.addCancelButton(); dlg.addNumEdit("VAL1",55,5,-1,-1,"Count back","",countback,2,1000); dlg.addDropList("VAL2",55,22,-1,-1,dataList,"Data Source","",dataSource); if (dlg.show() == Dialog.Cancel) return false; countback = dlg.getValue("VAL1"); dataSource = dlg.getValue("VAL2"); } storage.setAt(0, countback); storage.setAt(1, dataSource); setTitle("CBL " + countback+" Value ("+dataList[dataSource]+")"); } function getVal(share) { 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 * Math.max(var1,var2)*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; } else var data = getData(share,dataSource-15,1); if (data==undefined || data[0]==undefined || data.length= hi) { hi = data[i].high; poshi = i; } if (data[i].low <= lo) { lo = data[i].low; poslo = i; } } if (poshi >= poslo) { start = poshi; dir = up; } if (poshi < poslo) { start = poslo; dir = dn; } CBL[start-1] = (data[poshi].high + data[poslo].low)/2; if (dir == up) CBL[start-1] = data[poslo].low; for (var i=start; i data[i-1].high && dir == up) { count = 1; for (var j=i; j>i-countback+1; j--) while (data[j].low <= data[i-count].low && count < i) count++; pos = i - count; if (data[pos].low > CBL[i-1]) CBL[i] = data[pos].low; } if (data[i].low < data[i-1].low && dir == dn) { count = 1; for (var j=i; j>i-countback+1; j--) while (data[j].high >= data[i-count].high && count < i) count++; pos = i - count; if (data[pos].high < CBL[i-1]) CBL[i] = data[pos].high; } if (dir == up && data[i].close < CBL[i-1]) { dir = dn; count = 1; for (var j=i; j>i-countback+1; j--) while (data[j].high >= data[i-count].high && count < i) count++; pos = i - count; CBL[i] = data[pos].high; if (count > limit) { hi = data[i].high; for (var j=i-limit; j hi) hi = data[j].high; CBL[i] = hi; } } if (dir == dn && data[i].close > CBL[i]) { dir = up; count = 1; for (var j=i; j>i-countback+1; j--) while (data[j].low <= data[i-count].low && count < i) count++; pos = i - count; CBL[i] = data[pos].low; if (count > limit) { lo = data[i].low; for (var j=i-limit; jdata[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