Indicator not working when called from cBot

Created at 08 Jan 2019, 23:21
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!
UL

ulises.guerrero

Joined 23.11.2018

Indicator not working when called from cBot
08 Jan 2019, 23:21


Hello, 

I have a multi-timeframe indicator that works fine on its own, but when I call it from a cBot, it always returns the same value (wrong value). Please help me to understand why it doesn't give the proper values when called from the Cbot. Here's the code of the indicator and Cbot:

 

**************************************************************

**************************************************************

**************************************************************

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

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None, AutoRescale = false)]
    public class h4TriggerLines : Indicator
    {
        [Output("h4 TriggerLevel", LineColor = "Purple")]
        public IndicatorDataSeries h4TriggerLevel { get; set; }

        [Output("h4 Direction")]
        public IndicatorDataSeries h4Direction { get; set; }

        private MarketSeries h4series;
        private ExponentialMovingAverage emah4;
        private int indexh4;
        private int indexh4previous;

        protected override void Initialize()
        {
            h4series = MarketData.GetSeries(TimeFrame.Hour4);
            emah4 = Indicators.ExponentialMovingAverage(h4series.Close, 15);
        }

        public override void Calculate(int index)
        {
            h4TriggerLevel[index] = h4TriggerLevel[index - 1];
            h4Direction[index] = h4Direction[index - 1];

            indexh4previous = indexh4;
            indexh4 = GetIndexByDate(h4series, MarketSeries.OpenTime[index]);

            if (indexh4 != -1)
            {
                if (indexh4previous != indexh4)
                {
                    if (h4series.Close[indexh4] > emah4.Result[indexh4] && h4series.Close[indexh4 - 1] < emah4.Result[indexh4 - 1])
                    {
                        h4TriggerLevel[index] = h4series.High[indexh4];
                        h4Direction[index] = 1;
                        ChartObjects.DrawText(String.Format("ArrowH4{0}", indexh4), "▲", index, h4series.High[indexh4], VerticalAlignment.Top, HorizontalAlignment.Center, Colors.Purple);
                    }

                    if (h4series.Close[indexh4] < emah4.Result[indexh4] && h4series.Close[indexh4 - 1] > emah4.Result[indexh4 - 1])
                    {
                        h4TriggerLevel[index] = h4series.Low[indexh4];
                        h4Direction[index] = -1;
                        ChartObjects.DrawText(String.Format("ArrowH4{0}", indexh4), "▼", index, h4series.Low[indexh4], VerticalAlignment.Bottom, HorizontalAlignment.Center, Colors.Purple);
                    }
                }
            }
        }


        private int GetIndexByDate(MarketSeries series, DateTime time)
        {
            for (int i = series.Close.Count - 1; i > 0; i--)
            {
                if (time == series.OpenTime[i])
                {
                    return i;
                }
                else if (series.OpenTime[i] < time)
                {
                    return i;
                    //return last value prev. to desired
                }
            }
            return -1;
        }
    }
}

 

 

**************************************************************

**************************************************************

**************************************************************

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 H1EntryBotH4 : Robot
    {

        private MovingAverage h1ema15;
        private h4TriggerLines TriggerLines;
        private MarketSeries h4series;

        protected override void OnStart()
        {
            h4series = MarketData.GetSeries(TimeFrame.Hour4);

            h1ema15 = Indicators.SimpleMovingAverage(MarketSeries.Close, 15);
            TriggerLines = Indicators.GetIndicator<h4TriggerLines>();
        }

        protected override void OnBar()
        {
            Print(TriggerLines.h4TriggerLevel.Last(1));
            Print(TriggerLines.h4Direction.Last(1));

            if (MarketSeries.Close.Last(1) > h1ema15.Result.Last(1))
            {
                PlaceStopOrder(TradeType.Buy, Symbol, 1000, MarketSeries.High.Last(1), "entry", 10, 10);
            }

        }

        protected override void OnStop()
        {

        }
    }
}


@ulises.guerrero
Replies

ulises.guerrero
11 Jan 2019, 02:29

Please help, I'm stuck with development. Why does the cBot load a constant value rather than the proper indicator values?


@ulises.guerrero

PanagiotisCharalampous
11 Jan 2019, 14:07

Hi ulises.guerrero,

We are having a look at this. I will come back to you soon.

Best Regards,

Panagiotis


@PanagiotisCharalampous