Перейти к содержанию

(MQL) 2.4 Строки. Манипуляции над ними

Last updated on 21.06.2021

строки

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

Строки. Функции для работы с ними

Для начала создаём файл «Prepare.mqh» в папке «Helpers» нашего проекта. К нему подключается файл «Conversion.mqh».

#include "Сonversion.mqh"

Основные функции для работы со строками описаны в официальной документации языка MQL5.

«Обёрточные» функции

Первая группа функций — это всего лишь «обёртки». Они созданы для удобства вызова стандартных функций.

//+------------------------------------------------------------------+
 Эта функция удаляет символы перевода каретки, пробелы и символы  
 табуляции с начала и конца строки до первого значимого символа
//+------------------------------------------------------------------

 string trim(string str)
 {
  // Стандартная функция языка MQL5 
   StringTrimLeft(str);
 
  // Стандартная функция языка MQL5
   StringTrimRight(str);
  
 // Выше указанные функции работают с непосредственно с переменной str, так как она передаётся им по ссылке   
  return str;
 }

//+------------------------------------------------------------------
 Преобразует все символы указанной строки в нижний регистр
//+------------------------------------------------------------------
 
string toLower(string s)

 {
  // Стандартная функция языка MQL5
  // Переменная "s" передаётся по ссылке
  if(StringToLower(s)) return s;
  return "";
 }

//+------------------------------------------------------------------
  Преобразует все символы указанной строки в верхний регистр 
//+------------------------------------------------------------------
 
string toUpper(string s)
 {
 // Стандартная функция языка MQL5
 // Переменная "s" передаётся по ссылке
  if(StringToUpper(s))return s;
  return "";
 }

//+------------------------------------------------------------------+
 Эта функция определяет длину (количество символов) строки 
//+------------------------------------------------------------------
 
 int lenght(string value)
 {
  // Стандартная функция языка MQL5
   return StringLen(value);
 }
//+------------------------------------------------------------------+
 Заменяет в строке "value" все найденные подстроки "find" на заданную  
 последовательность символов "replacement".
