function Init() { indicator.name("XRSX_BB indicator"); indicator.description("XRSX_BB indicator"); indicator.requiredSource(core.Tick); indicator.type(core.Oscillator); indicator.parameters.addGroup("Calculation"); indicator.parameters.addInteger("DPeriod", "D Period", "", 15); indicator.parameters.addString("DMethod", "D Method", "", "MVA"); indicator.parameters.addStringAlternative("DMethod", "MVA", "", "MVA"); indicator.parameters.addStringAlternative("DMethod", "EMA", "", "EMA"); indicator.parameters.addStringAlternative("DMethod", "KAMA", "", "KAMA"); indicator.parameters.addStringAlternative("DMethod", "Wilder", "", "Wilder"); indicator.parameters.addStringAlternative("DMethod", "LWMA", "", "LWMA"); indicator.parameters.addStringAlternative("DMethod", "SineWMA", "", "SineWMA"); indicator.parameters.addStringAlternative("DMethod", "TriMA", "", "TriMA"); indicator.parameters.addStringAlternative("DMethod", "LSMA", "", "LSMA"); indicator.parameters.addStringAlternative("DMethod", "SMMA", "", "SMMA"); indicator.parameters.addStringAlternative("DMethod", "HMA", "", "HMA"); indicator.parameters.addStringAlternative("DMethod", "ZeroLagEMA", "", "ZeroLagEMA"); indicator.parameters.addStringAlternative("DMethod", "DEMA", "", "DEMA"); indicator.parameters.addStringAlternative("DMethod", "T3", "", "T3"); indicator.parameters.addStringAlternative("DMethod", "ITrend", "", "ITrend"); indicator.parameters.addStringAlternative("DMethod", "Median", "", "Median"); indicator.parameters.addStringAlternative("DMethod", "GeoMean", "", "GeoMean"); indicator.parameters.addStringAlternative("DMethod", "REMA", "", "REMA"); indicator.parameters.addStringAlternative("DMethod", "ILRS", "", "ILRS"); indicator.parameters.addStringAlternative("DMethod", "IE/2", "", "IE/2"); indicator.parameters.addStringAlternative("DMethod", "TriMAgen", "", "TriMAgen"); indicator.parameters.addStringAlternative("DMethod", "JSmooth", "", "JSmooth"); indicator.parameters.addString("DType", "D Type", "", "Histogram"); indicator.parameters.addStringAlternative("DType", "Line", "", "Line"); indicator.parameters.addStringAlternative("DType", "Histogram", "", "Histogram"); indicator.parameters.addStringAlternative("DType", "Dots", "", "Dots"); indicator.parameters.addInteger("SPeriod", "S Period", "", 15); indicator.parameters.addString("SMethod", "S Method", "", "MVA"); indicator.parameters.addStringAlternative("SMethod", "MVA", "", "MVA"); indicator.parameters.addStringAlternative("SMethod", "EMA", "", "EMA"); indicator.parameters.addStringAlternative("SMethod", "KAMA", "", "KAMA"); indicator.parameters.addStringAlternative("SMethod", "Wilder", "", "Wilder"); indicator.parameters.addStringAlternative("SMethod", "LWMA", "", "LWMA"); indicator.parameters.addStringAlternative("SMethod", "SineWMA", "", "SineWMA"); indicator.parameters.addStringAlternative("SMethod", "TriMA", "", "TriMA"); indicator.parameters.addStringAlternative("SMethod", "LSMA", "", "LSMA"); indicator.parameters.addStringAlternative("SMethod", "SMMA", "", "SMMA"); indicator.parameters.addStringAlternative("SMethod", "HMA", "", "HMA"); indicator.parameters.addStringAlternative("SMethod", "ZeroLagEMA", "", "ZeroLagEMA"); indicator.parameters.addStringAlternative("SMethod", "DEMA", "", "DEMA"); indicator.parameters.addStringAlternative("SMethod", "T3", "", "T3"); indicator.parameters.addStringAlternative("SMethod", "ITrend", "", "ITrend"); indicator.parameters.addStringAlternative("SMethod", "Median", "", "Median"); indicator.parameters.addStringAlternative("SMethod", "GeoMean", "", "GeoMean"); indicator.parameters.addStringAlternative("SMethod", "REMA", "", "REMA"); indicator.parameters.addStringAlternative("SMethod", "ILRS", "", "ILRS"); indicator.parameters.addStringAlternative("SMethod", "IE/2", "", "IE/2"); indicator.parameters.addStringAlternative("SMethod", "TriMAgen", "", "TriMAgen"); indicator.parameters.addStringAlternative("SMethod", "JSmooth", "", "JSmooth"); indicator.parameters.addInteger("BandsPeriod", "Bands Period", "", 100); indicator.parameters.addDouble("Deviation1", "Deviation 1", "", 1); indicator.parameters.addDouble("Deviation2", "Deviation 2", "", 1.6); indicator.parameters.addGroup("Style"); indicator.parameters.addColor("XRSX_UP_P_clr", "XRSX UP Positive Color", "XRSX UP Positive Color", core.rgb(0, 128, 128)); indicator.parameters.addColor("XRSX_UP_N_clr", "XRSX UP Negative Color", "XRSX UP Negative Color", core.rgb(255, 128, 255)); indicator.parameters.addColor("XRSX_DN_P_clr", "XRSX DN Positive Color", "XRSX DN Positive Color", core.rgb(0, 0, 255)); indicator.parameters.addColor("XRSX_DN_N_clr", "XRSX DN Negative Color", "XRSX DN Negative Color", core.rgb(255, 0, 0)); indicator.parameters.addColor("Signal_UP_clr", "Signal UP Color", "Signal UP Color", core.rgb(0, 255, 0)); indicator.parameters.addColor("Signal_DN_clr", "Signal DN Color", "Signal DN Color", core.rgb(255, 128, 0)); indicator.parameters.addInteger("widthLinReg", "Line width", "Line width", 1, 1, 5); indicator.parameters.addInteger("styleLinReg", "Line style", "Line style", core.LINE_SOLID); indicator.parameters.setFlag("styleLinReg", core.FLAG_LINE_STYLE); indicator.parameters.addColor("Bands1_clr", "Bands 1 color", "Bands 1 color", core.rgb(255, 0, 0)); indicator.parameters.addColor("Bands2_clr", "Bands 2 color", "Bands 2 color", core.rgb(0, 0, 255)); indicator.parameters.addInteger("Bwidth", "Bands width", "Bands width", 1, 1, 5); indicator.parameters.addInteger("Bstyle", "Bands style", "Bands style", core.LINE_SOLID); } var first; var source = null; var DPeriod; var DMethod; var SPeriod; var SMethod; var BandsPeriod; var Deviation1; var Deviation2; var DPrice, AbsDPrice; var DMA, AbsDMA, SignalMA; var BB1, BB2; var XRSX=null; var Signal=null; var UpperBand1=null; var UpperBand2=null; var LowerBand1=null; var LowerBand2=null; function Prepare() { source = instance.source; DPeriod=instance.parameters.DPeriod; DMethod=instance.parameters.DMethod; SPeriod=instance.parameters.SPeriod; SMethod=instance.parameters.SMethod; BandsPeriod=instance.parameters.BandsPeriod; Deviation1=instance.parameters.Deviation1; Deviation2=instance.parameters.Deviation2; first = source.first()+2; DPrice = instance.addInternalStream(first, 0); AbsDPrice = instance.addInternalStream(first, 0); DMA = core.indicators.create("AVERAGES", DPrice, DMethod, DPeriod, false); AbsDMA = core.indicators.create("AVERAGES", AbsDPrice, DMethod, DPeriod, false); var name = profile.id() + "(" + source.name() + ", " + instance.parameters.DPeriod + ", " + instance.parameters.DMethod + ", " + instance.parameters.SPeriod + ", " + instance.parameters.SMethod + ", " + instance.parameters.BandsPeriod + ", " + instance.parameters.Deviation1 + ", " + instance.parameters.Deviation2 + ")"; instance.name(name); if (instance.parameters.DType=="Line") { XRSX = instance.addStream("XRSX", core.Line, name + ".XRSX", "XRSX", instance.parameters.XRSX_UP_P_clr, first); } else if (instance.parameters.DType=="Histogram") { XRSX = instance.addStream("XRSX", core.Bar, name + ".XRSX", "XRSX", instance.parameters.XRSX_UP_P_clr, first); } else { XRSX = instance.addStream("XRSX", core.Dot, name + ".XRSX", "XRSX", instance.parameters.XRSX_UP_P_clr, first); } SignalMA = core.indicators.create("AVERAGES", XRSX, SMethod, SPeriod, false); BB1 = core.indicators.create("BB", XRSX, BandsPeriod, Deviation1); BB2 = core.indicators.create("BB", XRSX, BandsPeriod, Deviation2); Signal = instance.addStream("Signal", core.Line, name + ".Signal", "Signal", instance.parameters.Signal_UP_clr, first); Signal.setWidth(instance.parameters.widthLinReg); Signal.setStyle(instance.parameters.styleLinReg); XRSX.addLevel(50); XRSX.addLevel(-50); UpperBand1 = instance.addStream("UpperBand1", core.Line, name + ".UpperBand1", "UpperBand1", instance.parameters.Bands1_clr, first); LowerBand1 = instance.addStream("LowerBand1", core.Line, name + ".LowerBand1", "LowerBand1", instance.parameters.Bands1_clr, first); UpperBand2 = instance.addStream("UpperBand2", core.Line, name + ".UpperBand2", "UpperBand2", instance.parameters.Bands2_clr, first); LowerBand2 = instance.addStream("LowerBand2", core.Line, name + ".LowerBand2", "LowerBand2", instance.parameters.Bands2_clr, first); UpperBand1.setWidth(instance.parameters.Bwidth); UpperBand1.setStyle(instance.parameters.Bstyle); LowerBand1.setWidth(instance.parameters.Bwidth); LowerBand1.setStyle(instance.parameters.Bstyle); UpperBand2.setWidth(instance.parameters.Bwidth); UpperBand2.setStyle(instance.parameters.Bstyle); LowerBand2.setWidth(instance.parameters.Bwidth); LowerBand2.setStyle(instance.parameters.Bstyle); } function Update(period, mode) { if (period>first) { DPrice[period]=source[period]-source[period-1]; AbsDPrice[period]=Math.abs(DPrice[period]); DMA.update(mode); AbsDMA.update(mode); if (AbsDMA.DATA[period]==0) { XRSX[period]=null; } else { var XRSX_=DMA.DATA[period]/AbsDMA.DATA[period]; XRSX_=Math.max(Math.min(XRSX_,1),-1); XRSX[period]=XRSX_*100; } SignalMA.update(mode); Signal[period]=SignalMA.DATA[period]; BB1.update(mode); BB2.update(mode); UpperBand1[period]=BB1.TL[period]; LowerBand1[period]=BB1.BL[period]; UpperBand2[period]=BB2.TL[period]; LowerBand2[period]=BB2.BL[period]; if (XRSX[period]>=0) { if (XRSX[period]>=XRSX[period-1]) { XRSX.setColor(period, instance.parameters.XRSX_UP_P_clr); } else { XRSX.setColor(period, instance.parameters.XRSX_DN_P_clr); } } else { if (XRSX[period]>=XRSX[period-1]) { XRSX.setColor(period, instance.parameters.XRSX_UP_N_clr); } else { XRSX.setColor(period, instance.parameters.XRSX_DN_N_clr); } } if (Signal[period]>=Signal[period-1]) { Signal.setColor(period, instance.parameters.Signal_UP_clr) } else { Signal.setColor(period, instance.parameters.Signal_DN_clr) } } }