--+------------------------------------------------------------------+ --| Copyright © 2017, Gehtsoft USA LLC | --| http://fxcodebase.com | --+------------------------------------------------------------------+ --| Support our efforts by donating | --| Paypal: https://goo.gl/9Rj74e | --| BitCoin : 15VCJTLaz12Amr7adHSBtL9v8XomURo9RF | --+------------------------------------------------------------------+ --| Developed by : Mario Jemic | --| mario.jemic@gmail.com | --+------------------------------------------------------------------+ function Init() indicator:name("Custom Time Frame Candle View"); indicator:description("A chart will add a new Candle After passing of Set Number of Base Time Frame elements."); indicator:requiredSource(core.Tick); indicator:type(core.View); indicator.parameters:addGroup("Calculation"); indicator.parameters:addString("Instrument","Instrument","", "EUR/USD"); indicator.parameters:setFlag("Instrument", core.FLAG_INSTRUMENTS); indicator.parameters:addString("TF", "Base Time Frame", "Base Time Frame" , "m1"); indicator.parameters:addStringAlternative("TF", "m1", "m1" , "m1"); indicator.parameters:addStringAlternative("TF", "H1", "H1" , "H1"); indicator.parameters:addStringAlternative("TF", "D1", "D1" , "D1"); indicator.parameters:addStringAlternative("TF", "W1", "W1" , "W1"); indicator.parameters:addStringAlternative("TF", "M1", "M1" , "M1"); indicator.parameters:addInteger("Step","Number Of Elements","", 1); indicator.parameters:addBoolean("type", "Price Type","", true); indicator.parameters:setFlag("type", core.FLAG_BIDASK); indicator.parameters:addGroup("Range"); indicator.parameters:addDate("from", "From","", -1000); indicator.parameters:addDate("to", "To","", 0); indicator.parameters:setFlag("to", core.FLAG_DATE_OR_NULL); end local Last; local loading; local History; local open, high, low, close, volume; local offer; local offset; local LastTime; local Instrument; local Count; local FIRST; local Step; local LastS; local TF; local Old; -- initializes the instance of the indicator function Prepare(onlyName) FIRST=true; Step = instance.parameters.Step; TF = instance.parameters.TF; Instrument = instance.parameters.Instrument; local name = profile:id().. ", " .. Instrument .. ", " .. TF .. "x".. Step instance:name(name); if onlyName then return ; end -- check whether the instrument is available local offers = core.host:findTable("offers"); local enum = offers:enumerator(); local row=nil; row = enum:next(); while row ~= nil do if row.Instrument == Instrument then break; end row = enum:next(); end assert(row ~= nil, "Selected instrument is not available"); offer = row.OfferID; instance:initView(Instrument, row.Digits, row.PointSize, true, true); History = core.host:execute("getHistory", 1000, Instrument, TF, instance.parameters.from, instance.parameters.to, instance.parameters.type); loading = true; if instance.parameters.to == 0 then core.host:execute("subscribeTradeEvents", 2000, "offers"); end core.host:execute("setStatus", "Loading"); open = instance:addStream("open", core.Line, name .. "." .. "Open", "open", 0, 0, 0); high = instance:addStream("high", core.Line, name .. "." .. "High", "high", 0, 0, 0); low = instance:addStream("low", core.Line, name .. "." .. "Low", "low", 0, 0, 0); close = instance:addStream("close", core.Line, name .. "." .. "Close", "close", 0, 0, 0); volume = instance:addStream("volume", core.Line, name .. "." .. "Volume", "Volume", 0, 0, 0); instance:createCandleGroup("candle", "candle", open, high, low, close, volume , TF); end function Update(period) end function AsyncOperationFinished(cookie, success, message) if cookie == 1000 then handleHistory(); core.host:execute("setStatus", ""); elseif cookie == 2000 then loading = false; handleUpdate() end end local lastDirection; function calcValue( Index, period) if period < History:first() then return; end if period== 1 then instance:addViewBar(History:date(1)); Index=Index+1; Count=1; open[Index] = History.open[period]; low[Index] = History.low[period]; close[Index]=History.close[period]; high[Index] = History.high[period]; else if Last ~= History:date(period) then Count= Count+1; end if Count > Step then Index=Index+1; Count=1; instance:addViewBar(History:date(period)); open[Index] = History.open[period]; low[Index] = History.low[period]; close[Index]= History.close[period]; high[Index] = History.high[period]; volume[Index] = History.volume[period]; Old= History.volume[period]; else close[Index]=History.close[period]; low[Index] = math.min(low[Index], History.low[period]); high[Index] = math.max(high[Index], History.high[period]); if Last ~= History:date(period) then Old = volume[Index]+History.volume[period]; volume[Index] = Old ; else volume[Index] = Old + History.volume[period]; end end if Last ~= History:date(period) then Last = History:date(period); end end return Index; end function handleHistory() local s = History:size() - 1; local i; local current = open:size() - 1; for i = 1, s, 1 do current = calcValue(current, i); end loading = false; LastTime=History:size()-1; end function handleUpdate() local current = open:size() - 1; local i; local i; for i = LastTime, History:size()-1, 1 do current = calcValue( current ,i); end LastTime=History:size()-1; end