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

 

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

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

 
barabashkakvn:

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

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

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

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

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

 
Urain:

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   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);