
Введение в MQL5 (Часть 4): Структуры, классы и функции времени
Введение
Добро пожаловать в четвертую часть нашего серии, посвященной основам MQL5. В этот раз мы с вами познакомимся со структурами, классами и функциями времени, стараясь при этом сделать сложные концепции более доступными. Цель остается прежней: создать инклюзивное пространство, где язык MQL5 будет доступным для всех. Напомню еще раз, что любые ваши вопросы приветствуются — спрашивайте, чтобы ни одна деталь не осталась непонятой. Давайте вместе постараемся сделать так, чтобы изучение MQL5 был не только полезным, но и приятным.
Я понимаю, что программирование может быть утомительным, особенно для новичков. Именно поэтому в этих статьях мы пытаемся максимально детально разложить сложные вещи, чтобы они были понятны всем. Но если вдруг что-то все же осталось непонятным, задавайте вопросы. Любопытство открывает путь к знаниям. Мы переходим с вами к новой главе в изучении алгоритмической торговли. Здесь представлен не только теоретический материал, но и практические примеры кода с детальными пояснениями. Надеюсь, для вас это будет приятное путешествие в мир знаний. Приятного вам программирования и помните: любопытство — лучший спутник прогресса.
В этой статье мы рассмотрим следующие темы:
- Структуры
- Классы
- Функции времени в MQL5
Дорогие читатели, прежде чем перейти к изучению основного материала этой четвертой части, я по традиции представлю краткое видео, чтобы освежить знания о концепциях, изложенных в третьей части. Это видео служит кратким подведением итогов. Кроме того, оно поможет освежить знания и подготовиться к изучению нового материала. И если вам нужно повторить основы или вернуться и пристальнее изучить упущенные детали, это видео поможет вам. Далее мы перейдем к изучению нового материала, который тоже относится к разряду базового.
1. Структуры
Что такое структуры?
В программировании структура — это составной тип данных, позволяющий группировать различные типы данных под одним именем. Они позволяют организовывать логически связанные фрагменты информации и удобно управлять ими. Структура может включать в себя различные типы данных, например целые числа, числа с плавающей запятой и символы. Основная цель структуры — улучшить читабельность кода и возможность его повторного использования, а также представить объекты с множеством атрибутов.
В MQL5 той же цели служит структура. Это определяемый пользователем тип данных, который позволяет создать контейнер для хранения связанных элементов данных. Структуры в MQL5 часто используются для представления объектов реального мира в торговых алгоритмах, финансовых инструментах или в любых сценариях, где различные атрибуты должны быть связаны с одним объектом. Синтаксис объявления структур в MQL5 аналогичен синтаксису в других языках. Структуры представляют собой универсальный способ эффективной организации данных и доступа к ним в торговых скриптах и советниках.
Аналогия
Представим себе конструкцию в виде рюкзака. В этот рюкзак можно положить разные вещи: игрушки, вкусняшки и даже небольшую карту. Каждая вещь в рюкзаке — это отдельная информация. Например, игрушка — это тип игрушки, вкусняшки имеют вкус, а карта показывает направление.
Такой рюкзак можно представить как структуру в программировании. Структура содержит различные типы информации (игрушки, закуски и карты) точно так же, как структура хранит различные фрагменты данных в программе. Если вам нужно узнать об игрушке, вы заглядываете в рюкзак и находите игрушку. В программе вы используете структуру для поиска определенных фрагментов информации. Таким образом, структура помогает организовывать и переносить разные вещи, упрощая поиск того, что вам нужно.
1.1. Как объявлять структуры
Объявление структуры в MQL5 похоже на определение структуры при создании, скажем, формы для заполнения. Вы указываете типы и названия различных фрагментов информации, которые хотите включить.
struct Person { string name; int age; string address; };
Объяснение:
“struct Person”:
- На этой строке начинается объявление структуры с именем Person. Структуре здесь это определяемый пользователем тип данных, который позволяет группировать различные типы переменных под одним именем.
“string name;”:
- Внутри структуры объявлены три поля (переменные). Первое — name и имеет тип string. Это поле предназначено для хранения имени «человека» (person).
“int age;”:
- Второе поле — age, имеет тип int. Это поле предназначено для хранения возраста человека.
“string address;”:
- Третье поле — это address, также имеет тип string. Это поле предназначено для хранения адреса человека.
Таким образом, мы имеем специальный контейнер или форму, в которой можно аккуратно организовать информацию о человеке. Эта структура Person похожа на форму с определенными полями (name - имя, age - возраст и address - адрес), где вы можете заполнить данные о каждом человеке. Получив эту структуру, вы можете создавать ее экземпляры для разных людей, и каждый экземпляр будет содержать информацию о конкретном человеке.
1.2. Использование
После объявления структуры можно ее использовать. Само объявление структуры служит неким образцом для создания персонализированных экземпляров или объектов. Эти экземпляры будут хранить конкретные данные для каждого человека.
void OnStart() { struct Person { string name; int age; string address; }; // Creating variables of type Person Person person1, person2; // Filling in details for person1 person1.name = "Israel"; person1.age = 25; person1.address = "123 Main St"; // Filling in details for person2 person2.name = "Bob"; person2.age = 30; person2.address = "456 Oak St"; // Now you can use person1 and person2 with their specific details Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address); Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address); }
Объяснение:
“void OnStart()”:
- Это отправная точка выполнения скрипта. Любой код этой функции будет выполняться при запуске скрипта или когда вы прикрепите его к графику.
“Person person1, person2;”:
-
Объявление двух переменных person1 и person2 типа Person. Эти переменные действуют как контейнеры для хранения информации о людях.
“person1.name = "Israel";”:
- Присваиваем значение Israel элементу name в person1.
“person1.age = 25;”:
- Присваиваем значение "25" элементу age в person1.
“person1.address = "123 Main St";”:
- Присваиваем значение "123 Main St" элементу address в person1.
“person2.name = "Bob";” to “person2.address = "456 Oak St";”:
- Аналогичным образом присваиваем соответствующие значения для переменной person2.
“Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address);”:
- Выводим сведения о person1 с помощью функции Print.
“Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address);”:
- Выводим сведения о person2 с помощью функции Print.
Аналогия:
Представьте, что вы создаете персонализированные информационные карточки для определенных людей. В этих карточках есть отдельные поля для имени, возраста и адреса каждого человека. Тщательно сформированные процесс создания гарантирует, что каждая карточка хранит уникальную информацию о человеке, для которого она создана.
Создание персональных карточек:
-
В мастерской вы кладете на рабочий стол две пустые карточки и называете из person1 и person2. Карточки разработаны так, чтобы хранить различные детали разных людей.
Внесем данные в карточку person1:
-
В первой карточке person1 в поле имени "Name" записываем имя "Israel". Далее, в разделе возраста Age вписываем возраст 25. В разделе адреса Address записываем адрес человека "123 Main St".
Далее заполним вторую карточку person2:
- Для создания второй карточки person2 повторяем тот же самый процесс. На этот раз заполняем такие данные: имя "Bob", возраст "30", адрес "456 Oak St".
Работа с персональными карточками:
-
Достаем первую карточку person1 и читаем ее содержание: "Вот данные о первом человеке — его зовут Израэль, ему 25 лет, он живет по адресу Мейн-стрит, 123". Далее точно так же читаем вторую карточку с деталями второго человека.
В данном примере структура Person служит шаблоном, который определяет наличие разделов в карточках. Переменные person1 и person2 содержат данные для каждого конкретного человека. И чтобы получить к определенному набору данных по каждому человеку, достаточно достать соответствующую карточку.
Примечание: понимание таких концепций, как массивы и структуры, поначалу может показаться немного запутанным. Одним из распространенных заблуждений начинающих является путаница массивов и структур из-за их очевидного сходства. Оба предполагают организацию данных, но они отличаются. Массивы представляют собой организованные списки, в которых аналогичные фрагменты информации (сходные типы данных) расположены в последовательном порядке и доступны посредством индексации. Структуры же больше похожи на контейнеры, в которых разные типы информации (разные типы данных) могут быть объединены для определенной сущности.
То есть массивы — это коллекции одинаковых элементов, а структуры позволяют создавать сложные типы данных, содержащие различные фрагменты информации. Даже если сейчас это кажется немного сложным, со временем вы научитесь понимать все эти тонкости.
2. Классы
Что такое классы?
В MQL5 классы можно сравнить с шаблонами, которые помогают создавать объекты. Объекты в этом контексте — это конкретные экземпляры или реализации класса. Классе — набор инструкций для создания различных объектов, а каждый объект — уникальный элементе, созданный на основе этих инструкций.
Представьте, что у вас есть класс «Фрукты» с инструкциями по созданию различных фруктов, таких как яблоки, бананы и апельсины. Объектами будут настоящие яблоки, бананы и апельсины, которые будут созданы на основе этих инструкций. Каждый объект-фрукт имеет свои особые атрибуты (например, цвет и вкус) и может выполнять действия (например, быть съеденным). Итак, в MQL5 классы определяют правила, а объекты — это материальные вещи, которые вы создаете в соответствии с этими правилами.
Аналогия
Представьте, что играете с конструктором и у вас есть специальный набор инструкций, как построить крутой космический корабль. Этот набор инструкций похож на класс. В нем рассказывается, какие цвета использовать, как складывать блоки и даже как заставить космический корабль летать (как шаблон класса в программировании). Каждый раз, когда вы строите космический корабль по этим инструкциям, этот космический корабль становится объектом класса. Каждый космический корабль, который вы строите, может иметь свои цвета и особенности, но все они следуют одним и тем же инструкциям.
В компьютерном программировании класс это тоже специальные инструкции по созданию чего-то. Он помогает программистам создавать вещи (мы называем их объектами) с определенными функциями и действиями. Это способ организовать и спланировать определенные шаги, что упрощает создание множества похожих вещей. При этом не нужно каждый раз начинать с нуля. С такими наборами инструкций можно создавать множество самых разных предметов.
Представьте, что у вас есть производство, на котором изготавливают разные виды печенья. У вас есть рецепт — это и есть класс. Он определяет, какие ингредиенты должны быть в каждом печенье и как их следует выпекать.
2.1. Как объявить класс
В MQL5 синтаксис объявления классов включает использование ключевого слова class, за которым следует имя класса и блок кода, содержащий члены класса.
Пример:
void OnStart() { class Person { public: // Attributes (data members) string name; int age; // Methods (member functions) void displayInfo() { Print("Name: ", name); Print("Age: ", age); } }; // Creating an object of the Person class Person person1; // Initializing attributes of the object person1.name = "John"; person1.age = 25; // Calling the displayInfo method to print information person1.displayInfo(); }
Объяснение:
Объявление класса:
class Person {
-
В этой строке объявляется класс с именем Person. За ключевым словом class следует имя класса, а открывающая фигурная скобка «{» указывает на начало определения класса.
public:
- В этой строке объявляется спецификатор доступа public, указывая, что следующие члены класса (атрибуты и методы) доступны извне класса.
string name; int age;
- В этих строках объявляются два атрибута (члена данных) внутри класса: строковый атрибут name и целочисленный атрибут age.
void displayInfo() { Print("Name: ", name); Print("Age: ", age); }
- Здесь определяется метод (функцию-член) с именем displayInfo внутри класса. Он выводит значения атрибутов name и age с помощью функции Print.
};
- Закрывающая фигурная скобка «}» отмечает конец определения класса.
void OnStart() {
- Функция OnStart — это специальная функция в MQL5, которая выполняется при запуске скрипта или эксперта.
Person person1;
- Эта строка создает объект с именем person1 и типом Person. Так создается конкретный экземпляр класса.
Установка атрибутов:
person1.name = "John"; person1.age = 25;
- Здесь задаются значения атрибутов name и age для объекта person1.
person1.displayInfo();
- В этой строке вызывается метод displayInfo для объекта person1, который выводит информацию, хранящуюся в атрибутах.
Классы и структуры чем-то походи, но у них разное предназначение. Они используются для определения пользовательских типов данных и группируют связанные данные. Ключевое отличие заключается в их функциональности.
Структуры более просты и в основном служат контейнерами для данных без включения методов или функций. Их можно сравнить с организованными единицами хранения, которые группируют различные элементы данных для удобного доступа. Классы в объектно-ориентированном программировании охватывают не только данные, но и поведение посредством методов. Классах — универсальные наборы инструментов, которые не только содержат информацию, но и предоставляют средства для выполнения действий или функций. Таким образом, хотя и классы, и структуры организуют данные, классы предлагают дополнительный уровень функциональности с помощью методов.
Совершенно нормально, если поначалу различие между классами и структурами не совсем понятно. В следующей статье я представлю видео, в котором визуально покажу эти концепции, чтобы их было легче понять. Поэтому если сейчас все это кажется вам немного запутанным, дождитесь следующей статьи. Постепенно, шаг за шагом, мы вместе изучим все основы программирования.
3. Функции времени в MQL5
Время
В контексте программирования и торговли «время» относится к непрерывному течению часов, минут и секунд. Это фундаментальный аспект алгоритмической торговли, поскольку финансовые рынки работают в определенных временных рамках, и трейдерам необходимо синхронизировать свои стратегии с этими временными элементами.
Функции
В программировании функция — это автономный блок кода, предназначенный для выполнения определенной задачи или операции. Функции помогают организовать код, делая его более модульным и простым для понимания. Они принимают входные данные, обрабатывают их и предоставляют выходные данные.
Что такое функции времени?
Функции времени в программировании, особенно в MQL5, — это инструменты, которые позволяют разработчикам и трейдерам работать с временнЫми данными и использовать их в своих алгоритмах. Эти функции позволяют получать текущее время сервера, преобразовывать значения времени и выполнять различные операции, связанные с временными метками. В контексте алгоритмической торговли функции времени используются для синхронизации торговых стратегий с конкретными таймфреймами, установки точного времени исполнения и создания условий для торговых сигналов по времени. Они позволяют работать с временными аспектами финансовых рынков и использовать их в торговых стратегиях.
Аналогия
Представьте, что у вас есть часы, которые подсказывают, когда делать определенные вещи, например, когда играть, есть или спать. В мире компьютерных программ функции времени подобны часам. Они помогают компьютеру отслеживать время и решать, когда выполнять те или иные задачи.
Если вы пишете программу для торговли, вы можете использовать функции времени, чтобы сказать: «Если сейчас утро, примени эту торговую стратегию, а если ночь, сделай что-то другое». Функции времени подобны инструкциям о том, что делать в разное время.
Прежде чем перейти к более широкому изучению временных функций в MQL5, давайте в деталях разберем, пожалуй, основную — datetime.
3.1. datetime
В MQL5 datetime — это специальный тип данных, используемый для представления даты и времени. Это цифровые часы, которые могут отслеживать текущую дату и время в мире трейдинга. Этот тип данных позволяет трейдерам и алгоритмам определять время событий, анализировать и реализовывать стратегии, основанные на конкретных временных условиях.
3.1.1. Как объявить переменную datetime
Итак, переменная datetime хранит дату и время. Когда вы объявляете переменную datetime, вы можете установить для нее определенный момент во времени.
Пример:
void OnStart() { // Declaration of datetime variable datetime magicalClock; // Assigning a special date and time to our magical clock magicalClock = D'2024.01.15 12:30:00'; // Let's tell the computer to show us the date and time inside our Comment(magicalClock); }
Объяснение:
“datetime magicalClock;”:
-
Здесь мы объявляем переменную с именем magicalClock с типом данных datetime. Эта переменная будет хранить дату и время.
“magicalClock = D'2024.01.15 12:30:00';”:
- В этой строке мы присваиваем конкретную дату и время (15 января 2024 года, 12:30:00) переменной magicalClock, используя формат “D'YYYY.MM.DD HH:MI:SS'”.
- “D'” указывает, что мы присваиваем константу даты и времени.
- “2024” — год.
- “01” — месяц.
- “15” — день.
- “12” — час.
- “30” — минуты.
- “00” — секунды.
“Comment(magicalClock);”:
- Здесь используем функцию Comment для отображения содержимого часов (magicalClock). Компьютер выведет сохраненные дату и время из переменной datetime.
Этот фрагмент кода демонстрирует объявление, присвоение и вывод на экран переменной datetime в MQL5.
3.2. Основные функции времени
3.2.1. TimeCurrent
В контексте алгоритмического трейдинга функция TimeCurrent() в MQL5 представляет текущее время сервера. Эта функция возвращает значение переменной datetime, которое, по сути, представляет текущую отметку времени на сервере, на котором выполняются торговые операции.
В чем важность этой функции? Допустим, вы используете торговую стратегию, которая предполагает определенные действия в зависимости от времени суток. Например, это могут быть разные действия на открытии и закрытии рынка или в часы волатильности. Используя TimeCurrent(), вы можете программно получить доступ к текущему времени и соответствующим образом адаптировать торговые решения. С синхронизацией часов со временем сервера ваш алгоритм может динамически адаптироваться к различным рыночным условиям в течение дня.
На практике вы можете использовать TimeCurrent() для создания в торговых алгоритмах условий в зависимости от времени. Например, вы можете разрешить открывать сделки только в определенные часы или скорректировать стратегии управления рисками в зависимости от времени суток. Таким образом вы можете обеспечить синхронизацию алгоритмов с постоянно меняющейся ситуацией на финансовых рынках.
Аналогия
Давайте представим, что время в программировании похоже на часы, которые сообщают нам, когда что-то происходит. Используя TimeCurrent(), мы спрашиваем у компьютера: «Сколько сейчас времени?»
Когда мы используем TimeCurrent(), компьютер сообщает текущее время в специальном формате, например «2024.01.15 12:30:00». Эту информацию можно использовать, чтобы знать, когда произошли определенные события, или планировать действия. Это часы, которые всегда показывают текущее время в мире программирования.
Пример:void OnStart() { // Ask the magical clock for the current time datetime currentTime = TimeCurrent(); // Display the current time on the console Print("The magical clock says it's now: ", currentTime); }
Объяснение:
“datetime currentTime = TimeCurrent();”:
-
Здесь мы объявляем переменную с именем currentTime типа datetime (тип данных, который содержит информацию о дате и времени). Мы используем функцию TimeCurrent() для получения текущего времени сервера, а результат присваивается переменной currentTime.
“Print("The magical clock says it's now: ", currentTime);”:
- Функция Print() используется для вывода сообщений на консоль. В этой строке мы выводим на печать сообщение вместе со значением currentTime, поэтому оно показывает текущее время, сообщаемое нашими функцией.
Говоря простыми словами, программа проверяет текущее время с помощью функции TimeCurrent(), а затем сообщает нам, что она нашла, выводя сообщение на консоли.
Теперь давайте рассмотрим еще один пример, чтобы лучше понять, как работает функция. Это немного более сложный пример использования функции TimeCurrent(). Я покажу сценарий, в котором мы проверяем, соответствует ли текущее время сервера заранее определенному моменту. Это еще один вариант использования функций времени в MQL5. На самом деле таких вариантов может быть очень и очень много!
Пример:
void OnStart() { // Declaration of datetime variable datetime magicalClock; // Assigning a special date and time to our magical clock magicalClock = D'2024.01.15 12:30:00'; // Check if TimeCurrent is equal to our magical clock if(TimeCurrent() == magicalClock) { Print("The magic moment has arrived!"); } else { Print("Not yet the magic time..."); } }
Объяснение:
“datetime magicalClock;”:
- Объявляет переменную с именем magicalClock типа данных datetime.
“magicalClock = D'2024.01.15 12:30:00';”:
- Назначает определенную дату и время (15 января 2024 г., 12:30) для переменной magicalClock, используя префикс D для литералов datetime.
“if (TimeCurrent() == magicalClock) { ... }”:
- Сравнивает текущее время сервера (TimeCurrent()) с предопределенным значением magicalClock. Если они равны, в консоль выводится фраза "The magic moment has arrived!"; в противном показывается надпись "Not yet the magic time...".
При изучении MQL5 и алгоритмической торговли некоторые концепции могут сбивать с толку, особенно для начинающих. Это нормально, что процесс обучения включает в себя поиск ответов и разъяснений. Не стесняйтесь задавать любые вопросы — о массивах, пользовательских функциях, препроцессорах, обработке событий или о любой другой теме, которую мы рассмотрели.
Программирование, как и любой другой навык, поначалу может показаться немного сложным, но работая вместе, мы можем сделать это путешествие более приятным и понятным. Уникальность нашего опыта обучения заключается в вопросах, которые мы задаем, и дискуссиях, которые мы ведем. Будьте активным участником процесса обучения.
3.2.2. TimeGMT
Функция TimeGMT() в MQL5 позволяет работать со стандартным временем по Гринвичу (GMT). GMT — универсальные часы, которые люди во всем мире используют в качестве эталона. Это стандартизированная мера времени во всем мире. В алгоритмической торговле эта функция облегчает координацию и синхронизацию действий в глобальном масштабе, обеспечивая общую основу для операций, связанных со временем.
Функция TimeGMT в MQL5 возвращает текущее время по Гринвичу (GMT) с поправкой на летнее время (DST) на основе локального времени компьютера, на котором запущен клиентский терминал. С этой поправкой возвращаемый GMT учитывает, действует ли в настоящее время летнее время.
Аналогия
Представьте, что в особом городе Гринвич есть часы. Этот город похож на штаб-квартиру хранителей времени. Время на часах в Гринвиче считается эталонным временем, за которым следят все во всем мире. Теперь предположим, что у вас есть друзья в разных местах, у каждого свое местное время. Если вы хотите спланировать с ними виртуальную встречу, это может быть сложно, потому что у всех на часах разное время.
Вот где GMT приходит на помощь. Это время позволяет всем синхронизироваться. GMT — время на часах в Гринвиче, и когда вы знаете, сколько сейчас времени, вам легче координировать действия с друзьями, где бы они ни находились. Итак, GMT — это эталонное время, которое помогает людям из разных мест договориться, когда делать что-то вместе.
Представьте, что в нашем городе Гринвиче иногда в определенное время года меняют часы. Это специальное событие. Отсюда появляется летнее время (DST), которое отлично от обычного. Поэтому дополнительно нужно знать, находятся ли часы в режиме летнего времени или нет. Функция TimeGMT() в MQL5 сообщает это эталонное время, учитывая, находятся ли часы в данный момент в режиме летнего времени или нет.
В программировании эта информация имеет решающее значение, поскольку она позволяет трейдерам и алгоритмам точно отслеживать время, учитывая любые изменения. TimeGMT() всегда сообщает правильное время с учетом перехода на летнее и зимнее время.
Пример:
void OnStart() { // Declaration of a variable to store GMT time datetime gmtTime; // Assigning the current GMT time to the variable gmtTime = TimeGMT(); // Printing the GMT time Print("Current GMT Time: ", TimeToString(gmtTime)); }
Объяснение:
“datetime gmtTime;”:
- В этой строке объявляется переменная с именем gmtTime типа datetime. datetime — это тип данных в MQL5, используемый для представления значений даты и времени.
“gmtTime = TimeGMT();”:
- Эта строка присваивает текущее время по Гринвичу переменной gmtTime. Функция TimeGMT() вызывается для получения текущего времени по Гринвичу.
“Print("Current GMT Time: ", TimeToString(gmtTime));”:
- С помощью функции Print на консоль выводится сообщение. Это надпись "Current GMT Time: ", за которой следует время GMT, преобразованное в строку с помощью функции TimeToString(gmtTime).
Таким образом, этот фрагмент кода объявляет переменную для хранения времени GMT, присваивает этой переменной текущее время по Гринвичу, а затем выводит на консоль сообщение с текущим временем по Гринвичу.
3.2.3. TimeLocal
Функция TimeLocal() в MQL5 аналогична настройке часов на местное время вашего компьютера. Она позволяет узнать, сколько времени в вашем конкретном географическом месте. При использовании TimeLocal() вы получаете время по системным часам вашего компьютера без поправки на какие-либо глобальные часовые пояса.
Допустим, вы находитесь в Нью-Йорке, и часы вашего компьютера настроены на нью-йоркское время. TimeLocal() сообщит текущее время на основе времени вашего компьютера, что позволит легко адаптироваться к вашему распорядку дня и настройкам местного времени. Эта функция удобна, если вы хотите работать со временем в контексте вашего часового пояса, не беспокоясь о глобальных различиях.
Аналогия
Представьте часы, которые показывают время. Функция TimeLocal в MQL5 спрашивает у ваших часов: «Сколько времени здесь, где я нахожусь?» Она показывает время в соответствии с вашими местными условиями.
Пример:
void OnStart() { // Declaration of a variable to store local time datetime localTime; // Assigning the current local time to the variable localTime = TimeLocal(); // Printing the local time Print("Current Local Time: ", TimeToString(localTime)); }
Объяснение:
Этот код просит компьютер использовать функцию TimeLocal(), чтобы узнать время в вашем конкретном месте. Затем он выводит время на экран. Итак, если бы ваши часы были компьютерной программой, именно так они показывали бы время в вашей комнате!
3.2.4. TimeGMTOffset
Функция TimeGMTOffset() в MQL5 позволяет найти разницу во времени между вашим местным временем и GMT (по Гринвичу). «На сколько часов мое время идет впереди или позади по сравнению со стандартным глобальным временем?»
Формула:
TimeGMTOffset = TimeGMT() − TimeLocal()
TimeGMTOffset — удобная функция, которая определяет разницу во времени (смещение) в секундах между GMT и местным временем компьютера, на котором работает торговый терминал.
Аналогия
Представим, что ваши часы работают немного по-другому. Они сообщают не только время, но и разницу вашего времени от эталонного, которому следуют все во всем мире. Это эталонное время — время, с которым все согласны, GMT. Вместо сложных математических вычислений, чтобы узнать, насколько ваше время отличается от GMT, у вас есть волшебная кнопка под названием TimeGMTOffset. Когда вы нажимаете эту кнопку, вы получаете прямой ответ: на сколько секунд ваше время опережает или отстает от всемирного времени.
Если вы когда-нибудь захотите что-то спланировать одновременно с друзьями из разных мест в разных часовых поясах, эта кнопка поможет определить, когда встретиться, без необходимости все просчитывать самостоятельно. Это помощник, который следит за тем, чтобы все были на одной волне, где бы они ни находились!
Пример:
void OnStart() { // Declaration of variables int gmtOffsetSeconds, gmtOffsetMinutes; // Assigning the current GMT offset to the variable in seconds gmtOffsetSeconds = TimeGMTOffset(); // Converting seconds to minutes gmtOffsetMinutes = gmtOffsetSeconds / 60; // Printing the GMT offset in minutes Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes); }
Объяснение:
“int gmtOffsetSeconds, gmtOffsetMinutes;”:
- Здесь мы объявляем две переменные (gmtOffsetSeconds и gmtOffsetMinutes) для хранения смещения по Гринвичу в секундах и минутах соответственно.
“gmtOffsetSeconds = TimeGMTOffset();”:
- Мы используем функцию TimeGMTOffset() для получения текущего смещения от GMT в секундах. Присваиваем его переменной gmtOffsetSeconds.
“gmtOffsetMinutes = gmtOffsetSeconds / 60;”:
- Чтобы преобразовать смещение GMT из секунд в минуты, делим gmtOffsetSeconds на 60 и сохраняем результат в gmtOffsetMinutes.
“Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes);”:
- Наконец, выводим на консоль смещение в минутах. Функция Print отображает текст в кавычках вместе с рассчитанным смещением GMT в минутах.
В этом коде мы сначала получаем смещение по Гринвичу в секундах, используя TimeGMTOffset(), затем делим это значение на 60, чтобы преобразовать его в минуты. И выводим информацию в минутах. Если запустить скрипте с этим кодом, он отобразит смещение GMT в минутах.
Смещение GMT -60 означает, что местное время опережает GMT на 60 минут.
3.2.5. TimeToStruct
В MQL5 функция TimeToStruct() используется для преобразования временной метки (представленной в виде количества секунд, прошедших с 1 января 1970 года) в структурированный формат. Этот структурированный формат представлен предопределенной структурой MqlDateTime, которая включает отдельные элементы для года, месяца, дня, часа, минуты и секунды.
Пример:
void OnStart() { // Declare an MqlDateTime variable MqlDateTime myTime; // Convert the current timestamp to a structured format TimeToStruct(TimeCurrent(), myTime); // Access individual components of the structured time Print("Current Year: ", myTime.year); Print("Current Month: ", myTime.mon); Print("Current Day: ", myTime.day); Print("Current Hour: ", myTime.hour); Print("Current Minute: ", myTime.min); Print("Current Second: ", myTime.sec); }
В приведенном выше примере TimeCurrent() возвращает текущую временную метку, а TimeToStruct преобразует эту метку в структурированный формат, хранящийся в переменной myTime типа MqlDateTime. После преобразования вы можете получить доступ к конкретным компонентам времени (год, месяц, день и т. д.), используя элементы структуры myTime.
Примечание: дополнительные объяснения работы MqlDateTime будут представлены далее.
Аналогия
Рассмотрим, что делает TimeToStruct(). Представьте, что у вас есть огромный запас секунд, который начал отсчитываться в 1970 году (отправная точка в компьютерном хронометраже). Эти секунды накапливаются, и нам нужно знать, сколько часов, минут, дней и даже лет содержится в этом большом числе.
Вот тут-то и вступает в действие TimeToStruct(). Она берет огромную кучу секунд и разбивает их на более удобный для человека формат. И если у нас есть огромное число, например 100 000 секунд, TimeToStruct() сообщит, что это 27 часов, 46 минут и 40 секунд. Это калькулятор, который преобразует простое число секунд в детальную разбивку времени, начиная с отправной точки в 1970 году.
Представьте, что у вас есть капсула времени под названием MqlDateTime, и когда вы передаете ей определенный момент времени (например, текущее время), она открывается и раскрывает детали. Функция TimeToStruct() превращает необработанные секунды с 1970 года в удобно организованный набор информации.
Если у вас есть счетчик секунд, TimeToStruct() взмахнет волшебной палочкой, и у вас появится четкое представление о годах, месяцах, днях, часах, минутах, секундах, днях недели и днях года — все аккуратно упакованное в структуру MqlDateTime. Загадочный временной код превращается в удобочитаемый формат, что делает ваши программы более универсальными и практичными.
Пример:
void OnStart() { // Declare an MqlDateTime variable MqlDateTime myTime; // Convert the number of seconds into a structured format TimeToStruct(100000, myTime); // Now, myTime will tell us the breakdown since 1970 Print("Years: ", myTime.year); Print("Months: ", myTime.mon); Print("Days: ", myTime.day); Print("Hours: ", myTime.hour); Print("Minutes: ", myTime.min); Print("Seconds: ", myTime.sec); }
Объяснение:
“MqlDateTime myTime;”:
- Мы объявляем часы с именем myTime, используя структуру MqlDateTime.
“TimeToStruct(100000, myTime);”:
- Здесь мы используем TimeToStruct, чтобы преобразовать количество секунд (в данном случае 100 000) в структурированный формат, хранящийся в myTime. Таким образом мы расшифровываем конкретный момент времени.
“Print("Years: ", myTime.year);”:
- Теперь мы просим показать годы, начиная с 1970 года, используя атрибут года. То же самое касается месяцев, дней, часов, минут и секунд.
У нас есть момент времени (100 000 секунд с 1970 года), и мы просим разбить его на годы, месяцы, дни и так далее. Так мы можем понять, о каком моменте времени идет речь. Интересно, не тик ли?
Изучая тонкости временных функций в MQL5, как и любые другие аспекты программирования, не забывайте задавать вопросы. Шаг за шагом мы изучаем новые области программирования. Если вдруг вам что-то показалось непонятным, задавайте вопросы в комментариях.
Примечание: сегодняшнее знакомство с MqlDateTime — это только начало. Мы продолжим подробно изучать предопределенные структуры в следующей статье.
Заключение
Итак, в этой статье мы с вами изучили интересную область структур, классов и концепции времени в MQL5. Помните, обучение — это динамичный путь, в котором вы активный участник. Если остались какие-то вопросы, обязательно задавайте их, чтобы не осталось ничего непонятного. Следите за следующими статьями в этой серии, в которых мы перейдем на новые уровни программирования MQL5. Удачного программирования, удачной торговли!
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/14232





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования