function Init() { indicator.name("Min price change oscillator"); indicator.description("Min price change oscillator"); indicator.requiredSource(core.Tick); indicator.type(core.Oscillator); indicator.parameters.addGroup("Calculation"); indicator.parameters.addInteger("ChangesPeriod", "Changes period", "", 4); indicator.parameters.addInteger("CheckPeriod", "Check period", "", 10); indicator.parameters.addBoolean("AbsChange", "Absolute change", "", false); indicator.parameters.addGroup("Style"); indicator.parameters.addColor("Iclr", "Indicator color", "Indicator color", core.rgb(0, 255, 0)); indicator.parameters.addInteger("Iwidth", "Indicator line width", "Indicator line width", 1, 1, 5); indicator.parameters.addInteger("Istyle", "Indicator line style", "Indicator line style", core.LINE_SOLID); indicator.parameters.setFlag("Istyle", core.FLAG_LINE_STYLE); indicator.parameters.addColor("Mclr", "Min color", "Min color", core.rgb(255, 0, 0)); indicator.parameters.addInteger("Mwidth", "Min line width", "Min line width", 1, 1, 5); indicator.parameters.addInteger("Mstyle", "Min line style", "Min line style", core.LINE_DASH); indicator.parameters.setFlag("Mstyle", core.FLAG_LINE_STYLE); indicator.parameters.addColor("Sclr", "Signal color", "Signal color", core.rgb(0, 0, 255)); indicator.parameters.addInteger("Swidth", "Signal {t size", "Signal {t size", 3, 1, 5); } var first; var source = null; var ChangesPeriod; var CheckPeriod; var AbsChange; var Range; var Ind=null; var Min=null; var Signal=null; function Prepare() { source = instance.source; ChangesPeriod=instance.parameters.ChangesPeriod; CheckPeriod=instance.parameters.CheckPeriod; AbsChange=instance.parameters.AbsChange; first = source.first()+2; Range=instance.addInternalStream(first, 0); var name = profile.id() + "(" + source.name() + ", " + instance.parameters.ChangesPeriod + ", " + instance.parameters.CheckPeriod + ")"; instance.name(name); Ind = instance.addStream("Ind", core.Line, name + ".Ind", "Ind", instance.parameters.Iclr, first); Ind.setWidth(instance.parameters.Iwidth); Ind.setStyle(instance.parameters.Istyle); Min = instance.addStream("Min", core.Line, name + ".Min", "Min", instance.parameters.Mclr, first); Min.setWidth(instance.parameters.Mwidth); Min.setStyle(instance.parameters.Mstyle); Signal = instance.addStream("Signal", core.Dot, name + ".Signal", "Signal", instance.parameters.Sclr, first); Signal.setWidth(instance.parameters.Swidth); } function Update(period, mode) { if (period>first) { if (AbsChange) { Range[period]=Math.abs(source[period]-source[period-1]); } else { Range[period]=source[period]-source[period-1]; } if (period>first+ChangesPeriod) { var sum=Math.sum(Range, period-ChangesPeriod+1, period); Ind[period]=Math.abs(sum); if (period>first+CheckPeriod) { var tmp=Math.minmax(Ind, period-CheckPeriod, period-1); Min[period]=tmp[0]; if (Ind[period]=Min[period-1]) { Signal[period]=Min[period]; } else { Signal[period]=null; } } } } }