Crashed in OnTimer NullReferenceException, only when backtesting.
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).
Replies
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
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