English 中文 Español Deutsch 日本語 Português
preview
MQL5 — Вы тоже можете стать мастером этого языка

MQL5 — Вы тоже можете стать мастером этого языка

MetaTrader 5Интервью | 16 июня 2023, 09:56
1 148 5
Daniel Jose
Daniel Jose

Введение

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


Но перед этим, расскажу немного о своей истории.

С тех пор как я начал писать статьи для сообщества MQL5, я был одарен весьма положительными отзывами. Многие люди обращаются ко мне, с интересом спрашивают, как я научился программировать на MQL5 и какие возможности я изучаю в своих статьях. Я прекрасно понимаю, что многие из этих любопытных читателей - энтузиасты или люди, ищущие базовое руководство, чтобы сделать свои первые шаги в программировании, поэтому данная статья посвящена всем вам, энтузиастам и начинающим программистам на MQL5.

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

Как вы уже можете себе представить, у меня большой опыт программирования на MQL5. Однако на момент написания этой статьи я использую язык MQL5 всего полтора года: я менее двух лет работаю программистом на MQL5. Наверно вам покажется удивительным, как можно за такое короткое время практики на MQL5 достичь тех подвигов, которые я показываю, и которые возможны на платформе MetaTrader 5.

Ответ очень прост. У разработчиков и тех, кто поддерживает MQL5, хватило здравого смысла сделать язык во многом похожим на C/C++. Это значительно облегчает его изучение для программистов с большим опытом работы с C/C++, поскольку нет необходимости заново изучать концепции, синтаксис и команды.

И почему это важно в данном случае? Потому что я профессиональный программист на C/C++ с начала 2000-х годов, т.е. у меня более 23 лет опыта программирования на C/C++, и это огромное преимущество. Если бы мне пришлось изучить новый язык, чтобы быть действительно продуктивным в MetaTrader 5, я бы, наверное, сдался в конечном итоге.

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

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

Некоторые люди ошибочно полагают, что изучение MQL5 требует беспорядочного изучения разных материалов. Однако всем, кто спрашивал меня, как научиться MQL5 по-настоящему, не имея никаких предварительных знаний, я всегда советовал начинать с основ. То есть, немного узнать о языке С, понять синтаксис и логику программирования, а также команды. После понимания основ языка C, стоит продолжить изучать C++ одновременно с практикой на MQL5. Тот простой факт, что вы владеете программированием на языке С, значительно облегчит вам работу с MQL5.

Некоторые люди могут считать, что язык C устарел, но правда в том, что C - это чрезвычайно хорошо документированный и широко используемый язык. Поэтому можно найти множество материалов, чтобы научиться его использовать. Однако я хочу подчеркнуть: я не утверждаю, что вам нужно глубоко изучать язык C. Напротив, если вы выучите некоторые базовые команды, синтаксис и способы подачи команд, этого будет достаточно, чтобы начать работу с MQL5.

Это может показаться немного обескураживающим: изучать язык C, чтобы продвинуться в MQL5?! Возможно, если вы достаточно целеустремленны и найдете человека, готового вас обучит, вы сможете начать непосредственно с MQL5. Но по первому своему опыту и свидетельствам других людей я могу сказать, что задача будет не такой уж легкой. Большинство качественных материалов сосредоточивается здесь, в сообществе MQL5. В Интернете в целом контент широко распространен и часто имеет низкое качество, что может принести больше вреда, чем пользы. Однако, когда речь идет о языках C и C++, появляется огромное количество отличного и очень доступного материала. Поэтому вы сами должны решать, с чего начинать.


Мой первый код на MQL5

Обычно люди считают, что поскольку у меня уже был опыт программирования на C/C++, то я начал писать на MQL5 сложные и продуманные проекты. Хотелось бы сказать, что именно так всё и началось. Однако реальность оказалась совсем другой.

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

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

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property version   "1.00"
04. #property description "Modify special chart properties"
05. #property script_show_inputs
06. //+------------------------------------------------------------------+
07. enum eWhat  {
08.                eScaleDate  = CHART_SHOW_DATE_SCALE,   //Time scale
09.                eScalePrice = CHART_SHOW_PRICE_SCALE   //Price scale
10.             };
11. enum eOp    {
12.                eFalse,                                //Makes hidden
13.                eTrue                                  //Makes visible
14.             };
15. //+------------------------------------------------------------------+
16. input eWhat user00 = eScaleDate;                      //Graphic property
17. input eOp   user01 = eFalse;                          //What to do?
18. //+------------------------------------------------------------------+
19. void OnStart()
20. {
21.    ChartSetInteger(0, (ENUM_CHART_PROPERTY_INTEGER) user00, user01);
22. }
23. //+------------------------------------------------------------------+

