Ошибки, баги, вопросы - страница 2098

Sergey Chalyshev:

Точно не бред, есть непонимание. Объясните, куда ломится метаедитор, что ему делать в инете?

Ну так не показывайте свое непонимание на людях.

Какое отношение имеет метаедитор и то что он ломится к загрузке терминалом процессора?

Вот Ренат в ветке, у него и спросите куда едитор ломится

Ребят, надоело в андроиде в мт5 постоянно вводить логин и пароль от www.mql5.com
Почему они постоянно слетают ???
Vladimir Pastushak:
Ребят, надоело в андроиде в мт5 постоянно вводить логин и пароль от www.mql5.com
Почему они постоянно слетают ???

Смените браузер на тот, который хранит пароли. Например используйте Google Chrome - он подтянет все Ваши сохранённые пароли (конечно если Вы в настольной версии Google Chrome работаете залогинившись в Google аккаунт).

Vladimir Karputov:

Смените браузер на тот, который хранит пароли. Например используйте Google Chrome - он подтянет все Ваши сохранённые пароли (конечно если Вы в настольной версии Google Chrome работаете залогинившись в Google аккаунт).


Ребят, надоело в андроиде в мт5 постоянно вводить логин и пароль от www.mql5.com

Vladimir Pastushak:

Ребят, надоело в андроиде в мт5 постоянно вводить логин и пароль от www.mql5.com

Почему-то вообще не получается авторизоваться. На сайте всё работает. В MT5 на андроиде не получается:


Почему такая весьма полезная функция как ChartXYToTimePrice() такая дорогая по времени выполнения?

Я написал функцию - аналог XYToTimePrice() и она работает гораздо быстрее. До нескольких сотен раз быстрее.
Уважаемые разработчики, загляните плиз в свой код. Такое ощущение, что он сделан весьма не оптимально и его можно убыстрить на 2-3 порядка.
Код тестового индикатора прилагаю. Просто двигайте мышкой.

void XYToTimePrice(int x,int y,datetime &time,double &price,int id)
  {
   static int left_bar; // номер самого левого бара на экране
   static int WidBar;
   static int Wid;
   static int Hei;
   static double y_min;
   static double y_max;
   static int PerSec=PeriodSeconds();
   static bool ChartChange=true;
   if(id==CHARTEVENT_CHART_CHANGE) { ChartChange=true; return; } 
   if(ChartChange) // если было изменение чатра после последнего вычисления
     {
      left_bar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);        // номер самого левого бара на экране
      Wid=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);               // ширина экрана в пикселях
      WidBar=(int)ChartGetInteger(0,CHART_WIDTH_IN_BARS);              // ширина экрана в барах
      Hei=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);              // высота экрана в пикселях
      y_min=ChartGetDouble(0,CHART_PRICE_MIN);                         // макс. цена на экране
      y_max=ChartGetDouble(0,CHART_PRICE_MAX);                         // мин. цена на экране
     }
   if(x>Wid || x<0 || y<0 || y>Hei) return;  // выходим если точка (x,y) за пределами экрана
   price=y_min+(Hei-y)*(y_max-y_min)/Hei;
   int NrBar=left_bar-(int)((double)x/((double)Wid/(double)WidBar)); 
   datetime T[1];
   if(NrBar>=0) CopyTime(NULL,0,NrBar,1,T);
   else { CopyTime(NULL,0,0,1,T); T[0]+=fabs(NrBar)*PerSec;}
   ChartChange=false;
   time=T[0];
  }
Файлы:
TestSpeedXY.mq5  12 kb
Vladimir Pastushak:
Ребят, надоело в андроиде в мт5 постоянно вводить логин и пароль от www.mql5.com
Почему они постоянно слетают ???

У меня тоже спрашивает регулярно, но я не ввожу логин/пароль, а просто жму кнопку Назад, и оказывается, что он залогинен.

Nikolai Semko:

Почему такая весьма полезная функция как ChartXYToTimePrice() такая дорогая по времени выполнения?

