Умная автопрокрутка графика

При обычном наблюдении за рынком функция автопрокрутки обычно полезна, особенно на мелких таймфреймах, где нулевой бар может убежать за край экрана за несколько минут или часов, однако часто бывает полезно посмотреть историю сразу на том же графике, посмотреть прошлые дни, отработку старых уровней, сделать построение по прошлым данным (трендовые линии, каналы), не влезающие в текущее окно. Приходится постоянно включать или отключать автопрокрутку. Это можно автоматизировать.

После начала использования этой функции я больше не нажимаю кнопку включения и отключения автопрокрутки на графике, теперь это делается автоматически. За два года использования этой функции ещё ни разу не пришлось её отключать, а графики с её отсутствием кажутся ущербными.

Идея умной автопрокрутки в том, что при наличии на экране последнего бара (с индексом 0) включается функция автопрокрутки. Но если пролистать график в прошлое, то автопрокрутка отключается, и можно дальше исследовать историю, не беспокоясь о том, что на следующем тике график вернётся к последним данным.



(обратите внимание на включение и отключение автопрокрутки на панели инструментов)

Работает это довольно просто. Достаточно отслеживать в OnChartEvent текущее положение нулевого бара. Если он внутри видимого окна, то выключать автопрокрутку, иначе - включать.

Эта функция уже есть в индикаторе BetterChart, вот так выглядит основной код (версия 1.0):

void chart_event()
{
    if (!_chartevent.is_chart_change_event())
        return;

    int last_visible_bar = chart_.last_visible_bar();
    int scale = chart_.scale();
    
    // Включить автосдвиг, если в текущей ситуации виден последний бар, либо если
    // был изменён масштаб графика и при этом раньше последний бар был видим.
    bool enable_autoscroll = (last_visible_bar < 0) || ((prev_scale_ != scale) && (prev_last_visible_bar_ < 0));
    chart_.autoscroll(enable_autoscroll);
    
    prev_last_visible_bar_ = last_visible_bar;
    prev_scale_ = scale;
}

К сожалению, я не помню, зачем нужно было это дополнение про масштаб. Скорее всего, это обход какой-то проблемы. Вспомню - допишу. Обязательно пишите комментарии в вашем коде в таких ситуациях.

Отключение автопрокрутки может не сработать вовремя, т.е. до прихода нового тика, когда MT сдвинет всё на последний бар, если тики идут очень быстро, и  вы не успеваете прокрутить график достаточно далеко, чтобы нулевой бар ушёл за правый край. Эту проблему могут усугублять тяжелые индикаторы.

Но обычно хватает одного резкого движения колеса мыши вниз, фактически это движение заменило для меня отключение режима автопрокрутки. Включить обратно можно клавишей End, включением автопрокрутки стандартным способом, либо ручной прокруткой до самого правого бара графика.