MetaTrader 4 Client Terminal build 646: Умный поиск, книги в Маркете и обновление окна параметров MQL4-программы - страница 40

 

Вопрос, скорей к разработчикам! Но если мне объяснит любой осведомлённый, также буду благодарен!

Почему в журнале Реала вдруг появилась запись с красным кирпичом?!

10:47:43.544 Signal: '916461': failed get list of signals,connection error 

Я ведь не связан с сигналами, они мне не нужны! Или это новая манера навязывать этот сомнительный, по моему мнению, сервис?!

 

Добавляю объект OBJ_BUTTON, OBJPROP_CORNER = CORNER_RIGHT_LOWER, OBJPROP_ANCHOR = ANCHOR_RIGHT_LOWER.

Кнопка залазит за правый нижний угол. Похоже баг.

Нет разницы - что ставить ANCHOR_LEFT_UPPER, что ANCHOR_RIGHT_LOWER.

 
RickD:

Добавляю объект OBJ_BUTTON, OBJPROP_CORNER = CORNER_RIGHT_LOWER, OBJPROP_ANCHOR = ANCHOR_RIGHT_LOWER.

Кнопка залазит за правый нижний угол. Похоже баг.

Нет разницы - что ставить ANCHOR_LEFT_UPPER, что ANCHOR_RIGHT_LOWER.

Вот, всё работает:

