Урок 4. Основы программирования MQL4. Часть 2 | Automated Trading Systems
Все мы в жизни изо дня в день повторяем одни и те же действия. Так и в программе часто возникает необходимость выполнять одни и те же команды. Именно в таких случаях и следует использовать свои внешние функции. Пройдя этот урок, вы узнаете: зачем они нужны, как их «создавать» и как использовать в разработке.

Урок 4. Основы программирования MQL4. Часть 2

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

  • Работа с переменными
  • Вызов внешних функций
  • Условия
  • Циклы

Внешние функции – что это и зачем они нужны?

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

  • Очень часто один и тот же код нужно использовать много раз, и если все писать в одной главной функции, то каждый раз один и тот же код придется писать снова и снова, как следствие получаем следующий пункт
  • Код был бы слишком огромен
  • А как следствие из предыдущего – код было бы очень сложно читать, а значит и вся работа была бы сложнее и заняла больше времени

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

lesson4-lengthofvectors
Причем нужен нам этот код для расчета трех переменных, для каждой из которых будут свои значения a1 и a2. Напишем такой код и вкратце пробежимся по нему:

void OnStart()
  {
      //Объявляем переменные, в которые позже запишем вычисленные значения
      double a;
      double b;
      double c;
      //Объявляем переменные, которые будут использоваться при вычислении значений a,b и с
      double a1;
      double a2;

      a1=5;
      a2=10;
      b = NormalizeDouble(MathSqrt(MathPow(a1,2)+MathPow(a2,2)),2); 

      a1=1;
      a2=3;
      c = NormalizeDouble(MathSqrt(MathPow(a1,2)+MathPow(a2,2)),2); 

      Alert(a,", ",b,", ",c); 
  }

Объявляем три переменные: a,b,c. В эти переменные мы должны записать нужные нам рассчитанные значения. Также объявляем переменные a1 и a2. Это переменные, которые используются в формуле и по которым рассчитывается результат. Присвоим этим переменным значения 10 и 15 (сугубо для примера). После чего рассчитаем переменную a по формуле, приведенной выше. Здесь нужны более подробные пояснения. Встроенная функция MathPow вычисляет возводит число a1 (или a2) во вторую степень, MathSqrt вычисляет корень суммы квадратов (см. формулу). С помощью NormalizeDouble мы «обрезаем» знаки после запятой у вычисленного результата, оставив только два знака после запятой. В конечном итоге в переменную а записывается результат вычислений.
Аналогично вычисляем значения переменных b и c, после чего с помощью встроенной функции Alert выведем значения этих переменных через запятую.
Запустим скрипт в терминале и посмотрим результат:

lesson4-alert1

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

Для начала напишем «заготовку» функции:

double VectLen(double a1, double a2)
  {
    
  }

Здесь double определяет тип данных значения (дробное число), которое вернет эта функция в то место, откуда она вызывается. VectLen – название функции. double a1, double a2 – список параметров, которые мы передадим в функцию для последующей работы с ними. Продолжим работу и получим следующий результат:

double VectLen(double a1, double a2)
  {
      return NormalizeDouble(MathSqrt(MathPow(a1,2)+MathPow(a2,2)),2);     
  }

Команда return означает «вернуть» из функции то значение, которое находится справа от команды. В нашем случае справа от return находится наш расчет, который у нас был написан изначально. Итак, функция написана и готова к запуску. Пришло время разобраться с вызовом функций.

void OnStart()
  {
      double a;
      double b;
      double c;

      a=VectLen(10,15);
      b=VectLen(5,10);
      c=VectLen(1,3); 

      Alert(a,", ",b,", ",c); 
  }

Здесь мы переписали нашу главную функцию, сделав три вызова написанной нами функции. Давайте разберемся что изменилось. Во-первых, мы убрали объявления переменных a1 и a2 за ненадобностью, тогда как ранее ради читаемости кода приходилось их вводить. Сейчас мы в функцию передаем непосредственно нужные нам числа. Само же присваивание значений переменным a,b,c стало значительно короче.
Обратите внимание: так как функция у нас возвращает какое-то значение (типа double), нужно использовать всю фразу VectLen(a1,a2) (где a1, a2 – какие-либо числа или переменные) как переменную типа double. Например, присваивать эту строку какой-то переменной (как это делаем мы) или использовать эту функцию в каком-то условии для сравнения с каким-либо другим числом.
Разберем, из чего состоит вызов функции. VectLen – название функции, с помощью него и происходит сам вызов. В скобках после названия идут входные параметры, те, которые мы определили ранее при задании самой функции. В нашем случае это два числа типа double. Их мы и передаем в функцию. А дальше, как мы помним, на основе этих двух чисел произойдет расчет результата, который вернет нам функция.

Давайте посмотрим что теперь нам выдаст наш скрипт после запуска:

lesson4-alert2

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

На этом данный урок окончен. Если вам все же осталось что-то непонятно – не расстраивайтесь, ведь мы стараемся объяснить лишь самые основы и по довольно сжатой программе. Попробуйте изучить основы программирования по статьям на специализированных ресурсах (например по языку C++), а когда почувствуете, что достигли определенного уровня понимания – можете вернуться к нам и продолжить изучать наши уроки по MQL4.

Ну а если вы готовы продолжать – добро пожаловать к нам на следующий урок!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *