//@LibraryID:1003,3 //@LibraryID:1003,2 //@Name:Colour Change MA 3 //@Description:Changes the colour of the moving average and channels based on up/down movement or divergence // 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. var period = 20; var chPeriod = 2; var ma; var inputList = ["Open","High","Low","Close","Typical","Median","Weighted"]; var maList = ["Simple","Exponential", "Weighted", "Triangular" , "Variable VHF" , "Variable CMO" , "VIDYA", "TEMA", "Hull"]; var channelList = ["Envelopes","Bollinger","STARC","Keltner"]; var conditionList = ["MA Up/Down","Channel Conv/Div"]; var title = ["SMA","EMA","WMA","TMA","VHF","CMO","VIDYA", "TEMA", "Hull"]; var maType = 0; var chType = 0; var inputType = 3; var conditionType = 0; var maUp = Colour.Green; var maDown = Colour.Red; var chUp = Colour.RGB(200,255,200); var chDown = Colour.RGB(255,200,200); var showCh = false; var showMA = true; var fillCh = false; //Modified: Phil Tolhurst, ShareScope Support - 03-02-17 // 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. function init(status) { if (status == Loading || status == Editing) { showMA = storage.getAt(0); maType = storage.getAt(1); maUp = storage.getAt(2); maDown = storage.getAt(3); period = storage.getAt(4); showCh = storage.getAt(5); chType = storage.getAt(6); chUp = storage.getAt(7); chPeriod = storage.getAt(8); chDown = storage.getAt(9); inputType = storage.getAt(10); conditionType = storage.getAt(11); fillCh = storage.getAt(12); } if (status == Adding || status == Editing) { var dlg = new Dialog("Moving Average", 250, 127); dlg.addOkButton(); dlg.addCancelButton(); dlg.addGroupBox(15,5,175,50,""); dlg.addTickBox("TB1",20,5,65,-1,"Moving Average",showMA); dlg.addDropList("DL1",40,20,-1,-1,maList,"Type","",maType); dlg.addColPicker("COL1",155,20,-1,-1,"Up","",maUp); dlg.addColPicker("COL2",155,35,-1,-1,"Down","",maDown); dlg.addIntEdit("INT1",40,38,-1,-1,"","MA period",period,2,1000); dlg.addGroupBox(15,55,175,50,""); dlg.addTickBox("TB2",20,55,40,-1,"Channel",showCh); dlg.addDropList("DL2",40,70,-1,-1,channelList,"Type","",chType); dlg.addTickBox("TB3",155,60,-1,-1,"Fill",fillCh); dlg.addColPicker("COL3",155,70,-1,-1,"","",chUp); dlg.addNumEdit("NUM2",40,85,-1,-1,"","%/devs/periods",chPeriod,0.01,100); dlg.addColPicker("COL4",155,85,-1,-1,"","",chDown); dlg.addDropList("DL3",40,110,-1,-1,inputList,"Source","",inputType); dlg.addDropList("DL4",150,110,-1,-1,conditionList,"Ch.Colour","",conditionType); if (dlg.show()==Dialog.Cancel) return false; showMA = dlg.getValue("TB1"); maType = dlg.getValue("DL1"); maUp = dlg.getValue("COL1"); maDown = dlg.getValue("COL2"); period = dlg.getValue("INT1"); showCh = dlg.getValue("TB2"); chType = dlg.getValue("DL2"); chUp = dlg.getValue("COL3"); chPeriod = dlg.getValue("NUM2"); chDown = dlg.getValue("COL4"); inputType = dlg.getValue("DL3"); conditionType = dlg.getValue("DL4"); fillCh = dlg.getValue("TB3"); storage.setAt(0, showMA); storage.setAt(1, maType); storage.setAt(2, maUp); storage.setAt(3, maDown); storage.setAt(4, period); storage.setAt(5, showCh); storage.setAt(6, chType); storage.setAt(7, chUp); storage.setAt(8, chPeriod); storage.setAt(9, chDown); storage.setAt(10, inputType); storage.setAt(11, conditionType); storage.setAt(12, fillCh); } } function onNewChart() { draw(); } function onNewBarUpdate() { draw() } function draw() { //create and calculate the MA using the selected data type if (maType == 7) var ma1 = new TEMA(period) else if (maType == 8) var ma1 = new Hull(period) else var ma1 = new MA(period, maType); var maValue = []; for (var i=0;i0) { if (showMA) { setLayer(Layer.Top); moveTo(0,maValue[0]) for (var i=1;imaValue[i-1]) setPenStyle(0,1,maUp); else setPenStyle(0,1,maDown); lineTo(i,maValue[i]); } } //calculate, draw and fill the channel if (showCh) { setLayer(Layer.Top); var upCh = []; var downCh = []; //calculate one of the 4 channel types if (chType==0) { for (var i=0;imaValue[i-1]) || (conditionType==1 && upCh[i]-downCh[i]>upCh[i-1]-downCh[i-1])) setPenStyle(0,1,maUp); else setPenStyle(0,1,maDown); lineTo(i,upCh[i]); } //draw the lower band moveTo(0,downCh[0]) for (var i=1;imaValue[i-1]) || (conditionType==1 && upCh[i]-downCh[i]>upCh[i-1]-downCh[i-1])) setPenStyle(0,1,maUp); else setPenStyle(0,1,maDown); lineTo(i,downCh[i]); } //fill the channel if (fillCh) { setLayer(Layer.Bottom); beginPath(); moveTo(0,maValue[0]); if (conditionType==0) var ud = maValue[1]>maValue[0]?true:false; else var ud = upCh[1]-downCh[1]>upCh[0]-downCh[0]?true:false; var starti = 0; var runLoop = true; while (runLoop) { for (var i=starti+1;((conditionType==0 && ((maValue[i]>maValue[i-1] && ud) || (maValue[i]<=maValue[i-1] && !ud))) || (conditionType==1 && ((upCh[i]-downCh[i]>upCh[i-1]-downCh[i-1] && ud) || (upCh[i]-downCh[i]<=upCh[i-1]-downCh[i-1] && !ud)))) && i=bars.length) runLoop = false; i--; var endi = i; for (;i>=starti;i--) { lineTo(i,downCh[i]); } lineTo(starti,upCh[starti]); if (ud) setBrushColour(chUp); else setBrushColour(chDown); endPath(); fillPath(); ud = !ud; starti = endi; beginPath(); moveTo(starti,upCh[starti]); } endPath(); } } } } function BB(p,t,d) { this.period = p; this.ma1 = new MA(p,t); this.devs = d; this.priceArray = []; } BB.prototype.getNext = function (price) { var av1 = this.ma1.getNext(price); //Close price MA this.priceArray[this.priceArray.length] = price; if (this.priceArray.lengththis.period) this.priceArray.shift(); var y1 = 0; //Bollinger band calculations for (var i=0;i