//+------------------------------------------------------------------+
//|                                                  test_script.mq4 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- описание
#property description "Неправильная отрисовка OBJ_BITMAP_LABEL"
#property description "при CORNER_LEFT_LOWER и ANCHOR_LEFT_LOWER"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   if(!ObjectBitmapLabelCreate(0,"BmpLabel",0,0,0,"\\Images\\status_bar_off.bmp",445,
      24,false,CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,clrRed,STYLE_SOLID,1,false,false,true,0))
     {
      Print(__FUNCTION__,": не удалось создать объект \"Графическая метка\"! Код ошибки = ",GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+
//| Создает объект "Графическая метка"                               |
//+------------------------------------------------------------------+
bool ObjectBitmapLabelCreate(const long              chart_ID=0,// ID графика
                             const string            name="BmpLabel",          // имя метки
                             const int               sub_window=0,             // номер подокна
                             const int               x=0,                      // координата по оси X
                             const int               y=0,                      // координата по оси Y
                             const string            file_on="",               // картинка в режиме On
                             const int               width=0,                  // X-координата области видимости
                             const int               height=0,                 // Y-координата области видимости
                             //const int               x_offset=10,              // смещение области видимости по X
                             //const int               y_offset=10,              // смещение области видимости по Y
                             const bool              state=false,              // нажата/отжата
                             const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                             const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки 
                             const color             clr=clrRed,               // цвет рамки при выделении
                             const ENUM_LINE_STYLE   style=STYLE_SOLID,        // стиль линии при выделении
                             const int               point_width=1,            // размер точки перемещения
                             const bool              back=false,               // на заднем плане
                             const bool              selection=false,          // выделить для перемещений
                             const bool              hidden=true,              // скрыт в списке объектов
                             const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим графическую метку
   if(!ObjectCreate(chart_ID,name,OBJ_BITMAP_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать объект \"Графическая метка\"! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим картинки для режимов On и Off
   if(!ObjectSetString(chart_ID,name,OBJPROP_BMPFILE,0,file_on))
     {
      Print(__FUNCTION__,
            ": не удалось загрузить картинку для режима On! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим координаты метки
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим область видимости изображения; если значения ширины или высоты
//--- больше значений ширины и высоты (соответственно) исходного изображения, то
//--- оно не рисуется; если значения ширины и высоты меньше размеров изображения,
//--- то рисуется та его часть, которая соответствует этим размерам
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
/*//--- установим, какая часть изображения должна показываться в области видимости
//--- по умолчанию это левая верхняя область изображения; значения позволяют
//--- произвести сдвиг от этого угла и отобразить другую часть изображения
   ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
   ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);*/
//--- установим, в каком сотоянии находится метка (нажатом или отжатом)
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим способ привязки
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер точки привязки, с помощью которой можно перемещать объект
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
Файлы:
images.zip  1 kb
 
barabashkakvn:
Вот, всё работает:


Вопрос то был про OBJ_BUTTON, а ответ пришел про OBJ_BITMAP_LABEL. :)

Вот код скрипта, в котором не работает.

#property copyright ""
#property link      ""
#property version   "1.00"
//--- описание
#property description "Неправильная отрисовка OBJ_BUTTON"
#property description "при CORNER_RIGHT_LOWER и ANCHOR_RIGHT_LOWER"

void OnStart()
{
  if(!ObjectButtonCreate(0,"MyButton",0, 10,20,445,24, false,CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,clrRed,clrGray,STYLE_SOLID,1,false,false,true,0))
  {
    Print(__FUNCTION__,": не удалось создать объект \"OBJ_BUTTON\"! Код ошибки = ",GetLastError());
    return;
  }
}

bool ObjectButtonCreate(const long              chart_ID=0,// ID графика
                             const string            name="MyButton",          // имя метки
                             const int               sub_window=0,             // номер подокна
                             const int               x=0,                      // координата по оси X
                             const int               y=0,                      // координата по оси Y
                             const int               width=0,                  // X-координата области видимости
                             const int               height=0,                 // Y-координата области видимости
                             //const int               x_offset=10,              // смещение области видимости по X
                             //const int               y_offset=10,              // смещение области видимости по Y
                             const bool              state=false,              // нажата/отжата
                             const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки
                             const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки 
                             const color             clr=clrRed,               // цвет рамки при выделении
                             const color             clrBg=clrGray,            // цвет фона
                             const ENUM_LINE_STYLE   style=STYLE_SOLID,        // стиль линии при выделении
                             const int               point_width=1,            // размер точки перемещения
                             const bool              back=false,               // на заднем плане
                             const bool              selection=false,          // выделить для перемещений
                             const bool              hidden=true,              // скрыт в списке объектов
                             const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим графическую метку
   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать объект \"OBJ_BUTTON\"! Код ошибки = ",GetLastError());
      return(false);
     }

//--- установим координаты метки
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим область видимости изображения; если значения ширины или высоты
//--- больше значений ширины и высоты (соответственно) исходного изображения, то
//--- оно не рисуется; если значения ширины и высоты меньше размеров изображения,
//--- то рисуется та его часть, которая соответствует этим размерам
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
/*//--- установим, какая часть изображения должна показываться в области видимости
//--- по умолчанию это левая верхняя область изображения; значения позволяют
//--- произвести сдвиг от этого угла и отобразить другую часть изображения
   ObjectSetInteger(chart_ID,name,OBJPROP_XOFFSET,x_offset);
   ObjectSetInteger(chart_ID,name,OBJPROP_YOFFSET,y_offset);*/
//--- установим, в каком сотоянии находится метка (нажатом или отжатом)
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим способ привязки
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
     
//--- установим цвет рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,clrBg);
   
//--- установим стиль линии рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер точки привязки, с помощью которой можно перемещать объект
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
Файлы:
 
RickD:

Вопрос то был про OBJ_BUTTON, а ответ пришел про OBJ_BITMAP_LABEL. :)

Вот код скрипта, в котором не работает.


Вот немного изменённая функция OnStart() Вашего скрипта. Думаю всё станет понятно. Размеры кнопок 100х20. Точка привязки - правый нижний угол.

void OnStart()
{
  if(!ObjectButtonCreate(0,"MyButton1",0, 50,50,100,20, false,CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,clrRed,clrGray,STYLE_SOLID,1,false,false,true,0))
  {
    Print(__FUNCTION__,": не удалось создать объект \"OBJ_BUTTON\"! Код ошибки = ",GetLastError());
    return;
  }
  if(!ObjectButtonCreate(0,"MyButton2",0, 100,100,100,20, false,CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,clrRed,clrGray,STYLE_SOLID,1,false,false,true,0))
  {
    Print(__FUNCTION__,": не удалось создать объект \"OBJ_BUTTON\"! Код ошибки = ",GetLastError());
    return;
  }
}
 
barabashkakvn:


Вот немного изменённая функция OnStart() Вашего скрипта. Думаю всё станет понятно. Размеры кнопок 100х20. Точка привязки - правый нижний угол.


Спасибо. Я посмотрел, но понятности это не добавляет. По логике - при привязке к правому нижнему углу экрана левый нижний угол кнопки должен занимать одну и ту же позицию на чарте независимо от размера кнопки.
 
RickD:

Спасибо. Я посмотрел, но понятности это не добавляет. По логике - при привязке к правому нижнему углу экрана левый нижний угол кнопки должен занимать одну и ту же позицию на чарте независимо от размера кнопки.

OBJPROP_XDISTANCE

Дистанция в пикселях по оси X от угла привязки

int. Читать как: видимость объекта. На сколько объект выглядывает из-за оси графика

OBJPROP_YDISTANCE

Дистанция в пикселях по оси Y от угла привязки

int. Читать как: видимость объекта. На сколько объект выглядывает из-за оси графика

 


 И поэтому кнопка при длине 100, выглядывает только наполовину, так как её зона видимости 50 пикселей:

if(!ObjectButtonCreate(0,"MyButton1",0, 50,50,100,20, false,CORNER_RIGHT_LOWER,ANCHOR_RIGHT_LOWER,clrRed,clrGray,STYLE_SOLID,1,false,false,true,0))
  {
    Print(__FUNCTION__,": не удалось создать объект \"OBJ_BUTTON\"! Код ошибки = ",GetLastError());
    return;
  }

 

А привязка объекта - это место в котором у объекта нанесена капелька клея и используется она когда объект создается при такой форме:

ObjectCreate(0,text_name,OBJ_TEXT,0,TimeCurrent(),chart_max_price);

 когда в качестве точек привязки указывается ВРЕМЯ и ЦЕНА

 
barabashkakvn:

OBJPROP_XDISTANCE

Дистанция в пикселях по оси X от угла привязки

int. Читать как: видимость объекта. На сколько объект выглядывает из-за оси графика

OBJPROP_YDISTANCE

Дистанция в пикселях по оси Y от угла привязки

int. Читать как: видимость объекта. На сколько объект выглядывает из-за оси графика

 


 И поэтому кнопка при длине 100, выглядывает только наполовину, так как её зона видимости 50 пикселей:

 

А привязка объекта - это место в котором у объекта нанесена капелька клея и используется она когда объект создается при такой форме:

 когда в качестве точек привязки указывается ВРЕМЯ и ЦЕНА


Хорошо. Поставлю вопрос иначе. Почему объект OBJ_LABEL при CORNER_RIGHT_LOWER и ANCHOR_RIGHT_LOWER сам позиционируется так, что текст не уходит за правую часть экрана, а объект OBJ_BUTTON реализован по другому?
 
RickD:

Хорошо. Поставлю вопрос иначе. Почему объект OBJ_LABEL при CORNER_RIGHT_LOWER и ANCHOR_RIGHT_LOWER сам позиционируется так, что текст не уходит за правую часть экрана, а объект OBJ_BUTTON реализован по другому?

Косяк. Спасибо за замечание. Исправим.
 
RickD:

Хорошо. Поставлю вопрос иначе. Почему объект OBJ_LABEL при CORNER_RIGHT_LOWER и ANCHOR_RIGHT_LOWER сам позиционируется так, что текст не уходит за правую часть экрана, а объект OBJ_BUTTON реализован по другому?

В справочник MQL4 есть скрипт на странице OBJ_LABEL. Скрипт позволяет менять угол привязки объекта OBJ_LABEL. И очень хорошо видно, что OBJ_LABEL спокойно может заезжать за край графика.