Español Português
preview
От начального до среднего уровня: Песочница и MetaTrader

От начального до среднего уровня: Песочница и MetaTrader

MetaTrader 5Примеры |
48 0
CODE X
CODE X

Введение

В предыдущей статье, От начального до среднего уровня: События в объектах (IV), объяснили и продемонстрировали, как вы, уважаемый читатель, можете разработать методологию для непосредственного изменения размера некоторых объектов, существующих на графике. Поскольку цель здесь НЕ в том, чтобы разрабатывать какое-либо приложение, а в том, чтобы продемонстрировать и показать на примере, как вы, используя MQL5, можете контролировать процессы и управлять ими в MetaTrader 5, я не вижу на данный момент причин углубляться в то, что было рассмотрено в той статье.

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

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


Работа с файлами

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

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

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

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

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

При программировании на чистом MQL5 для управления или манипулирования MetaTrader 5 мы ограничены рамками так называемой песочницы (SandBox). Термин «песочница» сегодня широко используется благодаря современным ОС, которые позволяют создавать среду для запуска неизвестных приложений относительно безопасным способом. Это связано с тем, что у приложения будет создаваться впечатление, будто оно может делать всё что угодно. Однако любые внесенные изменения будут удалены, как только закроется песочница, в которой выполнялось приложение.

Это гарантирует, что даже потенциально вредоносное приложение не повредит файлы и не приведет к сбоям в работе ОС. Иными словами, «песочница» — это безопасная зона, за пределами которой ничего не будет затронуто.

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

Что ж, на данный момент это довольно сложный вопрос для объяснения, уважаемый читатель. У доступа к чему-либо за пределами песочницы есть свои преимущества и недостатки. Однако на данный момент вы должны понимать, что это скорее опасно, чем выгодно. Если какое-либо приложение, запущенное в MetaTrader 5, получит доступ за пределы песочницы, оно сможет обратиться к тому, к чему не должно иметь доступа. И это во многих случаях может представлять угрозу целостности всех ваших файлов.

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

Это обычно происходит при включении функции, показанной на следующем изображении:

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

На изображении 01 показан ключевой момент, который может позволить приложению при выполнении в MetaTrader 5 выйти за пределы песочницы. Настолько, что существует предупреждение о том, что включение этой опции может быть опасным для системы. Это связано именно с рисками манипулирования файлами без надлежащего контроля со стороны MetaTrader 5. После выхода за пределы песочницы MetaTrader 5 больше не сможет контролировать происходящее. В этом случае управление будет находиться в руках приложения и, возможно, вызовов DLL-библиотек ОС. Хотя это может показаться безопасным, вредоносное приложение может использовать собственные DLL-библиотеки ОС для нанесения катастрофического ущерба. ПОЭТОМУ БУДЬТЕ ОСТОРОЖНЫ.

"Хорошо, но тогда как песочница защитит нас в подобных случаях?" Итак, вот она, самая интересная часть, уважаемый читатель. Это связано с тем, что разработчики MetaTrader 5 поступили весьма дальновидно, разделив всё на небольшие блоки, каждый из которых можно рассматривать как отдельную песочницу, полностью изолированную от остальных. Хотя на практике всё обстоит не совсем так. Однако детальное понимание этих процессов придет к вам со временем, по мере практического освоения демонстрируемых методик и материалов.

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

Хорошо, тогда давайте начнём с чего-нибудь очень простого и понятного. Это делается с помощью кода, представленного ниже.

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06.     const string szText = "This file was created by a script written in MQL5.";
07.     uchar info[];
08. 
09.     StringToCharArray(szText, info);
10. 
11.     FileSave("Hello.txt", info);
12. }
13. //+------------------------------------------------------------------+

Код 01

Это очень простой и понятный код для записи файлов. Однако при выполнении данного кода происходит кое-что, что может вас немного заинтриговать. Но давайте обо всём по порядку. Во-первых, в строке 06 из кода 01 содержится сообщение, которое будет записано в файл. Но в каком именно файле? "Хорошо, имя файла указано в строке 11, но куда будет сохранён этот файл? Или, точнее, в каком каталоге на диске мне следует искать или ожидать сохранения этого файла?" Что ж, это зависит от некоторых условий. В том виде, в каком написан код, он будет сохранен в стандартном каталоге песочницы MetaTrader 5.

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

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

