//@Name:Timed Candles //@Description:Adds 2 candles with specific start and end times //@Type:Intraday // 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: Richard Chiesa, ShareScript Support var upColour = Colour.Green; var downColour = Colour.Red; var st1 = "08:00"; var et1 = "12:00"; var st2 = "12:00"; var et2 = "16:30"; var startTime1; var endTime1; var startTime2; var endTime2; var firstDisplayedDate = 0; function init(status) { if (status == Loading || status == Editing) { upColour = storage.getAt(0); downColour = storage.getAt(1); startTime1 = storage.getAt(2); endTime1 = storage.getAt(3); startTime2 = storage.getAt(4); endTime2 = storage.getAt(5); var temp; st1 = ((temp=Math.floor(startTime1/3600))<10?("0"+temp):temp)+":"+((temp=Math.floor((startTime1%3600)/60))<10?("0"+temp):temp) et1 = ((temp=Math.floor(endTime1/3600))<10?("0"+temp):temp)+":"+((temp=Math.floor((endTime1%3600)/60))<10?("0"+temp):temp) st2 = ((temp=Math.floor(startTime2/3600))<10?("0"+temp):temp)+":"+((temp=Math.floor((startTime2%3600)/60))<10?("0"+temp):temp) et2 = ((temp=Math.floor(endTime2/3600))<10?("0"+temp):temp)+":"+((temp=Math.floor((endTime2%3600)/60))<10?("0"+temp):temp) } if (status == Adding || status == Editing) { dlg = new Dialog("Timed Candles",150,105); dlg.addOkButton(); dlg.addCancelButton(); dlg.addColPicker("COL1",8,-1,-1,-1,"","Up colour",upColour); dlg.addColPicker("COL2",8,-1,-1,-1,"","Down colour",downColour); dlg.addTextEdit("TXT1",65,-1,-1,-1,"1st candle Start","",st1); dlg.addTextEdit("TXT2",65,-1,-1,-1,"1st candle End","",et1); dlg.addTextEdit("TXT3",65,-1,-1,-1,"2st candle Start","",st2); dlg.addTextEdit("TXT4",65,-1,-1,-1,"2st candle End","",et2); if (dlg.show()==Dialog.Cancel) return false; upColour = dlg.getValue("COL1"); downColour = dlg.getValue("COL2"); st1 = dlg.getValue("TXT1"); et1 = dlg.getValue("TXT2"); st2 = dlg.getValue("TXT3"); et2 = dlg.getValue("TXT4"); startTime1 = (st1[0]+st1[1])*3600 + (st1[3]+st1[4])*60; endTime1 = (et1[0]+et1[1])*3600 + (et1[3]+et1[4])*60; startTime2 = (st2[0]+st2[1])*3600 + (st2[3]+st2[4])*60; endTime2 = (et2[0]+et2[1])*3600 + (et2[3]+et2[4])*60; storage.setAt(0, upColour); storage.setAt(1, downColour); storage.setAt(2, startTime1); storage.setAt(3, endTime1); storage.setAt(4, startTime2); storage.setAt(5, endTime2); } setTitle(st1+"-"+et1+" "+st2+"-"+et2); } function onNewChart() { var share = getCurrentShare(); var data = share.getPriceArray(); var counter = 1; for (var i=data.length-1;i>=0;i--) { if (data[i].date>bars[0].date) counter++; else break; } if (firstDisplayedDate == null || firstDisplayedDate < counter) firstDisplayedDate = counter; draw() } function onZoom() { onNewChart() } function draw() { var share = getCurrentShare(); var timedBars = []; var j=0; barArray = []; for (var i=firstDisplayedDate;i>=0;i--) { barArray = barArray.concat(share.getIBarArray(i, 60)); } timedBars[0] = {open:null,high:null,low:null,close:null,date:barArray[0].date,dateNum:barArray[0].dateNum,timeNum:barArray[0].timeNum}; for (var i=1;ibarArray[i-1].dateNum || (barArray[i].timeNum>=startTime2 && barArray[i-1].timeNum=startTime1 && barArray[i].timeNum=startTime2 && barArray[i].timeNumbarArray[i].low) timedBars[j].low = barArray[i].low; timedBars[j].close = barArray[i].close; } } for (i=0;itimedBars[i].open) { setPenColour(upColour); setBrushColour(getBackColour()); } else { setPenColour(downColour); setBrushColour(downColour); } moveTo([timedBars[i].dateNum,(startTime1 + (endTime1 - startTime1)/2)],timedBars[i].high); lineTo([timedBars[i].dateNum,(startTime1 + (endTime1 - startTime1)/2)],Math.max(timedBars[i].open,timedBars[i].close)); moveTo([timedBars[i].dateNum,(startTime1 + (endTime1 - startTime1)/2)],Math.min(timedBars[i].open,timedBars[i].close)); lineTo([timedBars[i].dateNum,(startTime1 + (endTime1 - startTime1)/2)],timedBars[i].low); beginPath() moveTo([timedBars[i].dateNum,startTime1],Math.max(timedBars[i].open,timedBars[i].close)); lineTo([timedBars[i].dateNum,endTime1],Math.max(timedBars[i].open,timedBars[i].close)); lineTo([timedBars[i].dateNum,endTime1],Math.min(timedBars[i].open,timedBars[i].close)); lineTo([timedBars[i].dateNum,startTime1],Math.min(timedBars[i].open,timedBars[i].close)); lineTo([timedBars[i].dateNum,startTime1],Math.max(timedBars[i].open,timedBars[i].close)); endPath(); drawAndFillPath(); if (i+1 >= timedBars.length) break; moveTo([timedBars[i+1].dateNum,(startTime2 + (endTime2 - startTime2)/2)],timedBars[i+1].high); lineTo([timedBars[i+1].dateNum,(startTime2 + (endTime2 - startTime2)/2)],Math.max(timedBars[i+1].open,timedBars[i+1].close)); moveTo([timedBars[i+1].dateNum,(startTime2 + (endTime2 - startTime2)/2)],Math.min(timedBars[i+1].open,timedBars[i+1].close)); lineTo([timedBars[i+1].dateNum,(startTime2 + (endTime2 - startTime2)/2)],timedBars[i+1].low); beginPath() moveTo([timedBars[i+1].dateNum,startTime2],Math.max(timedBars[i+1].open,timedBars[i+1].close)); lineTo([timedBars[i+1].dateNum,endTime2],Math.max(timedBars[i+1].open,timedBars[i+1].close)); lineTo([timedBars[i+1].dateNum,endTime2],Math.min(timedBars[i+1].open,timedBars[i+1].close)); lineTo([timedBars[i+1].dateNum,startTime2],Math.min(timedBars[i+1].open,timedBars[i+1].close)); lineTo([timedBars[i+1].dateNum,startTime2],Math.max(timedBars[i+1].open,timedBars[i+1].close)); endPath(); drawAndFillPath(); } }