function Init() { indicator.name("Period Extreme"); indicator.description("Period Extreme"); indicator.requiredSource(core.Bar); indicator.type(core.Indicator); indicator.parameters.addGroup("Calculation"); indicator.parameters.addInteger("PERIOD", "Period", "Period", 0); indicator.parameters.addGroup("Style"); indicator.parameters.addBoolean("Backtrack", "Use completed candles only", "", true); indicator.parameters.addInteger("Size", "Font Size", "", 10); indicator.parameters.addColor("up_color", "Color of Crossover", "", core.rgb(0, 255, 0)); indicator.parameters.addColor("dn_color", "Color of Crossunder", "", core.rgb(255, 0, 0)); } var PERIOD; var first; var source = null; var Backtrack; var up = null; var down = null; var Size; function Prepare(nameOnly) { Backtrack = instance.parameters.Backtrack; Size = instance.parameters.Size; PERIOD = instance.parameters.PERIOD; source = instance.source; first = source.first()+PERIOD +2 var name = profile.id() + "(" + source.name() + ", " + tostring(PERIOD) + ")"; instance.name(name); if (!(nameOnly)) { up = instance.createTextOutput ("Up", "Up", "Wingdings", Size, core.H_Center, core.V_Top, instance.parameters.up_color, 0); down = instance.createTextOutput ("Dn", "Dn", "Wingdings", Size, core.H_Center, core.V_Bottom, instance.parameters.dn_color, 0); } } function Update(period) { if (Backtrack) { period = period-1; } if (period < first || !source.hasData(period)) { return; } var min=null; var max=null; var tmp=Math.minmax (source, period-1 - PERIOD, period-1); min=tmp[0]; max=tmp[1]; if (source.close[period] > max) { up.set(period, source.high[period], "\217", source.high[period]); down.setNoData (period); } else if (source.close[period] < min) { down.set(period, source.low[period], "\217", source.low[period]); up.setNoData (period); } }