Using the output of an indicator in a bot

Created at 05 Sep 2015, 06:40
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!
CL

cloesd

Joined 28.02.2015

Using the output of an indicator in a bot
05 Sep 2015, 06:40


I've got a customer indicator that I've referenced. Now I need to access it's values.

I was hoping to get a dataseries so I could start to use functions like hascrossedabove with the symbol marketseries.

The indicator has 3 outputs (It's a multi time frame one), How do i go about doing this:

I've defined the indicator in my onstart:

multi = Indicators.GetIndicator<EMAMTF>(14, EMATimeframe1, EMATimeframe2, EMATimeframe3);

Then in my ontick I've tried to use:

Print(multi.EMA1.Result.Lastvalue);

But it doesn't work.

by the way the indicator is this standard EMAMTF from this website:

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

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC)]
    public class EMAMTF : Indicator
    {
        [Parameter(DefaultValue = 14)]
        public int Periods { get; set; }

        [Parameter("EMA Timeframe1", DefaultValue = "Minute15")]
        public TimeFrame EMATimeframe1 { get; set; }

        [Parameter("EMA Timeframe2", DefaultValue = "Hour")]
        public TimeFrame EMATimeframe2 { get; set; }

        [Parameter("EMA Timeframe3", DefaultValue = "Hour4")]
        public TimeFrame EMATimeframe3 { get; set; }

        [Output("EMA1", Color = Colors.Blue)]
        public IndicatorDataSeries EMA1 { get; set; }

        [Output("EMA2", Color = Colors.Red)]
        public IndicatorDataSeries EMA2 { get; set; }

        [Output("EMA3", Color = Colors.Yellow)]
        public IndicatorDataSeries EMA3 { get; set; }

        private MarketSeries series1;
        private MarketSeries series2;
        private MarketSeries series3;

        private ExponentialMovingAverage Ema1;
        private ExponentialMovingAverage Ema2;
        private ExponentialMovingAverage Ema3;

        protected override void Initialize()
        {

            series1 = MarketData.GetSeries(EMATimeframe1);
            series2 = MarketData.GetSeries(EMATimeframe2);
            series3 = MarketData.GetSeries(EMATimeframe3);

            Ema1 = Indicators.ExponentialMovingAverage(series1.Close, Periods);
            Ema2 = Indicators.ExponentialMovingAverage(series2.Close, Periods);
            Ema3 = Indicators.ExponentialMovingAverage(series3.Close, Periods);

        }

        public override void Calculate(int index)
        {


            var index1 = GetIndexByDate(series1, MarketSeries.OpenTime[index]);
            if (index1 != -1)
            {
                EMA1[index] = Ema1.Result[index1];
            }

            var index2 = GetIndexByDate(series2, MarketSeries.OpenTime[index]);
            if (index2 != -1)
            {
                EMA2[index] = Ema2.Result[index2];
            }

            var index3 = GetIndexByDate(series3, MarketSeries.OpenTime[index]);
            if (index3 != -1)
            {
                EMA3[index] = Ema3.Result[index3];
            }

        }


        private int GetIndexByDate(MarketSeries series, DateTime time)
        {
            for (int i = series.Close.Count - 1; i > 0; i--)
            {
                if (time == series.OpenTime[i])
                    return i;
            }
            return -1;
        }
    }
}

 


@cloesd
Replies

ClickAlgo
05 Sep 2015, 13:50

try this and let me know if it works, I have had some issues with indicator objects loading lazily, they have a reference, but no values.

double x =multi.EMA1.Result.Lastvalue;

Print(x);


@ClickAlgo

ClickAlgo
05 Sep 2015, 14:32

Also try and make the Ema1 private field public and access this value instead.


@ClickAlgo

cloesd
06 Sep 2015, 03:45

RE:

Paul_Hayes said:

try this and let me know if it works, I have had some issues with indicator objects loading lazily, they have a reference, but no values.

double x =multi.EMA1.Result.Lastvalue;

Print(x);

Error CS1061: 'cAlgo.API.IndicatorDataSeries' does not contain a definition for 'Result' and no extension method 'Result' accepting a first argument of type 'cAlgo.API.IndicatorDataSeries' could be found (are you missing a using directive or an assembly reference?)

This is what I get.

I've set everthing to public in the indicator aswell, still same issue:


        public ExponentialMovingAverage Ema1;
        public ExponentialMovingAverage Ema2;
        public ExponentialMovingAverage Ema3;

 


@cloesd

ClickAlgo
06 Sep 2015, 08:08

Did you try and run the robot on a weekend when the markets were close?

If so then there are no data-feeds coming into cTrader, instead on a weekend you need to test your functionality with a back-test and log the results.

Aso from your robot you do not need to declare the result..

x = multi.EMA1.LastValue;
Print(x);

 


@ClickAlgo

cloesd
06 Sep 2015, 09:43

RE: RE:

Now it's working fine. (On some backtests).

 

Thanks heaps.


@cloesd