Наши рекомендации:

  1. Главная
  2. Уроки MQL4
  3. 1.2 Математические и строковые функции

1.2 Математические и строковые функции

1.2 Математические и строковые функции

Доброго времени суток!

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

Математические функции

Сложение, вычитание, умножение и деление мы уже знаем. Пора попробовать произвести другие операции с переменными.

  • MathAbs — функция возвращает модуль от указанного числа или выражения, т.е. убирает знак минус, если таковой имеется. Удобна, когда нужно узнать какое расстояние цена прошла в пунктах от цены открытия до текущего значения, когда не важно в какую сторону была открыта сделка, а нужно только положительное значение. Либо же разницу между старым и новым Тейк Профитом ордера перед очередной модификацией.
  • Функции округления дробного числа до целого:
    1. MathRound — обычной математическое округление. Если десятая часть больше или равна 0.5, то округление идет вверх, если ниже — соответственно вниз, все как в школе.
    2. MathCeil — округление вверх, в потолок (ceil). Если у вас число 0.01, результат все равно будет 1.
    3. MathFloor — соответственно округление вниз, в пол (floor). Если число 1.99, результат будет 1.
Порой необходимо округлить не до целого числа, а до десятой части, тогда приходится прибегать к хитростям:
  • MathMod  — функция для определения вещественного остатка от деления чисел.
При делении с остатком положительного числа 77 на 32 получается неполное частное 2 (32*2=64) и остаток равен 77-64=13. Вместо MathMod также можно применять изученную раннее арифметическую операцию %
  • MathMax — Функция возвращает максимальное из двух заданных чисел.
  • MathMin — Функция возвращает минимальное из двух заданных чисел.
Бывают ситуации, когда нужно узнать максимальное значение из трех или большего количества чисел, тогда можно воспользоваться функцией несколько раз.
Если же значений очень много, тогда поможет только перебор в цикле, который мы разберем позже.

  • MathPow — возведение основания в заданную степень. (pow сокр. от power — степень).  Функция широко используется в торговой системе Мартингейл, где нужно увеличивать торговый лот исходя из количества открытых ордеров. На примере нижу 2 в третьей степени это 2*2*2 = 8.
  • MathSqrt — вычисление квадратного корня из числа. Тут все просто и понятно.
  • MathRand — вывод случайного числа от 0 до 32767. Сокращенно от Random. Функция нужна, к примеру, когда нужно сделать рандомную задержку в миллисекундах перед открытием ордера.
Ее также можно использовать, когда нужен определенный диапазон, скажем от 0 до 10. Либо вы хотите написать советник, который торгует по принципу «монетки», когда на направление открытого ордера влияет только орел или решка. Тогда в конце функции нужно прибавить знак % и количество чисел, которые будут участвовать в лотерее.
Пример выше вернет вам ответ 0 или 1, что эквивалентно покупкам или продажам в коде MQL. Пример «Монетки» сделан для разнообразия, а не как рекомендация к торговле.

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

Строковые функции

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

  • StringAdd — функция присоединяет в конец одной переменной с текстом содержание другой. Первой пишется переменная, к которой нужно присоединить текст, второй — которую. Функция StringAdd является логической и возвращает true/false результат выполнения. Если данный ответ нам не интересен, то мы не объявляем ее в bool переменную, она просто пишется после объявления наших текстовых значений.
Минус данного метода в том, что не учитываются пробелы, их нужно расставлять вручную в тексте. Аналогично данное действие можно проделать с помощью оператора присваивания +=, добавив пробел вручную в кавычках:
Если вы задаетесь вопросом, почему сразу не написать целую строку, а не соединять две, то ответ прост — первая переменная name может быть объявлена в начале кода, а вторая потребоваться только в конце. При создании графического объекта ему нужно задавать индивидуальное имя, которое не может дублироваться. Объекты для одной программы рекомендуется называть одинаковыми символами в начале их имени. Для этого отдельно создается общее имя объекта, например «MyObject», а к ней уже добавляется другой текст, будь то тип, время или цена, на которой расположен данный объект «MyObject|Line|1.10125«.

  • StringConcatenate — функция формирует одну общую строку из всех перечисленных в ней параметров, преобразовывая их в тип string. Записать идет через запятую. Минимальное количество параметров равно двум, максимальное — 64-м.