Теперь на изображении 02 можно увидеть, что стрелка указывает на странный символ. Этот символ является частью файла, поскольку он был в нём сохранён. Однако, если посмотрим на сообщение в строке 06, мы не увидим никаких признаков наличия данного символа. Откуда же оно взялось? Что ж, уважаемый читатель, этот символ появился благодаря строке 09. Поскольку мы преобразуем строку в массив символов, чтобы функция в строке 11 могла записать строку в файл, символ конца строки также станет частью сохраняемого содержимого, так как он не был удален из строки, преобразованной в массив.

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

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

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06. #define szFileName "Hello.txt"
07. 
08.     const string szText = "This file was created by a script written in MQL5.";
09. 
10.     uchar W[], R[];
11. 
12.     StringToCharArray(szText, W);
13. 
14.     FileSave(szFileName, W);
15. 
16.     FileLoad(szFileName, R);
17. 
18.     Print(CharArrayToString(R));
19. }
20. //+------------------------------------------------------------------+

Код 02

Итак, чтобы гарантировать, что мы прочитаем тот же самый файл, который запишем, мы используем определение в строке 06 из кода 02 для указания имени используемого файла. Поскольку первые строки уже были объяснены, мы можем перейти к строке 16. Здесь мы прочтем содержимое файла и поместим его в массив. В строке 18 мы преобразуем данный массив символов в строку, что позволит нам вывести то же сообщение, что и в строке 08.

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

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

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

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

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06. #define szFileName "Hello.txt"
07. 
08.     const string szText = "This file was created by a script written in MQL5.";
09. 
10.     uchar W[], R[];
11. 
12.     StringToCharArray(szText, W);
13. 
14.     FileSave(szFileName, W, FILE_COMMON);
15. 
16.     FileLoad(szFileName, R, FILE_COMMON);
17. 
18.     Print(CharArrayToString(R));
19. }
20. //+------------------------------------------------------------------+

Код 03

Запустив код 03, вы увидите тот же результат, что и на изображении 03. Однако, если вы попытаетесь найти этот файл, то заметите, что он не создаётся в подпапке MQL5\Files, он будет создан в другом месте. Но где? Итак, прежде чем говорить об этом, обратите внимание, что единственное различие между кодом 02 и кодом 03 заключается именно в дополнительном параметре, который был добавлен в строках 14 и 16, как можно видеть в коде 03.

А теперь будьте внимательны, уважаемый читатель. При сохранении файла в строке 14 этот дополнительный параметр сообщит MetaTrader 5, в какой песочнице будет храниться файл. Однако, если при чтении, которое выполняется в строке 16, этот параметр не будет указан, MetaTrader 5 будет искать файл в стандартной песочнице, то есть в подпапке MQL5\Files. И, как следствие, это может привести к результату, отличающемуся от ожидаемого: к ошибке при чтении или доступе к файлу либо, в некоторых случаях, к непонятному содержимому, которое сильно отличается от того, что мы рассчитывали увидеть.

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

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

Итак, теперь мы наконец можем попытаться разобраться, на какую именно песочницу указывает этот дополнительный параметр в строках 14 и 16 кода 03. Это нужно для того, чтобы вы могли найти файл с помощью любого другого редактора, если захотите. Параметр FILE_COMMON указывает MetaTrader 5 использовать подпапку \Terminal\Common\Files, всё очень просто. "Подождите минутку, дайте мне понять, что здесь происходит. Если параметр FILE_COMMON отсутствует, мы указываем на песочницу MQL5\Files, а если он присутствует, то на песочницу \Terminal\Common\Files. И это всё?" Да, уважаемый читатель, именно это и происходит. "Но я предполагал, что для того, чтобы это изменение вступило в силу, нам потребуется указать каталог. В некотором смысле, это кажется мне немного запутанным".

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


Понимание песочницы

Для правильного понимания концепции песочницы нам потребуется некоторое представление о том, как работает файловая система. Я дам краткое пояснение просто для того, чтобы термины, которые будут использоваться далее, были понятны тем, кто с ними ещё не знаком.

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

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

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

На изображении 04 представлены две песочницы, точно такие же, какие мы использовали в предыдущей теме. Обратите внимание, что исходная папка — это подпапка MetaQuotes\Terminal. Однако это НЕ КОРЕНЬ, а субстрат, в котором расположены деревья.

