NullReferenceException
NullReferenceException
05 Apr 2014, 00:08
Hello,
i am trying to make some updates to Sample Trend Bot that comes with cAlgo,
i have tried to get last GrossProfit and if its value is negative then instead of a Sell it will open a Buy Order,
defining variables as
var longGrossProfit = longPosition.GrossProfit; var shortGrossProfit = shortPosition.GrossProfit;
It builds well, however at the backtest stage it returns this Exception
Crashed in OnTick with NullReferenceException: Object reference not set to an instance of an object.
i am attaching the code here as well
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class SampleTrendCBot : Robot { [Parameter("MA Type")] public MovingAverageType MAType { get; set; } [Parameter()] public DataSeries SourceSeries { get; set; } [Parameter("Slow Periods", DefaultValue = 10)] public int SlowPeriods { get; set; } [Parameter("Fast Periods", DefaultValue = 5)] public int FastPeriods { get; set; } [Parameter(DefaultValue = 10000, MinValue = 0)] public int Volume { get; set; } [Parameter(DefaultValue = 150)] public int StopLoss { get; set; } [Parameter(DefaultValue = 300)] public int TakeProfit { get; set; } private MovingAverage slowMa; private MovingAverage fastMa; private const string label = "Sample Trend cBot"; protected override void OnStart() { fastMa = Indicators.MovingAverage(SourceSeries, FastPeriods, MAType); slowMa = Indicators.MovingAverage(SourceSeries, SlowPeriods, MAType); } protected override void OnTick() { var longPosition = Positions.Find(label, Symbol, TradeType.Buy); var shortPosition = Positions.Find(label, Symbol, TradeType.Sell); var currentSlowMa = slowMa.Result.Last(0); var currentFastMa = fastMa.Result.Last(0); var previousSlowMa = slowMa.Result.Last(1); var previousFastMa = fastMa.Result.Last(1); var longProfit = longPosition.GrossProfit; var shortProfit = shortPosition.GrossProfit; if (previousSlowMa > previousFastMa && currentSlowMa <= currentFastMa && longPosition == null) { if (shortPosition != null) ClosePosition(shortPosition); if (shortProfit > 0) { ExecuteMarketOrder(TradeType.Sell, Symbol, Volume, label, StopLoss, TakeProfit); } else { ExecuteMarketOrder(TradeType.Buy, Symbol, Volume, label, StopLoss, TakeProfit); } } else if (previousSlowMa < previousFastMa && currentSlowMa >= currentFastMa && shortPosition == null) { if (longPosition != null) ClosePosition(longPosition); if (longProfit > 0) { ExecuteMarketOrder(TradeType.Buy, Symbol, Volume, label, StopLoss, TakeProfit); } else { ExecuteMarketOrder(TradeType.Sell, Symbol, Volume, label, StopLoss, TakeProfit); } } } } }
Could anyone please help me to find what i am missing,
Thanks
Replies
cAlgoFx
05 Apr 2014, 09:42
RE:
cAlgoFx said:
Use these linq statements for lines 54 && 55;
var longProfit = Positions.Where(pos => pos.Label == label && pos.SymbolCode == Symbol.Code && pos.TradeType == TradeType.Buy).Sum(pos => pos.GrossProfit);
var shortProfit = Positions.Where(pos => pos.Label == label && pos.SymbolCode == Symbol.Code && pos.TradeType == TradeType.Sell).Sum(pos => pos.GrossProfit);Should get you sorted.
Happy hunting
Don't forget pos.Label==LABEL.
@cAlgoFx
cAlgoFx
05 Apr 2014, 09:32
Use these linq statements for lines 54 && 55;
var longProfit = Positions.Where(pos => pos.Label == label && pos.SymbolCode == Symbol.Code && pos.TradeType == TradeType.Buy).Sum(pos => pos.GrossProfit);
var shortProfit = Positions.Where(pos => pos.Label == label && pos.SymbolCode == Symbol.Code && pos.TradeType == TradeType.Sell).Sum(pos => pos.GrossProfit);
Should get you sorted.
Happy hunting
@cAlgoFx