Исходный код моей первой программы на MQL5

Да, нельзя сказать, что код какой-то необычный или инновационный. Это прежде всего код, целью которого было подтвердить правильное понимание документации и то, как можно определить элементы и манипулировать ими. Следующее видео показывает результат выполнения этого же кода.


Демонстрационное видео

Обратите внимание, что это чрезвычайно простой вариант. Однако возможность создать этот код полностью автономным способом, без какой-либо помощи, кроме документации и исходных кодов Meta Editor, показала мне, что можно пойти дальше. Всё, что мне нужно было сделать - это адаптировать мои существующие знания C и C++ к MQL5. С этого момента и начался настоящий прогресс.

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

Я, однако, уже прошел этап кода "HELLO WORLD". Поэтому я решил попробовать что-то более сложное. Так как у меня не было большого опыта и понимания того, как на самом деле работает MQL5, я начал с разработки скрипта, который был бы для меня проще, учитывая мои ограниченные знания.

Только спустя некоторое время я понял, что MQL5 на самом деле не процедурный язык, а событийно-управляемый. Это открытие кардинально изменило мой подход к программированию и анализу кода. Желая улучшить свои навыки, я начал изучать и читать статьи здесь, в сообществе MQL5, и я понял, что хотя многие могли заставить свой код работать, они изучали MQL5 относительно базовым образом, по крайней мере, на мой взгляд. Поэтому я начал разрабатывать и экспериментировать с более сложными решениями, которые бы глубже исследовали возможности платформы MetaTrader 5 и языка MQL5.

И в какой-то момент я решил начать делиться результатами своих экспериментов. Так появилась первая моя статья. Действительно, одно дело - создать код, и совсем другое - объяснить, как он был построен и спроектирован. Это делалось в расчете на то, что и опытные, и новички будут читать написанное.

Статьи претерпели изменения, как по форме, так и по содержанию. Я так сделал для того, чтобы даже человек с небольшим опытом мог понять информацию. И даже если вы не сможете сразу усвоить все знания, представленные в материале, то со временем, по мере вашего развития в программировании вы сможете правильно усвоить то, что я пытаюсь передать в конкретной статье.

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

Так, давайте вернемся к коду. Я хочу показать вам, что даже код в несколько строк, может содержать гораздо больше информации и знаний, чем код с тысячей строк. Стоит сказать, что изначально вся информация, не являющаяся частью синтаксиса C/C++ и, соответственно, MQL5, была не на английском языке, но это лишь небольшая деталь. Давайте разберем этот небольшой код и поймем, как он работает, и, прежде всего, почему работает.


Разбор кода

Строки два, три и четыре можно было бы удалить из кода. По сути, они служат MetaTrader 5 только для того, чтобы сообщать пользователю о назначении кода. Если вы являетесь пользователем, то можете просто отбросить эти строки в своем учебном коде.

Пятая строка очень важна, так как без нее MetaTrader 5 не распознает, что скрипт может быть настроен пользователем через некую структуру ввода, которой в данном случае являются 'inputs', показанные в строках 16 и 17. Но скоро мы этого добьемся.

Теперь мы рассмотрим то, что многие могут не понять, особенно если они изучали только MQL5 или пришли из языка, сильно отличающегося от C / C++. Речь идет о перечислениях, которые присутствуют в строках 07 и 11.

Вполне вероятно, что при виде этих конструкций вы придете в замешательство. Вы можете даже представить, что они - нечто слишком сложное для вас. Однако именно потому, что MQL5 рассчитан на программистов с некоторым опытом работы на языке C / C ++, он становится приятным в использовании даже для тех, кто имеет минимальный опыт работы с C / C ++. Давайте хотя бы поверхностно разберемся, что такое перечисление.

Перечисление, в общих чертах, можно понимать как последовательность данных, которым можно присвоить или не присвоить значения. Если значение не присвоено, перечисление всегда начинается с первого возможного значения, которое в данном случае равно нулю. Поэтому перечисление, определенное в строке 11, следует тому же принципу, что и значение 0 или 1. Поэтому в C / C++, как и в MQL5, значение ноль считается ложным, а значение один - истинным.

Таким образом, в строке 12, где определено значение eFalse, у нас указывается ноль, а в строке 13, являющейся вторым значением перечисления, мы имеем значение один. Если бы у нас было определено больше элементов, они бы продолжали последовательность, так что следующим было бы два, следующим - три, и так далее. Это простейший случай.

Однако я хочу отметить кое-что другое. Обратите внимание, что в конце строки 12 у нас есть то, что в C / C++ было бы комментарием, так же как и в других строках у нас есть этот же вид аннотации. Давайте сосредоточимся на строке 12, хотя то, что было сказано для строки 12, применимо и ко всем остальным строкам.

Если посмотреть на скрипт при запуске на графике, то увидим изображение 01. В нем я выделяю то, что в точности соответствует комментарию в строке 12.

Изображение 01

Изображение 01 - Окно взаимодействия с пользователем


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

Давайте теперь вернемся к строке 07, где у нас есть еще одно перечисление. Однако данное перечисление отличается от того, которое я только что объяснил. Это не совсем разные вещи: отличие в том, что теперь мы присваиваем значения каждому из элементов. То есть компилятор будет использовать указанные нами значения, которые в данном случае являются константами, определенными в MQL5. Может вам придет в голову: почему бы не использовать константы напрямую, а не присваивать их перечислению? Причина в простоте реализации. Если бы мы использовали константы напрямую, нам пришлось бы создавать что-то еще, например, массив или структуру, и это гораздо сложнее. Однако, используя мой подход, можно вставить любое значение, в любой позиции или последовательности. И если в объявляемой мной последовательности появится какая-то интересующая константа, мне в самом деле не нужно будет присваивать или объявлять эту константу; всё, что мне нужно будет сделать - это добавить больше содержимого в перечисление, а язык сам позаботится о том, чтобы правильные значения были использованы и присвоены соответствующим образом.

Обратите внимание, как прочная, хорошо заложенная основа на таком языке, как C / C++, помогает нам при написании кода на MQL5. То, что мы здесь показываем, не часто встречается в коде MQL5. На самом деле, я заметил, что многие прибегают к гораздо более сложным и трудоемким конструкциям, чтобы добиться того же, что получили здесь. И заметьте, что в итоге мне понадобилось написать всего одну строку кода (строку 21).

Теперь обратите внимание вот на что: в самой строке 21, которая фактически является единственной, которая будет выполнена, нам надо явно выполнить приведение типа. Это необходимо для того, чтобы компилятор понял его и, соответственно, правильно сгенерировал конечный код. Но почему эта явная конверсия так важна? Причина в компиляторе. Для процессора это не имеет большого значения, потому что мы используем только числа, и это то, что процессор видит на самом деле. Для процессора типы не имеют никакого значения, просто посмотрите на цифры. Однако второй аргумент в строке 21, хотя и является числовым значением, но это не совсем то, что ожидает функция ChartSetInteger. Эта функция ожидает определенный тип, а не числовое значение. Даже если значение представляет ожидаемый тип, т.е. является именно той константой, которую мы используем, компилятор будет воспринимать это как ошибку. По этой причине, чтобы решить данную проблему, мы явно и принудительно приводим числовое значение к ожидаемому типу с помощью функции ChartSetInteger. Таким образом, компилятор поймет, что мы знаем о сути значений, которые передаем в функцию.


Несколько размышлений о Python

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

Хотя наша основная тема - MQL5, но нередко задают следующий вопрос: стоит ли изучать Python? Особенно для тех, кто начинает изучать программирование с целью торговли на финансовых рынках, возникает вопрос, стоит ли углублять свои знания Python для работы с MetaTrader 5. Этот вопрос очень кстати, поскольку изучение Python значительно проще и быстрее, чем пройти через трудности изучения C, затем C++ и, наконец, получить прочную и консолидированную основу для профессиональной работы с MQL5. Однако есть один момент, о котором следует помнить, чтобы вы не подумали, что зря потратили время на изучение (или не изучение) Python.

Язык программирования (хотя некоторые предпочитают относить его к языку скриптов) Python не сравним с тем, что можно сделать в MQL5 - возможно, именно поэтому некоторые не считают его языком программирования, но мы не будем вступать в этот спор здесь. Если ваша цель - изучить и сгенерировать код для тестирования, проверки и анализа чего-то чисто математического, то самое короткое и простое решение - изучить Python. Это связано с тем, что вы можете запускать бэктесты и тому подобное на Python, взаимодействуя непосредственно с MetaTrader 5 более эффективным образом, чем пытаться достичь того же самого с помощью MQL5.

Возможно, кому-то это покажется странным, но при небольшом обучении и большой самоотдаче вы легко сможете создать скрипт на Python, способный сделать то же самое, что программист с гораздо большим опытом сделает с помощью MQL5. Много раз данному программисту приходилось создавать индикаторы, советника, а также настраивать тестер стратегий для проверки прибыльности определенной операционной системы, так называемый SETUP. Не говоря уже о риске поставить всё под угрозу, не настроив всё должным образом.

Кто-то может подумать, что при использовании MetaTrader 5, мы по-прежнему будем иметь доступ к графикам и красивому представлению результатов, что облегчит нам анализ. Однако учтите, сколько знаний вам потребуется для программирования всех функций, необходимых для выполнения простого бэктеста непосредственно в MetaTrader 5.

Работая с помощью Python можно использовать пакет для доступа к данным MetaTrader 5. Объединив все функциональные возможности Python, можно легче проводить те же исследования, которые совершает программист на MQL5. После завершения исследования альтернативой может быть экспорт данных в Excel или другую программу, где все графическое представление, которое было бы сделано в MetaTrader 5, может быть выполнено, облегчая этим анализ полученных результатов.

Здесь стоит уточнить еще один момент: зачем использовать Python вместо Excel напрямую, ведь результаты будут отображаться на графике в Excel? Причина проста: VBA (Visual Basic for Application) не позволяет напрямую получить доступ к тем же данным, которые мы имели бы через Python, учитывая использование данных MetaTrader 5. Чтобы осуществить это в Excel, пришлось бы создать DLL для поддержки такого доступа или экспортировать множество файлов в формате CSV для получения тех же данных.

После того, как данные будут в Excel, для выполнения всех вычислений потребуется такая же или даже большая работа, как и в Python. Недостатком является то, что если мы решим изменить базу данных, нам придется заново проделать всю работу в Excel. Однако при использовании Python всё, что вам нужно сделать, - это дать Python указание на то, что надо изменить базу данных, и он обеспечит это прямо в MetaTrader 5, без каких-либо дополнительных усилий с вашей стороны.

Поэтому мой совет - постарайтесь узнать как можно больше: у каждого инструмента есть свои преимущества и недостатки. Хотя Python очень полезен, он не позволяет создать индикатор, отображаемый на графике, или советник для помощи в торговле. Это можно реализовать только через MQL5. Поэтому здесь не существует лучшего или худшего инструмента. Они дополняют друг друга и служат разным целям. В любом случае, изучайте оба варианта, потому что никогда не знаешь, когда тебе понадобится тот или иной.


Заключение

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

Осваивайте функции постепенно. Изучите язык C/C++, чтобы расширить свои возможности по проектированию и разработке решений на MQL5. Старайтесь всегда практиковаться и подходить к делу иначе, чем обычно, потому что, каким бы сложным оно ни казалось, всегда есть способ улучшить его.

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

Будьте всегда скромны и старайтесь делиться своими знаниями с другими. Таким образом, вы не только узнаете новое, но и покажете новые возможности тем, кто сосредоточился на других решениях. Это всё, о чем хотел рассказать.


Перевод с португальского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/pt/articles/12071

Последние комментарии | Перейти к обсуждению на форуме трейдеров (5)
Sergey Pavlov
Sergey Pavlov | 16 июн. 2023 в 19:24
хвалебная статья о себе гениальном: что-то типа, научу стать гуру программирования с нуля, но оказывается для этого надо знать С++ и опыт его использования 23 года. И удивительно то, что с таким багажом (С/С++) потребовалось 2 года для того что бы научится программировать на MQL5. В итоге, бла-бла-бла, я гений и вы так сможете через 25 лет. Жаль, что такие статьи публикуют...
MrBrooklin
MrBrooklin | 16 июн. 2023 в 19:41
MetaQuotes:

Опубликована статья MQL5 - Вы тоже можете стать мастером этого языка:

Автор: Daniel Jose

Вот когда у меня возникло желание написать статью для начинающих и уже были наброски статьи, основанные на материалах темы " Самообучение языку MQL5 с полного нуля", то тут же прилетело сообщение от ... (небуду называть имени и фамилии), что моя статья, как бы правильнее выразиться - не совсем актуальна. Прочитал эту статью и офигел. Что это вообще такое было?!

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

Vladimir Simakov
Vladimir Simakov | 17 июн. 2023 в 10:17

Мдяя...

Это ладно, графомания. Но, посмотрел другие статьи, по диагонали. Ну, как бы за 23 года, набить шишки по поводу наследование/композиция уже пора.

PS. Общее правило: I am (Animal -> Cat) - это наследование, а I have or use (Cat{arms[4],tail,head}) - композиция (хотя, апологеты наследования умудряются тут множественным и виртуальным убиваться)))).

Rashid Umarov
Rashid Umarov | 19 июн. 2023 в 09:51
MrBrooklin #:

Вот когда у меня возникло желание написать статью для начинающих и уже были наброски статьи, основанные на материалах темы " Самообучение языку MQL5 с полного нуля", то тут же прилетело сообщение от ... (небуду называть имени и фамилии), что моя статья, как бы правильнее выразиться - не совсем актуальна. Прочитал эту статью и офигел. Что это вообще такое было?!

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

Это не первая статья данного автора и я решил, что читателям будет интересно узнать, как он начал писать на MQL5.

Я написал вам в комментариях к вашей статье.

MrBrooklin
MrBrooklin | 19 июн. 2023 в 16:16
Rashid Umarov #:

Это не первая статья данного автора и я решил, что читателям будет интересно узнать, как он начал писать на MQL5.

Я написал вам в комментариях к вашей статье.

Здравствуйте, Рашид! Да, видел Ваше сообщение. Ближайшие 2-3 месяца точно не смогу заниматься своей статьёй. Навалилось много работы.

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

Разработка системы репликации — моделирование рынка (Часть 01): Первые эксперименты (I) Разработка системы репликации — моделирование рынка (Часть 01): Первые эксперименты (I)
Что вы думаете: создавать системы для изучения рынка, когда он закрыт, или создать систему, которая позволит моделировать рыночные ситуации? Здесь мы начнем новую серию статей, посвященных этому вопросу.
Интеграция ML-моделей с тестером стратегий (Часть 3): Управление файлами CSV(II) Интеграция ML-моделей с тестером стратегий (Часть 3): Управление файлами CSV(II)
Данный материал - полное руководство по созданию класса в MQL5 для эффективного управления CSV-файлами. Вы поймете, как реализуются методы открытия, записи, чтения и преобразования данных и как можно использовать их для хранения и доступа к информации. Кроме того, мы обсудим ограничения и важнейшие аспекты использования такого класса. Это ценный материал для тех, кто хочет научиться обрабатывать CSV-файлы в MQL5.
Нейросети — это просто (Часть 46): Обучение с подкреплением, направленное на достижение целей (GCRL) Нейросети — это просто (Часть 46): Обучение с подкреплением, направленное на достижение целей (GCRL)
Предлагаю Вам познакомиться с ещё одним направлением в области обучения с подкреплением. Оно называется обучением с подкреплением, направленное на достижение целей (Goal-conditioned reinforcement learning, GCRL). В этом подходе агент обучается достигать различных целей в определенных сценариях.
Оценка ONNX-моделей при помощи регрессионных метрик Оценка ONNX-моделей при помощи регрессионных метрик
Регрессия – это задача предсказания вещественной величины по непомеченному примеру. Для оценки точности предсказаний регрессионных моделей предназначены так называемые метрики регрессии.