Теперь обратите внимание на следующее: дерево №1 имеет корень, который в данном случае находится в папке Common\Files. У дерева №2 есть ещё один корень, который находится в папке MQL5\Files. Обратите внимание, что мы не можем перейти напрямую от одного дерева к другому, не пройдя предварительно через то, что является субстратом. Обычно для этого, то есть для перехода из одной ветви в другую, мы используем ресурс. Однако этот же ресурс здесь использовать было невозможно. Поскольку одно дерево — это одна песочница, в то время как другое дерево — это уже другая песочница.

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

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06. #define szFileName "Hello.txt"
07. #define macro_Save(A) Print("Attempting to write in [",A,"] resulted in: ", FileSave(A, buff));
08. //+----------------+
09.     const string szText = "This file was created by a script written in MQL5.\nThis would be the contents of file number #%02d.";
10. //+----------------+
11.     uchar   buff[];
12.     ushort  counter = 1;
13. //+----------------+
14.     StringToCharArray(StringFormat(szText, counter++), buff);
15.     macro_Save(szFileName);
16. //+----------------+
17.     StringToCharArray(StringFormat(szText, counter++), buff);
18.     macro_Save(".\\Test\\" + szFileName);
19. //+----------------+
20.     StringToCharArray(StringFormat(szText, counter++), buff);
21.     macro_Save(".\\Temp\\" + szFileName);
22. //+----------------+
23.     StringToCharArray(StringFormat(szText, counter++), buff);
24.     macro_Save("..\\SandBox\\" + szFileName);
25. }
26. //+------------------------------------------------------------------+

Код 04

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

Прежде всего, при запуске этого кода 04 в MetaTrader 5 мы увидим в терминале результат, похожий на тот, что представлен ниже:

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

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

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

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

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

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

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

Тем не менее, вернёмся к вопросу о самом коде 04. Обратите внимание, что в строках 15, 18, 21 и 24 мы изменяем только имя используемого каталога. Однако, как видно на изображении 05, при попытке создания четвертого файла произошла ошибка. Почему? Причина в том, что мы пытаемся создать нечто за пределами нынешней песочницы. Иными словами, мы пытаемся перейти к ветке, которая находится за пределами корневого каталога песочницы. И при попытке сделать это MetaTrader 5 интерпретирует её как ошибку и заблокирует любые операции с диском, будь то запись или чтение содержимого какого-либо файла.

Я понимаю, что многим это может показаться немного странным. Единственное различие между строками 18, 21 и 24 заключается в наличии дополнительной точки в строке 24, но она указывает системе двигаться в другом направлении, отличном от текущего местоположения. Однако, поскольку мы находимся в песочнице и используем вызовы MetaTrader 5 через MQL5, нам не разрешено покидать песочницу. Но этого бы не произошло, если бы мы использовали функцию записи из самой ОС. В этом случае ОС не будет знать о существовании песочницы, созданной и поддерживаемой MetaTrader 5. Таким образом, за пределами песочницы можно будет записывать, читать и даже делать что угодно с любым файлом.

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

Для этого мы используем приведенный ниже код:

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. //+------------------------------------------------------------------+
04. void OnStart(void)
05. {
06. #define szFileName "Hello.txt"
07. #define macro_Save(A) Print("Attempting to write in [",A,"] resulted in: ", FileSave(A, buff));
08. #define macro_Load(A) Print("Attempt to read the [",A,"] file resulted in: ", FileLoad(A, buff) != INVALID_HANDLE);
09. //+----------------+
10.     const string szText = "This file was created by a script written in MQL5.\nThis would be the contents of file number #%02d.";
11. //+----------------+
12.     uchar   buff[];
13.     ushort  counter = 1;
14. //+----------------+
15.     StringToCharArray(StringFormat(szText, counter++), buff);
16.     macro_Save(szFileName);
17. //+----------------+
18.     StringToCharArray(StringFormat(szText, counter++), buff);
19.     macro_Save(".\\Test\\" + szFileName);
20. //+----------------+
21.     StringToCharArray(StringFormat(szText, counter++), buff);
22.     macro_Save(".\\Temp\\" + szFileName);
23. //+----------------+
24.     StringToCharArray(StringFormat(szText, counter++), buff);
25.     macro_Save("..\\SandBox\\" + szFileName);
26. //+----------------+
27.     Print("+----------------+");
28.     ArrayResize(buff, 0);
29.     macro_Load(".\\Test\\" + szFileName);
30.     if (buff.Size() > 0)
31.         Print("File content:\n", CharArrayToString(buff));
32.     Print("+----------------+");
33.     ArrayResize(buff, 0);
34.     macro_Load(".\\Test 1\\" + szFileName);
35.     if (buff.Size() > 0)
36.         Print("File content:\n", CharArrayToString(buff));
37. }
38. //+------------------------------------------------------------------+

