//@Name:Price Channel Breakout //@Description:Finds shares that have closed outside of the Donchian channels. //@Returns:Number //@Width:60 var period = 65 var hlc = 0; var lookbackCheck = false; var lookback = 20; function init(status) { if (status == Loading || status == Editing) { hlc = storage.getAt(0); period = storage.getAt(1); lookbackCheck = storage.getAt(2); lookback = storage.getAt(3); } if (status == Adding || status == Editing) { dlg = new Dialog((status==Adding?"Add":"Edit")+" column", 320, 45); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("DL1",8,8,60,-1,["High/Low","Close"],"","",hlc); dlg.addIntEdit("INT1",72,8,-1,-1,"","period",period,2,5000); dlg.addTickBox("TB1",8,26,180,-1,"Don't trigger if another breakout occurred in the last",lookbackCheck); dlg.addIntEdit("INT2",190,25,20,-1,"","trading days",lookback,2,5000); if (dlg.show()==Dialog.Cancel) return false; hlc = dlg.getValue("DL1"); period = dlg.getValue("INT1"); lookbackCheck = dlg.getValue("TB1"); lookback = dlg.getValue("INT2"); storage.setAt(0, hlc); storage.setAt(1, period); storage.setAt(2, lookbackCheck); storage.setAt(3, lookback); } setTitle(period+" Price Channel Breakout") } function getVal(share) { var data = share.getPriceArray(period+lookback+2); if (data==undefined || data.length=data.length-(lookback+1) && i hh0) { if (downTrigger) return 0; else upTrigger = true; } if (data[i+1].close < ll0) { if (upTrigger) return 0; else downTrigger = true; } } } if (!upTrigger && data[data.length-1].close > hh0) return 1; else if (!downTrigger && data[data.length-1].close < ll0) return -1; else return 0; }