Язык программирования MQL 4: Взаимодействие с исполняющей средой (20-24.12.04)
|

Язык программирования MQL 4: Взаимодействие с исполняющей средой (20-24.12.04)

   В предыдущей статье, посвящённой изучению MQL4 (Forex Magazine №48), мы рассмотрели среду выполнения программ, написанных на MQL4. В этой статье попробуем разобраться в тонкостях общения между MQL-программой и средой клиентского терминала, исполняющей эту программу, а за одно разберём шаг за шагом один из трёх возможных типов пользовательских программ – индикаторы.


   Но сначала небольшое отступление от темы, которое, надеемся, многим облегчит прохождение одного из этапов создания MQL-программы с помошью мастера создания советников:
   Каждый раз, начиная писать MQL-программу с помощью мастера создания советников, мы получаем остов программы с информацией о разработчике, где указывается, что copyright принадлежит MetaQuotes Software. С этим можно смириться на этапе обучения, но когда Вы самостоятельно начнёте писать и, быть может, распространять собственные программы, то, естественно захотите, чтобы “шапка” программы содержала Ваши личные данные. Для этого можно каждый раз вручную исправлять предложенный вариант “шапки” на свой или сделать это на одном из шагов мастера исправив поля “Автор” и “Ссылка”, но проще единожды сделать это так, как предложено далее.
   Внимание, описаный далее способ предполагает точное понимание и последовательное исполнение всех указанных действий. Если Вы не уверены в том, что справитесь с поставленной задачей, то лучше не беритесь за неё вовсе!
   Неправильные действия с реестром могут привести к полной или частичной неработоспособности машины. Ни автор ни Журнал не несёт никакой ответственности за последствия выполненных действий или других нарушений работы Вашей системы.


1. Запустите программу RegEdit


2. Выберите в дереве на левой панели ветку HKEY_CURRENT_USERSoftwareMetaQuotesSoftwareMetaEditor 4Experts


3. В меню “Файл” выберите “Экспорт” и сохраните содержащуюся в выбранной ветке информацию в .reg файле. Далее для определённости будем считать, что выбранная ветка реестра была сохранена в файле “ME_ProgramHeader.reg”


4. Закрываем программу RegEdit.


5. Открываем файл ME_ProgramHeader.reg для редактирования. Для этого в проводнике, кликнув на названии файла правой кнопкой мыши, из контекстного меню выбираем “Правка”.


6. Меняем значения полей “Address” и “Author” на те, которые Вы хотите видеть в дальнейшем в “шапке” программы. Не забудте выделить двойными кавычками, как в имена параметров, так и их значения, как это было в неисправленном файле.


7. Сохраняем файл под другим именем, допустим, “My_ProgramHeader_.reg” и закрываем его.


8. Теперь у Вас есть два файла: один – с оригинальными данными, которые можно в любой момент восстановить; другой – с вашими данными которые мы сейчас добавим в реестр.


9. В проводнике, дважды кликнув на названии файла My_ProgramHeader_.reg , соглашаемся с предложением внести данные файла в реестр нажав кнопку “Да” и затем принимаем поздравления с успешным внесением данных в реестр, ещё раз нажимая “OK”.


10. Создаём в MetaEditor’е с помощью мастера новую программу и на втором этапе, когда будет предложено ввести название программы, мы видим, что поля “Автор” и “Ссылка” содержат нужные нам строки.


   Теперь каждый раз мастер будет предлагать создать MQL-программу с “правильными” полями “Автор” и “Ссылка”. Но если вдруг Вам захочется вернуть значения реестра в первоначальное состояние, то это будет сделать очень легко, нужно будет восстановить значения из файла созданного на 3-ем этапе.


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


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


   Далее следует раздел, в котором описаны свойства (properties) будующей программы. Свойства программы могут включать в себя следующие поля:


общая информация о программе:
  copyright
  link
тип компилируемого модуля:
  library
  indicator_chart_window
  indicator_separate_window