Я написал функцию - аналог XYToTimePrice() и она работает гораздо быстрее. До нескольких сотен раз быстрее.

Так там же еще и ChartID_in  с SubWindow_out в оригинале. Сделайте полный аналог.

fxsaber:

Так там же еще и ChartID_in  с SubWindow_out в оригинале. Сделайте полный аналог.


Добавить ChartID_in и SubWindow_out  совсем не сложно. Но я не преследую цель создать полный аналог, а лишь создал эту функцию, чтоб показать тормознутость ChartXYToTimePrice().

void XYToTimePrice(long chart_id,int x,int y,int& sub_window,datetime &time,double &price,int id)
  {
   static int left_bar; // номер самого левого бара на экране
   static int WidBar;
   static int Wid;
   static int Hei;
   static double y_min;
   static double y_max;
   static int PerSec=PeriodSeconds();
   static bool ChartChange=true;
   if(id==CHARTEVENT_CHART_CHANGE) { ChartChange=true; return; } 
   if(ChartChange) // если было изменение чатра после последнего вычисления
     {
      left_bar=(int)ChartGetInteger(chart_id,CHART_FIRST_VISIBLE_BAR, sub_window);        // номер самого левого бара на экране
      Wid=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_PIXELS, sub_window);               // ширина экрана в пикселях
      WidBar=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_BARS, sub_window);              // ширина экрана в барах
      Hei=(int)ChartGetInteger(chart_id,CHART_HEIGHT_IN_PIXELS, sub_window);              // высота экрана в пикселях
      y_min=ChartGetDouble(chart_id,CHART_PRICE_MIN, sub_window);                         // макс. цена на экране
      y_max=ChartGetDouble(chart_id,CHART_PRICE_MAX, sub_window);                         // мин. цена на экране
     }
   if(x>Wid || x<0 || y<0 || y>Hei) return;  // выходим если точка (x,y) за пределами экрана
   price=y_min+(Hei-y)*(y_max-y_min)/Hei;
   int NrBar=left_bar-(int)((double)x/((double)Wid/(double)WidBar)); 
   datetime T[1];
   if(NrBar>=0) CopyTime(NULL,0,NrBar,1,T);
   else { CopyTime(NULL,0,0,1,T); T[0]+=fabs(NrBar)*PerSec;}
   ChartChange=false;
   time=T[0];
  }

 но правда для моей функции необходим еще дополнительный параметр id события. И пока эта функция более менее одинаково работает с оригиналом при толщине свечи один пиксель, но можно ее доработать, если есть необходимость.

Nikolai Semko:

Добавить ChartID_in и SubWindow_out  совсем не сложно. Но я не преследую цель создать полный аналог, а лишь создал эту функцию, чтоб показать тормознутость ChartXYToTimePrice().

 но правда для моей функции необходим еще дополнительный параметр id события. И пока эта функция более менее одинаково работает с оригиналом при толщине свечи один пиксель, но можно ее доработать, если есть необходимость.


А еще я заметил странную особенность ChartXYToTimePrice. Время ее выполнения  прямо пропорциональна количеству бар на графике.

Это говорит о "странности" алгоритма её вычисления. А именно о циклическом суммировании, что весьма странно для оптимального решения подобной задачи.

Скорость же функции XYToTimePrice одинакова вне зависимости от количества бар.

И, по правде сказать,  скорость выполнения функций ChartGetInteger и ChartGetDouble тоже явно невероятно завышена и имеет очень странные особенности. Например функция 

ChartGetDouble(0,CHART_PRICE_MAX);

выполняется в 20-100 раз быстрее функции:

ChartGetDouble(0,CHART_PRICE_MIN);          

если МAX стоит после MIN:

но если поменять их местами, ситуация будет обратной.


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

Хотя я и не исключаю, что данный эффект происходит из-за какой-то особенности профилирования и носит фейковый характер. Но тормознутость этих функций не фейковая.