Ну, во-первых, хочу предупредить, что я со сжатием работал мало и только на истории. Так что, вполне возможно не вижу какого то хорошего решения.

Последний бар закрыт не всегда. Регулярно получаю сообщение от программы типа "Нет свечи для привязки заявки № ... Сигналы сформированы не будут". Насколько я понимаю, это происходит когда на незакрытой свече была сделка.

Последний часовой бар у вас закрыт 1 раз из 6. Закрыт в смысле больше не будет меняться. на пересчете в 14:20 у вас будет один бар со временем 14:00, а на пересчете 14:30 другой. Вы, как я понимаю, хотите отфильтровать сигналы с незакрытых баров. Для этого надо написать условие проверяющее закрыт ли последний часовой бар.

Как бы я это делал:
Вариант №1: С учетом того что время на компьютере отличается от времени сервера на секунды, а скрипт работает на 10 минутках, то если системное время на 59 минут больше времени последнего часового бара, то этот бар не будет меняться. Например если время последнего сжатого бара 14:00, а сейчас 14:59 или позже то последний часовик закрыт. По хорошему еще бы проверить, что 10 минутный бар закрыт через ctx.IsLastBarClosed

Вариант №2: Часовой бар закрыт когда время последнего 10 минутного бара равно 18:40 или неважно сколько часов и 50 минут. Тут могут быть проблемы если бара с нужным временем не будет Например это возможно на неликвидных инструментах. Не думаю, что вы собираетесь торговать что-то, где может не быть сделок более 10 минут, но помнить об этом надо. Еще возможны технические проблемы на бирже - как приостановка торгов вчера на мосбирже.