Why won't this code print any value other than zero for the indicator?

Created at 05 May 2019, 16:46
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!
FI

firemyst

Joined 26.03.2019

Why won't this code print any value other than zero for the indicator?
05 May 2019, 16:46


Hi everyone:

See screen capture and code below. Despite hard-coding the public property being set to 4 by the bot, the indicator never displays a value other than zero.

Why? What am I missing?

It should pick up the value of the public property that is set by the bot, and then set the IndicatorDataSeries "UpwardBuy" to 4.

Thank you :-)

Indicator code:

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

namespace cAlgo
{
    [Levels(2, 1, 0)]
    [Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class ConditionsOfEntry : Indicator
    {
        [Output("UpwardSell", LineStyle = LineStyle.Solid, PlotType = PlotType.Line, LineColor = "Red")]
        public IndicatorDataSeries UpwardSell { get; set; }
        [Output("UpwardNeutral", LineStyle = LineStyle.Solid, PlotType = PlotType.Line, LineColor = "Yellow")]
        public IndicatorDataSeries UpwardNeutral { get; set; }
        [Output("UpwardBuy", LineStyle = LineStyle.Solid, PlotType = PlotType.Line, LineColor = "Lime")]
        public IndicatorDataSeries UpwardBuy { get; set; }

        public int UpwardCount { get; set; }

        //private const int UpwardMax = 5;
        public override void Calculate(int index)
        {
            //if (UpwardCount >= UpwardMax)
                UpwardBuy[index] = UpwardCount;
            //else if (UpwardCount > Math.Round(UpwardMax / 2.0, MidpointRounding.AwayFromZero))
            //    UpwardNeutral[index] = UpwardCount;
            //else
            //    UpwardSell[index] = UpwardCount;
        }

    }
}

 

Bot code:

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 TestBot : Robot
    {
        private string _positionLabel = String.Empty;
        private MarketSeries _marketSeries;
        private ConditionsOfEntry _c = new ConditionsOfEntry();

        protected override void OnStart()
        {
            _marketSeries = MarketData.GetSeries(Symbol, MarketSeries.TimeFrame);
            DataSeries series = _marketSeries.Close;
            _positionLabel = (MarketSeries.TimeFrame) + " " + Symbol.Code + " Test Bot";
            _c = Indicators.GetIndicator<ConditionsOfEntry>();
        }

        protected override void OnTick()
        {
            if (SumOfLongEntryConditions() >= 5)
                Print("Hello");
            else
                Print("Oh no!");
        }

        private int SumOfLongEntryConditions()
        {
            int _sumOfLongEntryConditions = 4;
            Print("_sumOfLongEntryConditions {0}", _sumOfLongEntryConditions);
            _c.UpwardCount = _sumOfLongEntryConditions; //set to 4
            return _sumOfLongEntryConditions;
        }
    }
}

 


@firemyst
Replies

PanagiotisCharalampous
06 May 2019, 12:37

Hi FireMyst,

I am not sure what do you expect to happen here. Indicators referenced by cBots are not displayed on the charts.

Best Regards,

Panagiotis


@PanagiotisCharalampous

firemyst
06 May 2019, 16:32

RE:

Panagiotis Charalampous said:

Hi FireMyst,

I am not sure what do you expect to happen here. Indicators referenced by cBots are not displayed on the charts.

Best Regards,

Panagiotis

 

What I was hoping to achieve, is to have some values calculated in the bot based on all the indicators on the current tick, and then display those calculated values on a separate chart (hence the "IsOverlay = false" because those calculated values would be anywhere from -10...0...10 (kind of like an oscillator).

But from what you're telling me, I'd have to create another indicator that:

1) references all the other indicators I want used in the calculations

2) incorporate the bot's calculation logic

and add it to the chart as a separate indicator?

There's currently no way then to draw objects on a chart that's not the main chart? Or is there?

Thank you.


@firemyst

PanagiotisCharalampous
06 May 2019, 16:39

Hi FireMyst,

1) references all the other indicators I want used in the calculations

2) incorporate the bot's calculation logic

indeed this is the correct approach

There's currently no way then to draw objects on a chart that's not the main chart? Or is there?

There is but you need to manually add the area. See below an example 

  Chart.IndicatorAreas[0].DrawText("Test", "Test", Server.Time, 50, Color.Red);

Best Regards,

Panagiotis


@PanagiotisCharalampous

firemyst
06 May 2019, 16:47

RE:

Panagiotis Charalampous said:

Hi FireMyst,

1) references all the other indicators I want used in the calculations

2) incorporate the bot's calculation logic

indeed this is the correct approach

There's currently no way then to draw objects on a chart that's not the main chart? Or is there?

There is but you need to manually add the area. See below an example 

  Chart.IndicatorAreas[0].DrawText("Test", "Test", Server.Time, 50, Color.Red);

Best Regards,

Panagiotis

Perfect! Thanks yet again!


@firemyst