Ошибка при замене функции ObjectSet(name, OBJPROP_CORNER, 1) на функцию ObjectSetInteger(0,name, OBJPROP_CORNER, 1)

 

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

ObjectSetInteger(0,name, OBJPROP_CORNER, 0) вместо 

ObjectSet(name, OBJPROP_CORNER, 0) .

Лишь замена

ObjectSet(name, OBJPROP_CORNER, 1) на функцию

ObjectSetInteger(0,name, OBJPROP_CORNER, 1)

- привязка к правому верхнему углу - приводит к тому, что объекты располагаются так, как будто бы у них одинаковые координаты (что, конечно, не так); они накладываются друг на друга.

Использование вместо 1 (единички) "пятерочной" константы  CORNER_RIGHT_UPPER (воспринимается без проблем) ничего не меняет.

Ниже для ясности привожу картинки. 

ПРАВИЛЬНО - ObjectSet(name, OBJPROP_CORNER, 1)

 

НЕПРАВИЛЬНО -  ObjectSetInteger(0,name, OBJPROP_CORNER, 1)

 

По-моему, это "головоломка" для уважаемых разработчиков. 

 
Пробую обратить внимание на мою тему еще раз. Спасибо.
 

При переходе на "новую запись" Вам нужно учесть, что привязка к углу "по-новому" теперь обеспечивается двумя свойствами.

Второе свойство - OBJPROP_ANCHOR

Старый вызов выставляет сразу оба свойства.

 
Если что-то работает, зачем это что-то менять? В пятом лучше причесать уже код под те стандарты.
 
evillive:
Если что-то работает, зачем это что-то менять? В пятом лучше причесать уже код под те стандарты.

Сделали очень удобно.

Осталась привязка к углу графика (OBJPROP_CORNER), но добавилось ещё и позиционирование угла объекта относительно точки привязки (OBJPROP_ANCHOR). Очень удобно и полезно.

ЗЫ. Кстати - не только угла объекта, но и его сторон. Теперь можно позиционировать объект по восьми узлам:

  1. верх-лево
  2. верх-право
  3. верх-центр
  4. низ-лево
  5. низ-право
  6. низ-центр
  7. право-центр
  8. лево-центр
 
stringo:

При переходе на "новую запись" Вам нужно учесть, что привязка к углу "по-новому" теперь обеспечивается двумя свойствами.

Второе свойство - OBJPROP_ANCHOR

Старый вызов выставляет сразу оба свойства.

Спасибо за дружественный ответ. Удачи!
 
evillive:
Если что-то работает, зачем это что-то менять? В пятом лучше причесать уже код под те стандарты.
Спасибо за ответ, удачи!
 
artmedia70:

Сделали очень удобно.

Осталась привязка к углу графика (OBJPROP_CORNER), но добавилось ещё и позиционирование угла объекта относительно точки привязки (OBJPROP_ANCHOR). Очень удобно и полезно.

ЗЫ. Кстати - не только угла объекта, но и его сторон. Теперь можно позиционировать объект по восьми узлам:

  1. верх-лево
  2. верх-право
  3. верх-центр
  4. низ-лево
  5. низ-право
  6. низ-центр
  7. право-центр
  8. лево-центр
Спасибо за подробности, весьма кстати. Удачи!
 
artmedia70:

Сделали очень удобно.

Осталась привязка к углу графика (OBJPROP_CORNER), но добавилось ещё и позиционирование угла объекта относительно точки привязки (OBJPROP_ANCHOR). Очень удобно и полезно.

ЗЫ. Кстати - не только угла объекта, но и его сторон. Теперь можно позиционировать объект по восьми узлам:

  1. верх-лево
  2. верх-право
  3. верх-центр
  4. низ-лево
  5. низ-право
  6. низ-центр
  7. право-центр
  8. лево-центр

9. центр-центр

Нумерация идёт от 0 до 8

 
stringo:

9. центр-центр

Нумерация идёт от 0 до 8

С Вашего позволения уточню официальную информацию из документации:

Идентификатор

Значение
константы

Описание

ANCHOR_LEFT_UPPER 

 0

Точка привязки в левом верхнем углу

ANCHOR_LEFT

 1

Точка привязки слева по центру

ANCHOR_LEFT_LOWER

 2

Точка привязки в левом нижнем углу

ANCHOR_LOWER

 3

Точка привязки снизу по центру

ANCHOR_RIGHT_LOWER

 4

Точка привязки в правом нижнем углу

ANCHOR_RIGHT

 5

Точка привязки справа по центру

ANCHOR_RIGHT_UPPER

 6

Точка привязки в правом верхнем углу

ANCHOR_UPPER

 7

Точка привязки сверху по центру

ANCHOR_CENTER

 8

Точка привязки строго по центру объекта

 К моей теме. Действительно, совместное использование двух функций для OBJ_LABEL

   ObjectSetInteger(0,name, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
   ObjectSetInteger(0,name, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);

 или, что то же самое,

   ObjectSetInteger(0,name, OBJPROP_CORNER, 1);
   ObjectSetInteger(0,name, OBJPROP_ANCHOR, 6);

 вместо одиночной функции (как это было в "старом" МТ4)

   ObjectSet(name, OBJPROP_CORNER, 1);

исправило ошибку, которой посвящена эта тема.

Спасибо всем за обсуждение. 

 
Такой вариант рабочий

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2019.05.02 01:22

#define CORNER_LEFT_LOWER  2
#define CORNER_LEFT_UPPER  0
#define CORNER_RIGHT_LOWER 3
#define CORNER_RIGHT_UPPER 1
#define CORNER(A) ((A) ? ((A) + 1) % 3 + 1 : 0)

bool ObjectSet( const string name, const ENUM_OBJECT_PROPERTY_INTEGER property, const long value )
{
  return((property != OBJPROP_CORNER) ? ObjectSetInteger(0, name, property, value)
                                      : ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER(value)) && 
                                        ObjectSetInteger(0, name, OBJPROP_ANCHOR, CORNER(value) << 1));
}

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