function Init() { indicator.name("XRSX_ indicator"); indicator.description("XRSX_ 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.addGroup("Style"); indicator.parameters.addColor("clr", "Color", "Color", core.rgb(0, 128, 128)); 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); } var first; var source = null; var DPeriod; var DMethod; var DPrice, AbsDPrice; var DMA, AbsDMA; var XRSX=null; function Prepare() { source = instance.source; DPeriod=instance.parameters.DPeriod; DMethod=instance.parameters.DMethod; 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.name(name); XRSX = instance.addStream("XRSX", core.Line, name + ".XRSX", "XRSX", instance.parameters.clr, first); XRSX.setWidth(instance.parameters.widthLinReg); XRSX.setStyle(instance.parameters.styleLinReg); XRSX.addLevel(30); XRSX.addLevel(70); } 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_*50+50; } } }