Custom Indicator call error

Created at 09 Aug 2021, 17:02
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!
Nickachino's avatar

Nickachino

Joined 03.04.2017

Custom Indicator call error
09 Aug 2021, 17:02


Hi,

I m trying to use 2 EMAs from a custom multi timeframe indicators. I get an error when I call the indicator in my cBot.

This is the indicator code:

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

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

        [Parameter(DefaultValue = 21)]
        public int EMAPeriods2 { get; set; }

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

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

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

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

        private MarketSeries series1;
        private MarketSeries series2;

        private ExponentialMovingAverage Ema1;
        private ExponentialMovingAverage Ema2;

        protected override void Initialize()
        {
            series1 = MarketData.GetSeries(EMATimeframe1);
            series2 = MarketData.GetSeries(EMATimeframe2);

            Ema1 = Indicators.ExponentialMovingAverage(series1.Close, EMAPeriods1);
            Ema2 = Indicators.ExponentialMovingAverage(series2.Close, EMAPeriods2);

        }

        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];
            }

        }


        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;
        }
    }
}

The I call it like this:

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 SIMPLEandPROFITABLEForexScalping : Robot
    {
        [Parameter("Risk %", DefaultValue = 0.02)]
        public double RiskPct { get; set; }

        [Parameter("EMA1 period", DefaultValue = 8)]
        public int EMA1Period { get; set; }

        [Parameter("EMA2 period", DefaultValue = 13)]
        public int EMA2Period { get; set; }

        [Parameter("EMA3 period", DefaultValue = 21)]
        public int EMA3Period { get; set; }

        private MovingAverage EMA1;
        private MovingAverage EMA2;
        private MovingAverage EMA3;
        private MyMTFEMA MTFEMA;

        protected override void OnStart()
        {
            // Put your initialization logic here
            EMA1 = Indicators.MovingAverage(Bars.ClosePrices, EMA1Period, MovingAverageType.Exponential);
            EMA2 = Indicators.MovingAverage(Bars.ClosePrices, EMA2Period, MovingAverageType.Exponential);
            EMA3 = Indicators.MovingAverage(Bars.ClosePrices, EMA3Period, MovingAverageType.Exponential);
            MTFEMA = Indicators.GetIndicator<MyMTFEMA>(8, 21, "Hour", "Hour");
            
        }

However I get an error when trying to run the cBot with this message:

31/12/2019 02:00:00.000 | Backtesting started
31/12/2019 02:00:00.000 | Crashed in OnStart with AlgoActivationException: Can not set "Hour" as a value for "EMATimeframe1" parameter
31/12/2019 02:00:00.000 | Backtesting was stopped

I have tried various ways to change the way I call the parameters using the 8, 21 and two "Hour" options but still get an error.

 

Any assistance would be appreciated.
 

 


@Nickachino
Replies

firemyst
29 Aug 2021, 12:25

RE:

Nickachino said:

Hi,

I m trying to use 2 EMAs from a custom multi timeframe indicators. I get an error when I call the indicator in my cBot.

This is the indicator code:

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

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

        [Parameter(DefaultValue = 21)]
        public int EMAPeriods2 { get; set; }

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

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

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

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

        private MarketSeries series1;
        private MarketSeries series2;

        private ExponentialMovingAverage Ema1;
        private ExponentialMovingAverage Ema2;

        protected override void Initialize()
        {
            series1 = MarketData.GetSeries(EMATimeframe1);
            series2 = MarketData.GetSeries(EMATimeframe2);

            Ema1 = Indicators.ExponentialMovingAverage(series1.Close, EMAPeriods1);
            Ema2 = Indicators.ExponentialMovingAverage(series2.Close, EMAPeriods2);

        }

        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];
            }

        }


        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;
        }
    }
}

The I call it like this:

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 SIMPLEandPROFITABLEForexScalping : Robot
    {
        [Parameter("Risk %", DefaultValue = 0.02)]
        public double RiskPct { get; set; }

        [Parameter("EMA1 period", DefaultValue = 8)]
        public int EMA1Period { get; set; }

        [Parameter("EMA2 period", DefaultValue = 13)]
        public int EMA2Period { get; set; }

        [Parameter("EMA3 period", DefaultValue = 21)]
        public int EMA3Period { get; set; }

        private MovingAverage EMA1;
        private MovingAverage EMA2;
        private MovingAverage EMA3;
        private MyMTFEMA MTFEMA;

        protected override void OnStart()
        {
            // Put your initialization logic here
            EMA1 = Indicators.MovingAverage(Bars.ClosePrices, EMA1Period, MovingAverageType.Exponential);
            EMA2 = Indicators.MovingAverage(Bars.ClosePrices, EMA2Period, MovingAverageType.Exponential);
            EMA3 = Indicators.MovingAverage(Bars.ClosePrices, EMA3Period, MovingAverageType.Exponential);
            MTFEMA = Indicators.GetIndicator<MyMTFEMA>(8, 21, "Hour", "Hour");
            
        }

However I get an error when trying to run the cBot with this message:

31/12/2019 02:00:00.000 | Backtesting started
31/12/2019 02:00:00.000 | Crashed in OnStart with AlgoActivationException: Can not set "Hour" as a value for "EMATimeframe1" parameter
31/12/2019 02:00:00.000 | Backtesting was stopped

I have tried various ways to change the way I call the parameters using the 8, 21 and two "Hour" options but still get an error.

 

Any assistance would be appreciated.
 

 

Of course it's crashing there. You're passing in "Hour" as a string. The parameter is specifically for a TimeFrame object.

So you have to pass the timeframe similar to:

 

MTFEMA = Indicators.GetIndicator<MyMTFEMA>(8, 21, TimeFrame.Hour, TimeFrame.Hour);

 


@firemyst