Код 05

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

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

Для понимания всех этих сообщений необходимо, чтобы вы разобрались, что мы реализовали в коде 04 и какой результат получили. Учитывая, что результатом выполнения кода 04 является изображение 05, а содержимое каждого из файлов можно увидеть на изображениях 06, 07 и 08, здесь, в этом коде 05, нам нужно учесть лишь несколько ключевых моментов. По сути, нам нужно лишь объяснить, что происходит начиная с 26-й строки. Именно там начинается чтение или попытка чтения файлов.

Итак, как видите, в строках 29 и 34 мы запускаем макрос из строки 08. Особенность здесь заключается в том, что при выполнении этого макроса в строке 08 в терминале будет напечатано сообщение с указанием того, какой файл мы пытаемся прочитать, а также был ли результат успешным или нет. Итак, до этого момента всё довольно нормально и легко понять. Но зачем в этом коде используются строки 28 и 33? Причина заключается именно в очистке массива данных. Поскольку при попытке чтения может возникнуть ошибка, мы не хотим, чтобы какие-либо предыдущие данные сохранялись. Таким образом, когда будут выполняться проверки в строках 30 и 35, мы выведем сообщение в терминал только в том случае, если в массиве действительно есть какие-либо данные.

Учитывая, что в строке 34 мы попытаемся прочитать файл, который, в принципе, НЕ ДОЛЖЕН СУЩЕСТВОВАТЬ, на терминале будет выведено сообщение об ошибке, и проверка в строке 35 также завершится неудачей.

Прежде всего, следует учитывать, что ни файлы, ни каталоги, указанные в коде 05, изначально не должны существовать. Таким образом, результат будет корректным и отобразится правильно, как можно увидеть на изображении 09. Если вы получите другой результат, попробуйте изменить имя или даже каталоги, задействованные в этом коде 05. Цель состоит в том, чтобы сгенерировать как ошибку, возникающую при попытке чтения несуществующего файла, так и результат попытки чтения файла в заданном каталоге.

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


Заключительные идеи

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

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

Файл MQ5 Описание
Code 01   Демонстрация доступа к файлам
Code 02    Демонстрация доступа к файлам
Code 03    Демонстрация доступа к файлам
Code 04    Демонстрация доступа к файлам
Code 05    Демонстрация доступа к файлам

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

Прикрепленные файлы |
Anexo.zip (2.56 KB)
Особенности написания Пользовательских Индикаторов Особенности написания Пользовательских Индикаторов
Написание пользовательских индикаторов в торговой системе MetaTrader 4
Нейросети в трейдинге: От рыночного шума к устойчивому торговому плану (Окончание) Нейросети в трейдинге: От рыночного шума к устойчивому торговому плану (Окончание)
Продолжается адаптация MomAD к алгоритмическому трейдингу: собран класс CNeuronMomAD, объединяющий UncAD с модулями согласования и уточнения сценариев (TTM, MPI). Разобраны этапы последовательного обучения модели и тестирование на EURUSD H1 за январь–апрель 2026 года. Статья фокусируется на интеграции в общий вычислительный контур и практических выводах по управлению риском при положительном результате.
Особенности написания экспертов Особенности написания экспертов
Написание и тестирование экспертов в торговой системе MetaTrader 4.
Создание профессиональной торговой системы на базе Heikin Ashi (Часть 2): Разработка советника Создание профессиональной торговой системы на базе Heikin Ashi (Часть 2): Разработка советника
В этой статье объясняется, как разработать профессиональный советник (EA) на MQL5 на основе Heikin Ashi. Вы узнаете, как настроить входные параметры, перечисления, индикаторы, глобальные переменные и реализовать основную торговую логику. Вы также сможете выполнить бэктест на золоте, чтобы проверить свою работу.