Скачать MetaTrader 5

Какой получить размер сетки графика?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
58686
Vladimir Karputov  

Здравствуйте.

Скажите, можно ли получить размер сетки графика по вертикали для одного из шести значений масштаба  

Nikolay Demko
12559
Nikolay Demko  
barabashkakvn:

Здравствуйте.

Скажите, можно ли получить размер сетки графика по вертикали для одного из шести значений масштаба  

Размер в каких единицах?

Если в барах то (int)pow(2,ChartGetInteger(0,CHART_SCALE));

ЗЫ Ошибочка, там обратная нумерация возвращается, правильная формула дающая количество баров в одном степе сетки (int)pow(2, 5- ChartGetInteger(0,CHART_SCALE));

Vladimir Karputov
Модератор
58686
Vladimir Karputov  
Urain:

Размер в каких единицах?

Если в барах то (int)pow(2,ChartGetInteger(0,CHART_SCALE));

Хотелось-бы размер сетки по вертикали получить или в пикселях или в ценах.  

Nikolay Demko
12559
Nikolay Demko  

Значение масштаба [(+)(-)] от 0 до 5 это масштабирование по горизонтали, вертикальный масштаб зависит от количества видимых в окне баров, затем ищется максимум и минимум этих видимых баров и на основе этих макс и мин делается разбиение с шагом не менее 5.

По идее должны быть минимальное и маскимальное количество кубиков, которое задаёт алгоритму точку перехода в новое состояние сетки (но этот вопрос я не изучал).

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Отображение графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Отображение графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Отображение графиков - Документация по MQL5
Vladimir Karputov
Модератор
58686
Vladimir Karputov  
Urain:

Значение масштаба [(+)(-)] от 0 до 5 это масштабирование по горизонтали, вертикальный масштаб зависит от количества видимых в окне баров, затем ищется максимум и минимум этих видимых баров и на основе этих макс и мин делается разбиение с шагом не менее 5.

По идее должны быть минимальное и маскимальное количество кубиков, которое задаёт алгоритму точку перехода в новое состояние сетки (но этот вопрос я не изучал).

У меня похожий алгоритм. 

Просто хотелось привязывать горизонтальный индикатор ("Рыночный профиль") к сетке графика - в таком случае смотрелось-бы красиво. 

Dmitry Fedoseev
45329
Dmitry Fedoseev  
Диапаззон по вертикали можно определеить. С каким шагом сетка нарисована - нет и пытаться не стоит.
Ihor Herasko
11270
Ihor Herasko  
Integer:
Диапаззон по вертикали можно определеить. С каким шагом сетка нарисована - нет и пытаться не стоит.
Это в четверке так было. Там до сих пор такие проблемы. А вот в пятерке с шагом сетки проблем не замечал. В ней, вроде бы, алгоритм другой. Потому и вычислить можно, как написали выше.
Dmitry Fedoseev
45329
Dmitry Fedoseev  
Scriptong:
Это в четверке так было. Там до сих пор такие проблемы. А вот в пятерке с шагом сетки проблем не замечал. В ней, вроде бы, алгоритм другой. Потому и вычислить можно, как написали выше.
Не знаю не пробовал. В теории все легко, показал бы кто на практике.
Ihor Herasko
11270
Ihor Herasko  
Integer:
Не знаю не пробовал. В теории все легко, показал бы кто на практике.

1. Получаем высоту графика в пикселах (CHART_HEIGHT_IN_PIXELS).

2. Получаем  разность максимальной и минимальной цен графика (CHART_PRICE_MAX - CHART_PRICE_MIN).

3. Вычисляем кол-во пунктов, приходящееся на один пиксел. 

Далее пока только предположения, т. к. досконально не занимался.

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

Конечно, чтобы не гадать, можно было бы просто попросить MQ опубликовать (или хотя бы подсказать суть) алгоритм, рисующий сетку. На мой взгляд, в нем не должно быть никакой военной тайны.

Dmitry Fedoseev
45329
Dmitry Fedoseev  
На практике замучаешься. Где то надо floor(), где-то ceil(), где-то round(), где-то добавить пиксель, где-то отнять. Раньше может быть сразу кинулся эксприментировать, искать, а сейчас проще смотрю на мир - нет такой функции, значит и  не надо.
Ihor Herasko
11270
Ihor Herasko  

В итоге на скорую руку получилось так (метод не претендует на точность, но вектор должен быть понятен):

   double point = _Point;
   if (point == 0)
      return;

   double priceMin = ChartGetDouble(0, CHART_PRICE_MIN, 0);
   double priceMax = ChartGetDouble(0, CHART_PRICE_MAX, 0);
   long height = ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0);
   if (height == 0)
      return;
   
   long heightIn5Points = long((priceMax - priceMin) / (5 * point));
   double ratio = double (height / heightIn5Points);
   int gridStep = MathMax(32, int (MathRound(ratio)));
   
   Print("Шаг сетки в пикселах = ", gridStep);
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий