English Deutsch 日本語 Português
preview
Изучение MQL5 от новичка до профи (Часть I): Начинаем программировать

Изучение MQL5 от новичка до профи (Часть I): Начинаем программировать

MetaTrader 5Примеры | 29 ноября 2023, 16:25
2 193 28
Oleh Fedorov
Oleh Fedorov

Введение

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

Правда, у кого-то желание "всё понять" так и не проходит. Тогда и может пригодиться какое-нибудь пошаговое руководство от простого — к сложному. Но именно такого, пошагового, руководства для языка MQL5 под руками и не оказывается.

Все (известные мне) руководства предполагают, что человек с программированием уже сталкивался, понимает, как это работает, и достаточно ему объяснить некоторые нюансы — и всё у него получится.

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

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

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

Основные технические термины

Почти все современные компьютеры построены на основе архитектуры Фон Неймана (или иногда пишут Фон-Неймана). И чтобы успешно читать литературу, надо понимать те термины, которые используют программисты.

  • Центральный процессор (или просто "Процессор", или CPU). Этот модуль отвечает за все вычисления и логику.
  • Оперативная память (часто говорят просто "Память" или RAM). В памяти хранятся данные и программы. При выключении компьютера или после завершения работы программы данные из оперативной памяти стираются.
  • Внешние накопители (жесткие диски, флешки, SSD...) Процессор способен записывать на них данные на  в виде файлов.
  • Файлы — информация, записанная на внешних носителях (а не в оперативной памяти).
  • Поток выполнения. Во время работы процессор берет данные из памяти, "понимает", команда это или данные, выполняет команду и результаты записывает либо обратно в память, либо на внешнее устройство, на которое укажет работающая программа. А потом снова считывает следующий фрагмент памяти, и так — до тех пор, пока программа не завершится. Весь этот процесс и называется "поток выполнения".

Чтобы измерить информацию, были придуманы специальные величины.

  • Бит — самая минимальна единица информации. По сути это — "выключатель", который определяет состояние конкретного, самого крохотного кусочка памяти. Содержит либо "0" ("выключено), либо "1" (включено).
  • Байт — с английского можно перевести как "слог", и это минимальный "пакет" информации, равный 8 бит. Когда компьютеры были большими и занимали целые этажи, а объёмы оперативной памяти — просто крохотными, и файлы хранились на перфокартах, 8 бит оказались самым удобным техническим компромиссом между скоростью (одновременно можно прочесть аж 8 отверстий!) и размером носителя.

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

При измерении физических, а не информационных величин каждая такая приставка сообщает об увеличении предыдущего размера в 1000 раз. Например, километр равен 1000 метров, а мегавольт — 1000 киловольт или 1 000 000 вольт.

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

Так, килобайт (Кбайт, Кб,) равен 1024 байта, мегабайт (Мбайт, Мб) будет содержать 1024 килобайта), и так далее.