Альтернативный вариант объединения параметров можно написать, используя вместо этой функции знак плюс:
  • StringInit — инициализирует (заполняет) строку указанными символами. Если вам нужна переменная с 10 тире, какой-то одной буквой или пробелами — эта функция для вас. Я ее использовал, чтобы сделать отступ с пробелами нескольким текстовым переменным. Первым параметром задается строка, которую нужно заполнить, втором — длина строки, измеряемая в количестве символов. Последний параметр это символ, которым нужно заполнить эту строку, указывается в одинарных кавычках. Функция StringInit имеет тип bool, так что ей не обязательно объявлять переменную в данном случае.
  • StringLen — функция рассчитывает количество символов в вашей строке. Используется, чтобы узнать сколько букв в наименовании валютной пары или просто в тексте, чтобы не превысить допустимое значение в 64 символа для Print, если это важно, и т.д.
  • StringFind — поиск номера позиции, которую занимает указанный символ в тексте. У функции три параметра: строка, в которой нужно произвести поиск, что именно нужно найти и номер позиции, с которой нужно начать поиск (ноль обозначает самое начало текста). Если указанная подстрока не найдена, то возвращается -1.
  • StringReplace — заменяет найденные подстроки в тексте на указанное значение. Имеет три параметра: первый это непосредственно сама строка, в которой будет происходить замена, второй — та часть текста, которую нужно заменить, третья — то, на что нужно заменить указанную часть текста.
  • StringSubstr — извлечение подстроки из основной строки, начиная с заданного номера позиции. Параметры функции: первый — строка, из которой нужно извлечь текст. Второй — номер позиции с которой начинать извлечение (считается от нуля). Третий параметр — количество извлекаемых символов, т.е. их длина (если указать 0, то извлекается строка до самого конца).
Если же мы не знает номер строки с которой начинается искомый текст, но знаем текст строк до и после, то мы можем совместить функцию StringSubstr с StringFind и StringLen. Если строка находится посередине, то извлечение происходит в два этапа. Допустим нам нужно извлечь число 50 из фразы «Сегодня я закрыл 50 сделок в плюс»:
Понимаю, что пример немного сумбурный, но суть его показать, что с помощью танца с бубном можно из любого текста вытащить необходимые данные. Такой метод я примеряю для анализа данных из интернета, когда происходит парсинг сторонних сайтов, информация с которых идет в одном string’e.

  • StringToLower, StringToUpper — две функции преобразования всех букв в тексте в строчные, либо в  заглавные.
  • StringTrimLeft, StringTrimRight — две функции, которые удаляют лишние символы перед и после заданного текста, такие как пробелы, символы табуляции и  перевода каретки. Функция не преобразует текущую переменную, как это делает StringToLower/StringToUpper, поэтому нужно указывать вначале нее наименование переменной, которой будет присвоено новое значение.
  • StringSplit — получение из заданной строки подстроки, которые перечислены по известному разделителю. К примеру, если есть перечень валютных пар через запятую: «EURUSD,GBPUSD,NZDCAD», то мы может вывести наименование всех трех пар в отдельный массив. Т.к. массивы мы еще не проходили, то более подробно данный алгоритм мы разберем позже, просто нужно знать, что это возможно сделать.

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

Заключение

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

1 комментарий. Оставить новый

  • Мари
    06.12.2022 18:06

    Здраствуйте! А Можно что то сделать вроде домашнего задания в конце каждого урока?)

    Ответить

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

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

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.
Вы должны согласиться с условиями для продолжения

Меню