Содержание
Доброго времени суток!
В продолжении предыдущего урока мы поговорим о дополнительных функциях, которые помогут более качественно работать с числами и текстом. Рассматривать будем самые используемые, чтобы не захламлять пост лишней информацией.
Математические функции
Сложение, вычитание, умножение и деление мы уже знаем. Пора попробовать произвести другие операции с переменными.
- MathAbs — функция возвращает модуль от указанного числа или выражения, т.е. убирает знак минус, если таковой имеется. Удобна, когда нужно узнать какое расстояние цена прошла в пунктах от цены открытия до текущего значения, когда не важно в какую сторону была открыта сделка, а нужно только положительное значение. Либо же разницу между старым и новым Тейк Профитом ордера перед очередной модификацией.
0 1 2 |
double a1 = 2.3, b1 = 3.4; double abs = MathAbs(a1-b1); //равно 1.1 Print(abs); |
- Функции округления дробного числа до целого:
-
- MathRound — обычной математическое округление. Если десятая часть больше или равна 0.5, то округление идет вверх, если ниже — соответственно вниз, все как в школе.
- MathCeil — округление вверх, в потолок (ceil). Если у вас число 0.01, результат все равно будет 1.
- MathFloor — соответственно округление вниз, в пол (floor). Если число 1.99, результат будет 1.
0 1 2 3 4 |
double a2 = 5.5; double b2 = MathRound(a2); //равно 6.0 double c2 = MathCeil(a2); //равно 6.0 double d2 = MathFloor(a2); //равно 5.0 Print("MathRound=",b2,", MathCeil=",c2,", MathFloor=",d2); |
0 1 2 |
double a3 = 0.07; double round_value = MathRound(a3*10)/10; //равно 0.1 Print(round_value); |
- MathMod — функция для определения вещественного остатка от деления чисел.
0 1 2 |
int a4 = 77, b4 = 32; double c4 = MathMod(a4,b4); //равно 13 Print(c4); |
0 1 2 |
int a4 = 77, b4 = 32; double d4 = a4%b4; //равно 13 Print(d4); |
- MathMax — Функция возвращает максимальное из двух заданных чисел.
- MathMin — Функция возвращает минимальное из двух заданных чисел.
0 1 2 3 |
int a5 = 3, b5 = 6; int min = MathMin(a5,b5); //равно 3 int max = MathMax(a5,b5); //равно 6 Print("min=",min,",max=",max); |
0 1 2 |
int a6 = 3, b6 = 6, c6 = 4; int max2 = MathMax(a6,MathMax(b6,c6)); //равно 6 Print("max=",max2); |
- MathPow — возведение основания в заданную степень. (pow сокр. от power — степень). Функция широко используется в торговой системе Мартингейл, где нужно увеличивать торговый лот исходя из количества открытых ордеров. На примере нижу 2 в третьей степени это 2*2*2 = 8.
0 1 2 |
int a7 = 2, b7 = 3; double pow_value = MathPow(a7,b7); //равно 8 Print("pow=",pow_value); |
- MathSqrt — вычисление квадратного корня из числа. Тут все просто и понятно.
0 1 2 |
int a8 = 25; double Sqrt = MathSqrt(a8); //равно 5 Print("Sqrt=",Sqrt); |
- MathRand — вывод случайного числа от 0 до 32767. Сокращенно от Random. Функция нужна, к примеру, когда нужно сделать рандомную задержку в миллисекундах перед открытием ордера.
0 1 |
int Random1 = MathRand(); Print("Random1=",Random1); |
0 1 |
int Random1 = MathRand()%2; Print("Random1=",Random1); |
Возможно не все эти функции вам понадобятся по началу, но знать о них стоит. Помимо перечисленных математических вычислений есть также возможность рассчитать синус, тангенс, арккосинус и т.д., но лично мне они ни разу не пригодились, поэтому не вижу смысла на них останавливаться, почерпнуть информацию всегда можно в справке MQL.
Строковые функции
Тип данных string мы разбирали ранее, он нужен для того, чтобы хранить любую текстовую информацию. Порой эту информацию нужно дополнительно обрабатывать — уменьшать количество букв, найти в тексте какой-то фрагмент, заменить часть букв или слов, узнать длину строчки и т.д. В основном я работаю с этими функциями, когда обрабатываю информацию, которую получают наши скрипты и индикаторы из интернета, анализе наименований объектов, а также при работе с валютными парами.
- StringAdd — функция присоединяет в конец одной переменной с текстом содержание другой. Первой пишется переменная, к которой нужно присоединить текст, второй — которую. Функция StringAdd является логической и возвращает true/false результат выполнения. Если данный ответ нам не интересен, то мы не объявляем ее в bool переменную, она просто пишется после объявления наших текстовых значений.
0 1 2 3 |
string name1 = "DaVinci"; string name2 = "FX Group"; StringAdd(name1,name2); Print(name1); //Результат: "DaVinciFX Group" |
0 1 2 3 |
string name3 = "DaVinci"; string name4 = "FX Group"; name3 += " " + name4; Print(name3); //Результат: "DaVinci FX Group" |
- StringConcatenate — функция формирует одну общую строку из всех перечисленных в ней параметров, преобразовывая их в тип string. Записать идет через запятую. Минимальное количество параметров равно двум, максимальное — 64-м.
0 1 |
string text=StringConcatenate("Время брокера: ", TimeToStr(TimeCurrent()), ". Время начать зарабатывать!"); Print(text); |
0 1 |
string text2="Текущее время брокера: " + TimeToStr(TimeCurrent()) + ". Время начать зарабатывать!"; Print(text2); |
- StringInit — инициализирует (заполняет) строку указанными символами. Если вам нужна переменная с 10 тире, какой-то одной буквой или пробелами — эта функция для вас. Я ее использовал, чтобы сделать отступ с пробелами нескольким текстовым переменным. Первым параметром задается строка, которую нужно заполнить, втором — длина строки, измеряемая в количестве символов. Последний параметр это символ, которым нужно заполнить эту строку, указывается в одинарных кавычках. Функция StringInit имеет тип bool, так что ей не обязательно объявлять переменную в данном случае.
0 1 2 |
string str; StringInit(str,10,'-'); Print("str = ",str); //результат "----------" |
- StringLen — функция рассчитывает количество символов в вашей строке. Используется, чтобы узнать сколько букв в наименовании валютной пары или просто в тексте, чтобы не превысить допустимое значение в 64 символа для Print, если это важно, и т.д.
0 1 2 |
string name5 = "Программирование это просто!"; int Len = StringLen(name5); Print(Len); //результат 28 |
- StringFind — поиск номера позиции, которую занимает указанный символ в тексте. У функции три параметра: строка, в которой нужно произвести поиск, что именно нужно найти и номер позиции, с которой нужно начать поиск (ноль обозначает самое начало текста). Если указанная подстрока не найдена, то возвращается -1.
0 1 2 3 4 5 6 |
string text3 = "Найти номер буквы А"; int find = StringFind(text3,"А",0); Print(find); //результат 18 символ string text4 = "Найти номер буквы А"; int find2 = StringFind(text3,"Ф",0); Print(find2); //результат -1 (не найдено) |
- StringReplace — заменяет найденные подстроки в тексте на указанное значение. Имеет три параметра: первый это непосредственно сама строка, в которой будет происходить замена, второй — та часть текста, которую нужно заменить, третья — то, на что нужно заменить указанную часть текста.
0 1 2 3 |
string text5 = "Сделка закрыта с убытком в -20$"; int replaced = StringReplace(text5,"убытком","прибылью"); replaced += StringReplace(text5,"-20","30"); Print("Replaced: ", replaced,". Result=",text5); //результат "Сделка закрыта с прибылью в 30$" |
- StringSubstr — извлечение подстроки из основной строки, начиная с заданного номера позиции. Параметры функции: первый — строка, из которой нужно извлечь текст. Второй — номер позиции с которой начинать извлечение (считается от нуля). Третий параметр — количество извлекаемых символов, т.е. их длина (если указать 0, то извлекается строка до самого конца).
0 1 2 |
string text = "Нам нужно слово: Форекс"; string substr = StringSubstr(text,17,0); Print(substr); //результат Форекс |
0 1 2 3 4 5 6 7 8 |
string text7 = "Сегодня я закрыл 50 сделок в плюс"; int str_len = StringLen("закрыл"); //узнаем длину слова "закрыл" int find3 = StringFind(text7,"закрыл",0); //находим позицию, с которой начинается слово "закрыл" string substr2 = StringSubstr(text7,find3+str_len+1,0); //результат "50 сделок в плюс" int find4 = StringFind(substr2,"сделок",0); //находим позицию, с которой начинается слово "сделок" string substr3 = StringSubstr(substr2,0,find4-1); //Удаляем лишнюю часть в конце. Print(substr3); //результат 50 |
- StringToLower, StringToUpper — две функции преобразования всех букв в тексте в строчные, либо в заглавные.
0 1 2 3 4 |
string text8 = "Деньги нужны даже для того, чтобы без них обходиться. © Оноре де Бальзак"; StringToLower(text8); //строчные Print(text8); StringToUpper(text8); //заглавные Print(text8); |
- StringTrimLeft, StringTrimRight — две функции, которые удаляют лишние символы перед и после заданного текста, такие как пробелы, символы табуляции и перевода каретки. Функция не преобразует текущую переменную, как это делает StringToLower/StringToUpper, поэтому нужно указывать вначале нее наименование переменной, которой будет присвоено новое значение.
0 1 2 3 |
string text9 = " Welcome "; text9 = StringTrimLeft(text9); text9 = StringTrimRight(text9); Print("result:(",text9,")"); //результат "(Welcome)" |
- StringSplit — получение из заданной строки подстроки, которые перечислены по известному разделителю. К примеру, если есть перечень валютных пар через запятую: «EURUSD,GBPUSD,NZDCAD», то мы может вывести наименование всех трех пар в отдельный массив. Т.к. массивы мы еще не проходили, то более подробно данный алгоритм мы разберем позже, просто нужно знать, что это возможно сделать.
В статье перечислены не все строковые функции, которые есть в арсенале MetaEditor, только самые часто используемые при написании программного кода. Ознакомиться с полным перечнем можно по ссылке.
Заключение
На этом можно подвести итог: работа как с числами, так и с текстом требует определенных умений и времени, с помощью данных функций вы сможете более качественно оформить свой код, добиться нужных вычислений, либо найти искомое текстовое значение.
[download url=»http://www.davinci-fx.com/wp-content/uploads/2021/01/1.2-Math-and-String-Functions.rar» title=»Скачать mql4 примеры из урока»]
1 комментарий. Оставить новый
Здраствуйте! А Можно что то сделать вроде домашнего задания в конце каждого урока?)