haClose = (C[i] + O[i] + L[i] + H[i]) / 4;
// далее - неверно!!! нужно использовать haOpen и haClose !!!
// haOpen = ( O[i - 1] + C[i - 1] ) / 2;
// должно быть так:
haOpen = (haOn[i - 1] + haCn[i - 1]) / 2;
haLow = Math.Min(L[i], Math.Min(haOpen, haClose));
haHigh = Math.Max(H[i], Math.Max(haOpen, haClose));
с префиксом haXXX - параметры свечи Heikin Ashi (это haOpen haClose, haLow, haHigh), без префикса - параметры обычной свечи (O,L,C,H), haOn - список значений haOpen, haCn - список значений haClose.
Таким образом, сначала высчитаем значение Закрытия свечи HA (складывая O,C,L,H соответствующей обычной свечи)
haClose = (C[i] + O[i] + L[i] + H[i]) / 4;
затем высчитываем значение Открытия свечи HA
haOpen = (haOn[i - 1] + haCn[i - 1]) / 2;
беря значения haOpen и haClose предыдущей свечи HA
затем высчитываем Минимум свечи HA
haLow = Math.Min(L[i], Math.Min(haOpen, haClose));
выбирая минимум из Лоу обычной свечи, Открытия и Закрытия свечи HA
ну и напоследок так же считаем Максимум свечи HA
на самом деле всё легко понять, если взять из интернета оригинальную формулу и сравнить с этим кодом