//@Name:CBL Distance //@Description:Distance of close from countback line //@Returns:Number //@Width:80 //@Env:Production /*Idea: in Datamining, use your favourite method of determing trend (say long) plus a daily CBL set to negative to +5% plus a weekly CBL set to completely positive. Either trade when cross over daily CBL on a closing basis occurs or a bounce above it. */ // Author: Roger Harmer //@Future:Yes // Care has been taken in preparing this code but it is provided without guarantee. var dataType = 0; var dataSource = ["Daily","Weekly","Monthly"]; var limit = 10; var countback = 3; function init(status) { if (status == Loading || status == Editing) { dataType = storage.getAt(0); } if (status == Adding || status == Editing) { dlg = new Dialog("Timeframe",164,75); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",50,-1,40,-1,dataSource,"Data source","",dataType); if (dlg.show()==Dialog.Cancel) return false; dataType = dlg.getValue("DL1"); storage.setAt(0, dataType); } //sets the title of the column setTitle("CBL "+dataSource[dataType]); } function getVal(x) { var CBL = new Array(); var countbackline = new Array(); var count, hi, lo, poshi, poslo, start, dir, pos, up, dn; var diff; if (dataType==0)data = x.getPriceArray(120); if (dataType==1)data = x.getWeeklyBarArray(120); if (dataType==2)data = x.getMonthlyBarArray(120); up = 1; dn = -1; if (data.length < limit + 70) return CBL; hi = data[limit-1].high; lo = data[limit-1].low; poshi = poslo = limit-1; for (var i=limit; i= 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; j