Компилятор не причем - это логическая ошибка.
if (LongPos == null && ShortPos == null)
{
longi = source.Positions.LastLongPositionClosed.Profit();
shorti = source.Positions.LastShortPositionClosed.Profit();
}
Очень странный код, проверяется, что переменные равны null и вызывается функция Profit() для source.Positions.LastLongPositionClosed. Хотя значение LastLongPositionClosed на null не проверяется. А оно им может быть, более того - будет обязательно, т.к. в начале работы позиций нет вообще.