Следующие по порядку приставки будут такими: гига-, тера-, пета-...

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

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


    Какие программы необходимы, чтобы начать программировать на MQL5

    Чтобы компьютер был полезен людям, нужно написать программу для каждого вида деятельности: для торговли, просмотра рисунков, слушания музыки...

    Писать программы непосредственно в командах процессора... можно. Но очень непродуктивно.

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

    Вот минимальный список таких программ для программистов:

    1. Текстовый редактор: Это программа, с помощью которой вы пишете свой код. Подойдёт любой, который вам нравится, главное, чтобы он не добавлял каких-то своих символов помимо того текста, что вы набираете. Очень удобно, когда редактор умеет подсвечивать синтаксис нужного вам языка (в данном случае — MQL5).

      При установке MetaTrader в систему автоматически устанавливается очень мощный редактор, который называется MetaEditor. Он умеет всё, что нужно.

      Однако если он вам по каким-то причинам не нравится, вы вольны выбрать что угодно другое. Например, один из очень популярных редакторов для программистов — Visual Studio Code (VSCode). Его тоже можно настроить на работу с MQL5 — с помощью плагинов.

    2. Компилятор: Компилятор преобразует текст, написанный программистом в редакторе, в машинный код. Только после преобразования процессор сможет этот код выполнить.

      Для языка MQL5 компилятор встроен в MetaEditor. Для других языков, таких как C++, компилятор может быть отдельной программой.

      Некоторые языки, такие как Python, не имеют явно выраженного компилятора. Они как бы выполняют текст из вашего файла напрямую.

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

    3. Отладчик: Инструмент для поиска и исправления ошибок в вашей программе. Он позволяет вам пошагово выполнять код и проверять данные, с которыми работает ваша программа в каждый конкретный момент времени, на каждом шаге.

      В MetaEditor отладчик встроенный.

    4. Система контроля версий (Version Control System, VCS): Помогает отслеживать изменения в вашем коде.

      Если вы написали много кода, а потом вдруг поняли, что версия, которая была день назад, работала намного лучше, и вообще нужно идти другим путём, VCS позволит "откатиться" к предыдущему состоянию файла (и даже всего проекта) буквально в несколько кликов или текстовых команд с клавиатуры.

      И, что самое главное, чаще всего VCS сохраняет данные на удалённом сервере, а не на вашем локальном компьютере, и это гарантирует, что если произойдёт сбой (например, откажет жёсткий диск), вы быстро сможете восстановить свою работу.

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

      Существуют сторонние инструменты, такие как Git.

      Однако такое средство встроено и в MetaEditor, и новичку возможностей встроенной VCS на первое время хватит "с головой".

    Это — тот инструментарий, без которого современное программирование очень сложно представить. Иногда бывает, что все эти средства используются программистами по отдельности. Но в современном мире это происходит относительно редко. Чаще используются такие программы, как MetaEditor, который включает в себя все эти возможности сразу (и даже больше).

    Программы, включающие все вышеперечисленные компоненты (текстовый редактор, компилятор, отладчик...), называются Интегрированная среда разработки (IDE).


    Основные виды программ MQL

    Программы, исполняемые в MetaTrader, можно разделить всего на четыре типа:

    1. Скрипты. Могут отображать любую информацию, торговать, выводить графические объекты... Но для того, чтобы скрипт выполнить, каждый раз его необходимо запускать заново.
    2. Индикаторы. Предназначены для отображения некоторой важной для торговой стратегии информации на каждом тике. Однако торговать самостоятельно они не умеют.
    3. Советники (они же "эксперты"). Это программы, предназначены для торговли. Как и индикаторы, выполняются на каждом тике, однако инструменты для рисования всяких красивых стрелочек или полезных линий у них обрезаны.
    4. Сервисы. В отличие от всех предыдущих видов программ сервисы не требуют для работы какого-то определённого графика. Они запускаются один раз при старте терминала. Можно заставить их оставаться в памяти до тех пор, пока терминал не будет закрыт (и даже ещё какое-то время после этого), однако реагировать на события терминала, такие, как приход нового тика или щелчок мышкой, они не умеют.

    Сравнение программ, доступных в MQL5

    Всё, что касается использования программ в MQL5, можно свести в простую таблицу:

    Таблица 1. Сравнение возможностей основных типов программ MQL5.

    Возможности программ
    Скрипты Индикаторы Советники Сервисы
    Привязаны к конкретному графику да да да нет
    Могут торговать да нет да да
    Выгружаются из памяти при смене временного интервала
    да да да нет
    Выполняются на каждом тике нет да да нет
    Срабатывает один раз при открытии терминала нет нет нет да
    Работают, пока открыто окно графика нет да да нет
    Могут обрабатывать различные события терминала или графика нет да да нет
    Могут запускать и останавливать таймер нет да да нет
    Автоматически вызываются функции инициализации и деинициализации нет да да нет
    На графике может выполняться только один  экземпляр программы
    да нет да

    Функции

    Каждая программа должна что-то делать, то есть, выполнять какие-то функции.

    Любая функция — это набор действий программы, приводящих к какому-то (часто — элементарному) результату. Например, вывести на печать строку текста, нарисовать одну букву, открыть сделку...

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

    Практически любой язык программирования позволяет создать свои собственные, пользовательские функции, чтобы выделить кусочки кода, которые повторяются, и затем эти кусочки повторно использовать одной строкой, а не переписывать раз за разом. Кроме этого, в любом языке всегда есть набор предопределённых функций. Именно эти, предопределённые функции отличают один язык программирования от всех остальных.

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

    MQL5 не является исключением. Он содержит набор встроенных функций и позволяет создавать пользовательские. Очень удобно для изучения встроенных функций языка пользоваться контекстной справкой. Для её вызова достаточно открыть чей угодно (даже чужой) код в MetaEditor, кликнуть на любом выделенном цветом слове и нажать клавишу <F1>.

    Из некоторых типов программ нельзя вызывать определённые встроенные функции. Некоторые, как уже было сказано, необходимо реализовать именно так, как описано в справке, причем в разных типах программ необходимыми будут разные функции.

    Но в остальном наше творчество почти ничем не ограничено. Мы можем создавать любые вспомогательные функции, организовывать их так, как нам удобно, и даже использовать функции, описанные с помощью других языков, таких как C++ или Python. И мы обязательно вернёмся к этим возможностям в будущих статьях.

    Но сейчас начнём с самого простого, что только позволяет создать язык MQL5: создадим скрипт, который выполнится один раз, когда его перетаскивают на график мышкой. С помощью стандартной функции языка MQL в этом скрипте мы просто выведем для пользователя обычное текстовое сообщение в стандартную панель внизу терминала.

    Запуск и настройка IDE

    Вот мы и добрались до практики! Всю работу мы будем выполнять в MetaEditor. Его можно запустить либо с помощью ярлыка (на рабочем столе или в меню "Пуск"), либо прямо из терминала MetaTrader — одним из способов, показанных на картинке (рисунок 1).

    Три способа вызвать MetaEditor.

    Рисунок 1. Три способа вызвать MetaEditor: 1 — кнопка на панели инструментов, 2 — меню, 3 — горячая клавиша (F4)

    После появления окна редактора рекомендую сразу же ввести свои логин и пароль с сайта mql5.com (или, если вы ещё не зарегистрированы — сделайте это). Регистрация позволит сохранять ваши проекты прямо на сервер, используя встроенную в MetaEditor программу контроля версий. При этом ваши сохранённые файлы никто не увидит, если вы сами не откроете доступ, поэтому сохранение своей работы в облаке MetaQuotes безопасно, насколько вообще может быть безопасно хранение информации в Интернет, и это — хорошая практика (хранить свою работу не только на своём компьютере).

    Диалог авторизации

    Рисунок 2. Диалог авторизации в сообществе MQL5.com

    Чтобы попасть в диалог авторизации, выберите в главном меню окна редактора "Инструменты -> Настройки" и перейдите на вкладку "Сообщество". Эту настройку нужно совершить один раз. Дальше введённые данные сохранятся, и вы сможете работать с системой контроля версий и другими полезными сервисами MQL, не задумываясь об авторизации, долгое время.


    Первый скрипт

    И вот теперь... Просто нажимаем правой кнопкой мыши на папку в левой панели, где хотим создать скрипт, и выбираем "Новый файл"... Или сочетание клавиш <Ctrl>+<N>... В появившемся окне выбираем "Скрипт", а в следующем за ним вводим имя файла...

    Создание файла

    Рисунок 3. Методы создания нового файла.

    Создание файла — диалог выбора типа программы

    Рисунок 4. Диалог "мастера" создания файла — выбор типа создаваемой программы.

    Создание файла — выбор имени

    Рисунок 5. Диалог "мастера" создания файла — ввод имени создаваемой программы.

    И в итоге получается новое окно вот с таким содержимым:

    //+------------------------------------------------------------------+
    //|                                                   HelloWorld.mq5 |
    //|                                       Oleg Fedorov (aka certain) |
    //|                                   mailto:coder.fedorov@gmail.com |
    //+------------------------------------------------------------------+
    #property copyright "Oleg Fedorov (aka certain)"
    #property link      "mailto:coder.fedorov@gmail.com"
    #property version   "1.00"
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       
      }
    //+------------------------------------------------------------------+
    

    Пример 1. Шаблон скрипта, сгенерированный "мастером".

    Вроде ничего сложного, всего 17 строк, вполне можно окинуть одним взглядом...

    Разберёмся же, что именно тут написано.

    • Во-первых, вначале идёт несколько строк, начинающихся символами двойного слэша ( // ). Аналогичные строки идут и в середине программы.

    Это комментарии. Они пишутся для людей, и компилятор при генерации байт-кода их полностью выбросит. Такие комментарии, которые начинаются двойным слэшем, называются однострочными. Их нужно располагать в конце строки. Правило очень простое: всё, что до двойного слэша, компилятор будет считать кодом, всё, что после — текстом для человека.

    В этом, созданном мастером шаблоне код "до" в данном контексте просто не понадобился.

    В MetaEditor можно быстро закомментировать несколько строк: выделить их — и нажать сочетание клавиш " <Ctrl>+< ' > (контрол+ апостроф). Чтобы раскомментировать такие строки, необходимо их выделить снова и нажать сочетание <Ctrl>+< ; >.

    Существуют ещё и многострочные комментарии. Они начинаются с символов " /* " и заканчиваются обратной последовательностью " */ ". Многострочные комментарии можно вставлять в любое место кода, где допустим пробел. При компиляции компилятор тоже сначала "выбрасывает" такие последовательности, а уж потом пытается разобраться, "что же имел в виду автор".

    На практике в середину кода комментарии вставляются довольно редко. Чаще всего это просто неудобно. Зато комментировать большие блоки ненужного кода или описывать "шапки" функций с их помощью — одно удовольствие.

    Вот как могла бы выглядеть "шапка" этого файла с использованием многострочного комментария (если бы я писал её сам, а не автоматика MetaEditor):

    /*
                                                       HelloWorld.mq5 
                                           Oleg Fedorov (aka certain) 
                                       mailto:coder.fedorov@gmail.com 
    */

    Пример 2. Многострочные комментарии.

    Или так:

    /*******************************************************************
     *                                                  HelloWorld.mq5 *
     *                                      Oleg Fedorov (aka certain) *
     *                                  mailto:coder.fedorov@gmail.com *
     *******************************************************************/

    Пример 3. Украшенные многострочные комментарии.

    В общем, между знаками /* и */ (или после // ) может находиться любой текст, на любом языке, благо, современные редакторы поддерживают кодировку Unicode в полной мере. Но всё же рекомендуется использовать английский язык, поскольку это позволяет сэкономить время на переключении раскладок (а в больших проектах это таки существенно).

    • Второй блок, который бросается в глаза — это строки, начинающиеся со знака " # ". В данном файле начальные слова у каждой строки этого блока — #property.

    Вообще говоря, каждое слово, начинающееся со знака решетки — это директива препроцессора. Компилятор перед преобразованием текста в машинный код должен не только выкинуть все комментарии. Он также должен сделать и другие приготовления. Подготовительной работы бывает обычно довольно много, потому, что в больших проектах необходимо и собрать проект из нескольких файлов, определить некоторые данные (обычно — константы типа числа π или чего-то подобного, хотя бывают и более сложные случаи) — и так далее. Но со всеми этими директивами мы будем разбираться гораздо позже.

    Пока, для понимания полученного кода, достаточно знать, что директива #property описывает некоторое свойство полученной программы. Чаще всего эти "свойства" влияют на исходное окно, которое появляется сразу после того, как пользователь запустит нашу программу, перетянув её иконку на график.

    Чтобы проиллюстрировать это, добавим в код еще одну строку:

    #property copyright "Oleg Fedorov (aka certain)"
    #property link      "mailto:coder.fedorov@gmail.com"
    #property version   "1.00"
    #property script_show_inputs

    Пример 4. Добавление свойства script_show_inputs.

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

    Итак, записав нужную строку в нужное место файла (сразу после свойства version), проведём первую компиляцию нашей программы.

    Выберите один из способов, показанных на рисунке (например, нажмите клавишу <F7>).

    Несколько способов скомпилировать программу

    Рисунок 6. Несколько способов скомпилировать программу.

    Несколько секунд ожидания... И — вот, программа скомпилирована (рисунок 7).

    Компиляция завершена

    Рисунок 7. Результаты компиляции. В данном случае компиляция прошла успешно (0 ошибок), заняла 527 миллисекунд, и байт-код создан для 64-битного процессора.

    На рисунке 9 видно, что компиляция прошла успешно. Если бы в текстовом файле были ошибки, сообщения о них попали бы в это же окно.

    После компиляции иконка скрипта автоматически появится в списке скриптов вашего торгового терминала. Чтобы переключиться в терминал, можно, например, в редакторе нажать клавишу <F4>. Это сэкономит немного времени.

    Перетаскиваем мышкой скрипт на график и можем полюбоваться окном свойств.

    Первый запуск скрипта

    Рисунок 8. Окно параметров скрипта.
    (1)В правом верхнем углу основного окна отображается иконка работающего скрипта.
    (2) На вкладке "Общие" видно, как используются свойства, описанные с помощью директив #property.
    (3) MetaEditor добавил к адресу, указанному в свойстве "link", дополнительные параметры.
    Вероятно, для того, чтобы если ссылка будет на сайт, это могло помочь понять, откуда пришли посетители.

    Закроем окно, вернёмся в редактор и попробуем уговорить скрипт сделать что-то полезное, например, вывести сообщение для пользователя.

    Для этого закомментируем строку, выводящую окно параметров (нам же пока нечего изменять?), и добавим другую, пишущую сообщение:

    //+------------------------------------------------------------------+
    //|                                                   HelloWorld.mq5 |
    //|                                       Oleg Fedorov (aka certain) |
    //|                                   mailto:coder.fedorov@gmail.com |
    //+------------------------------------------------------------------+
    #property copyright "Oleg Fedorov (aka certain)"
    #property link      "mailto:coder.fedorov@gmail.com"
    #property version   "1.00"
    //#property script_show_inputs
    
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       Print("Hello, MQL5 world!");
      }
    //+------------------------------------------------------------------+
    

    Пример 5. Скрипт, выводящий строку в пользовательский журнал.

    • Теперь обратите внимание на предопределенные слова.

    В данном коде предопределёнными являются слова #property, copyright, link, version, void, OnStart, Print. Попробуйте кликнуть в редакторе MetaEditor по любому из них и нажать <F1> для вызова встроенной справки.

    • Внутри сгенерированной мастером функции OnStart мы вызвали другую стандартную функцию — Print, и с помощью параметров (по-другому их еще называют аргументы), перечисленных в скобках, рассказали ей, что именно надо печатать.

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

    Если какой-либо функции нужно будет передать несколько параметров, эти параметры должны быть перечислены через замятую, как в примере 6:

    Print("Привет, мир MQL5!", " Я написал собственную программу. ", "Ура!");

    Пример 6. Функция, принимающая три параметра

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

    И еще обратите внимание на пробелы внутри второго аргумента. Дело в том, что функция Print "сливает" свои аргументы в одну большую строку, поэтому обо всех знаках препинания и дополнительных разделителях между словами программист должен позаботиться самостоятельно.

    Функция OnStart выполняется автоматически, один раз, при старте скриптов и сервисов.

    Компилируем и запускаем уже известным способом.

    Выводим строку

    Рисунок 9. Первая полезная работа: вывод строки в журнал.


    Заключение

    В экспертах и индикаторах тоже есть предопределённые функции, но с другими названиями. Принцип их действия тот же самый, что и у функций скриптов: наш код записывается, в основном, внутри, а свойства — снаружи. Но есть и отличия.

    Так, некоторые функции в советниках и индикаторах выполняются терминалом на каждом тике, а не один раз, как OnStart.

    Поэтому предлагаю тем, кто хочет проверить, что усвоилось из статьи (и для закрепления знаний), самостоятельно провести небольшие "домашние исследования":

    1. С помощью мастера создания файлов сгенерируйте все остальные типы программ, не охваченные примерами этой статьи.
    2. Подумайте, можно ли с помощью описанных в статье средств выяснить, какие функции в каком порядке вызываются при старте каждого типа программ.
    3. Для любопытных — можно проверить, что будет, если:
      • добавить функцию OnStart к индикаторам и советникам;
      • добавить к скриптам и сервисам те функции, которые мастер создаст для других типов программ;

    Возможно, эти исследования принесут вам новые идеи, а возможно, вы глубже поймёте, как именно работают программы на языке MQL5.

    Желаю вам успехов. И — до скорой встречи в следующих статьях цикла!

    Последние комментарии | Перейти к обсуждению на форуме трейдеров (28)
    Oleh Fedorov
    Oleh Fedorov | 30 нояб. 2023 в 20:23
    MrBrooklin #:

    Пожалуйста, доберитесь до структур и разложите всё по полочкам. Это тоже очень интересная и важная тема! Главное в цикле статей, чтобы весь учебный материал, с учётом его степени сложности, шел дозированно, плавно и по нарастающей.

    Обязательно.

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

    Просто цикл задуман довольно длинный, хочу выпустить минимум семь статей, чтобы охватить как можно больше важных тем. Может, и большее количество, если материал потребует да модератор разрешит. :-)

    Что ещё будет интересно узнать новичку, исходя из личного опыта самообучения:

    1. передача аргументов в функцию, в т.ч. по ссылкам;
    2. массивы;
    3. файлы;
    4. рисование графических объектов;
    5. доступ к таймсериям и данным индикаторов;
    6. функция OnTradeTransaction.

    Спасибо.

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

    Ну, в моём представлении, индикаторы новичкам тоже нужны. Да и события - штука хорошая... И много чего еще.

    В общем, новички, оставайтесь на линии. :-)

    Но и опытным разработчикам спасибо за мнение. Я рад, что вы сочли материал полезным.

    Aleksandr Shirin
    Aleksandr Shirin | 21 февр. 2024 в 10:47
    Статья понравилась. Было бы здорово если бы была возможность обсуждать с автором возникающие трудности и решать их. Намерне продолжать заниматься по статьям из этого цикла.
    Oleh Fedorov
    Oleh Fedorov | 21 февр. 2024 в 13:35
    Aleksandr Shirin #:
    Статья понравилась. Было бы здорово если бы была возможность обсуждать с автором возникающие трудности и решать их. Намерне продолжать заниматься по статьям из этого цикла.
    Возможность есть. Я, как правило, на связи - что в русских и английских комментах, что в личных сообщениях...
    gmurphygmcs
    gmurphygmcs | 2 мая 2024 в 17:03
    Спасибо Алексею за то, что собрал воедино основы программирования и обучения MQ. Как новичок, я имею некоторое базовое понимание программирования и хотел углубиться в советники, но никогда не имел времени (как трейдер с полной занятостью), чтобы заняться этим. Это было 20 лет назад. Здравствуйте, GTP4. Общаясь и обсуждая концепции торговли, а теперь и построения советников, я хотел узнать, что генерирует ИИ. Я не могу приблизиться к сложности или скорости, с которой он работает, но приятно знать, что, черт возьми, происходит - Спасибо!
    Oleh Fedorov
    Oleh Fedorov | 3 мая 2024 в 08:21
    gmurphygmcs #:
    Спасибо Алексею за то, что собрал воедино основы программирования и обучения MQ. Как новичок, я имею некоторое базовое понимание программирования и хотел углубиться в советники, но никогда не имел времени (как трейдер с полной занятостью), чтобы заняться этим. Это было 20 лет назад. Здравствуйте, GTP4. Общаясь и обсуждая концепции торговли, а теперь и построения советников, я хотел узнать, что генерирует ИИ. Я не могу приблизиться к сложности или скорости, с которой он работает, но приятно знать, что, черт возьми, происходит - Спасибо!
    GTP4 генерирует, в основном, MQL4 код. MQL5 его нужно учить, и то, не факт, что он будет помнить обучение через несколько сообщений.
    Сделайте торговые графики лучше с интерактивным графическим интерфейсом на основе MQL5 (Часть III): Простой перемещаемый торговый интерфейс Сделайте торговые графики лучше с интерактивным графическим интерфейсом на основе MQL5 (Часть III): Простой перемещаемый торговый интерфейс
    В этой серии статей мы исследуем интеграцию интерактивных графических интерфейсов в перемещаемые торговые панели на MQL5. В третьей части мы используем наработки из предыдущих частей, чтобы превратить статические торговые панели в динамические.
    Python, ONNX и MetaTrader 5: Создаем модель RandomForest с предварительной обработкой данных RobustScaler и PolynomialFeatures Python, ONNX и MetaTrader 5: Создаем модель RandomForest с предварительной обработкой данных RobustScaler и PolynomialFeatures
    В этой статье мы создадим модель случайного леса на языке Python, обучим модель и сохраним ее в виде конвейера ONNX с препроцессингом данных. Модель мы далее используем в терминале MetaTrader 5.
    Нейросети — это просто (Часть 66): Проблематика исследования в офлайн обучении Нейросети — это просто (Часть 66): Проблематика исследования в офлайн обучении
    Обучение моделей в офлайн режиме осуществляется на данных ранее подготовленной обучающей выборки. Это дает нам ряд преимуществ, но при этом информация об окружающей среде сильно сжимается до размеров обучающей выборки. Что, в свою очередь, ограничивает возможности исследования. В данной статье хочу предложить познакомиться с методом, позволяющем наполнить обучающую выборку максимально разнообразными данными.
    Теория категорий в MQL5 (Часть 15): Функторы с графами Теория категорий в MQL5 (Часть 15): Функторы с графами
    Статья продолжает серию о реализации теории категорий в MQL5, рассматривая функторы как мост между графами и множеством. Мы вновь обратимся к календарным данным и, несмотря на их ограничения в использовании тестера стратегий, обоснуем использование функторов в прогнозировании волатильности с помощью корреляции.