Woodie CCI
Posted: Tue Apr 20, 2010 6:13 pm
This is another port of the Scriptor's MT4 indicator to lua. The original indicator is here.
The indicator shows fast and slow CCI and also highlights neutral zone for the slow CCI for the first N periods after the slow CCI crosses zero.
download the indicator:
The old version
Use it when the compatibility is problem.
Timed Tick WOODIE_CCI version of indicator.
viewtopic.php?f=17&t=65432&p=116357#p116357
The indicator shows fast and slow CCI and also highlights neutral zone for the slow CCI for the first N periods after the slow CCI crosses zero.
download the indicator:
The old version
Use it when the compatibility is problem.
- Code: Select all
-- 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("Woodie CCI with histogramm coloring");
indicator:description("");
indicator:requiredSource(core.Bar);
indicator:type(core.Oscillator);
indicator.parameters:addGroup("Calculation");
indicator.parameters:addInteger("F", "Fast CCI Periods", "", 12);
indicator.parameters:addInteger("S", "Slow CCI periods", "", 50);
indicator.parameters:addInteger("N", "Length of neutral zone in bars", "", 6);
indicator.parameters:addGroup("Overbought / Oversold Levels");
indicator.parameters:addInteger("Overbought", "Overbought", "",100);
indicator.parameters:addInteger("Oversold", "Oversold", "", -100);
indicator.parameters:addInteger("level_overboughtsold_width", "Level lines width", "The width of the overbought/oversold levels", 1, 1, 5);
indicator.parameters:addInteger("level_overboughtsold_style", "Level lines stype", "The style of the overbought/oversold levels", core.LINE_SOLID);
indicator.parameters:addColor("level_overboughtsold_color", "Level lines color", "The color of the overbought/oversold levels" , core.rgb(96, 96, 138));
indicator.parameters:setFlag("level_overboughtsold_style", core.FLAG_LEVEL_STYLE);
indicator.parameters:addGroup("Style");
indicator.parameters:addInteger("F_width", "Up Line width", "", 1, 1, 5);
indicator.parameters:addInteger("F_style", "Up Line style", "", core.LINE_SOLID);
indicator.parameters:setFlag("F_style", core.FLAG_LINE_STYLE);
indicator.parameters:addColor("F_color", "Color of Fast CCI", "", core.rgb(255, 255, 0));
indicator.parameters:addInteger("S_width", "Up Line width", "", 1, 1, 5);
indicator.parameters:addInteger("S_style", "Up Line style", "", core.LINE_SOLID);
indicator.parameters:setFlag("S_style", core.FLAG_LINE_STYLE);
indicator.parameters:addColor("S_color", "Color of Slow CCI", "", core.rgb(255, 128, 0));
indicator.parameters:addColor("H_color", "Color of neutral bars", "", core.rgb(192, 192, 192));
indicator.parameters:addColor("HR_color", "Color of red bars", "", core.rgb(255, 0, 0));
indicator.parameters:addColor("HB_color", "Color of blue bar", "", core.rgb(0, 0, 255));
indicator.parameters:addGroup("Slow Bar/Line Style");
indicator.parameters:addString("Slow", "Style", "", "Bar");
indicator.parameters:addStringAlternative("Slow", "Bar", "", "Bar");
indicator.parameters:addStringAlternative("Slow", "Line", "", "Line");
end
-- Indicator instance initialization routine
-- Processes indicator parameters and creates output streams
-- TODO: Refine the first period calculation for each of the output streams.
-- TODO: Calculate all constants, create instances all subsequent indicators and load all required libraries
-- Parameters block
local F;
local S;
local N;
local Slow;
local first;
local source = nil;
local CCIF;
local CCIS;
-- Streams block
local F = nil;
local S = nil;
local Z = nil;
-- Routine
function Prepare()
F = instance.parameters.F;
S = instance.parameters.S;
N = instance.parameters.N;
Slow= instance.parameters.Slow;
source = instance.source;
CCIF = core.indicators:create("CCI", source, F);
CCIS = core.indicators:create("CCI", source, S);
first = math.max(CCIF.DATA:first(), CCIS.DATA:first());
local name = profile:id() .. "(" .. source:name() .. ", " .. F .. ", " .. S .. ")";
instance:name(name);
Z = instance:addInternalStream(0, 0);
F = instance:addStream("F", core.Line, name .. ".F", "F", instance.parameters.F_color, first);
F:setWidth(instance.parameters.F_width);
F:setStyle(instance.parameters.F_style);
if Slow == "Line" then
S = instance:addStream("S", core.Line, name .. ".S", "S", instance.parameters.S_color, first);
else
S = instance:addStream("S", core.Bar, name .. ".S", "S", instance.parameters.S_color, first);
end
F:addLevel(instance.parameters.Oversold, instance.parameters.level_overboughtsold_style, instance.parameters.level_overboughtsold_width, instance.parameters.level_overboughtsold_color);
F:addLevel(0, instance.parameters.level_overboughtsold_style, instance.parameters.level_overboughtsold_width, instance.parameters.level_overboughtsold_color);
F:addLevel(instance.parameters.Overbought, instance.parameters.level_overboughtsold_style, instance.parameters.level_overboughtsold_width, instance.parameters.level_overboughtsold_color);
end
-- Indicator calculation routine
function Update(period, mode)
CCIF:update(mode);
CCIS:update(mode);
if period >= first then
F[period] = CCIF.DATA[period];
S[period] = CCIS.DATA[period];
local flag = false;
local v = 0;
if period >= first + 1 then
if (S[period] >= 0 and S[period - 1] < 0) or
(S[period] < 0 and S[period - 1] >= 0) then
v = 1;
flag = true;
elseif Z[period - 1] > 0 then
flag = true;
v = Z[period - 1] + 1;
end
else
-- initally we are in the gray zone
flag = true;
v = 1;
end
if flag then
Z[period] = v;
if Z[period] > N then
flag = false;
end
end
if flag then
S:setColor(period,instance.parameters.H_color);
else
Z[period] = 0;
if S[period] > 0 then
S:setColor(period,instance.parameters.HB_color);
else
S:setColor(period,instance.parameters.HR_color);
end
end
else
Z[period] = 0;
end
end
Timed Tick WOODIE_CCI version of indicator.
viewtopic.php?f=17&t=65432&p=116357#p116357