Crashed in OnTimer NullReferenceException, only when backtesting.

Created at 18 Oct 2019, 04:41
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!
EN

enoque_santos

Joined 10.10.2019

Crashed in OnTimer NullReferenceException, only when backtesting.
18 Oct 2019, 04:41


I have a problem where during backtest I get a NullReferenceException error.

The strange thing is during live testing the code works perfectly, just during backtest I get the NullReferenceException error:

The error is:
"Crashed in OnTimer with NullReferenceException: Object reference not set to an instance of an object."

It occurs after the winning of some positions achieves take profit and the next code instructions is  for closing all the other positions; the cBot should then start over the cycle, opening new positions,  but instead,  it ends with the error.

(if necessary,  I will share my cBot code).


@enoque_santos
Replies

PanagiotisCharalampous
18 Oct 2019, 08:20

Hi enoque_santos,

Thanks for posting in our forum. Please share the cBot code so that we can have a look.

Best Regards,

Panagiotis


@PanagiotisCharalampous

enoque_santos
18 Oct 2019, 17:58

Sure.  Here you are.  Thank you.

 

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 hml_Buy_OnTimer_Jaboke_Backtest : Robot
    {
        [Parameter("Stop Loss (pips)", DefaultValue = 60)]
        public int StopLossInPips { get; set; }

        [Parameter("Take Profit (pips)", DefaultValue = 30)]
        public int TakeProfitInPips { get; set; }

        [Parameter("ZonaDePerigo (pips)", DefaultValue = 30)]
        public int ZonaDePerigo { get; set; }

        [Parameter("variavelDeControle", DefaultValue = 0)]
        public int variavelDeControle { get; set; }

        [Parameter("Volume (Lots)", DefaultValue = 1000)]
        public double Volume { get; set; }

        protected override void OnStart()
        {
            Timer.Start(TimeSpan.FromMilliseconds(100));
        }

        protected override void OnTimer()
        {
            if (variavelDeControle == 0 || variavelDeControle == 1)
            {
                trataEntrada01();
            }

            if (variavelDeControle == 2 || variavelDeControle == 3)
            {
                trataEntrada02();
            }

            if (variavelDeControle == 4 || variavelDeControle == 5)
            {
                trataEntrada03();
            }

            if (variavelDeControle == 6 || variavelDeControle == 7)
            {
                trataEntrada04();
            }

            if (variavelDeControle == 8 || variavelDeControle == 9)
            {
                trataEntrada05();
            }

            if (variavelDeControle == 10 || variavelDeControle == 11)
            {
                trataEntrada06();
            }
        }

        private void trataEntrada01()
        {
            if (variavelDeControle == 0)
            {
                var buyPosition00 = ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "buyPosition00", StopLossInPips, TakeProfitInPips);
                if (!buyPosition00.IsSuccessful)
                {
                    CloseAllPositions();
                }
                variavelDeControle = 1;
            }

            if (Positions.Find("buyPosition00").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }
            else
            {
                if (Positions.Find("buyPosition00").Pips <= -ZonaDePerigo)
                {
                    Volume = Volume * 3;
                    variavelDeControle = 2;
                }
            }
        }

        private void trataEntrada02()
        {
            if (variavelDeControle == 2)
            {
                var sellPosition01 = ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, "sellPosition01", StopLossInPips, TakeProfitInPips);
                if (!sellPosition01.IsSuccessful)
                {
                    CloseAllPositions();
                }
                variavelDeControle = 3;
            }

            if (Positions.Find("sellPosition01").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }
            else
            {
                if (Positions.Find("sellPosition01").Pips <= -ZonaDePerigo)
                {
                    Volume = Volume * 2;
                    variavelDeControle = 4;
                }
            }
        }

        private void trataEntrada03()
        {
            if (variavelDeControle == 4)
            {
                var buyPosition02 = ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "buyPosition02", StopLossInPips, TakeProfitInPips);
                if (!buyPosition02.IsSuccessful)
                {
                    CloseAllPositions();
                }
                variavelDeControle = 5;
            }

            if (Positions.Find("buyPosition02").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }
            else
            {
                if (Positions.Find("buyPosition02").Pips <= -ZonaDePerigo)
                {
                    Volume = Volume * 2;
                    variavelDeControle = 6;
                }
            }
        }

        private void trataEntrada04()
        {
            if (variavelDeControle == 6)
            {
                var sellPosition02 = ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, "sellPosition02", StopLossInPips, TakeProfitInPips);
                if (!sellPosition02.IsSuccessful)
                {
                    CloseAllPositions();
                }
                variavelDeControle = 7;
            }

            if (Positions.Find("sellPosition02").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }
            else
            {
                if (Positions.Find("sellPosition02").Pips <= -ZonaDePerigo)
                {
                    Volume = Volume * 2;
                    variavelDeControle = 8;
                }
            }

        }

        private void trataEntrada05()
        {
            if (variavelDeControle == 8)
            {
                var buyPosition03 = ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "buyPosition03", StopLossInPips, TakeProfitInPips);
                if (!buyPosition03.IsSuccessful)
                {
                    CloseAllPositions();
                }
                variavelDeControle = 9;
            }

            if (Positions.Find("buyPosition03").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }
            else
            {
                if (Positions.Find("buyPosition03").Pips <= -ZonaDePerigo)
                {
                    Volume = Volume * 2;
                    variavelDeControle = 10;
                }
            }
        }

        private void trataEntrada06()
        {
            if (variavelDeControle == 10)
            {
                var sellPosition03 = ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, "sellPosition03", StopLossInPips, TakeProfitInPips);
                if (!sellPosition03.IsSuccessful)
                {
                    CloseAllPositions();
                }
                variavelDeControle = 11;
            }

            if (Positions.Find("sellPosition03").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }
            else
            {
                if (Positions.Find("sellPosition03").Pips <= -ZonaDePerigo)
                {
                    variavelDeControle = 12;
                }
            }
        }

        private void CloseAllPositions()
        {
            foreach (var p in Positions)
            {
                if (p != null)
                {
                    ClosePositionAsync(p);
                }
            }
            variavelDeControle = 0;
        }

        protected override void OnTick()
        {
        }

        protected override void OnStop()
        {
        }
    }
}


@enoque_santos

PanagiotisCharalampous
21 Oct 2019, 08:40

Hi enoque_santos,

The problem occurs because you are trying to access a property of the object that is returned by the Find() function without checking if the function actually returns a value. For example below

            if (Positions.Find("buyPosition00").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }

To fix this you need to make the relevant checks wherever this is applicable. See below an example

            if (Positions.Find("buyPosition00") != null && Positions.Find("buyPosition00").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }

Best Regards,

Panagiotis


@PanagiotisCharalampous

enoque_santos
22 Oct 2019, 05:34

RE:

Panagiotis Charalampous said:

Hi enoque_santos,

The problem occurs because you are trying to access a property of the object that is returned by the Find() function without checking if the function actually returns a value. For example below

            if (Positions.Find("buyPosition00").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }

To fix this you need to make the relevant checks wherever this is applicable. See below an example

            if (Positions.Find("buyPosition00") != null && Positions.Find("buyPosition00").Pips >= TakeProfitInPips)
            {
                CloseAllPositions();
            }

Best Regards,

Panagiotis

Hello, Panagiotis,

The error was fixed; thank you very much !!!

Best Regards,

Enoque.


@enoque_santos