Reference Custom Library using .dll throw nullreference
14 Aug 2018, 19:54
Hi Guys,
Some help, i'm building a custom library with multiple classes (BotBuildingBlocks) & (IndicatorBuildingBlocks)
Custom Class -> MGTradingLibrary.dll with below BotBuildingBlocks class. Inheriting Robot class.
using System;
using System.Diagnostics;
using System.Linq;
using cAlgo.API;
using System.Collections.Generic;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Threading;
namespace MGTradingLibrary
{
/// <summary>
/// This class is a collection of methods that can be used when building a Bot.
/// </summary>
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
public class BotBuildingBlocks : Robot
{
/// <summary>
/// Summary: This method checks if the current time is within the user-defined trading window.
/// <para> Detail: 1. Timezone is South African Standard Time --- 2. Automatically adjusts for daylight savings --- 3. Will return a string 'Trading Window Active or Trading Window Not Active' </para>
/// </summary>
/// <param name="startTime">Enter the start of the trading window in hours.</param>
/// <param name="stopTime">Enter the end of the trading window in hours.</param>
public string zzzActiveTradingWindow(double startTime, double stopTime)
{
string tradingWindowActive = "Trading Window Not Active";
try
{
bool isDST = Server.Time.IsDaylightSavingTime();
double currentTime = Server.Time.Hour;
if (isDST)
{
startTime = startTime + 1;
stopTime = stopTime + 1;
}
if (currentTime > startTime && currentTime < stopTime)
return tradingWindowActive = "Trading Window Active";
else
{
Print("Trading Window Active, Time is ", Server.Time);
return tradingWindowActive;
}
}
catch (Exception error)
{
Print("zzzActiveTradingWindow Method Error: ", error.ToString());
return (error.ToString());
}
}
/// <summary>
/// Summary: This method will collect all the Swing High points.
/// <para> Detail: 1. Will return an x amount of Swign Highs contained in a list of doubles </para>
/// </summary>
/// <param name="candleCount">The amount of candles before and after the high before classifying it as a Swing High.</param>
/// <param name="timeFrame">Select the timeframe you want to calculate Swing Highs on.</param>
/// <param name="listSize">The amount of swing highs you want to store in the list.</param>
public List<double> zzzSwingHighs(int candleCount, int listSize, TimeFrame timeFrame)
{
List<double> swingHighs = new List<double>();
try
{
int period = candleCount % 2 == 0 ? candleCount - 1 : candleCount;
for (int bar = 0; bar < MarketData.GetSeries(Symbol, timeFrame).High.Count; bar++)
{
int middleIndexHigh = bar - period / 2;
double middleValueHigh = MarketData.GetSeries(Symbol, timeFrame).High[middleIndexHigh];
bool up = true;
for (int i = 0; i < period; i++)
{
if ((middleValueHigh < MarketData.GetSeries(Symbol, timeFrame).High[bar - i]))
{
up = false;
break;
}
}
if (up)
{
swingHighs.Add(middleValueHigh);
if (swingHighs.Count > listSize)
swingHighs.RemoveAt(0);
}
}
return swingHighs;
}
catch (Exception error)
{
Print("Swing High Method Error: ", error.ToString());
return swingHighs;
}
}
/// <summary>
/// Summary: This method will collect all the Swing Low points.
/// <para> Detail: 1. Will return an x amount of Swign Lows contained in a list of doubles </para>
/// </summary>
/// <param name="candleCount">The amount of candles before and after the high before classifying it as a Swing High.</param>
/// <param name="timeFrame">Select the timeframe you want to calculate Swing Highs on.</param>
/// <param name="listSize">The amount of swing highs you want to store in the list.</param>
public List<double> zzzSwingLows(int candleCount, int listSize, TimeFrame timeFrame)
{
List<double> swingLows = new List<double>();
try
{
int period = candleCount % 2 == 0 ? candleCount - 1 : candleCount;
for (int bar = 0; bar < MarketData.GetSeries(Symbol, timeFrame).Low.Count; bar++)
{
int middleIndexLow = bar - period / 2;
double middleValueLow = MarketData.GetSeries(Symbol, timeFrame).Low[middleIndexLow];
bool down = true;
for (int i = 0; i < period; i++)
{
if ((middleValueLow < MarketData.GetSeries(Symbol, timeFrame).Low[bar - i]))
{
down = false;
break;
}
}
if (down)
{
swingLows.Add(middleValueLow);
if (swingLows.Count > listSize)
swingLows.RemoveAt(0);
}
}
return swingLows;
}
catch (Exception error)
{
Print("Swing High Method Error: ", error.ToString());
return swingLows;
}
}
When reference the class with the using statement as per below.
---.Net Frameworks are the same
---Everything builds
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using MGTradingLibrary;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class MethodTester : Robot
{
[Parameter(DefaultValue = 0.0)]
public double Parameter { get; set; }
protected override void OnStart()
{
Test();
}
protected override void OnTick()
{
// Put your core logic here
}
protected override void OnStop()
{
// Put your deinitialization logic here
}
public void Test()
{
BotBuildingBlocks test = new BotBuildingBlocks();
var output = test.zzzSwingHighs(5, 5, TimeFrame.Daily);
}
}
}
it crashes OnStart with NullReferenceException. Does anyone perhpas know why?

Replies
myinvestmentsfx
15 Aug 2018, 07:48
Hi .ics,
Library is referenced in the manner you explained, still getting nullreference.
Kind Regards,
@myinvestmentsfx
myinvestmentsfx
15 Aug 2018, 14:20
So for those who are interested. This issue was that my "BuildingBlocks" class was inheriting the cAlgo "Robot" class and then when I built the "Run" class it was set to inherit the same "Robot" class. I think changed my "Run" class to inherit my custom "BuildingBlocks" class, which in the backend inherits the "Robot" class.
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Threading;
using MGTradingLibrary;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class Run : BotBuildingBlocks
{
[Parameter(DefaultValue = 0.0)]
public double Parameter { get; set; }
protected override void OnStart()
{
}
protected override void OnTick()
{
// Put your core logic here
}
protected override void OnStop()
{
// Put your deinitialization logic here
}
public void Test()
{
var test = zzzActiveTradingWindow(2, 3);
}
}
}
@myinvestmentsfx

.ics
15 Aug 2018, 02:09
Did you make a reference to the .dll file?
Open your algo in automate > at top center, Manage References > Libraries > Browse to your .dll and check it > Apply > rebuild your algo and retry.
Grtz.
@.ics