Page 1 of 3

Woodie CCI

PostPosted: Tue Apr 20, 2010 6:13 pm
by Nikolay.Gekht
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.

woodiecci.png


download the indicator:
WOODIE_CCI.lua
(5.85 KiB) Downloaded 2698 times


The old version
WOODIECCI.lua
(5.78 KiB) Downloaded 1575 times

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

Re: Woodie CCI

PostPosted: Wed Apr 21, 2010 12:52 pm
by zekelogan
VERY cool. One of my favorite indicators.

As a Woodie traditionalist, the only thing I can suggest is to make the slow CCI line thicker than the fast.

Maybe an alternate version for us weirdo's ? :D

Re: Woodie CCI

PostPosted: Wed Apr 21, 2010 4:20 pm
by Nikolay.Gekht
In the next version of Marketscope. Now there is no way to tune width of the lines. I requested this functionality and will modify the indicator as soon as this feature will developed.

Re: Woodie CCI

PostPosted: Wed Apr 21, 2010 4:58 pm
by zekelogan
Thanks Nikolay!

Re: Woodie CCI

PostPosted: Thu Apr 22, 2010 12:08 am
by michaelwen
could you explain a little bit how to use this indicators. thanks

Re: Woodie CCI

PostPosted: Thu Apr 22, 2010 8:11 am
by Nikolay.Gekht
I think you have to start from this: http://www.woodiescciclub.com/start.htm

Re: Woodie CCI

PostPosted: Mon Jun 28, 2010 4:20 pm
by zoglchaim
hey great job there
do you think that you could add SIDEWINER and a CHOP ZONE INDICATORs? CZI and SI in short

Re: Woodie CCI

PostPosted: Thu Aug 05, 2010 1:06 am
by patick
Thanks for the great indicator, Nikolay.

Is it possible to modify to display the current CCI level the same way as StochRSI?

Re: Woodie CCI

PostPosted: Fri Apr 08, 2011 2:21 pm
by Apprentice
Line Style Options Added.
You Can Now Adjust Overbought / Oversold Line Levels

patick
I'm not sure on which aspect of StochRSI you are thinking.

Re: Woodie CCI

PostPosted: Sun Apr 10, 2011 6:05 am
by luigipg
There are three types of entrance signals.
These will all assume a long entrance. Short entrances are the reverse.
1. CCI 50 crosses above its Zero line. The CCI 14 must also be above its zero line and price must close above the 34EMA.
2. First Zero Line Reject after the CCI 50 crosses above zero.
The CCI50 has crossed above zero. Then either the CCI 50 or CCI 14 falls below +100 and shoots back up.
3. Slingshot- The CCI 50 is above its zero line.
The CCI 14 dips below -75 , moves upward and crosses zero.
Exits are up to you. Dr. Bob couldn't make up his mind about when to exit either. The entrances are great though.