//+------------------------------------------------------------------
 string replace(string value="",string find="",string replacement=""
 {
   string copy = value;
   StringReplace(copy,find,replacement);
   return copy;
 }
//+------------------------------------------------------------------
 Получает из строки "string_value" массив подстрок "result" по 
 заданному разделителю "separator" и возвращает количество полученных  
 подстрок.
//+------------------------------------------------------------------
 int split(const string string_value, string separator, string & result[])
 {
  // StringSplit() - стандартная функция MQL5 
  return StringSplit(string_value,sToChar(separator),result);
 }

//+------------------------------------------------------------------+
 Функция извлекает подстроку из строки "string_value" начиная с 
 позиции "start_pos" длиной "sub_string_length" элементов
//+------------------------------------------------------------------
 string substring( string  string_value,int start_pos,int sub_string_length=-1)
 {
  return StringSubstr(string_value,start_pos,sub_string_length);
 }

Функция «sToChar()» — является новой. Она преобразует строковый элемент в символ. Эта функция является дополнением функции «toChar()». В файле «Conversion.mqh» она прописана не была, поэтому это надо исправить. При попытке использования «toChar()» эта функция вернёт значение «0». А это не то, что нам надо. Так как любой элемент строки имеет числовое представление, то результат должен быть отличен от нуля. Поэтому функция «toChar()» для работы со строками не подходит.

//+------------------------------------------------------------------+
//+------------------------------------------------------------------
 char sToChar(string str)
 {
  return toChar(str[0]); 
 } 

Обратная ей функция «chToString()» преобразует символ в строковый элемент. Её тоже следует внести в файл «Conversion.mqh». Обе функции можно расположить в конце файла.

//+------------------------------------------------------------------+
//+------------------------------------------------------------------
 string chToString( char str)
 {
  return CharToString(str);
 }

Если вы хотите каждый элемент строки преобразовать в символ, тогда лучше воспользоваться стандартной функцией «StringToCharArray()».

Функции, дополняющие стандартный набор

Вторая группа функций является дополнением к стандартному набору.

//+------------------------------------------------------------------
 Эта функция переводит первый элемент строки в верхний регистр
//+------------------------------------------------------------------
 
string ucFirst(string s)
 {
   string copy=s;
   // извлекается первый элемент строки
   string su = substring(copy,0,1);
  
   // извлечённый элемент "su" возводится в верхний регистр
   // затем извлекается подстрока, в которой не содержится элемент "su" 
   // Всё это объединяется и образуется новая строка "copy"
   
  copy = toUpper(su)+substring(copy,1);
   return copy;
 }

//+------------------------------------------------------------------  
 Эта функция переводит последний элемент строки в верхний регистр
//+------------------------------------------------------------------
 
string ucLast(string s)
 {
   string copy=s;
// извлекается последний элемент строки
   string su = substring(copy,lenght(copy)-1);

 // извлечённый элемент "su" возводится в верхний регистр
   // затем извлекается подстрока, в которой не содержится элемент "su" 
   // Всё это объединяется и образуется новая строка "copy"

   copy = substring(copy,0,lenght(copy)-1)+toUpper(su);
   return copy;
 }

//+------------------------------------------------------------------
 Функция переворачивает строку
//+------------------------------------------------------------------
 
string reverse(string value)
 {
  string result = "";
  // любую строку можно представить в виде массива
  // в данном случае это массив "value"
  // чтобы перевернуть строку необходимо прочитать массив от последнего массива к первому
 
  for(int i=lenght(value)-1;i>=0;i--)
    {
     // так как мы рассматриваем строку как массив, то при обращении к любому элементу массива по индексу, в качестве результата, мы получим число  
    // Потому нам необходимо его преобразовать в тип "char", а затем тип "char" в "string".
    // После того как мы сделаем это, полученная строка соединяется со строкой "result" 
     result+=chToString(toChar(value[i]));
    }
    return result;
 }

//+------------------------------------------------------------------
 Данная функция объединяет все элементы массива в единую строку
//+------------------------------------------------------------------
 
string splice(string &array[],string separator="")
 {
  string result="";
  for(int i=0;i<ArraySize(array);i++)
    { 
     // к содержимому каждой ячейки массива присоединяется разделитель
     // затем полученный результат присоединяется к переменной  "result"
     result+=array[i]+separator;
    }
  // на выходе получаем строку, в которой последним элементом будет "separator"
 // если он не является пустой строкой, тогда его необходимо удалить 
 // то есть из результата "result" извлекается подстрока без последнего элемента
 // если же separator == "", то в этой операции нет никакого смысла  
 result = (separator!="")?substring(result,0,lenght(result)-1):result;

    return result;
 }

//+------------------------------------------------------------------
 Поиск подстроки "substring_find" в строке "string_value". Поиск начинается с позиции "start_pos". Возвращает номер позиции в строке, с которой начинается подстрока, либо -1, если подстрока не найдена.
//+------------------------------------------------------------------

 int find(  string  string_value,string  substring_find,int start_pos=0)
 {

 // Поиск можно вести от начала к концу строки и от конца строки к её началу
 // Если "start_pos" содержит отрицательное значение, то поиск начинается с конца строки
 
 if(start_pos<0)   
  {    
   string pos=""; 
  // строка рассматривается как массив  
   for(int i=lenght(string_value)+start_pos;i>=0;i--)
      {
      // формируем новую строку из элементов массива. Обратите внимание на то, как это строка формируется
       pos = chToString(toChar(string_value[i]))+pos;
     

     // Два слова о рекурсии. Рекурсия -  вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или опосредованно  (через другие функции). В первом случае речь идёт о простой рекурсии, а во втором о сложной рекурсии)

     // Вот вам пример простой рекурсии. Функция "find" вызывает себя же
     // если мы находит подстроку "substring_find" в новой строке "pos", тогда функция вернёт результат отличный от "-1"
    // Это означает, что текущее значение индекса "i" и есть то место в строке "string_value" откуда начинается подстрока "substring_find"

       if(find(pos,substring_find,0)>-1)return(i);
      } 
     return -1;
   }
 // Если "start_pos" содержит положительное значение или ноль, то поиск начинается с начала строки
 // для этого используется стандартная функция "StringFind()"
 return StringFind(string_value,substring_find,start_pos);
 }

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

Ну что же начнём работать над этим модулем!

Опубликовано в рубрикеОснову для торговых роботов (MQL)2. Хелперы