//@LibraryID:828,0 //@Name:Market Graph:Volume Oscillator //@Description:Returns the Volume Oscilator according to McClellan (Similar to the McClellan Oscillator but uses volume movement not price movement) // 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: Phil Tolhurst, ShareScript Support var listNum = 0; var indexList = ["FTSE100","FTSE250","FTSE350","FTSE All-Share","NYSE","Nasdaq","AMEX"]; var listList = [List.FTSE100,List.FTSE250,List.FTSE350,List.FTSEAllShare,List.NYSE,List.NASDAQ,List.AMEX]; var vOsc = []; var colour1=Colour.RGB(0,255,0); var width1=1; var pen1=0; var altColour = 1; var colour2=Colour.RGB(255,0,0); var width2=1; var pen2=0; var colour3=Colour.RGB(0,0,0); var baseData; var showCurrVal=1; function init(status) { if (status == Loading || status == Editing) { listNum = storage.getAt(0); colour1 = storage.getAt(1); width1 = storage.getAt(2); pen1 = storage.getAt(3); colour2 = storage.getAt(4); altColour = storage.getAt(5); showCurrVal=storage.getAt(6); colour3 = storage.getAt(7); } if (status == Adding || status == Editing) { var dlg = new Dialog("Advance/Decline Ratio MA", 220, 110); dlg.addOkButton(); dlg.addCancelButton(); dlg.addDropList("VAL1",8,5,90,-1,indexList,"","",listNum); dlg.addColLinePicker("VAL2",110,22,-1,-1,"Primary (Up) Colour","",colour1,pen1,width1); dlg.addColPicker("VAL3",110,39,-1,-1,"","",colour2); dlg.addTickBox("VAL4",13,39,94,-1,"Alternative (Down) Colour",altColour); dlg.addTickBox("VAL5",13,56,110,-1,"Show Current Value on title bar",showCurrVal); dlg.addColPicker("VAL6",110,67,-1,-1,"Set Title Colour","",colour3); dlg.addText(8,85,140,16,"Note that the indicator may take a few minutes to calculate") if (dlg.show()==Dialog.Cancel) return false; listNum = dlg.getValue("VAL1"); colour1 = dlg.getValue("VAL2").colour; width1 = dlg.getValue("VAL2").width; pen1 = dlg.getValue("VAL2").pen; colour2 = dlg.getValue("VAL3"); altColour = dlg.getValue("VAL4"); showCurrVal = dlg.getValue("VAL5"); colour3 = dlg.getValue("VAL6"); storage.setAt(0, listNum); storage.setAt(1, colour1); storage.setAt(2, width1); storage.setAt(3, pen1); storage.setAt(4, colour2); storage.setAt(5, altColour); storage.setAt(6, showCurrVal); storage.setAt(7, colour3); } if (altColour) { setSeriesColour(0, colour3); setSeriesColourMode(1, ColourMode.UpDown); setSeriesColour(1, colour1, colour2); setSeriesLineStyle(1, pen1, width1); setRange(1, Range.CentraZero); setHorizontalLine(0); } else { setSeriesColour(0, colour3); setSeriesColour(1, colour1); setSeriesLineStyle(1, pen1, width1); setRange(1, Range.CentraZero); setHorizontalLine(0); } if(listNum<4) var baseshare=getShare("UKI:UKX"); else var baseshare=getShare("USI:DJI"); baseData = baseshare.getPriceArray(); //First we get the list of shares var list = getList(listList[listNum]); var upVol = []; var downVol = []; //Now we take each share in the list one at a time for (var a=0;a0) { if (data[data.length-i].close>data[data.length-(i+1)].close) upVol[baseData.length-i]+=(data[data.length-i].volume/1000000); if (data[data.length-i].closebaseData[j].dateNum) j++; for (var i=0;ibaseData[j].dateNum) { j++;i--; continue; } else { voOutput[i] = voOutput[i-1] ; } } catch(e) { voOutput[i] = voOutput[i-1] ; } } showCurrVal?setTitle("("+indexList[listNum]+") Volume Oscillator(m): "+voOutput[voOutput.length-1].toFixed(3)):setTitle("("+indexList[listNum]+") Volume Oscillator(m)"); return [dummy,voOutput]; }