function Init() { indicator.name("Intermediate secondary cycle index"); indicator.description(""); indicator.requiredSource(core.Tick); indicator.type(core.Oscillator); indicator.parameters.addGroup("Volatility Calculation"); indicator.parameters.addInteger("AveragePeriod", "Average Period", "Average Period", 25); indicator.parameters.addString("Method", "MA Method", "Method" , "MVA"); indicator.parameters.addStringAlternative("Method", "MVA", "MVA" , "MVA"); indicator.parameters.addStringAlternative("Method", "EMA", "EMA" , "EMA"); indicator.parameters.addStringAlternative("Method", "LWMA", "LWMA" , "LWMA"); indicator.parameters.addStringAlternative("Method", "TMA", "TMA" , "TMA"); indicator.parameters.addStringAlternative("Method", "SMMA", "SMMA" , "SMMA"); indicator.parameters.addStringAlternative("Method", "KAMA", "KAMA" , "KAMA"); indicator.parameters.addStringAlternative("Method", "VIDYA", "VIDYA" , "VIDYA"); indicator.parameters.addStringAlternative("Method", "WMA", "WMA" , "WMA"); indicator.parameters.addInteger("ShiftPeriod", "Shift Period", "Shift Period", 12); indicator.parameters.addInteger("SummarizingPeriod", "Summarizing Period", "Summarizing Period", 50); indicator.parameters.addGroup(" Index Calculation"); indicator.parameters.addInteger("Short", "Short MA Period", "Short MA Period", 12); indicator.parameters.addInteger("Long", "Long MA Period", "Long MA Period", 25); indicator.parameters.addInteger("TsfPeriod", "TSF Period", "TSF Period", 6); indicator.parameters.addString("Method1", "MA Method", "Method" , "EMA"); indicator.parameters.addStringAlternative("Method1", "MVA", "MVA" , "MVA"); indicator.parameters.addStringAlternative("Method1", "EMA", "EMA" , "EMA"); indicator.parameters.addStringAlternative("Method1", "LWMA", "LWMA" , "LWMA"); indicator.parameters.addStringAlternative("Method1", "TMA", "TMA" , "TMA"); indicator.parameters.addStringAlternative("Method1", "SMMA", "SMMA" , "SMMA"); indicator.parameters.addStringAlternative("Method1", "KAMA", "KAMA" , "KAMA"); indicator.parameters.addStringAlternative("Method1", "VIDYA", "VIDYA" , "VIDYA"); indicator.parameters.addStringAlternative("Method1", "WMA", "WMA" , "WMA"); indicator.parameters.addGroup("Style"); indicator.parameters.addColor("MCI_color", "Line Color", "Line Color", core.rgb(255, 0, 0)); indicator.parameters.addInteger("width", "Line width", "", 1, 1, 5); indicator.parameters.addInteger("style", "Line style", "", core.LINE_SOLID); indicator.parameters.setFlag("style", core.FLAG_LINE_STYLE); indicator.parameters.addGroup("OB/OS Levels"); indicator.parameters.addDouble("overbought", "Overbought Level","", 100); indicator.parameters.addDouble("oversold","Oversold Level","", -100); indicator.parameters.addColor("level_overboughtsold_color", "Line Color","", core.rgb(128, 128, 128)); indicator.parameters.addInteger("level_overboughtsold_width","Line width","", 1, 1, 5); indicator.parameters.addInteger("level_overboughtsold_style", "Line Style","", core.LINE_SOLID); indicator.parameters.setFlag("level_overboughtsold_style", core.FLAG_LEVEL_STYLE); } var AveragePeriod; var TsfPeriod; var ShiftPeriod; var SummarizingPeriod; var Method; var first; var source = null; var MCI; var Short, Long, Method1; var sigom,MCI; var MA,yom,yomyom,som, Avg,varyom; var MA1,MA2; var yme; var TSF,ymes; function Prepare(nameOnly) { AveragePeriod = instance.parameters.AveragePeriod; TsfPeriod = instance.parameters.TsfPeriod; ShiftPeriod = instance.parameters.ShiftPeriod; Method = instance.parameters.Method; SummarizingPeriod = instance.parameters.SummarizingPeriod; Short = instance.parameters.Short; Long = instance.parameters.Long; Method1 = instance.parameters.Method1; source = instance.source; yom= instance.addInternalStream(0, 0); yomyom= instance.addInternalStream(0, 0); som= instance.addInternalStream(0, 0); varyom = instance.addInternalStream(0, 0); sigom = instance.addInternalStream(0, 0); yme= instance.addInternalStream(0, 0); ymes= instance.addInternalStream(0, 0); MA = core.indicators.create( Method, source, AveragePeriod); Avg = core.indicators.create( Method, som, AveragePeriod); first = MA.DATA.first()+ShiftPeriod; MA1 = core.indicators.create ( Method1, source, Short); MA2 = core.indicators.create( Method1, source, Long); TSF= core.indicators.create("TSF2", yme, TsfPeriod); var name = profile.id() + "(" + source.name() + ", " + tostring(AveragePeriod) + ", " + tostring(Method) + ", " + tostring(ShiftPeriod) + ", " + tostring(SummarizingPeriod) + ", " +Short + ", " + Long + ", " + Method1 + ")"; instance.name(name); if (!(nameOnly)) { MCI = instance.addStream("ICI", core.Line, name, "ICI", instance.parameters.MCI_color,TSF.DATA.first()); MCI.setWidth(instance.parameters.width); MCI.setStyle(instance.parameters.style); MCI.addLevel(instance.parameters.oversold, instance.parameters.level_overboughtsold_style, instance.parameters.level_overboughtsold_width, instance.parameters.level_overboughtsold_color); MCI.addLevel(instance.parameters.overbought, instance.parameters.level_overboughtsold_style, instance.parameters.level_overboughtsold_width, instance.parameters.level_overboughtsold_color); MCI.addLevel(0, instance.parameters.level_overboughtsold_style, instance.parameters.level_overboughtsold_width, instance.parameters.level_overboughtsold_color); } } function Update(period, mode) { MA.update(mode); if (period < first) { return; } yom[period]= 100*(source[period]-MA.DATA[period-ShiftPeriod])/MA.DATA[period-ShiftPeriod]; yomyom[period]=yom[period]*yom[period]; if (period < first + SummarizingPeriod) { return; } var avyom= Math.sum(yom, period-SummarizingPeriod+1, period)/SummarizingPeriod; varyom[period] = Math.sum(yomyom,period-SummarizingPeriod+1, period)/50-avyom*avyom; som[period]= Math.sqrt(varyom[period-ShiftPeriod]) ; Avg.update(mode); if (period < Avg.DATA.first()) { return; } sigom[period] = Avg.DATA[period]; MA1.update(mode); MA2.update(mode); if (period < Math.max(MA1.DATA.first(),MA2.DATA.first())) { return; } yme[period]=100*(MA1.DATA[period]-MA2.DATA[period])/MA2.DATA[period] TSF.update(mode); if (period < TSF.DATA.first()) { return; } ymes[period]=TSF.DATA[period]; MCI[period]= 100*ymes[period]/sigom[period] }