Фиксировать масштаб в МТ5

 

 Прошу у знающих людей помощи в автоматизации процесса по фиксингу масштаба и приведению рабочего пространства графика к следующему виду:

Рис.1

 В таком состоянии с графиком легко работать и он передвигается во всех четырех направлениях. Однако после смены профиля или ТФ график возвращается в первоначальное состояние.

Рис 2.


Была поставлена задача по написанию индикатора для автоматического перехода графика в изначальное рабочее состояние и поддержание его таковым (Рис.1)

Мною была найдена и частично автоматизированна эта работа:

1) Действие (1). Открываем свойства графика и прописываем (фиксированный максимум * 1,5) и (фиксированный минимум/1,5) , таким образом расширяем диапазон видимой цены.

Рис.3

  Эта возможность легко реализуется в коде и с ней вопросов не возникает. Далее Ок.

2) Действие (2). График получился следующего вида:

Рис.4

 Неудобоваримая кривая линия, что-бы получить снова наш график как на Рис.1,  я делаю двойной клик мыши в область ценовой шкалы:


  Вот тут и возникает вопрос: двойной клик не запрограммировать, а чем заменить это действие(2) я ума не приложу. Должен быть какой-то другой вариант решения этой задачи?

Напоминаю, что работа ведется в МТ5.

 

Алгоритм без программирования кликов:

1. Определяете макс (d_Highest) и мин (d_Lowest) значения цены на видимом уч-ке и вычисляете высоту (d_Height) в ценах инструмента. OFF: теоретически можно прочесть приблизительные значения из WindowPriceMax / WindowPriceMin или ChartGetDouble(0, CHART_PRICE_MAX) / ChartGetDouble(0, CHART_PRICE_MIN). Но практически они работают хрен знает как, причём, похоже что разработчики в состав спецгруппы "хрен" не входят - вопрос про масштабирование графика мёртво висит в сервисдеске уже полгода. Поэтому надёжнее самому организовать определение Highest High и Lowest Low

2. Включаете фиксированный масштаб ChartSetInteger(0, CHART_SCALEFIX, true)

3. Устанавливаете фиксированные границы с нужным сдвигом (сдвиг - заданный в настройках % от размаха графика d_Ratio) ChartSetDouble(0, CHART_FIXED_MAX, d_Highest + d_Height * d_Ratio) / ChartSetDouble(0, CHART_FIXED_MIN, d_Lowest - d_Height * d_Ratio)

4. Запоминаете d_Highest и d_Lowest и отслеживаете их изменение - если изменение больше заданного в настройках (d_Step), обновляете фиксированные границы. Можно не отслеживать, а просто повторять всю процедуру по каждому движению цены или графика, но это потребует много больше ресурсов

Наверно это кажется сложно, но на сам деле функция занимает 8 строк + несколько строк в OnChartEvent. Но у меня это MT4 и задача другая - вертикальная центровка по цене Bid - поэтому кодом делиться не буду