Сегодня вместе с разработчиками нашли ошибку в моих скриптах. Оказывается, список позиций в реальной работе передается уже заполненным, в лаборатории же он всегда пустой и формируется по мере расчета. Поэтому, когда вы находитесь в позиции нужно проверять еще и текущий бар. Текущий бар должен быть больше бара открытия позиции, иначе это может порождать забавные глюки. Типа открыл-закрыл. Меня кстати сегодня это спасло от лося случайно. Но проверку я все же переделал.
Итак правильная проверка:
if (
position == null /* && other conditions*/
) {
// try to buy or sell
} else {
if (null == position || position.EntryBarNum > barNum)
continue;
// stop loss, take profit or close by market logic
}