Ценовой интервал в одном пикселе чарта по-вертикали

 

Как узнать, какой ценовой интервал содержится в одном пикселе чарта по-вертикали?

И какой временной интервал содержится в одном пикселе чарта по-горизонтали?

Вопросы могут показаться элементарными, поскольку есть такие возможности

  • CHART_HEIGHT_IN_PIXELS
  • CHART_WIDTH_IN_PIXELS
  • CHART_PRICE_MAX
  • CHART_PRICE_MIN
  • CHART_WIDTH_IN_BARS
  • ChartPeriod
  • PeriodSeconds
Однако, например, напрашивающийся сразу ответ (CHART_PRICE_MAX - CHART_PRICE_MIN) / CHART_HEIGHT_IN_PIXELS не верный (и это логично).
 
fxsaber:

Как узнать, какой ценовой интервал содержится в одном пикселе чарта по-вертикали?

И какой временной интервал содержится в одном пикселе чарта по-горизонтали?

Вопросы могут показаться элементарными, поскольку есть такие возможности

  • CHART_HEIGHT_IN_PIXELS
  • CHART_WIDTH_IN_PIXELS
  • CHART_PRICE_MAX
  • CHART_PRICE_MIN
  • CHART_WIDTH_IN_BARS
  • ChartPeriod
  • PeriodSeconds
Однако, например, напрашивающийся сразу ответ (CHART_PRICE_MAX - CHART_PRICE_MIN) / CHART_HEIGHT_IN_PIXELS не верный (и это логично).
А если попробовать преобразовать 0 пиксель в цену и последний пиксель в цену, получить разность, поделить на пункт и поделить на количество пикселей?
 
Alexey Kozitsyn:
0 пиксель в цену и последний пиксель в цену
Это, соответственно, CHART_PRICE_MAX и CHART_PRICE_MIN.
 
fxsaber:
Это, соответственно, CHART_PRICE_MAX и CHART_PRICE_MIN.

Предположим, хотя, я бы проверил.

А почему решение не верное? 

 
Alexey Kozitsyn:

Предположим, хотя, я бы проверил.

А почему решение не верное? 

Допустим, нам известно, какой ценовой интервал содержится в каждом пикселе. Формула была бы верной, если бы CHART_PRICE_MAX был максимальной границей самого верхнего известного нам интервала, а CHART_PRICE_MIN - минимальной границей самого нижнего известного нам интервала. Но это не так.
 
fxsaber:
Допустим, нам известно, какой ценовой интервал содержится в каждом пикселе. Формула была бы верной, если бы CHART_PRICE_MAX был максимальной границей самого верхнего известного нам интервала, а CHART_PRICE_MIN - минимальной границей самого нижнего известного нам интервала. Но это не так.
Думаю, если вертикальный масштаб будет фиксирован - все будет ок. А иначе частые проверки этого самого масштаба. Ведь цена его может сама изменить.
 
Alexey Kozitsyn:
Думаю, если вертикальный масштаб будет фиксирован - все будет ок. А иначе частые проверки этого самого масштаба. Ведь цена его может сама изменить.

Фиксированность вертикального масштаба - это ручное задание того, что делается автоматом. Не более того.

Вопрос на самом деле довольно тонкий для обсуждения, т.к. в этой теме надо покопаться.

Возобновил написание тикового индикатора и сталкиваюсь вот с такими проблемами. Что-нибудь кривое, да выложу в кодобазу.

 
fxsaber:

Как узнать, какой ценовой интервал содержится в одном пикселе чарта по-вертикали?

И какой временной интервал содержится в одном пикселе чарта по-горизонтали?

Вопросы могут показаться элементарными, поскольку есть такие возможности

  • CHART_HEIGHT_IN_PIXELS
  • CHART_WIDTH_IN_PIXELS
  • CHART_PRICE_MAX
  • CHART_PRICE_MIN
  • CHART_WIDTH_IN_BARS
  • ChartPeriod
  • PeriodSeconds
Однако, например, напрашивающийся сразу ответ (CHART_PRICE_MAX - CHART_PRICE_MIN) / CHART_HEIGHT_IN_PIXELS не верный (и это логично).

Преобразуйте CHART_PRICE_MAX и CHART_PRICE_MIN в пиксельные координаты с помощью ChartTimePriceToXY().

 
Sergei Vladimirov:

Преобразуйте CHART_PRICE_MAX и CHART_PRICE_MIN в пиксельные координаты с помощью ChartTimePriceToXY().

Так?
datetime GetVisibleTime( const long Chart_ID = 0 )
{
  datetime TmpTime;
  double TmpPrice;
  int TmpSubWindow;

  ChartXYToTimePrice(Chart_ID, 0, 0, TmpSubWindow, TmpTime, TmpPrice); // находим корректные координаты для ChartTimePriceToXY

  return(TmpTime);
}

int ChartPriceToY( const double Price )
{
  int X, Y;
  
  ChartTimePriceToXY(0, 0, GetVisibleTime(), Price, X, Y);
  
  return(Y);
}

double PricesPerPixel( void )
{
  return((double)(ChartPriceToY(ChartGetDouble(0, CHART_PRICE_MAX)) - ChartPriceToY(ChartGetDouble(0, CHART_PRICE_MIN))) /
         ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));
}
 

fxsaber: 


Так?

Нет.

double PricesPerPixel( void )
{
        double fMaxPrice = ChartGetDouble(0, CHART_PRICE_MAX);
        double fMinPrice = ChartGetDouble(0, CHART_PRICE_MIN);
        
        return((fMaxPrice - fMinPrice) / (ChartPriceToY(fMinPrice) - ChartPriceToY(fMaxPrice)));
}

И вместо GetVisibleTime() можно просто 0 подставить. Координата Х ведь в данном случае не имеет значения.
 

Причина обращения: