Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Может быть, их надо просто почаще перерисовывать?
P.S. Линии, начинающиеся непосредственно в этих точках, вряд ли можно, так как опорные точки линий всегда жестко привязаны к барам. Надо эти опорные точки вычислять.
Вопрос на засыпку для Quod Licet: если все это нарисовать крестиками, то на какие из пересечений линий надо обращать взгляд?
Иронию Вашу полагаю неуместной, поскольку отдельно написал, что ситуации детально не знаю, а потому настаивать не могу. Это была всего лишь идея, мелькнувшая при взгляде на Ваш изначальный пост (сам я предпочитаю меньшие масштабы, и нецелое смещение не использую). Пользоваться или не пользоваться ею - Ваше право.
Не вижу, в чем Вы усматриваете проблему при программном вычислении зума (обсужденных в данном треде возможностей достаточно, и практически все шаги для написания такой функции Вы проделали, осталось лишь оформить это в три строчки кода - во всяком случае, в моей аналогичной функции три строчки), однако используемые Вами тонны сарказма делают общение малопродуктивным, засим откланиваюсь.
Кстати, когда как следует подумал, у меня тут же получились функции вычисления или установки зума (скрипт). Правда, не в 3 строки:
Неприятное открытие: знания зума и разрешения экрана не достаточно для воспроизведения результатов (ровно 8 точек между барами). Видимо, какую-то роль тут могут играть параметры метрики шрифтов, отображаемых в системе. Вот они, издержки решения чисто графической задачи плохо приспособленными для этого текстовыми инструментами...
return(MathLog((GetClientWidth(hwnd)-3-41)/WindowBarsPerChart())/MathLog(2)) возвращает искомый вами масштаб. Ровно одна строчка. И еще две строчки - в dll, которая оборачивает GetClientRect в GetClientWidth.
В общем же, есть одна особенность - GetClientRect возвращает LPRECТ - это структура (а структур в mql нет), поэтому проще именно обернуть (wrapping - общепринятый термин) ее своей функцией, возвращающей int. На каком-то этапе становится удобней таки иметь свою dll с утилитами, некоторые вещи без нее не сделаешь, а добавление функции-враппера в уже имеющийся код в этом случае элементарно.
Если все же нужно обойтись - то попробуйте int& buf[].
GetClientRect описано следующим образом
BOOL GetClientRect(
HWND hWnd,
LPRECT lpRect
);
опишите ее в импорте как int GetClientRect(int hwnd, int& buf[]), передайте туда буфер достаточного размера, и посмотрите на результат. Если мне не изменяет память, int в mql 32-битный, так что, возможно, придется посмотреть на четные элементы массива, поскольку long длиннее в два раза. Короче, немного экспериментирования, и у вас должно получиться. В конце концов, передавайте string (предварительно инициализированный длинной строкой-константой) - его тоже можно рассматривать как массив.
"Максимальная и минимальная видимые котировки"
И еще: Ваша функция зума все время возвращает целые значения с точностью до 8 знаков (я ради прикола специально объявил результат как double). Вы об этом не задумывались? Мистика какая-то... Это ж по сути означает, что независимо от ширины окна (Width-44)/BarsPerChart - всегда точная степень двойки. Но это не так на самом деле, я проверил вручную. Где у меня шарики за ролики заехали?
P.S. Да уж, бывает... Внутри логарифма - целочисленное деление с округлением в сторону MathFloor()!
По поводу P.S. MathFloor - ага.