Exception
Exception
27 Nov 2012, 09:34
Hi,
I build my robot succeeded but when I do the backtest it gives me this error:
Crashed in OnTick with System.NullReferenceException: Object reference not set to an instance of an object. |
I am using a customized indicator and I alse added Reference for the robot. Could any one please help me with this
Thanks
Replies
phamvanthanh
27 Nov 2012, 11:34
//#reference: ..\Indicators\NonLagDot.algo // // ------------------------------------------------------------------------------------------------- // // // ------------------------------------------------------------------------------------------------- using System; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.Indicators; namespace cAlgo.Robots { [Robot] public class NonLagDotBot : Robot { private NonLagDot trnd; private Position position; [Parameter] public DataSeries Price { get; set; } //[Parameter("Take Profit", DefaultValue = 10)] //public int TakeProfitInPips { get; set; } [Parameter("Length", DefaultValue = 60)] public int Length { get; set; } [Parameter("Displace", DefaultValue = 0)] public int Displace { get; set; } [Parameter("Filter", DefaultValue = 0)] public int Filter { get; set; } [Parameter("Color", DefaultValue = 1)] public int ColorFront { get; set; } [Parameter("ColorBarBack", DefaultValue = 2)] public int ColorBarBack { get; set; } [Parameter("Deviation", DefaultValue = 0)] public double Deviation { get; set; } [Parameter("Volume", DefaultValue = 10000, MinValue = 0)] public int Volume { get; set; } [Parameter("Stop Loss", DefaultValue = 10)] public int StopLoss { get; set; } protected override void OnStart() { trnd = Indicators.GetIndicator<NonLagDot>(Price, Length, Displace, Filter, ColorFront, ColorBarBack, Deviation); } protected override void OnTick() { if (Trade.IsExecuting) return; bool longposition = position != null & position.TradeType == TradeType.Buy; bool shortposition = position != null & position.TradeType == TradeType.Sell; if (trnd.markettrend > 0.0 && shortposition) { ClosePosition(); Buy(); } if (trnd.markettrend < 0.0 && longposition) { ClosePosition(); Sell(); } } private void ClosePosition() { if (position != null) { Trade.Close(position); position = null; } } private void Buy() { Trade.CreateBuyMarketOrder(Symbol, Volume); } private void Sell() { Trade.CreateSellMarketOrder(Symbol, Volume); } protected override void OnPositionOpened(Position openedPosition) { position = openedPosition; Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), null); } private double GetAbsoluteStopLoss(Position position, int StopLoss) { return position.TradeType == TradeType.Buy ? position.EntryPrice - Symbol.PipSize * StopLoss : position.EntryPrice + Symbol.PipSize * StopLoss; } } } and this is the indicator using System; using cAlgo.API; namespace cAlgo.Indicators { [Indicator("NonLagDot", IsOverlay = true, ScalePrecision = 5)] public class NonLagDot : Indicator { #region Input [Parameter] public DataSeries Price { get; set; } [Parameter("Length", DefaultValue = 60)] public int Length { get; set; } [Parameter("Displace", DefaultValue = 0)] public int Displace { get; set; } [Parameter("Filter", DefaultValue = 0)] public int Filter { get; set; } [Parameter("Color", DefaultValue = 1)] public int ColorFront { get; set; } [Parameter("ColorBarBack", DefaultValue = 6)] public int ColorBarBack { get; set; } [Parameter("Deviation", DefaultValue = 0)] public double Deviation { get; set; } public double markettrend = 0; #endregion #region indicator line [Output("NLD", Color = Colors.Yellow, PlotType = PlotType.Points)] public IndicatorDataSeries MABuffer { get; set; } [Output("Up", Color = Colors.RoyalBlue, PlotType = PlotType.Points)] public IndicatorDataSeries UpBuffer { get; set; } [Output("Dn", Color = Colors.Red, PlotType = PlotType.Points)] public IndicatorDataSeries DnBuffer { get; set; } //[Output("markettrend")] //public trend markettrend { get; set; } #endregion private IndicatorDataSeries price; private IndicatorDataSeries trend; private const double Cycle = 4; /// <summary> /// Indicator initialization function /// </summary> protected override void Initialize() { price = CreateDataSeries(); trend = CreateDataSeries(); } /// <summary> /// NonLagMA_v4 main logic /// </summary> /// <param name="index"></param> public override void Calculate(int index) { if (index < Length*Cycle + Length) { MABuffer[index] = 0; UpBuffer[index] = 0; DnBuffer[index] = 0; return; } const double pi = 3.1415926535; const double Coeff = 3*pi; int Phase = Length - 1; double Len = Length*Cycle + Phase; double Weight = 0; double Sum = 0; double t = 0; for (int i = 0; i <= Len - 1; i++) { double g = 1.0/(Coeff*t + 1); if (t <= 0.5) g = 1; double beta = Math.Cos(pi*t); double alfa = g*beta; price[i] = Price[index - i]; Sum += alfa*price[i]; Weight += alfa; if (t < 1) t += 1.0/(Phase - 1); else if (t < Len - 1) t += (2*Cycle - 1)/(Cycle*Length - 1); } if (Weight > 0) MABuffer[index] = (1.0 + Deviation/100)*Sum/Weight; double filterFactor = Filter*Symbol.PointSize; if (Filter > 0) { if (Math.Abs(MABuffer[index] - MABuffer[index - 1]) < filterFactor) MABuffer[index] = MABuffer[index - 1]; } if (ColorFront <= 0) return; trend[index] = trend[index - 1]; if (MABuffer[index] - MABuffer[index - 1] > filterFactor) trend[index] = 1; if (MABuffer[index - 1] - MABuffer[index] > filterFactor) trend[index] = -1; DnBuffer[index] = double.NaN; UpBuffer[index] = double.NaN; if (trend[index] > 0) { UpBuffer[index] = MABuffer[index]; if (trend[index - ColorBarBack] < 0) UpBuffer[index - ColorBarBack] = MABuffer[index - ColorBarBack]; } else if (trend[index] < 0) { DnBuffer[index] = MABuffer[index]; if (trend[index - ColorBarBack] > 0) DnBuffer[index - ColorBarBack] = MABuffer[index - ColorBarBack]; } markettrend = trend[index]; if (IsRealTime) { ChartObjects.DrawText("markettrend", "markettrend = " + markettrend + " ", StaticPosition.TopLeft, Colors.White); } } } }
Hi admin,
above are robot and indicators
Thanks
@phamvanthanh
admin
27 Nov 2012, 18:07
The reason it is crasshing is here:
bool longposition = position != null & position.TradeType == TradeType.Buy; bool shortposition = position != null & position.TradeType == TradeType.Sell;
It has to be corrected to this:
bool longposition = position != null && position.TradeType == TradeType.Buy; bool shortposition = position != null && position.TradeType == TradeType.Sell;
One more note, you would need this line
public IndicatorDataSeries MarketTrend { get; set; }
instead of
public double markettrend = 0;
in order to be able to access the values.
@admin
phamvanthanh
28 Nov 2012, 06:04
Hi again,
Could I use
public double MarketTrend { get; set; }
instead of
public double MarketTrend { get; set; }
?
I have done that for the Indicator code an It returns the result as intended. But when I use MarketTrend in robot as below condition
if (Trnd.MarketTrend >= 0.0 && !longposition)
It doesn't work right. Then I use this method in the robot to check its value (Trnd.MarketTrend's value)
ChartObjects.DrawText("\nMarketTrend", "\nMarketTrend_Robot = " + Trnd.MarketTrend + " ",
StaticPosition.TopLeft, Colors.White);
and this method to check in the Indicator
if (IsRealTime)
{
ChartObjects.DrawText("MarketTrend", "MarketTrend_Indicator = " + MarketTrend + " ",
StaticPosition.TopLeft, Colors.White);
}
and the screen shows
"MarketTrend_Indicator = 1" (or -1 denpends on market)
"MarketTrend_Robot = 0" (always)
as Image
I think this issue is easy to you but it quite difficult to me as I am newbie
Thanks
@phamvanthanh
phamvanthanh
28 Nov 2012, 06:16
Sorry,
I mean I'd like to use
public double MarketTrend { get; set; }
instead of
public IndicatorDataSeries MarketTrend { get; set; }
because I intend to use MarketTrend with the value "-1"and "1" depend on market's move as condition for robot.
If I use
public "IndicatorDataSeries MarketTrend { get; set; } I don't know how to use its value for the robot nor to convert it to double or integer.
thanks
@phamvanthanh
admin
27 Nov 2012, 09:45
It referes to a variable that has not been initialized. You may send us the code to point out exactly where the error is.
@admin