Hello fellows,
I hacked together this to get a feeling of quantconnect and I get this error, wich suggests I have to declare somehow the apriOrdineTest object. (I'm new to both QC and CSharp so excuse me if this is a very dumb question)
I just dont understand why the commented out IF works and the current IF with more conditions does not.
The error is: "Runtime Error: Object reference not set to an instance of an object"


namespace QuantConnect.Algorithm.CSharp
{

public class BasicTemplateAlgorithm : QCAlgorithm
{
private Symbol spy = QuantConnect.Symbol.Create("SPY", SecurityType.Equity, Market.USA);
private HeikinAshi heikinHour;
private HeikinAshi heikinDay;
decimal spread = .0001m;
decimal price;
OrderTicket lastOrderTicket = null;
decimal prezzOrdineAltoDelGiorno = 0;
bool condizioneDiSicurezza = true;



public override void Initialize()
{
SetStartDate(2018, 10, 07); //Set Start Date
SetEndDate(DateTime.Now.Date.AddDays(-1));
SetCash(100000); //Set Strategy Cash

AddEquity("SPY", Resolution.Hour);
var eurusd = AddForex("EURUSD", Resolution.Hour, Market.Oanda);
eurusd.SetDataNormalizationMode(DataNormalizationMode.Raw);
heikinDay = HeikinAshi("EURUSD", Resolution.Daily);
heikinHour = HeikinAshi("EURUSD", Resolution.Hour);

}

public override void OnData(Slice data)
{
var tickets = Transactions.GetOpenOrderTickets().ToList();
var orders = Transactions.GetOpenOrders();
var holdings_eurusd = Portfolio["EURUSD"].Quantity;

apriOrdineTest();
controllaTicket();

}

// Override the base class event handler for order events
/*public override void OnOrderEvent(OrderEvent orderEvent)
{
var lastOrder = Transactions.getOrderById(lastOrderId);
var order = Transactions.GetOrderById(orderEvent.OrderId);
Console.WriteLine("{0}: {1}: {2}", Time, order.Type, orderEvent);

}*/


// funzione di prova che apre l'ordine /---------------------
public void apriOrdineTest(){

if(!heikinHour.IsReady) { // THIS ONE causes Runtime Error: Object reference not set to an instance of an object
var heikinValue = heikinHour;
}
else
{
if(condizioneDiSicurezza == true){
if(lastOrderTicket == null) {lastOrderTicket = StopMarketOrder("EURUSD", 1, Decimal.Add(heikinHour.High, spread));}
// Runtime Error: Object reference not set to an instance of an object
if(Transactions.GetOrderById(lastOrderTicket).Status == OrderStatus.Filled && Transactions.GetOrderById(lastOrderTicket).Price < heikinHour.High) {
prezzOrdineAltoDelGiorno = Transactions.GetOrderById(lastOrderTicket).Price;
lastOrderTicket = StopMarketOrder("EURUSD", 1, Decimal.Add(heikinHour.High, spread));
}
}
else // condizione sicurezza
{
Log("Non ci sono le condizioni di sicurezza per procedere");
}
}

/*if (lastOrderTicket == null){ // THIS ONE GOES

if(!heikinHour.IsReady) {
var heikinValue = heikinHour;
}
else // heikin hour is ready
{
//if(){}
Debug("lanciato apriOrdineTest()");
lastOrderTicket = StopMarketOrder("EURUSD", 1, Decimal.Add(heikinHour.High, spread));
Debug("lastOrderTicket = " + lastOrderTicket);
}

}*/

}

public bool ordinePrecedente(){
int lastOrder_id = Transactions.LastOrderId;
var lastOrder_status = Transactions.GetOrderById(lastOrder_id).Status;
var lastOrder_time = Transactions.GetOrderById(lastOrder_id).Time;
//var lastOrder_ticket = Transactions.GetOrderById(lastOrder_id);

Debug("lastOrder_status " + lastOrder_status.ToString() +" lastOrder_time " + lastOrder_time);

/*if(lastOrder_status ==){return true;}
else
{return false;}*/

return true;

//Values: New, Submitted, PartiallyFilled, Filled, Canceled, None, Invalid, CancelPending

}

public void controllaTicket(){ //---------------------
decimal peggiorePerdita = 0;

var tickets = Transactions
.GetOrderTickets(x => x.Status == OrderStatus.Filled);
DateTime ticketTime = Time;

int worstOrderId = 0;

Debug("Average price of " + Portfolio["EURUSD"].Quantity + " fills at average " + Portfolio["EURUSD"].AveragePrice);

foreach (var ticket in tickets){
var symbol = ticket.Symbol;
var fillQuantity = ticket.QuantityFilled;
var fillPrice = ticket.AverageFillPrice;
ticketTime = ticket.Time;

if (fillPrice - price > peggiorePerdita){
peggiorePerdita = fillPrice - price;
worstOrderId = ticket.OrderId;
}
}
}
}
}