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

 
MrBrooklin #:

Всем доброго дня и хорошего настроения!

Вопросы от начинающего в программировании:

  1. В чём принципиальная разница между пользовательской структурой и переменными, объявленными на глобальном уровне?
  2. Скорость обращения к структуре и к глобальным переменным разная или примерно одинаковая?
  3. Кроме удобства в программировании пользовательская структура имеет, какое-то ещё полезное свойство?

С уважением, Владимир.

Я не профессиональный программист, поэтому не судите строго и мой ответ может быть неточен.

Структура - это элемент ООП. В отличие от простой переменной она содержит несколько типов данных и позволяет описать некий объект.
Например, мы программируем компьютерную игру и нам нужно описать монстра, который имеет несколько нижних конечностей (int), 
несколько верхних конечностей (int), некоторую силу (float, double), время рождения (datetime), координаты в пространстве и др. характеристики.

Можно создать массив структур, элементом структуры может также быть массив или структура. В некоторых случаях без структур 
практически не обойтись.

Что касается скорости то думаю что различие с обычными переменными минимально. Можно протестировать - это не сложно.

 
Grigori.S.B #:
Можно протестировать - это не сложно.

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

С измерением скорости у меня полная проблема, т.к. никогда не занимался и даже понятия не имею, как это сделать. ))

С уважением, Владимир.

 
MrBrooklin #:

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

С измерением скорости у меня полная проблема, т.к. никогда не занимался и даже понятия не имею, как это сделать. ))

С уважением, Владимир.

Не представляю себе как можно без структур / ООП реализовать появление нового объекта с несколькими разнотипными свойствами.
Исчезновение одного из старых объектов (например убили монстра).
Тем более если количество объектов динамически меняется и заранее неизвестно.

Насчет замеров скорости / сравнения исполнения различных участков кода тут масса примеров.
Тот же сабер каждый день по несколько выкладывает.
1. Создаешь таймер высокого разрешения
2. Принтом выводишь его значение до выполнения операции.
3. После выполнения операции.
Разность - есть время выполнения операции.

Проделываешь это для обычной переменной и для структуры и сравниваешь.

 
MrBrooklin #:
а зачем создавать структуру

например для этого, что-бы свести вместе,

/*struct PriceData
  {
   double            open[];
   double            high[];
   double            low[];
   double            close[];
  };*/

или создавать структуры монстров в игре

//--- базовая структура для описания монстров
struct Animal
  {
   int               head;          // кол-во голов
   int               legs;          // кол-во ног
   int               wings;         // кол-во крыльев
   bool              tail;          // наличие хвоста
   bool              fly;           // летает
   bool              swim;          // плавает  
   bool              run;           // бегает
  };

далее 

//--- создадим объект базового типа Animal и опишем его 
   Animal some_monster_small; 
   some_monster_small.head=1; 
   some_monster_small.legs=4; 
   some_monster_small.wings=0; 
   some_monster_small.tail=true; 
   some_monster_small.fly=false; 
   some_monster_small.swim=false; 
   some_monster_small.run=true; 

и далее

   Animal some_monster_bigboss; 
   some_monster_bigboss.head=3; 
   some_monster_bigboss.legs=8; 
   some_monster_bigboss.wings=1; 
   some_monster_bigboss.tail=true; 
   some_monster_bigboss.fly=true; 
   some_monster_bigboss.swim=true; 
   some_monster_bigboss.run=true; 

пример из справки.. наименования поменял
 
Grigori.S.B #:
Структура - это элемент ООП.

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

С уважением, Владимир.

 
Grigori.S.B #:

Не представляю себе как можно без структур / ООП реализовать появление нового объекта с несколькими разнотипными свойствами.
Исчезновение одного из старых объектов (например убили монстра).
Тем более если количество объектов динамически меняется и заранее неизвестно.

Насчет замеров скорости / сравнения исполнения различных участков кода тут масса примеров.
Тот же сабер каждый день по несколько выкладывает.
1. Создаешь таймер высокого разрешения
2. Принтом выводишь его значение до выполнения операции.
3. После выполнения операции.
Разность - есть время выполнения операции.

Проделываешь это для обычной переменной и для структуры и сравниваешь.

О, как! Об этом даже и не задумывался. Это про  "Не представляю себе как можно без структур / ООП реализовать появление нового объекта с несколькими разнотипными свойствами".

За то, что подробно рассказали, как сделать замеры скорости, огромное спасибо!!!

С уважением, Владимир.

 
lynxntech #:

например для этого, что-бы свести вместе,

или создавать структуры монстров в игре

далее 

пример из справки.. наименования поменял

Спасибо за подсказку. Теперь начинаю осознавать ценность в использовании пользовательской структуры.

С уважением, Владимир.

 
и всетаки как советник может по хэндлу индикатора удалить его с графика в OnDeinit
 
MrBrooklin #:

Вам обязательно нужно по хэндлу? А то есть функция, которая удаляет с указанного окна графика индикатор с указанным именем. 

IndicatorDelete(int,const string) - Ценовые графики - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5

С уважением, Владимир.

Проще взять функцию чем СБ…

bool  ChartIndicatorDelete( 
   long           chart_id,              // идентификатор графика 
   int            sub_window             // номер подокна 
   const string   indicator_shortname    // короткое имя индикатора 
   );
Причина обращения: