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

 
Youri Lazurenko:

Еще раз спасибо, теперь линия как линия, приятно посмотреть. Вот только  ObjectDelete(0, name); нужен, иначе раз нарисованная линия не перерисовывается. Тоже и в mql4, просто забыл.

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

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
    if(!ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0))
     {
      Print("Ошибка в создании линии");
      return (false);
     }
  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_TIME, 0, price1);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 1, price2);

  ChartRedraw();
  return(true);
 }
 
Vladimir Karputov:

Ну что за несуразица. Нарисованный графический объект спокойно перемещается. Пример дан в справке для каждого объекта (для горизонтальной линии OBJ_HLINE).

Также уже нарисованному объекту можно менять любое свойство: цвет, стиль , запах ...

В ручную, не спорю. Советник же рисует трендовые линии по точкам ДеМарка. С функцией  ObjectDelete(0, name);, при изменении точек, убирается старая трендовая линия и рисуется новая. Без этой функции первые нарисованные линии больше не перерисовываются. Это не несуразица, а факт. 

Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

В ручную, не спорю. Советник же рисует трендовые линии по точкам ДеМарка. С функцией  ObjectDelete(0, name);, при изменении точек, убирается старая трендовая линия и рисуется новая. Без этой функции первые нарисованные линии больше не перерисовываются. Это не несуразица, а факт. 

Да прочтите же справку наконец! И пример запустите.

 
Alexey Viktorov:

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

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

 ChartRedraw();
Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Да прочтите же справку наконец! И пример запустите.

Справку я прочитал. Только вы возмущаетесь голословно, а я пишу исходя из практики. Другое дело что вместо ObjectDelet() использовать ChartRedraw(), не спорю и проверю. Только на это и нужно указать, ссылаясь на пример.

 
Youri Lazurenko:

Справку я прочитал. Только вы возмущаетесь голословно, а я пишу исходя из практики. Другое дело что вместо ObjectDelet() использовать ChartRedraw(), не спорю и проверю. Только на это и нужно указать, ссылаясь на пример.

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

 
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();
 }
Причина обращения: