Category Trend  Published on 11/12/2022

renko

Description

using cAlgo.API;<font></font>

using cAlgo.API.Indicators;<font></font>

using cAlgo.API.Internals;<font></font>

using cAlgo.Indicators;<font></font>

using System;<font></font>

using System.Collections.Generic;<font></font>

using System.Linq;<font></font>

using System.Windows.Forms;<font></font>

using System.Runtime.InteropServices;<font></font>

using System.Diagnostics;<font></font>

using cT_MedianRenkoEngine;<font></font>

<font></font>

namespace cAlgo<font></font>

{<font></font>

    [Indicator("MedianRenko", IsOverlay = true, AutoRescale = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]<font></font>

    public class MedianRenko : Indicator<font></font>

    {<font></font>

        [Parameter("Bar Size (Pips)", DefaultValue = 10, MinValue = 0.1, Step = 1)]<font></font>

        public double BarSizePips { get; set; }<font></font>

<font></font>

        [Parameter("Retracement factor (0.01 - 1.00)", DefaultValue = 0.5, MinValue = 0.01, MaxValue = 1.0, Step = 0.01)]<font></font>

        public double Retracement { get; set; }<font></font>

<font></font>

        [Parameter("Maximum Bars", DefaultValue = 300, MinValue = 1)]<font></font>

        public int BricksToShow { get; set; }<font></font>

<font></font>

        [Parameter("Symmetrical Reversals", DefaultValue = true)]<font></font>

        public bool SymmetricalReversals { get; set; }<font></font>

<font></font>

        [Parameter("Reset Open on new trading day", DefaultValue = false)]<font></font>

        public bool ResetOpenOnNewTradingDay { get; set; }<font></font>

<font></font>

        [Parameter("Apply offset to first renko bar", DefaultValue = false)]<font></font>

        public bool ApplyOffsetToFirstBar { get; set; }<font></font>

<font></font>

        [Parameter("Tick offset value", DefaultValue = 0, MinValue = 0)]<font></font>

        public int OffsetValue { get; set; }<font></font>

<font></font>

        [Parameter("Bullish Bar Color", DefaultValue = "SeaGreen")]<font></font>

        public string ColorBull { get; set; }<font></font>

<font></font>

        [Parameter("Bearish Bar Color", DefaultValue = "Tomato")]<font></font>

        public string ColorBear { get; set; }<font></font>

<font></font>

        [Output("Open", Color = Colors.DimGray, Thickness = 0, PlotType = PlotType.Points)]<font></font>

        public IndicatorDataSeries Open { get; set; }<font></font>

<font></font>

        [Output("High", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]<font></font>

        public IndicatorDataSeries High { get; set; }<font></font>

<font></font>

        [Output("Low", Color = Colors.DimGray, Thickness = 0, PlotType = PlotType.Points)]<font></font>

        public IndicatorDataSeries Low { get; set; }<font></font>

<font></font>

        [Output("Close", Color = Colors.DimGray, Thickness = 0, PlotType = PlotType.Points)]<font></font>

        public IndicatorDataSeries Close { get; set; }<font></font>

<font></font>

        private MedianRenkoCore core = null;<font></font>

        private bool coreOK = true;<font></font>

<font></font>

        private DateTime lastTime;<font></font>

<font></font>

        private bool appliedOffset = false;<font></font>

<font></font>

        private T_OLHCV pOLHCV;<font></font>

        private T_OLHCV OLHCV;<font></font>

        private T_OLHCV mOLHCV;<font></font>

        private T_OLHCV cOLHCV;<font></font>

        private T_OLHCV memRates;<font></font>

        private T_OLHCV lastBar;<font></font>

<font></font>

        private List<T_OLHCV> bars = new List<T_OLHCV>();<font></font>

        private double barSize;<font></font>

        private Colors colorBull, colorBear;<font></font>

<font></font>

        protected override void Initialize()<font></font>

        {<font></font>

            core = new MedianRenkoCore();<font></font>

            coreOK = core.StatusCheck();<font></font>

<font></font>

            barSize = BarSizePips * Symbol.PipSize;<font></font>

<font></font>

            lastTime = new DateTime();<font></font>

            lastTime = MarketSeries.OpenTime[MarketSeries.Close.Count - 1];<font></font>

<font></font>

            lastBar = new T_OLHCV();<font></font>

            pOLHCV = new T_OLHCV();<font></font>

            OLHCV = new T_OLHCV();<font></font>

            mOLHCV = new T_OLHCV();<font></font>

            cOLHCV = new T_OLHCV();<font></font>

            memRates = new T_OLHCV();<font></font>

<font></font>

            if (!Enum.TryParse<Colors>(ColorBull, out colorBull))<font></font>

            {<font></font>

                colorBull = Colors.SeaGreen;<font></font>

            }<font></font>

            if (!Enum.TryParse<Colors>(ColorBear, out colorBear))<font></font>

            {<font></font>

                colorBear = Colors.Tomato;<font></font>

            }<font></font>

<font></font>

            appliedOffset = false;<font></font>

        }<font></font>

<font></font>

        private bool NewBar(int index)<font></font>

        {<font></font>

            if (lastTime != MarketSeries.OpenTime[index])<font></font>

            {<font></font>

                lastTime = MarketSeries.OpenTime[index];<font></font>

                return true;<font></font>

            }<font></font>

<font></font>

            return false;<font></font>

        }<font></font>

<font></font>

        private static int cc = 0;<font></font>

        private void pushBars(T_OLHCV bar, bool display)<font></font>

        {<font></font>

            int count = bars.Count();<font></font>

<font></font>

            var newBar = new T_OLHCV();<font></font>

            newBar.Copy(bar);<font></font>

            newBar.Index = cc++;<font></font>

<font></font>

            bars.Insert(0, newBar);<font></font>

            count++;<font></font>

<font></font>

            if (display)<font></font>

            {<font></font>

                shiftBars(0);<font></font>

            }<font></font>

<font></font>

            if (count > BricksToShow)<font></font>

            {<font></font>

                if (display)<font></font>

                {<font></font>

                    for (int i = BricksToShow - 1; i < count; i++)<font></font>

                    {<font></font>

                        ChartObjects.RemoveObject("mr_Wick_" + bars[i].Index);<font></font>

                        ChartObjects.RemoveObject("mr_Bar_" + bars[i].Index);<font></font>

                    }<font></font>

                }<font></font>

<font></font>

                bars.RemoveRange(BricksToShow, count - BricksToShow);<font></font>

<font></font>

                Open[count - BricksToShow] = double.NaN;<font></font>

                High[count - BricksToShow] = double.NaN;<font></font>

                Low[count - BricksToShow] = double.NaN;<font></font>

                Close[count - BricksToShow] = double.NaN;<font></font>

            }<font></font>

<font></font>

        }<font></font>

<font></font>

        private void shiftBars(int shift)<font></font>

        {<font></font>

            int count = bars.Count;<font></font>

            int ix = MarketSeries.Close.Count - 2;<font></font>

<font></font>

            for (int i = 0; i < count && i < BricksToShow; i++)<font></font>

            {<font></font>

                var candleColor = (bars[i].Close > bars[i].Open) ? colorBull : colorBear;<font></font>

<font></font>

                ChartObjects.DrawLine("mr_Wick_" + bars[i].Index, ix, bars[i].High, ix, bars[i].Low, candleColor, 1, LineStyle.Solid);<font></font>

                ChartObjects.DrawLine("mr_Bar_" + bars[i].Index, ix, bars[i].Close, ix, bars[i].Open, candleColor, 5, LineStyle.Solid);<font></font>

<font></font>

                Open[ix] = bars[i].Open;<font></font>

                High[ix] = bars[i].High;<font></font>

                Low[ix] = bars[i].Low;<font></font>

                Close[ix] = bars[i].Close;<font></font>

<font></font>

                ix--;<font></font>

            }<font></font>

        }<font></font>

<font></font>

        private void UpdateLastBar(int ix)<font></font>

        {<font></font>

            var candleColor = (memRates.Close > memRates.Open) ? colorBull : colorBear;<font></font>

<font></font>

            ChartObjects.DrawLine("mr_Wick_Live", ix, memRates.High, ix, memRates.Low, candleColor, 1, LineStyle.Solid);<font></font>

            ChartObjects.DrawLine("mr_Bar_Live", ix, memRates.Close, ix, memRates.Open, candleColor, 5, LineStyle.Solid);<font></font>

<font></font>

            Open[ix] = memRates.Open;<font></font>

            High[ix] = memRates.High;<font></font>

            Low[ix] = memRates.Low;<font></font>

            Close[ix] = memRates.Close;<font></font>

<font></font>

        }<font></font>

<font></font>

        public override void Calculate(int index)<font></font>

        {<font></font>

            if (ResetOpenOnNewTradingDay)<font></font>

            {<font></font>

                if (IsNewSession(MarketSeries.OpenTime[(index > 0) ? (index - 1) : index], MarketSeries.OpenTime[index]))<font></font>

                {<font></font>

                    cOLHCV.Clear();<font></font>

                    mOLHCV.Clear();<font></font>

                    pOLHCV.Clear();<font></font>

                    memRates.Copy(mOLHCV);<font></font>

                }<font></font>

            }<font></font>

<font></font>

            if (IsRealTime)<font></font>

            {<font></font>

                if (!coreOK)<font></font>

                {<font></font>

                    ChartObjects.DrawText("TrialOverMsg", "MedianRenko Indicator - Trial period ended. Please purchase a license file at www.az-invest.eu", StaticPosition.Center, Colors.White);<font></font>

                    return;<font></font>

                }<font></font>

<font></font>

                if (NewBar(index))<font></font>

                {<font></font>

                    shiftBars(0);<font></font>

<font></font>

                    Open[index - BricksToShow - 1] = double.NaN;<font></font>

                    High[index - BricksToShow - 1] = double.NaN;<font></font>

                    Low[index - BricksToShow - 1] = double.NaN;<font></font>

                    Close[index - BricksToShow - 1] = double.NaN;<font></font>

                }<font></font>

<font></font>

                OLHCV.Open = MarketSeries.Close[index];<font></font>

                OLHCV.Low = MarketSeries.Close[index];<font></font>

                OLHCV.High = MarketSeries.Close[index];<font></font>

                OLHCV.Close = MarketSeries.Close[index];<font></font>

                OLHCV.OpenTime = MarketSeries.OpenTime[index];<font></font>

                OLHCV.TickVolume = 1;<font></font>

<font></font>

<font></font>

                ProcessMarketData(OLHCV);<font></font>

                UpdateLastBar(index);<font></font>

            }<font></font>

            else<font></font>

            {<font></font>

                OLHCV.Open = MarketSeries.Open[index];<font></font>

                OLHCV.Low = MarketSeries.Low[index];<font></font>

                OLHCV.High = MarketSeries.High[index];<font></font>

                OLHCV.Close = MarketSeries.Close[index];<font></font>

                OLHCV.OpenTime = MarketSeries.OpenTime[index];<font></font>

                OLHCV.TickVolume = MarketSeries.TickVolume[index];<font></font>

<font></font>

                if (ApplyOffsetToFirstBar && !appliedOffset)<font></font>

                {<font></font>

                    OLHCV.Open = OffsetValue * Symbol.TickSize + Math.Floor(OLHCV.Open / barSize) * barSize;<font></font>

                    appliedOffset = true;<font></font>

                }<font></font>

<font></font>

                ProcessMarketData(OLHCV);<font></font>

<font></font>

                if (IsLastBar)<font></font>

                    UpdateLastBar(index);<font></font>

            }<font></font>

        }<font></font>

<font></font>

        private void ProcessMarketData(T_OLHCV ___OLHCV)<font></font>

        {<font></font>

            int rb_return = core.ProcessMedianRenko(barSize, Retracement, SymmetricalReversals, ___OLHCV, ref pOLHCV, ref mOLHCV, ref cOLHCV, 1);<font></font>

            while (true)<font></font>

            {<font></font>

                if ((rb_return >= 1) && (rb_return <= 4))<font></font>

                {<font></font>

                    pushBars(cOLHCV, IsRealTime);<font></font>

                    memRates.Copy(mOLHCV);<font></font>

                    OLHCV.Copy(memRates);<font></font>

<font></font>

                    cOLHCV.Clear();<font></font>

                    mOLHCV.Clear();<font></font>

<font></font>

                    rb_return = core.ProcessMedianRenko(barSize, Retracement, SymmetricalReversals, ___OLHCV, ref pOLHCV, ref mOLHCV, ref cOLHCV, 0);<font></font>

                    continue;<font></font>

<font></font>

                }<font></font>

                else if (rb_return == 10)<font></font>

                {<font></font>

                    memRates.Copy(mOLHCV);<font></font>

                    break;<font></font>

                }<font></font>

                else if (rb_return == -1)<font></font>

                {<font></font>

                    return;<font></font>

                }<font></font>

                else<font></font>

                {<font></font>

                    throw new Exception("Unhandled return value = " + rb_return);<font></font>

                }<font></font>

            }<font></font>

<font></font>

            if (IsLastBar && !IsRealTime)<font></font>

            {<font></font>

                shiftBars(0);<font></font>

            }<font></font>

        }<font></font>

<font></font>

        private bool IsNewSession(DateTime prevTime, DateTime currTime)<font></font>

        {<font></font>

            if (prevTime.DayOfWeek != currTime.DayOfWeek)<font></font>

                return true;<font></font>

            else<font></font>

                return false;<font></font>

        }<font></font>

<font></font>

<font></font>

    }<font></font>

}<font></font>

<font></font>


using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using System;
using System.Collections.Generic;
using System.Linq;

namespace cAlgo
{
    [Indicator("Renko", IsOverlay = true, AutoRescale = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Renko : Indicator
    {
        [Parameter("Renko (Pips)", DefaultValue = 10, MinValue = 0.1, Step = 1)]
        public double RenkoPips { get; set; }

        [Parameter("Bricks To Show", DefaultValue = 100, MinValue = 1)]
        public int BricksToShow { get; set; }

        [Parameter("Zoom Level", DefaultValue = 3, MinValue = 0, MaxValue = 5, Step = 1)]
        public double ZoomLevel { get; set; }

        [Parameter("Bullish Color", DefaultValue = "SeaGreen")]
        public string ColorBull { get; set; }

        [Parameter("Bearish Color", DefaultValue = "Tomato")]
        public string ColorBear { get; set; }

        [Output("Open", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
        public IndicatorDataSeries Open { get; set; }

        [Output("High", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
        public IndicatorDataSeries High { get; set; }

        [Output("Low", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
        public IndicatorDataSeries Low { get; set; }

        [Output("Close", Color = Colors.DimGray, Thickness = 1, PlotType = PlotType.Points)]
        public IndicatorDataSeries Close { get; set; }

        public class Brick
        {
            public double Open { get; set; }
            public double Close { get; set; }
        }

        private List<Brick> renkos = new List<Brick>();
        private double closeLastValue, thickness, renkoPips, renkoLastValue;
        private Colors colorBull, colorBear;
        private bool colorError;
        private int lastCount;

        protected override void Initialize()
        {
            if (!Enum.TryParse<Colors>(ColorBull, out colorBull) || !Enum.TryParse<Colors>(ColorBear, out colorBear))
                colorError = true;

            renkoPips = RenkoPips * Symbol.PipSize;
            thickness = Math.Pow(2, ZoomLevel) - (ZoomLevel > 0 ? 1 : 0);
            renkoLastValue = 0;
        }

        public override void Calculate(int index)
        {
            if (colorError)
            {
                ChartObjects.DrawText("Error0", "{o,o}\n/)_)\n \" \"\nOops! Incorrect colors.", StaticPosition.TopCenter, Colors.Gray);
                return;
            }

            if (renkoLastValue == 0)
            {
                var open = MarketSeries.Open.LastValue;

                renkoLastValue = open - (open % renkoPips) + renkoPips / 2;
            }

            closeLastValue = MarketSeries.Close.LastValue;

            while (closeLastValue >= renkoLastValue + renkoPips * 1.5)
            {
                renkoLastValue += renkoPips;
                renkos.Insert(0, new Brick 
                {
                    Open = renkoLastValue - renkoPips / 2,
                    Close = renkoLastValue + renkoPips / 2
                });
                if (renkos.Count() > BricksToShow)
                    renkos.RemoveRange(BricksToShow, renkos.Count() - BricksToShow);
                if (IsLastBar)
                    UpdateHistory(index);
            }
            while (closeLastValue <= renkoLastValue - renkoPips * 1.5)
            {
                renkoLastValue -= renkoPips;
                renkos.Insert(0, new Brick 
                {
                    Open = renkoLastValue + renkoPips / 2,
                    Close = renkoLastValue - renkoPips / 2
                });
                if (renkos.Count() > BricksToShow)
                    renkos.RemoveRange(BricksToShow, renkos.Count() - BricksToShow);
                if (IsLastBar)
                    UpdateHistory(index);
            }

            bool isNewBar = MarketSeries.Close.Count > lastCount;

            if (IsLastBar && isNewBar)
            {
                UpdateHistory(index);

                Open[index - BricksToShow] = double.NaN;
                High[index - BricksToShow] = double.NaN;
                Low[index - BricksToShow] = double.NaN;
                Close[index - BricksToShow] = double.NaN;

                lastCount = MarketSeries.Close.Count;
            }

            if (IsRealTime)
                UpdateLive(index);
        }

        private void UpdateHistory(int index)
        {
            for (int i = 0; i < BricksToShow - 1 && i < renkos.Count() - 1; i++)
            {
                var color = renkos[i].Open < renkos[i].Close ? colorBull : colorBear;

                ChartObjects.DrawLine(string.Format("renko.Last({0})", i + 1), index - i - 1, renkos[i].Open, index - i - 1, renkos[i].Close, color, thickness, LineStyle.Solid);

                Open[index - i - 1] = renkos[i].Open;
                High[index - i - 1] = Math.Max(renkos[i].Open, renkos[i].Close);
                Low[index - i - 1] = Math.Min(renkos[i].Open, renkos[i].Close);
                Close[index - i - 1] = renkos[i].Close;
            }
        }

        private void UpdateLive(int index)
        {
            double y1, y2;
            var top = Math.Max(renkos[0].Open, renkos[0].Close);
            var bottom = Math.Min(renkos[0].Open, renkos[0].Close);

            if (closeLastValue > top)
                y1 = top;
            else if (closeLastValue < bottom)
                y1 = bottom;
            else
                y1 = closeLastValue;

            y2 = closeLastValue;

            var colorLive = y1 < y2 ? colorBull : colorBear;

            ChartObjects.DrawLine("renko.Live", index, y1, index, y2, colorLive, thickness, LineStyle.Solid);

            Open[index] = y1;
            High[index] = y1 > y2 ? y1 : y2;
            Low[index] = y1 < y2 ? y1 : y2;
            Close[index] = y2;
        }
    }
}


MR
mrhung.tvt

Joined on 10.01.2022

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: Renko.algo
  • Rating: 0
  • Installs: 555
  • Modified: 11/12/2022 03:14
Comments
Log in to add a comment.
OR
orabelleemma · 1 year ago

The code initializes the indicator by checking if the Median Renko core is working properly and setting the bar size based on the input parameter. It also initializes variables for storing the previous and current OHLCV (Open, High, Low, Close, and Volume) values and the list of bars. tunnel rush

PA
pauldupont1120 · 1 year ago

Thank you very much. exhibit of sorrows This information is really useful for me and I want to tell you that the article is great