Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1283

 
Youri Lazurenko:


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

C:\Users\barab\OneDrive\Изображения\Screenpresso\2021-02-01_16h09_06.gif

Код:

//+------------------------------------------------------------------+
//|                       OBJ_HLINE change properties on the fly.mq5 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input string          InpName="HLine";     // Line name
//--- an array for storing colors contains 14 elements
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- the number of colors
   int size=ArraySize(colors);
//--- get a random value
   int number=MathRand();
//--- get an index in the col[] array as a remainder of the integer devision
   int i=number%size;
//--- set line color
   ObjectSetInteger(ChartID(),InpName,OBJPROP_COLOR,colors[i]);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Спасибо, но оставлю свой вариант, он работает. Хотя попробую вместо  ObjectDelete(0, name); применить 

Совершенно ошибочное решение. Удаление графического объекта и обновление графика никак не заменяют друг друга.

В моём примере сначала проверяется есть-ли объект, в частности трендовая с именем тфьу, это name в русской раскладке клавиатуры))). Затем, если его нет, то рисуется трендовая. При неудачной попытке рисования, выводится сообщение и выход из функции с возвратом false.

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

По скорости выполнения проверить наличие трендовой будет менее затратно, чем её удалить с нарисовать новую.

Но… окончательное решение принимаете вы и если вам нравится чесать левое ухо мизинцем правой ноги, я не имею права вам мешать.

 
Youri Lazurenko:

И возвращаясь к рисованию трендовой линии. Если нужен код. 

Очень плохой код.

 
Alexey Viktorov:

Я сделал-бы так

А Я так:

void CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
   {
    ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0);
    ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
    ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
    ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
   }
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 0, price1);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 1, price2);

  ChartRedraw();
 }
 
Vitaly Muzichenko:

А Я так:

Разница незначительна и тоже приемлемый вариант. Но вот если пользователь решил изменить толщину или цвет, они видимо задаются во входных параметрах, раз имеют переменные, то ваш код уже не поменяет без удаления трендовой.

В общем, о вкусах фломастеров спорить не сто́ит.

 
Alexey Viktorov:

Совершенно ошибочное решение. Удаление графического объекта и обновление графика никак не заменяют друг друга.

В моём примере сначала проверяется есть-ли объект, в частности трендовая с именем тфьу, это name в русской раскладке клавиатуры))). Затем, если его нет, то рисуется трендовая. При неудачной попытке рисования, выводится сообщение и выход из функции с возвратом false.

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

По скорости выполнения проверить наличие трендовой будет менее затратно, чем её удалить с нарисовать новую.

Но… окончательное решение принимаете вы и если вам нравится чесать левое ухо мизинцем правой ноги, я не имею права вам мешать.

Спасибо огромное. Прислушаюсь вашим советам и переделаю код.

 
Vitaly Muzichenko:

А Я так:

Огромное спасибо. Код переделаю. Уже переделал, все о кей.

 
string obj_symbol=ObjectGetString(ChartID(),obj_name,OBJPROP_SYMBOL);

Это вообще не работает что ли? У кого-нибудь возвращает символ объекта? У меня всегда пустая строка.

Или сначала ему надо это свойство задать?.. 

 
leonerd:

Это вообще не работает что ли? У кого-нибудь возвращает символ объекта? У меня всегда пустая строка.

Или сначала ему надо это свойство задать?.. 

Это специфическое свойство - для объекта "График" возвращает символ. А Вы для какого типа объекта пытаетесь получить символ?

 
Vladimir Karputov:

Это специфическое свойство - для объекта "График" возвращает символ. А Вы для какого типа объекта пытаетесь получить символ?

для треугольника. Как узнать его "символ"?