//@Name:ATR Bands //@Description:Draws lines at multiples of the ATR //@Env:Production //Define the colour, width and pen of each of the six output lines var colour1 = Colour.DarkGreen; var width1 = 1; var pen1 = 0; var colour2 = Colour.DarkRed; var width2 = 1; var pen2 = 0; var colour3 = Colour.Green; var width3 = 1; var pen3 = 0; var colour4 = Colour.Red; var width4 = 1; var pen4 = 0; var colour5 = Colour.LightGreen; var width5 = 1; var pen5 = 0; var colour6 = Colour.LightRed; var width6 = 1; var pen6 = 0; //Define the multiples as part of an array; var multiple1 = 0.5; var multiple2 = 1; var multiple3 = 1.5; //Define the atr period; var atrPeriod = 14; //Array where all the above will be stored to make drawing via a loop easier var settings = new Array(); //Array and variable that determine whether the study draws lines or dots. Used in the drawn function. var drawList = ["Draw Lines","Draw Dots"]; var drawType = 0; //Array and variable that determines whether the bands are drawn from the High/Low or the Close. Use in the draw function. var priceList = ["High/Low","Close","Moving Average"]; var priceType = 0; //Use an MA rather than the price as the main source. var ma_type = 0; var ma_list = ["Simple","Exponential","Weighted","Triangular","VariableVHF","VariableCMO"] var ma_period = 20; var colour7 = Colour.Blue; var width7 = 1; var pen7 = 0; var ma_storage = 0; //Tick box settings for each pair of bands. var option1 = 1; var option2 = 1; var option3 = 1; function init(status) { if (status == Loading || status == Editing) { atrPeriod = storage.getAt(0); multiple1 = storage.getAt(1); multiple2 = storage.getAt(2); multiple3 = storage.getAt(4); colour1 = storage.getAt(5); colour2 = storage.getAt(6); colour3 = storage.getAt(7); colour4 = storage.getAt(8); colour5 = storage.getAt(9); colour6 = storage.getAt(10); width1 = storage.getAt(11); width2 = storage.getAt(12); width3 = storage.getAt(13); width4 = storage.getAt(14); width5 = storage.getAt(15); width6 = storage.getAt(16); pen1 = storage.getAt(17); pen2 = storage.getAt(18); pen3 = storage.getAt(19); pen4 = storage.getAt(20); pen5 = storage.getAt(21); pen6 = storage.getAt(22); drawType = storage.getAt(23); priceType = storage.getAt(24); option1 = storage.getAt(25); option2 = storage.getAt(26); option3 = storage.getAt(27); ma_period = storage.getAt(28); ma_type = storage.getAt(29); colour7 = storage.getAt(30) ma_storage = storage.getAt(31); ma_storage = ma_storage.toString(); width7=parseInt(ma_storage.substr(1,1),10); pen7=parseInt(ma_storage.substr(2,1),10); } if (status == Adding || status == Editing) { do { var dlg = new Dialog("ATR Bands properties", 285, 210); dlg.addOkButton(); dlg.addCancelButton(); dlg.addGroupBox(5,5,200,30,"ATR Properties"); dlg.addIntEdit("VAL1",55,17,-1,-1,"ATR Period","",atrPeriod,1,999); dlg.addGroupBox(5,35,200,105,"Band Properties"); dlg.addDropList("VAL12",83,50,69,-1,priceList,"Draw bands from the: ","",priceType); dlg.addDropList("VAL11",152,50,50,-1,drawList,"","",drawType); dlg.addTickBox("VAL13",10,80,10,10,"",option1); dlg.addNumEdit("VAL2",65,80,-1,-1,"Multiplier +/-","",multiple1,0.1,999); dlg.addText(135,70,20,10,"Upper"); dlg.addText(175,70,20,10,"Lower"); dlg.addColLinePicker("VAL3",130,80,-1,-1,"","",colour1,pen1,width1); dlg.addColLinePicker("VAL4",170,80,-1,-1,"","",colour2,pen2,width2); dlg.addTickBox("VAL14",10,100,10,10,"",option2); dlg.addNumEdit("VAL5",65,100,-1,-1,"Multiplier +/-","",multiple2,0.1,999); dlg.addColLinePicker("VAL6",130,100,-1,-1,"","",colour3,pen3,width3); dlg.addColLinePicker("VAL7",170,100,-1,-1,"","",colour4,pen4,width4); dlg.addTickBox("VAL15",10,120,10,10,"",option3); dlg.addNumEdit("VAL8",65,120,-1,-1,"Multiplier +/-","",multiple3,0.1,999); dlg.addColLinePicker("VAL9",130,120,-1,-1,"","",colour5,pen5,width5); dlg.addColLinePicker("VAL10",170,120,-1,-1,"","",colour6,pen6,width6); dlg.addGroupBox(5,145,200,56,"Moving Average Properties"); dlg.addNumEdit("VAL16",10,160,-1,-1,"","",ma_period,2,9999); dlg.addDropList("VAL17",50,160,-1,-1,ma_list,"","",ma_type); dlg.addColLinePicker("VAL18",170,160,-1,-1,"","",colour7,pen7,width7); dlg.addText(10,180,190,20,"Note: these values only apply if the bands are set to draw from the moving average."); if (dlg.show() == Dialog.Cancel) return false; atrPeriod = dlg.getValue("VAL1"); multiple1 = dlg.getValue("VAL2"); multiple2 = dlg.getValue("VAL5"); multiple3 = dlg.getValue("VAL8"); colour1 = dlg.getValue("VAL3").colour; pen1 = dlg.getValue("VAL3").pen; width1 = dlg.getValue("VAL3").width; colour2 = dlg.getValue("VAL4").colour; pen2 = dlg.getValue("VAL4").pen; width2 = dlg.getValue("VAL4").width; colour3 = dlg.getValue("VAL6").colour; pen3 = dlg.getValue("VAL6").pen; width3 = dlg.getValue("VAL6").width; colour4 = dlg.getValue("VAL7").colour; pen4 = dlg.getValue("VAL7").pen; width4 = dlg.getValue("VAL7").width; colour5 = dlg.getValue("VAL9").colour; pen5 = dlg.getValue("VAL9").pen; width5 = dlg.getValue("VAL9").width; colour6 = dlg.getValue("VAL10").colour; pen6 = dlg.getValue("VAL10").pen; width6 = dlg.getValue("VAL10").width; drawType = dlg.getValue("VAL11"); priceType = dlg.getValue("VAL12"); option1 = dlg.getValue("VAL13"); option2 = dlg.getValue("VAL14"); option3 = dlg.getValue("VAL15"); ma_period = dlg.getValue("VAL16"); ma_type = dlg.getValue("VAL17"); colour7 = dlg.getValue("VAL18").colour; pen7 = dlg.getValue("VAL18").pen; width7 = dlg.getValue("VAL18").width; } while (option1==0 && option2==0 && option3==0); storage.setAt(0,atrPeriod); storage.setAt(1,multiple1); storage.setAt(2,multiple2); storage.setAt(4,multiple3); storage.setAt(5,colour1); storage.setAt(6,colour2); storage.setAt(7,colour3); storage.setAt(8,colour4); storage.setAt(9,colour5); storage.setAt(10,colour6); storage.setAt(11,width1); storage.setAt(12,width2); storage.setAt(13,width3); storage.setAt(14,width4); storage.setAt(15,width5); storage.setAt(16,width6); storage.setAt(17,pen1); storage.setAt(18,pen2); storage.setAt(19,pen3); storage.setAt(20,pen4); storage.setAt(21,pen5); storage.setAt(22,pen6); storage.setAt(23,drawType); storage.setAt(24,priceType); storage.setAt(25,option1); storage.setAt(26,option2); storage.setAt(27,option3); ma_storage = 100+(width7*10)+pen7 storage.setAt(28,ma_period); storage.setAt(29,ma_type); storage.setAt(30,colour7); storage.setAt(31,ma_storage); } settings = [[multiple1,colour1,pen1,width1,colour2,pen2,width2,option1],[multiple2,colour3,pen3,width3,colour4,pen4,width4,option2],[multiple3,colour5,pen5,width5,colour6,pen6,width6,option3]]; } function onNewChart() { clearDisplay(); draw(); } function onNewBarUpdate(preExisting) { if (!preExisting) clearDisplay(); draw(); } function draw() { //Create the ATR object var atrCalc = new ATR(atrPeriod); //Create the ATR result array var atrRes=[]; //Create the ATR object var maCalc = new MA(ma_period,ma_type); //Create the ATR result array var maRes=[]; //Loop through the data and calculate the ATR and moving average for (var i=0;i