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

 

В свое время реализовывал поиск количества (то ли цены, то ли времени) что помещается в страндартный grid на мт4 в не зависимости от масштаба в шакале времени.
Найду - выложу.

 
Sergei Vladimirov:

Нет.

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

Интересно. Получается совсем отсутствует CHART_HEIGHT_IN_PIXELS.

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

Нельзя, к сожалению.
 
fxsaber:

Интересно. Получается совсем отсутствует CHART_HEIGHT_IN_PIXELS.

А зачем???

 Нельзя, к сожалению.

 Можно, к счастью. )

void OnStart()
{
        Alert("Price per pixel: ", PricesPerPixel());
}

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

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


2016.10.28 21:03:23.910 TempScript (SBER,M5) Price per pixel: 0.00501210653753025


 
Sergei Vladimirov:

Можно, к счастью. )

Точно, Спасибо! Было время, когда нельзя было.
 
Можно вопрос - а зачем это нужно, знать цену и временной интервал пикселя?
 
Alexey Volchanskiy:
Можно вопрос - а зачем это нужно, знать цену и временной интервал пикселя?
Чтобы написать, действительно, полезный/удобный тиковый индикатор.
 
Предложенный Sergei Vladimirov  метод работает в случае визуального мода, когда график присутствует на чарте.
В случаях, когда графика нет (например тестер стратегий) - все немного сложнее.
Когда-то решал по сути ту же проблему но звучала она - найти количество пипсов, припадающий на стандартную сетку в мт4 терминале при любом масштабе и ширине чарта:



#property copyright "Serhii Dziublyk"
#property link      "https://www.mql5.com/en/users/ALXIMIKS"
#property strict
#property indicator_chart_window


extern double timer = 0.1;
extern double pixel_size = 33.3;
long g_chart_id = ChartID();



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{  
   EventSetMillisecondTimer(int (timer * 1000));

   OnTimer();
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|   OnDeinit                                                               |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
   EventKillTimer();
   Comment("");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//|   OnTimer                                                               |
//+------------------------------------------------------------------+
void OnTimer(){
   grid_info(pixel_size);
}

//+------------------------------------------------------------------+
//|  return pip's value of grid or -1 on error                 |
//+------------------------------------------------------------------+
void grid_info(double grid_pixels){
   double price_max = ChartGetDouble(g_chart_id, CHART_PRICE_MAX);
   double price_min = ChartGetDouble(g_chart_id, CHART_PRICE_MIN);
  
   int bar = int(ChartGetInteger(g_chart_id, CHART_FIRST_VISIBLE_BAR));
   int bar_on_chart = int(ChartGetInteger(g_chart_id, CHART_VISIBLE_BARS));
  
   int shift = bar - bar_on_chart + 1;
  
   int price_max_pixel;
   int price_min_pixel;
   int tmp;
  
   if (!ChartTimePriceToXY(g_chart_id, 0, Time[bar], price_max, tmp ,price_max_pixel)){
      Print("Error #" + string(GetLastError()));
      return;
   }
  
   if (!ChartTimePriceToXY(g_chart_id, 0, Time[bar], price_min, tmp, price_min_pixel)){
      Print("Error #" + string(GetLastError()));
      return;
   }
   int price_difference_pixels = (price_min_pixel - price_max_pixel);
   double grid_1 = grid_1(grid_pixels);
  
   double grid_2 = grid_2(grid_pixels, price_difference_pixels, bar_on_chart, shift);
  
   Comment("Grid size = " + DoubleToString(grid_1, 0)  + "\n"
           "Price_difference_pixels = " + string(price_difference_pixels) + "\n"
           "Bars_number = " + string(bar_on_chart) + "\n"
           "Shift = " + string(shift) + "\n"    
           "\n"
           "Grid size_2 =" + DoubleToString(grid_2, 0));
          
}



//+------------------------------------------------------------------+
//|  return pip's value of grid for non visual chart                 |
//+------------------------------------------------------------------+
double grid_2(double grid_pixels, int price_difference_pixels, int bars_number, int shift){
   static double price_max;
   static double price_min;
   find_max_min_price(price_max, price_min, bars_number, shift);
   double grid = (price_max - price_min) / (price_difference_pixels) / Point * grid_pixels;
   return 1.08 * grid;
}


//+------------------------------------------------------------------+
//|   find_max_min_price                                                               |
//+------------------------------------------------------------------+
void find_max_min_price(double & price_max, double & price_min, int bars_number, int shift){
   int i = bars_number - 1;
   price_max = High[i + shift];
   price_min = Low[i + shift];
   --i;
   for(; i >= 0; --i){
      if (price_max < High[i + shift])
         price_max = High[i + shift];
      if (price_min > Low[i + shift])
         price_min = Low[i + shift];
   }
}


//+------------------------------------------------------------------+
//|  return pip's value of grid for visual chart                |
//+------------------------------------------------------------------+
double grid_1(double grid_pixels){
   double price_max = ChartGetDouble(g_chart_id, CHART_PRICE_MAX);
   double price_min = ChartGetDouble(g_chart_id, CHART_PRICE_MIN);

   int price_max_pixel;
   int price_min_pixel;
  
   int tmp;
   if (!ChartTimePriceToXY(g_chart_id, 0, Time[0], price_max, tmp ,price_max_pixel)){
      Print("Error #" + string(GetLastError()));
      return -1;
   }
  
   if (!ChartTimePriceToXY(g_chart_id, 0, Time[0], price_min, tmp, price_min_pixel)){
      Print("Error #" + string(GetLastError()));
      return -1;
   }
   double grid = (price_max - price_min) / (price_min_pixel - price_max_pixel) / Point * grid_pixels;
   return grid;
}

 
Sergey Dzyublik:
Предложенный Sergei Vladimirov  метод работает в случае визуального мода, когда график присутствует на чарте.
В случаях, когда графика нет (например тестер стратегий) - все немного сложнее.
Когда-то решал по сути ту же проблему но звучала она - найти количество пипсов, припадающий на стандартную сетку в мт4 терминале при любом масштабе и ширине чарта:

Ваша функция grid_1() вычисляет вертикальный масштаб в точности так же, как и в моём варианте, вы ничего не изменили. Только потом умножили этот масштаб на шаг сетки в пикселях. Да и что тут можно изменить? Как ещё можно вычислить соотношение цена/пиксель, кроме как делением разности двух цен на расстояние в пикселях между ними? )

И о каком масштабе графика можно говорить, если графика нет? Это исключительно визуальный параметр.

 
Sergei Vladimirov:

Ваша функция grid_1() вычисляет вертикальный масштаб в точности так же, как и в моём варианте, вы ничего не изменили. Только потом умножили этот масштаб на шаг сетки в пикселях. Да и что тут можно изменить? Как ещё можно вычислить соотношение цена/пиксель, кроме как делением разности двух цен на расстояние в пикселях между ними? )

И о каком масштабе графика можно говорить, если графика нет? Это исключительно визуальный параметр.

1) Предлагаю присмотреться к:
//+------------------------------------------------------------------+
//|  return pip's value of grid for non visual chart                 |
//+------------------------------------------------------------------+
double grid_2(double grid_pixels, int price_difference_pixels, int bars_number, int shift)


2) Даже если графика нет, масштаб все равно будет.
Так как есть максимальная и минимальная цена на количестве видимых свеч.
Писал же:

В случаях, когда графика нет (например тестер стратегий) - все немного сложнее.