![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В свое время реализовывал поиск количества (то ли цены, то ли времени) что помещается в страндартный grid на мт4 в не зависимости от масштаба в шакале времени.
Найду - выложу.
Нет.
{
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 подставить. Координата Х ведь в данном случае не имеет значения.
Интересно. Получается совсем отсутствует CHART_HEIGHT_IN_PIXELS.
А зачем???
Нельзя, к сожалению.
Можно, к счастью. )
{
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
Можно, к счастью. )
Можно вопрос - а зачем это нужно, знать цену и временной интервал пикселя?
В случаях, когда графика нет (например тестер стратегий) - все немного сложнее.
Когда-то решал по сути ту же проблему но звучала она - найти количество пипсов, припадающий на стандартную сетку в мт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;
}
Предложенный Sergei Vladimirov метод работает в случае визуального мода, когда график присутствует на чарте.
В случаях, когда графика нет (например тестер стратегий) - все немного сложнее.
Когда-то решал по сути ту же проблему но звучала она - найти количество пипсов, припадающий на стандартную сетку в мт4 терминале при любом масштабе и ширине чарта:
Ваша функция grid_1() вычисляет вертикальный масштаб в точности так же, как и в моём варианте, вы ничего не изменили. Только потом умножили этот масштаб на шаг сетки в пикселях. Да и что тут можно изменить? Как ещё можно вычислить соотношение цена/пиксель, кроме как делением разности двух цен на расстояние в пикселях между ними? )
И о каком масштабе графика можно говорить, если графика нет? Это исключительно визуальный параметр.
Ваша функция 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) Даже если графика нет, масштаб все равно будет.
Так как есть максимальная и минимальная цена на количестве видимых свеч.
Писал же:
В случаях, когда графика нет (например тестер стратегий) - все немного сложнее.