Drawing lines from robots and indicators

Created at 27 Mar 2018, 11:57
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!
CE

ceakuk

Joined 19.03.2018

Drawing lines from robots and indicators
27 Mar 2018, 11:57


As the title says robots and indicators from tis previous post [/forum/whats-new/913]

However all explanations are for indicator. Could someone please  help me  do the same for ROBOT

I would like any example that impliment a robot version to this code then plot vertical lines. Thanks a lot

[Indicator("Name", IsOverlay = true, AutoRescale = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Renko : Indicator

 


@ceakuk
Replies

ceakuk
27 Mar 2018, 12:03

RE:

if possible could you please tell me why the indicator output has to be in the form

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

I try the one below and doesnt work when I use a robot to fetch the output value

[Output("Close")]
        public double Close { get; set; }

 

 


@ceakuk

PanagiotisCharalampous
27 Mar 2018, 12:09

Hi ceakuk,

See below the first example as a robot

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

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class NewcBot : Robot
    {
        [Parameter(DefaultValue = 30, MinValue = 1)]
        public int Period { get; set; }

        protected override void OnStart()
        {
            // Put your initialization logic here
        }

        protected override void OnTick()
        {
            RedrawLines();
        }
        private void RedrawLines()
        {
            int count = MarketSeries.Close.Count;

            int maxIndex1 = FindNextLocalExtremum(MarketSeries.High, count - 1, true);
            int maxIndex2 = FindNextLocalExtremum(MarketSeries.High, maxIndex1 - Period, true);

            int minIndex1 = FindNextLocalExtremum(MarketSeries.Low, count - 1, false);
            int minIndex2 = FindNextLocalExtremum(MarketSeries.Low, minIndex1 - Period, false);

            int startIndex = Math.Min(maxIndex2, minIndex2) - 100;
            int endIndex = count + 100;

            DrawTrendLine("high", startIndex, endIndex, maxIndex1, MarketSeries.High[maxIndex1], maxIndex2, MarketSeries.High[maxIndex2]);

            DrawTrendLine("low", startIndex, endIndex, minIndex1, MarketSeries.Low[minIndex1], minIndex2, MarketSeries.Low[minIndex2]);
        }

        private void DrawTrendLine(string lineName, int startIndex, int endIndex, int index1, double value1, int index2, double value2)
        {
            double gradient = (value2 - value1) / (index2 - index1);

            double startValue = value1 + (startIndex - index1) * gradient;
            double endValue = value1 + (endIndex - index1) * gradient;

            ChartObjects.DrawLine(lineName, startIndex, startValue, endIndex, endValue, Colors.Gray);
            ChartObjects.DrawLine(lineName + "_red", index1, value1, index2, value2, Colors.Red);
        }

        private int FindNextLocalExtremum(DataSeries series, int maxIndex, bool findMax)
        {
            for (int index = maxIndex; index >= 0; index--)
            {
                if (IsLocalExtremum(series, index, findMax))
                {
                    return index;
                }
            }
            return 0;
        }

        private bool IsLocalExtremum(DataSeries series, int index, bool findMax)
        {
            int end = Math.Min(index + Period, series.Count - 1);
            int start = Math.Max(index - Period, 0);

            double value = series[index];

            for (int i = start; i < end; i++)
            {
                if (findMax && value < series[i])
                    return false;

                if (!findMax && value > series[i])
                    return false;
            }
            return true;
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

Let me know if this helps.

Best Regards,

Panagiotis


@PanagiotisCharalampous

ceakuk
27 Mar 2018, 12:52

RE:

Panagiotis Charalampous said:

Thank you very much for always answering promptly. It works with live data. is it possible  to draw on back testing?

 

Sorry I had another question about indicator output

if possible could you please tell me why the indicator output MUST to be in the form

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

 

I just want to an output of a single double.

I try the one below and doesnt work when I use a robot to fetch the output value

[Output("Close")]
        public double Close { get; set; }

Thanks a lot


@ceakuk

PanagiotisCharalampous
27 Mar 2018, 14:43

Hi ceakuk,

It is currently not possible to draw objects during backtesting. This will be added in a future release.

Regarding the output issue, could you please share the cBot and the Indicator so that we can advise you what is wrong with the code?

Best Regards,

Panagiotis


@PanagiotisCharalampous