
Переходим на MQL5 Algo Forge (Часть 1): Создание основного репозитория
Содержание
- Введение
- Что есть на данный момент
- Приступаем к переходу
- Инструмент работы с репозиторием
- Создание основного репозитория
- Клонирование репозитория
- Настраиваем игнорируемые файлы
- Выгрузка изменений
- Создание архивной ветки
- Подготовка к созданию веток проектов
- Заключение
Введение
Работая над более менее крупным проектом, неизбежно приходится сталкиваться с необходимостью отслеживания сделанных изменений в коде, их группировке по смысловому содержанию и возможности вернуться к предыдущим версиям кода. В целом, для этого используются различные системы контроля версий, например, GIT или Subversion (SVN).
Как правило, среды разработки программ предоставляют встроенные инструменты для работы с репозиториями (хранилищами) кода какой-либо системы управления версиями. MetaEditor не является исключением и тоже поддерживает использование собственного хранилища MQL Storage на базе системы контроля версий SVN. Как сказано в справке:
MQL5 Storage — это персональное онлайн-хранилище исходных кодов на MQL4/MQL5. Оно интегрировано в MetaEditor: вы можете сохранять и получать данные из хранилища прямо в редакторе.
В хранилище используется система контроля версий. Это значит, что вы всегда можете посмотреть, когда и как были изменены файлы, можете отменить любые изменения и вернуться к предыдущей версии.
В MQL5 Storage ваши исходные коды всегда в безопасности. Данные хранятся на защищенном сервере и доступ к ним есть только у вас. При выходе из строя жесткого диска все ранее сохраненные коды можно легко восстановить.
Через хранилище можно легко обмениваться и синхронизировать шаблоны и профили графиков, наборы параметров для тестирования MQL5-программ и наборы торговых инструментов между разными платформами.
MQL5 Storage также позволяет вести совместную удаленную разработку приложений при помощи групповых проектов.
Однако большей популярностью пользуются система контроля версий GIT и, на наш взгляд, вполне заслуженно. Наверное поэтому некоторое время назад на форуме были озвучены планы по переходу на использование GIT в качестве встроенной системы контроля версий в MetaEditor, и анонсирован собственный аналог общедоступного хранилища проектов GitHub — MQL5 Algo Forge.
Это хранилище уже доступно для использования, но пока что работы по его интеграции MetaEditor ещё не завершены. Поэтому, оставаясь в рамках использования MetaEditor как основной среды разработки, нам остаётся только использовать имеющееся в нём на данный момент хранилище MQL Storage на основе SVN.
В процессе работы над различными проектами мы активно использовали имеющуюся систему контроля версий. Однако, при работе над циклом статей "Разрабатываем мультивалютный советник" особенно остро стал ощущаться недостаток возможности вести разработку кода в параллельных ветках с их последующим слиянием. Хотя SVN позволяет использовать их, в интерфейсе MetaEditor поддержка веток не реализована. Для их использования можно было бы воспользоваться внешним клиентом SVN, но это уже требует некоторых усилий по перестройке привычной среды окружения.
Так что новость о переходе на использование MQL5 Algo Forge была встречена очень тепло. Наши надежды были связаны как раз с тем, что теперь в MetaEditor будет добавлена поддержка веток. Но прошло уже семь месяцев, а надеждам пока сбыться не удалось. Поэтому попробуем посмотреть, как можно обойтись уже имеющимися средствами для повышения комфортности разработки.
Для лучшего понимания дальнейшего изложения потребуются хотя бы базовые знания о системах контроля версий. Поэтому рекомендуем, при необходимости, ознакомится с материалами на эту тему на сайте MQL5 или в других местах, например, со статьёй Работаем с Git: первые шаги в GitHub.
Что есть на данный момент
Сразу после выхода новости о создании MQL5 Algo Forge мы увидели, что там появился репозиторий с именем mql5, в котором располагались все файлы из нашего текущего хранилища MQL Storage. Однако, они были добавлены одним коммитом от имени пользователя super.admin, поэтому никакой истории изменений (коммитов) из текущего хранилища там, естественно, не было. Это в принципе не страшно. Да и понятно, что перенести всю историю изменений между разными типами систем контроля версий практически невозможно.
Какое-то время назад, в MetaEditor в некоторых местах сменилось название используемого хранилища. Например, в заголовке диалога показа истории изменений мы видим именно "MQL5 Algo Forge":
Однако, суть всё равно осталась пока прежней: все изменения попадают в MQL Storage, а не в MQL5 Algo Forge. Так что перенесённые в новое хранилище 7 месяцев назад файлы без нашего участия не обновлялись.
Зато мы можем теперь использовать разные репозитории! В текущем хранилище репозиторий был один. Разные проекты нам приходилось создавать в разных папках внутри папки данных MQL5. Именно она всегда является корневой папкой хранилища. Это приводило к тому, что создав новую копию терминала для работы над новым проектом и активировав хранилище, мы получали из него код всех ранее созданных проектов. Когда их накопилось уже заметное количество, то это стало доставлять некоторые неудобства.
Просто удалить код ненужных в данный момент проектов из папки данных было нельзя, так как при каждом коммите изменений нам пришлось бы отмечать, что удаление данных файлов не следует переносить и в хранилище.
С приходом полноценного GIT-репозитория, у нас появляется возможность использовать несколько вариантов организации хранения и работы с кодом разных проектов:
- Каждый проект находится в отдельном репозитории.
- Каждый проект находится в отдельной ветке в одном репозитории.
- Смешанный вариант из первых двух: под какие-то проекты мы создаём отдельный репозиторий, а какие-то проекты могут сосуществовать в отдельных ветках одного репозитория.
У каждого из этих подходов наверняка есть свои преимущества и недостатки. Навскидку можно заметить, что если в разных проектах используется одинаковая библиотека, то её будет неудобно хранить в отдельном репозитории, и лучше вести её разработку в отдельной ветви, выполняя время от времени слияние правок с ветками проектов, где эта библиотека используется. А если проект является самодостаточным, то более подходящим будет использование для него отдельного репозитория, чтобы не хранить в нём ненужный код от других проектов.
Приступаем к переходу
Когда мы хотим что-то поменять, то нелишне будет позаботиться о сохранении уже имеющегося. Использовать уже созданный репозиторий с именем mql5, наверное, не стоит, так как при дальнейших шагах по интеграции со стороны MetaQuotes в этом репозитории возможно будут выполняться какие-то ещё действия от имени super.admin. Поэтому, первым делом, создадим новый репозиторий, в котором будут аккумулированы все имеющиеся на данный момент проекты. Для нового репозитория мы будем использовать модель хранения разных проектов в разных ветках. Для того, чтобы выполнить такое разделение, примем следующие соглашения:
- Основная ветка main или будет пустой, или будет содержать только небольшое количество кода, требуемого для всех проектов.
- Отдельная ветка archive будет содержать весь имеющийся на момент перехода код. Из неё мы сможем брать код для отдельных веток проектов.
- Остальные ветки будут относиться к какому-либо проекту и содержать его название в начале своего имени.
- Для одного проекта может быть открыто несколько веток по выбранной модели (например, можно воспользоваться подходом, предложенным в статье Удачная модель ветвления для Git).
Итак, предположим, у нас есть папка MetaTrader5 с установленным терминалом и подключенным хранилищем MQL Storage. То есть папка данных терминала MetaTrader5/MQL5 содержит вместе с некоторыми стандартными файлами, поставляемыми вместе с терминалом, код наших проектов.
Создадим новую папку MetaTrader5.forge и скопируем туда два запускаемых файла:
Запустим из этой папки терминал MetaTrader в portable-режиме. У нас при двойном клике он сразу запустился в этом режиме. Но может потребоваться явно указать ключ /portable при запуске из командной строки, или создав ярлык, в котором этот ключ можно добавить к команде запуска приложения. Торговый демо-счёт можно пока не открывать и в аккаунт сообщества MQL5.community тоже пока можно не входить.
В новой папке создалась начальная структура папок, среди которых есть и папка данных MQL5. В ней сейчас ещё нет наших файлов:
Запустим MetaEditor из открытого терминала нажатием F4.
Если кликнуть правой кнопкой по имени какой-нибудь папки, то в контекстном меню в последнем пункте предлагается активировать хранилище MQL5 Algo Forge (хотя на самом деле пока что будет активироваться хранилище MQL Storage). Не будем его активировать, так как мы хотим перейти на использование хранилища нового типа.
Закроем терминал MetaTrader и MetaEditor, так как какое-то время они нам не понадобятся, а также нам придётся выполнять некоторые действия в папке терминала.
Инструмент работы с репозиторием
Далее нам необходимо выбрать инструмент работы с будущим репозиторием. В будущем им возможно станет сам MetaEditor, но пока нам надо воспользоваться чем-то другим. Подойдет любой инструмент позволяющий работать с GIT-репозиторием, например, Visual Studio Code (VSCode) и собственно сам GIT. Его версию для Windows можно скачать с gitforwindows.org.
Итак, устанавливаем GIT и VSCode (или убеждаемся, что они уже были установлены ранее). В VSCode устанавливаем расширение MQL Tools для работы с файлами на MQL5:
После установки расширения, в его настройках указываем в параметре "Metaeditor5 Dir" путь к запускаемому файлу MetaEditor. Поскольку нет необходимости работать с исходными файлами MQL5, расположенными вне рабочей папки какой-то копии терминала, то можно последовать рекомендациям и указать путь относительно текущей открытой папки в VSCode:
И ниже, в настройках этого расширения, рекомендуем обязательно поставить галочку в пункте "Portable MT5".
Также для подсветки синтаксиса нам понадобится установка расширения C/C++ for Visual Studio Code:
К сожалению, хотя язык MQL5 очень похож на C++, в нём встречаются некоторые языковые конструкции, которые считаются недопустимыми в C++. Поэтому кое-где мы сможем наблюдать сообщения от этого расширения об ошибках синтаксиса C++, хотя, с точки зрения MQL5, всё будет правильно.
Откроем теперь папку данных терминала MetaTrader5.forge/MQL5 в VSCode:
Попробуем открыть какой-нибудь файл советника:
Подсветка синтаксиса работает, в правом верхнем углу окна добавились кнопки проверки синтаксиса MQL5 и компиляции данного файла с помощью MetaEditor. Но все директивы #include порождают сообщение об ошибке. Связано это с тем, что MQL5 - это всё-таки не C++, и расположение включаемых файлов стандартной библиотеки отличается. Для исправления этой ошибки достаточно последовать подсказке по исправлению: в настройках расширения C/C++ for Visual Studio Code добавить путь к папке MetaTrader5.forge/MQL5/Include:
После этого, сообщение об ошибке исчезает, и файл советника успешно компилируется:
На этом мы временно сворачиваем VSCode, так как в игру должен вступить главный виновник торжества — MQL5 Algo Forge.
Создание основного репозитория
Заходим на сайт https://forge.mql5.io/ и либо регистрируем новый аккаунт, либо используем наш существующий аккаунт в сообществе MQL5.community для входа:
В правом верхнем углу в меню выбираем пункт "New repository":
Выберем какое-нибудь название для репозитория (например, mql5-main). При клонировании репозитория на локальный компьютер, мы сможем указать своё название корневой папки для файлов репозитория, поэтому имя можно особо не выбирать. Также сразу добавим инициализацию репозитория добавлением файлов .gitignore и README.md:
Отлично, репозиторий создан, первый коммит автоматически сделан:
Для дальнейших действий нам понадобится скопировать URL репозитория, который в нашем случае равен https://forge.mql5.io/antekov/mql5-main.git. Теперь возвращаемся из браузера к VSCode, MetaEditor и терминалу MetaTrader 5.
Клонирование репозитория
Для клонирования репозитория на локальный компьютер нам понадобится чистая папка MQL5 в папке терминала. Но сейчас она уже наполнена файлами, поэтому придётся поступить так:
- Закрываем VSCode, MetaEditor и терминал MetaTrader5.
- Переименовываем папку MQL5 (например, в MQL6).
Теперь папки с именем MQL5 в папке терминала MetaTrader5.forge нет:
Открываем эту папку в VSCode и запускаем консоль нажатием [Ctrl + `].
Копируем URL репозитория и выполняем в консоли команду клонирования, указав после URL имя корневой папки репозитория на локальном компьютере (оно должно быть равно MQL5):
git clone https://forge.mql5.io/antekov/mql5-main.git MQL5
Если делать эту операцию впервые, то понадобится ввести свои учётные данные, если репозиторий был создан как частный. В результате, в папке терминала появилась вложенная папка MQL5 с двумя файлами (.gitignore и README.md)
Перемещаем все файлы и папки из MetaTrader5.forge/MQL6 в папку MetaTrader5.forge/MQL5 и удаляем MetaTrader5.forge/MQL6:
Открываем папку MetaTrader5.forge/MQL5 в VSCode, на панели слева кликаем на иконку системы контроля версий и видим, что в нашей папке репозитория присутствует много новых файлов (581):
Но все эти файлы не обязаны находиться в нашем репозитории, поскольку они идут вместе с устанавливаемой платформой MetaTrader. В новых версиях может меняться состав, расположение и содержание файлов стандартной библиотеки и примеров советников и индикаторов. Мы не можем вносить в них правки без риска потерять их при следующем обновлении терминала MetaTrader или перехода к новой рабочей папке. Поэтому добавлять их в наш репозиторий нет смысла.
Настраиваем игнорируемые файлы
Как раз для этого нам пригодится файл .gitignore. В нём мы можем перечислить, какие файлы система контроля версий GIT будет игнорировать. Это очень удобно — вместо сотен новых файлов в списке изменений мы будем видеть только свои изменённые файлы. Поскольку сейчас в наш репозиторий мы ещё ничего своего не добавляли, то все файлы, видимые в списке изменённых, надо включить в состав игнорируемых.
Для этого открываем файл .gitignore и заменяем его шаблонное содержимое на, например, такое:
# ---> MQL5 # VSCode Preferences .vscode/* # Executables *.ex5 # MQL5 Standard Files /Experts/Advisors/ /Experts/Examples/ /Experts/Free Robots/ /Experts/Market/ /Files/ /Images/ /Include/Arrays/ /Include/Canvas/ /Include/ChartObjects/ /Include/Charts/ /Include/Controls/ /Include/Expert/ /Include/Files/ /Include/Generic/ /Include/Graphics/ /Include/Indicators/ /Include/Math/ /Include/OpenCL/ /Include/Strings/ /Include/Tools/ /Include/Trade/ /Include/WinAPI/ /Include/MovingAverages.mqh /Include/Object.mqh /Include/StdLibErr.mqh /Include/VirtualKeys.mqh /Indicators/Examples/ /Indicators/Free Indicators/ /Libraries/ /Logs/ /Profiles/ /Scripts/Examples/ /Scripts/UnitTests/ /Services/ /Shared Projects/ /experts.dat /mql5.*
Таким образом мы сообщаем системе контроля версий, что надо игнорировать все файлы настроек VSCode, все скомпилированные файлы советников и индикаторов (в репозитории, как правило, хранятся только исходные коды) и все стандартные файлы, находящиеся в перечисленных папках.
Выгрузка изменений
После сохранения изменений в файле .gitignore, VSCode показывает, что изменения есть только в одном единственном файле — самом .gitignore. Все остальные файлы, которые вернулись в папку MQL5, ставшую теперь корневой папкой нашего репозитория mql5-main, как будто бы не существуют. То есть в папке они присутствуют, но система контроля версий на их наличие не обращает внимания:
Выполним коммит (фиксацию) изменений в локальном репозитории: введём описание сделанных изменений, например "Add standard files to .gitignore" и нажмём кнопку Commit.
Сейчас информация о внесённых исправлениях сохранена только в локальном репозитории. Чтобы она попала в вышестоящий репозиторий, необходимо выполнить команду push. Это можно сделать разными способами, например, нажав кнопку "Sync Changes", выбрав пункт Push из меню, скрывающегося за троеточием напротив CHANGES, или выполнив консольную команду git push.
Однако, пока мы ещё не отправили последний коммит в вышестоящий репозиторий, обратите внимание на историю коммитов в GRAPH. Сейчас в ней показаны два коммита с комментариями "Initial commit" и "Add standard files to .gitignore". Справа, напротив коммитов, мы видим цветное название ветки. У первого коммита она называется origin/main, а у второго просто main. На самом деле это одна и та же ветка main. Имя origin является псевдонимом вышестоящего репозитория, поэтому приставка origin/ означает, что этот коммит является последним в ветке main в вышестоящем репозитории. Второй коммит этой приставки не имеет, поэтому он существует и является последним только в локальном репозитории.
Нажмём кнопку "Sync Changes":
Изменения были успешно отправлены в вышестоящий репозиторий, и фиолетовая метка ветки вышестоящего репозитория переместилась на второй коммит. Теперь эти изменения можно увидеть, если зайти в вышестоящий репозиторий через веб-интерфейс:
Итак, мы подготовили новый пустой репозиторий (ну, почти пустой) к наполнению нашими файлами. Сейчас в нём есть единственная ветка с именем main, в которой есть только два добавленных нами файла. Остальные файлы, которые присутствуют в папке данных этой копии терминала, игнорируются системой контроля версий.
Создание архивной ветки
Как было сказано выше, сначала мы поместим все наши файлы в одну ветку, чтобы они уже оказались под управлением системы контроля версий и после операции push попали бы в вышестоящий репозиторий. После этого, мы сможем получить наши файлы из вышестоящего репозитория на любом другом компьютере при необходимости.
Создание новой ветки, как и остальные операции системы контроля версий, можно выполнить через разные интерфейсы. Из VSCode это можно сделать, например, через меню действий с репозиторием, скрывающимся за троеточием. Нам надо выбрать пункт "Checkout to...":
После этого, в появившемся списке действий нужно выбрать пункт "Create new branch.."
В веб-интерфейсе вышестоящего репозитория мы можем перейти на вкладку веток (1 branch) и там нажать кнопку создания новой ветки (выделена зелёным прямоугольником):
Между этими двумя способами есть одно отличие. Первый создаёт новую ветку на локальном компьютере, и до выгрузки изменений командой push, вышестоящий репозиторий не будет знать о существовании этой ветки. Второй способ создаёт новую ветку в вышестоящем репозитории, поэтому теперь уже локальный репозиторий до загрузки изменений командой pull не будет знать о существовании этой ветки. Это не является какой-либо проблемой, достаточно выполнить синхронизацию репозиториев (выполнив команды pull & push).
Третий способ состоит в использовании консольных команд управления репозиторием. Создать новую ветку с именем "archive" в локальном репозитории можно, выполнив, например, такую команду из папки репозитория:
git checkout -b archive
Если сделать это в интегрированной консоли в VSCode, то увидим примерно следующую картину:
В консоли нам сообщили, что репозиторий был переключен на только что созданную новую ветку "archive". В списке коммитов название ветки main сменилось на archive. В списке изменений нам предлагают опубликовать новую ветку в вышестоящий репозиторий. Но подождём с этой операцией до наполнения этой ветки нашими файлами.
Если помните, то у нас была начальная папка с терминалом MetaTrader, в которой в папке MQL5 были расположены все наши файлы. Репозиторий мы создали внутри другой папки с терминалом. Теперь давайте скопируем из папки старого терминала всё содержимое папки MQL5 в эту папку нового терминала:
Система контроля версий сразу обнаружила, что в папке репозитория появились новые файлы, и в списке изменений они показаны для выбора дальнейших действий. В данном случае, мы хотим все новые файлы добавить в индекс (то есть под управление системы контроля версий). Это можно сделать или через интерфейс VSCode, нажав кнопку "+" (Stage All Changes) в заголовке списка изменений, или выполнив консольную команду
git add .
Как видно, напротив каждого имени файла в списке изменений теперь стоит буква A вместо U, то есть файл добавлен (Added) в индекс. Остаётся сделать коммит и выгрузить сделанные изменения в вышестоящий репозиторий:
Как видно, теперь в ветке main последний коммит — это второй коммит, а третий коммит сделан уже в ветке archive. Проверим, что новая ветка попала в вышестоящий репозиторий:
Да, последний коммит виден в вышестоящем репозитории и относится он к новой ветке archive. Если кликнуть на нём, то можно увидеть, какие изменения вошли в этот коммит:
Итак, все файлы добавлены в архивную ветку. Попробуем теперь вернуться в локальном репозитории к основной ветке main.
Подготовка к созданию веток проектов
Для переключения на основную ветку, выполним в консоли команду
git checkout main
Наш локальный репозиторий должен вернуться к состоянию, которое было у него до копирования всех наших файлов. Но посмотрев на содержимое папки MQL5 после такого переключения, мы заметим, что много наших папок с файлами советников остались на месте:
Если присмотреться, то оказывается, что в этих папках остались скомпилированные файлы советников. Дело в том, что поскольку мы исключили их из отслеживания системой контроля версий, то при переключении с архивной на основную ветку, эти файлы остались нетронутыми. Из папок наших проектов пропали только файлы с исходным кодом, которые были добавлены в индекс системы контроля версий.
Это не очень удобно, поэтому давайте удалим скомпилированные файлы и пустые каталоги, образовавшиеся после удаления этих файлов. Разумеется, не стоит делать это вручную, так как это потребует заметного времени, и такую операцию может потребоваться выполнять ещё неоднократно в дальнейшем. Поэтому напишем простенький скрипт, выполняющий данную работу.
В процессе написания выяснилось, что удаления только файлов недостаточно для приведения корневой папки в исходное состояние, после переключения с архивной на основную ветку. Надо ещё удалять папки, которые стали пустыми после удаления файлов .ex5. Часть папок, которые могут изначально быть пустыми и не должны удаляться, мы добавим в список исключений. В него войдут все папки, которые мы перечисляли в файле .gitignore, и папка .git со служебными файлами системы контроля версий.
Вот как мог бы выглядеть код этого скрипта:
import os def delete_ex5_files_and_empty_dirs(path, excluded=['.git', '.vscode']): # Исключения excluded = {os.path.join(path, dir) for dir in excluded} # Обход всех директорий и файлов в дереве каталогов for root, dirs, files in os.walk(path, topdown=False): is_excluded = False for ex in excluded: if root.startswith(ex): is_excluded = True break if is_excluded: continue # Удаление всех файлов с расширением .ex5 for file in files: if file.endswith('.ex5'): file_path = os.path.join(root, file) os.remove(file_path) print(f'File removed: {file_path}') # Удаление директорий, которые стали пустыми после удаления файлов for dir in dirs: dir_path = os.path.join(root, dir) # Если каталог пустой после удаления файлов if dir_path not in excluded and not os.listdir(dir_path): try: os.rmdir(dir_path) print(f'Empty folder removed: {dir_path}') except OSError: pass # Если что-то не так, просто игнорируем excluded = [ '.git', '.vscode', 'Experts\\Advisors', 'Experts\\Examples', 'Experts\\Free Robots', 'Experts\\Market' 'Files', 'Images', 'Include\\Arrays', 'Include\\Canvas', 'Include\\ChartObjects', 'Include\\Charts', 'Include\\Controls', 'Include\\Expert', 'Include\\Files', 'Include\\Generic', 'Include\\Graphics', 'Include\\Indicators', 'Include\\Math', 'Include\\OpenCL', 'Include\\Strings', 'Include\\Tools', 'Include\\Trade', 'Include\\WinAPI', 'Indicators\\Examples', 'Indicators\\Free Indicators', 'Libraries', 'Logs', 'Presets', 'Profiles', 'Scripts\\Examples', 'Scripts\\UnitTests', 'Services', 'Shared Projects', ] if __name__ == '__main__': current_dir = os.getcwd() # Текущая рабочая директория delete_ex5_files_and_empty_dirs(current_dir, excluded)
Сохраним его в файле clean.py в корневой папке репозитория и добавим в систему контроля версий в основной ветке. После переключения на основную ветку с какой-либо другой, нам достаточно запустить этот скрипт на выполнение, и все скомпилированные файлы и ставшие пустыми папки будут удалены.
Заключение
На этом мы пока завершим наши эксперименты по внедрению использования нового хранилища. Все наши файлы были благополучно в него перенесены. Была выполнена подготовительная работа для дальнейшего создания новых веток репозитория для отдельных проектов. Поскольку весь код уже хранится в архивной ветке, можно делать это постепенно, по мере возникновения необходимости вернуться к какому-то из ранее начатых проектов.
Также весьма интересно опробовать создание публичного репозитория для размещения исходных кодов нашего цикла статей "Разрабатываем мультивалютный советник". Пока ещё не ясно, как лучше организовать разбиение кода, относящегося к разным частям цикла, но мы поработаем над этим вопросом в ближайшем будущем.
Спасибо за внимание, до новых встреч!
Содержание архива
# | Имя | Версия | Описание |
---|---|---|---|
MQL5 | Корневая папка репозитория (папка данных терминала) | ||
1 | .gitignore | 1.00 | Файл со списком игнорируемых папок и файлов для системы контроля версий git |
2 | clean.py | 1.00 | Скрипт для удаления скомпилированных файлов и пустых папок при переключении на основную ветку репозитория |
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
а потом на ровном месте получаем бан (админы с модераторами в этом плане легки на руку) и прощаемся с проектами :-)
Здравствуйте, Максим.
Если я правильно понял вашу мысль, то вы имеете ввиду следующее: если пользователя забанили на форуме, то он не сможет получить доступ и на сайт MQL5 Algo Forge, где хранится вышестоящий репозиторий. И тогда пользователь не сможет получить из этого репозитория код своих проектов.
Честно говоря, такой сценарий действительно не рассматривался. Не знаю, ограничивает ли сейчас бан пользователя на форуме доступ к текущему хранилищу MQL Storage, и будет ли при этом ограничиваться доступ и к новому хранилищу. Если да, то этот фактор риска, конечно, стоит учитывать.
Здравствуйте, Максим.
Если я правильно понял вашу мысль, то вы имеете ввиду следующее: если пользователя забанили на форуме, то он не сможет получить доступ и на сайт MQL5 Algo Forge, где хранится вышестоящий репозиторий. И тогда пользователь не сможет получить из этого репозитория код своих проектов.
Честно говоря, такой сценарий действительно не рассматривался. Не знаю, ограничивает ли сейчас бан пользователя на форуме доступ к текущему хранилищу MQL Storage, и будет ли при этом ограничиваться доступ и к новому хранилищу. Если да, то этот фактор риска, конечно, стоит учитывать.
Проверить это проблемно - поэтому оценка риска теоретическая ;-) но риск как таковой есть
для MQLStorage нужно логиниться в комьюнити. Техническая возможность логина - в руках админов. В теории, если сильно нарушить правила (или кому-то покажется что серьёзно) может получится жёсткий бан. При временном бане кроде как только "поражение в правах", то есть просто компоненты сайта и отдельные сервисы запрещаются.
но существуют и виртуалки, сервера, дата-центры,сети заработавшие бан-по-ip . MQLStorage оттуда скорее всего недоступен. Такое можно получить без личных усилий и даже просто по динамическому ip :-)
минимизировать такие риски - держать полные бэкапы и независимое зеркало репозитория. То ещё удовольствие...