Библиотеки: Easy Canvas - страница 13

 
Mighty7:

Can you please answer 1 last question? What is faster, shifting left/right or shifting up/down? Thanks again.

Сдвиг вниз-вверх немного быстрее чем влево-вправо. Весь сдвиг занимает примерно 0.3 милисекунды (1/3000 секунды) на среднем компьютере стандартного окна FullHD экрана.

Shift up and down is slightly faster than left and right. The entire shift takes about 0.3 milliseconds (1/3000 of a second) on an average computer of a standard FullHD window.

 
Nikolai Semko:

Сдвиг вниз-вверх немного быстрее чем влево-вправо. Весь сдвиг занимает примерно 0.3 милисекунды (1/3000 секунды) на среднем компьютере стандартного окна FullHD экрана.

Shift up and down is slightly faster than left and right. The entire shift takes about 0.3 milliseconds (1/3000 of a second) on an average computer of a standard FullHD window.

Thank you.

 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }

Несколько раз получил тут деление на 0, но после перезапуска терминала не воспроизводится )

 
Oleksii Chepurnyi:

Несколько раз получил тут деление на 0, но после перезапуска терминала не воспроизводится )

странно, у меня такого не было.
ну тогда замените пока так:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (W.dx_pix==0) return;
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

хотя нет, лучше так:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
К сожалению не могу обновить версию в КБ. Что-то в очередной раз поломали.
Файлы:
iCanvas.mqh  52 kb
 

Было бы интересно увидеть универсальное решение с 4к и 8к мониторами.

К примеру, рисуем прямоугольник, на нём две кнопки и два поля ввода. Кнопки соответственно объектами в пикселях.

Раз в пикселях, значит всё уменьшится в 2 раза на 4к разрешении, кроме полей ввода.

А вот если автоматически переводить всё полотно канваса x2, то при любом разрешении экрана всё будет выглядеть и как на обычном мониторе.

Ещё может быть проблема в том, что некоторые пользователи лезут в настройки виндоус и увеличивают шрифт (что увеличивает стандартное поле ввода).

Отсюда возникает ещё более универсальное решение изменять пикселизацию листа канваса со множителем, зависимым от размера шрифта.


Главное условие - рисование, как на обычном full HD мониторе с привычными размерами в пикселях. Ищется решение:

1. Изменение масштаба листа строго x2 (при 4к), x4 (при 8к)

2. Изменение масштаба листа с динамичным множителем, привязанным к размеру шрифта


Для чего? Для дэшбордов, торговых панелей и прочего, что рисуется объектами в пикселях.

 
Vitaliy Kuznetsov:

Было бы интересно увидеть универсальное решение с 4к и 8к мониторами.

К примеру, рисуем прямоугольник, на нём две кнопки и два поля ввода. Кнопки соответственно объектами в пикселях.

Раз в пикселях, значит всё уменьшится в 2 раза на 4к разрешении, кроме полей ввода.

А вот если автоматически переводить всё полотно канваса x2, то при любом разрешении экрана всё будет выглядеть и как на обычном мониторе.

Ещё может быть проблема в том, что некоторые пользователи лезут в настройки виндоус и увеличивают шрифт (что увеличивает стандартное поле ввода).

Отсюда возникает ещё более универсальное решение изменять пикселизацию листа канваса со множителем, зависимым от размера шрифта.


Главное условие - рисование, как на обычном full HD мониторе с привычными размерами в пикселях. Ищется решение:

1. Изменение масштаба листа строго x2 (при 4к), x4 (при 8к)

2. Изменение масштаба листа с динамичным множителем, привязанным к размеру шрифта


Для чего? Для дэшбордов, торговых панелей и прочего, что рисуется объектами в пикселях.

Ключ к решению это TERMINAL_SCREEN_DPI.
Никакой сложности здесь нет. У меня давно все реализовано. 
Нет времени для демонстрационных примеров.
Если есть сложности с пониманием процесса, погуглите как это реализуется в JS.
 
Nikolai Semko:
Ключ к решению это TERMINAL_SCREEN_DPI.
Никакой сложности здесь нет. У меня давно все реализовано. 
Нет времени для демонстрационных примеров.
Если есть сложности с пониманием процесса, погуглите как это реализуется в JS.

Да, в поиске потом нашёл. Спасибо. Тут есть пример - https://www.mql5.com/ru/docs/constants/environment_state/terminalstatus

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

Доброго времени, коллеги!

А чего у меня не работает код ниже? Для примера хотел нарисовать кружки над барами у которых определенные условия. 

void  OnTimer()

 {

    Canvas.Erase(0x00FFFFFF);

      for(int i = 0; i < 100 ; i++)

       {

        if(iClose(_Symbol, PERIOD_CURRENT, i + 1) > iClose(_Symbol, PERIOD_CURRENT, i + 2))

         {

          Canvas.Circle((int)_X(Canvas.Bar(i + 1)), (int)_Y(Canvas.Price(iClose(_Symbol, PERIOD_CURRENT, i + 1))), 5, 0x88ff9999);

         }

       }

  Canvas.Update();

 }


 
Petr Zharuk #:

Доброго времени, коллеги!

А чего у меня не работает код ниже? Для примера хотел нарисовать кружки над барами у которых определенные условия. 

void  OnTimer()

 {

    Canvas.Erase(0x00FFFFFF);

      for(int i = 0; i < 100 ; i++)

       {

        if(iClose(_Symbol, PERIOD_CURRENT, i + 1) > iClose(_Symbol, PERIOD_CURRENT, i + 2))

         {

          Canvas.Circle((int)_X(Canvas.Bar(i + 1)), (int)_Y(Canvas.Price(iClose(_Symbol, PERIOD_CURRENT, i + 1))), 5, 0x88ff9999);

         }

       }

  Canvas.Update();

 }


На первый взгляд вижу пока одну проблему. Для координаты X необходимо:
_X(double (i))
Фукциия double Canvas. Bar(int x) возвращает номер бара по координате x окна 
 
Petr Zharuk #:

Доброго времени, коллеги!

А чего у меня не работает код ниже? Для примера хотел нарисовать кружки над барами у которых определенные условия.

void  OnTimer()

 {

    Canvas.Erase(0x00FFFFFF);

      for(int i = 0; i < 100 ; i++)

       {

        if(iClose(_Symbol, PERIOD_CURRENT, i + 1) > iClose(_Symbol, PERIOD_CURRENT, i + 2))

         {

          Canvas.Circle((int)_X(Canvas.Bar(i + 1)), (int)_Y(Canvas.Price(iClose(_Symbol, PERIOD_CURRENT, i + 1))), 5, 0x88ff9999);

         }

       }

  Canvas.Update();

 }

добрался до компьютера:

void  OnTimer()
  {
   Canvas.Erase(0x00FFFFFF);
   for(int i = (int)W.Right_bar; i <= W.Left_bar ; i++)
     {
      if(iClose(_Symbol, _Period, i) > iClose(_Symbol, _Period, i + 1))
        {
         Canvas.FillCircle((int)_X((double)i), (int)_Y(iClose(_Symbol, _Period, i)), 5, 0x88ff9999);
        }
     }
   Canvas.Update();
  }



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