convert lua code to ctrader (tick timed macd0

Created at 04 May 2018, 04:43
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
SI

simjopaul@gmail.com

Joined 07.04.2018

convert lua code to ctrader (tick timed macd0
04 May 2018, 04:43


function Init()

    indicator:name("Tick Timed MACD");

    indicator:description("Tick Timed MACD");

    indicator:requiredSource(core.Tick);

    indicator:type(core.Oscillator);

    indicator.parameters:addGroup("Calculation"); 

 

    indicator.parameters:addInteger("DurationOfFast", "Fast MA Duration in seconds", "Fast MA Duration in seconds", 60);

    indicator.parameters:addInteger("DurationOfSlow", "Slow MA Duration in seconds", "Slow MA Duration in seconds", 2500);

indicator.parameters:addInteger("DurationOfSignal", "Signal MA Duration in seconds", "Signal MA Duration in seconds", 90);

    indicator.parameters:addGroup("Style");

    indicator.parameters:addColor("Color", "Color of MACD", "Color of MACD", 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:addColor("Color2", "Color of Signal", "Color of Siganal", core.rgb(0, 255, 0));

indicator.parameters:addInteger("Width2", "Line width", "", 1, 1, 5);

    indicator.parameters:addInteger("Style2", "Line style", "", core.LINE_SOLID);

    indicator.parameters:setFlag("Style2", core.FLAG_LINE_STYLE);

indicator.parameters:addColor("Color3", "Color of Histogram", "Color of Histogram", core.rgb(0, 0, 255));

 

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 first;

local source = nil;

 

-- Streams block

local RawFast = nil;

local RawSlow = nil; 

local DurationOfFast;

local DurationOfSlow;

local DurationOfSignal;

 

local PeriodOfFast;

local PeriodonOfSlow;

local PeriodonOfSignal;

 

local MACD;

local BarSize; 

local Signal;

local Histogram;

-- Routine

function Prepare(nameOnly)

    DurationOfFast = instance.parameters.DurationOfFast;

    DurationOfSlow = instance.parameters.DurationOfSlow; 

DurationOfSignal= instance.parameters.DurationOfSignal;

    source = instance.source;

    first=source:first();

local name = profile:id() .. "(" .. source:name() .. ")";

    instance:name(name);

    

    if (not (nameOnly)) then

        RawFast= instance:addInternalStream(0, 0);

        RawSlow= instance:addInternalStream(0, 0); 

        MACD = instance:addStream("MACD", core.Line, name .. ".MACD", "MACD", instance.parameters.Color, source:first());

MACD:setWidth(instance.parameters.Width);

        MACD:setStyle(instance.parameters.Style);

MACD:setPrecision (source:getPrecision());

Signal = instance:addStream("Signal", core.Line, name .. ".Signal", "Signal", instance.parameters.Color2, source:first());

Signal:setWidth(instance.parameters.Width2);

        Signal:setStyle(instance.parameters.Style2);

Signal:setPrecision (source:getPrecision());

Histogram = instance:addStream("Histogram", core.Bar, name .. ".Histogram", "Histogram", instance.parameters.Color3, source:first());

Histogram:setPrecision (source:getPrecision());

      

    end

end

 

-- Indicator calculation routine

-- TODO: Add your code for calculation output values

function Update(period)

 

 

    if period <= first then

return;

end

if period == first+1 then

local s1, e1, s2, e2;

    s1 = source:date(period-1);

e1 = source:date(period);

    BarSize= math.floor((e1 - s1)*86400+0.5); 

PeriodOfFast =BarSize / DurationOfFast  ;

PeriodOfSlow=BarSize / DurationOfSlow  ;

PeriodOfSignal=BarSize / DurationOfSignal  ;

core.host:execute ("setStatus", "Fast :" .. win32.formatNumber(PeriodOfFast, false, 2)  .. " Slow :" ..win32.formatNumber(PeriodOfSlow, false, 2) .. " Signal :" ..win32.formatNumber(PeriodOfSlow, false, 2) );

 

if   DurationOfFast <BarSize then

error( "The chosen Fast MA Duration must be equal to or bigger than "..BarSize  );

end

if   DurationOfSlow <BarSize then 

error( "The chosen Slow MA Duration must be equal to or bigger than " ..BarSize);

end

 

if   DurationOfSignal <BarSize then

         error( "The chosen Slow MA Duration must be equal to or bigger than " ..BarSize);

     end

 

 

 

 

 

local P1= core.findDate (source, source:date(period)-PeriodOfFast, false);

local P2= core.findDate (source, source:date(period)-PeriodOfSlow, false);

local P3= core.findDate (source, source:date(period)-PeriodOfSignal, false);

if P1==-1 or P2==-1 or P3==-1 

or P1< first+1 or P2< first+1 or P3< first+1

or P1>= period

or P2>= period

or P3>= period

    then

    return;

    end

 

local P1= core.findDate (source, source:date(period)-PeriodOfFast, false);

local P2= core.findDate (source, source:date(period)-PeriodOfSlow, false);

local P3= core.findDate (source, source:date(period)-PeriodOfSignal, false);

if P1==-1 or P2==-1 or P3==-1 

or P1< first or P2< first or P3< first

then

return;

end

RawFast[period] = mathex.avg(source ,P1, period);

RawSlow[period]  = mathex.avg(source ,P2, period);

 

MACD[period]= RawFast[period]-RawSlow[period];

Signal[period]= mathex.avg(MACD,P3, period);

Histogram[period]= MACD[period]-Signal[period];

 

   end

 end


@simjopaul@gmail.com