-- More information about this indicator can be found at:
-- http://fxcodebase.com/code/viewtopic.php?f=17&t=60521
-- Id: 11496

--+------------------------------------------------------------------+
--|                               Copyright © 2018, Gehtsoft USA LLC |
--|                                            http://fxcodebase.com |
--+------------------------------------------------------------------+
--|                                      Developed by : Mario Jemic  |
--|                                          mario.jemic@gmail.com   |
--+------------------------------------------------------------------+
--|                                 Support our efforts by donating  |
--|                                  Paypal : https://goo.gl/9Rj74e  |
--|                                 Patreon : https://goo.gl/GdXWeN  |
--|                    BitCoin : 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF  |
--|               BitCoin Cash : 1BEtS465S3Su438Kc58h2sqvVvHK9Mijtg  |
--|           Ethereum : 0x8C110cD61538fb6d7A2B47858F0c0AaBd663068D  |
--|                   LiteCoin : LLU8PSY2vsq7B9kRELLZQcKf5nJQrdeqwD  |
--+------------------------------------------------------------------+

function Init()
    indicator:name("Master_Candle");
    indicator:description("Master_Candle");
    indicator:requiredSource(core.Bar);
    indicator:type(core.Indicator);
    indicator.parameters:addGroup("Calculation");	 
    indicator.parameters:addInteger("Period", "Min Engulf Candles", "Min Engulf Candles", 4, 1, 1000);
	
	indicator.parameters:addGroup("Style");
    indicator.parameters:addColor("Top", "Top Line Color", "", core.rgb(0, 255, 0));
	indicator.parameters:addColor("Bottom", "Bottom 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);
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 Period;
local first;
local source = nil;
local Top, Bottom;
local id; 
local style , width;
-- Routine
function Prepare(nameOnly)
    Top = instance.parameters.Top;
	style = instance.parameters.style;
	width = instance.parameters.width;
	Bottom = instance.parameters.Bottom;
    Period = instance.parameters.Period;
    source = instance.source;
    first = source:first()+Period;

    local name = profile:id() .. "(" .. source:name() .. ", " .. tostring(Period) .. ")";
    instance:name(name);

     instance:ownerDrawn(true);
end

-- Indicator calculation routine
-- TODO: Add your code for calculation output values
function Update(period)
 
  id=0;
   core.host:execute ("removeLine", 10000);
   core.host:execute ("removeLine", 20000);
end



function Draw(stage, context )

if stage ~= 2 then
return;
end

id=0;
 core.host:execute ("removeLine", 10000);
   core.host:execute ("removeLine", 20000);

local Last=math.min(context:lastBar (), source:size()-1);
  local First=math.max(source:first(), context:firstBar ());
  
  
   context:setClipRectangle (  context:left (), context:top(), context:right (), context:bottom());

local period;


for period = First, Last, 1 do
isMasterCandle(period -Period)  
end
end

function Line(period)

local Index= period+Period;
core.host:execute("drawLine", ID(), source:date(period), source.high[period], source:date(Index), source.high[period], Top,style , width , string.format("%." .. source:getPrecision () .. "f", source.high[period]));
core.host:execute("drawLine", ID(), source:date(period), source.low[period], source:date(Index), source.low[period], Bottom,style , width ,string.format("%." .. source:getPrecision () .. "f", source.low[period]));

end


function ID()
id=id+1;

return id;
end
 function isMasterCandle(period )
 
  
 
   local  CandleTop = source.high[period ];
   local  CandleBottom = source.low[period ];
   local i; 
   local Flag= true;
   
   for i =period, period+Period, 1 do   
		if  source.high[i] > CandleTop  or  source.low[i] < CandleBottom  then       
		Flag= false;
		end	 
   end
   
   
        if Flag then	
			if period == source:size()-1-Period then
								local Index= period+Period;
					core.host:execute("drawLine", 10000, source:date(period), source.high[period], source:date(Index), source.high[period], Top,style , width , string.format("%." .. source:getPrecision () .. "f", source.high[period]));
					core.host:execute("drawLine", 20000, source:date(period), source.low[period], source:date(Index), source.low[period], Bottom,style , width ,string.format("%." .. source:getPrecision () .. "f", source.low[period]));
			else
			Line(period );  
			end
	    end
		
end

