-- Indicator profile initialization routine -- Defines indicator profile properties and indicator parameters -- TODO: Add minimal and maximal value of numeric parameters and default color of the streams function Init() indicator:name("Rubicon CCI"); indicator:description(""); indicator:requiredSource(core.Bar); indicator:type(core.Oscillator); indicator.parameters:addInteger("CCI_N", "CCI parameter", "No description", 10); indicator.parameters:addInteger("EMA_N", "EMA parameter", "No description", 3); indicator.parameters:addColor("CCI_color", "Color of CCI", "Color of CCI", core.rgb(0, 255, 0)); indicator.parameters:addColor("EMA_color", "Color of EMA", "Color of EMA", core.rgb(255, 0, 0)); indicator.parameters:addColor("LBL_color", "Color of labels", "Color of labels", core.COLOR_LABEL); indicator.parameters:addColor("BG_color", "Color of background", "Color of backgroung", core.rgb(127, 127, 127)); indicator.parameters:addInteger("BG_trans", "Background transparency", "Transparency of background", 90, 0, 100); end -- Indicator instance initialization routine -- Processes indicator parameters and creates output streams -- Parameters block local CCI_N; local EMA_N; local source = nil; -- Streams block local CCI = nil; local EMA = nil; local LBL1 = nil; local LBL2 = nil; local L1 = nil; local L2 = nil; local L3 = nil; local L4 = nil; local _CCI = nil; local _EMA = nil; -- Routine function Prepare() CCI_N = instance.parameters.CCI_N; EMA_N = instance.parameters.EMA_N; source = instance.source; local name = profile:id() .. "(" .. source:name() .. ", " .. CCI_N .. ", " .. EMA_N .. ")"; instance:name(name); L1 = instance:addStream("L1", core.Line, name .. ".L1", "L1", instance.parameters.BG_color, 0); L2 = instance:addStream("L2", core.Line, name .. ".L2", "L2", instance.parameters.BG_color, 0); instance:createChannelGroup("BG", "BG", L1, L2, instance.parameters.BG_color, 100 - instance.parameters.BG_trans); L3 = instance:addStream("L3", core.Line, name .. ".L3", "L3", core.rgb(255, 0, 0), 0); L4 = instance:addStream("L4", core.Line, name .. ".L4", "L4", core.rgb(0, 255, 0), 0); LBL1 = instance:createTextOutput ("L", "L", "Wingdings", 10, core.H_Center, core.V_Top, instance.parameters.LBL_color, 0); LBL2 = instance:createTextOutput ("L", "L", "Wingdings", 10, core.H_Center, core.V_Bottom, instance.parameters.LBL_color, 0); _CCI = core.indicators:create("CCI", source, CCI_N); _EMA = core.indicators:create("EMA", _CCI.DATA, EMA_N); CCI = instance:addStream("CCI", core.Line, name .. ".CCI", "CCI", instance.parameters.CCI_color, _CCI.DATA:first()); CCI:addLevel(-100); CCI:addLevel(0); CCI:addLevel(100); EMA = instance:addStream("EMA", core.Line, name .. ".EMA", "EMA", instance.parameters.EMA_color, _EMA.DATA:first()); end -- Indicator calculation routine -- TODO: Add your code for calculation output values function Update(period, mode) local i; _CCI:update(mode); _EMA:update(mode); L1[period] = 100; L2[period] = -100; L3[period] = 100; L4[period] = -100; if period >= _CCI.DATA:first() then CCI[period] = _CCI.DATA[period]; end if period >= _EMA.DATA:first() then EMA[period] = _EMA.DATA[period]; end if period >= _EMA.DATA:first() + 6 and period >= _CCI.DATA:first() + 6 then if core.crossesOver(_EMA.DATA, -100, period) then for i = period, period - 5, -1 do if core.crossesOver(_CCI.DATA, -100, i) then LBL2:set(period, -100, "\225"); break; end end elseif core.crossesUnder(_EMA.DATA, 100, period) then for i = period, period - 5, -1 do if core.crossesUnder(_CCI.DATA, 100, i) then LBL1:set(period, 100, "\226"); break; end end end end end