максимум и минимум индикатора:
  indicator_maximum
  indicator_minimum
количество графиков и цвета:
  indicator_buffers
  indicator_color1 . indicator_color8


   Из общей информации о программе мы можем указать два параметра. Эффект от этих параметров будет виден, когда мы будем добавлять индикатор на график. На панели параметров индикатора появится надпись с тем текстом, который мы указали в “copyright”. При нажатии на эту надпись запускается указанная в “link” ссылка на веб ресурс.


   Далее можно выбрать  тип компилируемого модуля


   Если мы пишем программу советник, то ни одно из указанных свойств указывать не надо. Если мы пишем индикатор, то можно выбрать индикатор, рисуемый в окне с ценовым графиком, (chart window indicator) или индикатор, рисуемый в отдельном окне (separate window indicator). Свойство “library” указывает на то, что мы хотим написать не программу типа советник или индикатор, а библиотеку функций. Когда мы говорили о том, что существует три типа программ, мы нарочно не упомянули библиотеки функций – во-первых, это и не программа, так как не может самостоятельно быть выполнены, а во-вторых, до них очередь дойдёт тогда, когда мы полностью овладеем навыками создания MQL-программ.


   Следующие свойства программы отвечают за максимальное (indicator maximum) и минимальное (indicator minimum) значения индикатора. Они пригодятся в том случае, когда мы будем писать индикатор, выводимый в отдельном окне.


   Рассмотрим немного более подробно свойства, указывающие количество графиков, выводимых индикатором, и их цвета. В предыдущей версии MetaTrader 3.x пользователю из MQL-программ можно было рисовать всего лишь две кривых. Часто этого не хватало, и приходилось прибегать к различным ухищрениям. Было распространено использование нескольких MQL-программ для отрисовки одного индикатора. Это способ не удовлетворял многих из-за того, что был не столь трудоёмкий, сколько неочевидным и неудобным. Разработчики MetaQuotes Software при написании MetaTrader4 учли этот недостаток и добавили возможность пользовательским индикаторам рисовать до восьми графиков. Теперь для того, чтобы использовать несколько графиков нужно указать их число в свойстве
индикатора “indicator_buffers”. Ну а для того, чтобы каждый из графиков индикатора выводился на экран желаемым цветом, нужно указать их в саойствах indicator_color1, indicator_color2, indicator_color3 и так далее до indicator_color8.


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


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


   За разделом, описывающим свойства, идёт раздел с глобальными переменными, напомним, что “глобальными” они называются из-за того, что область их видимости простирается на все функции, включённые в данный файл.
   Есть ещё не глобальные (мы будем называть их “локальными”) которые, будучи объявленными внутри какой-либо функции, не доступны другим функциям.


   Первая, и пока единственная переменная – это ExtMapBuffer1. Это массив, который в должен быть заполнен значениями нашего индикатора. Это ещё одно тонкое место в связке программа-терминал, которое важно чётко себе представлять. ExtMapBuffer1 – это единственная (в случае с одним графиком) возможность повлиять на способ отрисовки графика. Далее будет видно как эта переменная связана с графиком.


   Заглянем в функцию init(). Там присутствуют два вызова функций из программного интерфейса MetaTrader’а:
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);


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


   В случае, когда нужно будет выводить несколько графиков на экран, каждый из них должен будет быть проинициализирован подобным образом. Номер инициализируемого графика передаётся первым парамметром в обоих функциях, это значение “0”, так как индексация массивов графиков начинается с нуля.
   Дальнейшие строки программы должны быть Вам уже знакомы. Если же нет, то за пояснениями по-прежнему отправляем читателя к материалам предыдущих выпусков журнала Forex Magazine (№№ 20-28) и на сайт разработчиков MetaTrader 4 – сайт фирмы MetaQuotes Software


Александр Иванов
для Forex Magazine
fxtrade@tomsk.ru