Только "Полезные функции от KimIV". - страница 9

 

Функция StringLower().

Данная функция выполняет преобразование строки в нижний регистр. Все ПРОПИСНЫЕ (большие) символы становятся строчными (маленькими). Функция StringLower() принимает только один обязательный параметр - это входящая строка.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в нижнем регистре                            |
//+----------------------------------------------------------------------------+
string StringLower(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>64 && c<91) n=c+32;     // A-Z -> a-z
    if (c>191 && c<224) n=c+32;   // А-Я -> а-я
    if (c==168) n=184;            //  Ё  ->  ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}
 

Функция StringUpper().

Данная функция выполняет преобразование строки в ВЕРХНИЙ регистр. Все строчные (маленькие) символы становятся ПРОПИСНЫМИ (большими). Функция StringUpper() принимает только один обязательный параметр - это входящая строка.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в ВЕРХНЕМ регистре                           |
//+----------------------------------------------------------------------------+
string StringUpper(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>96 && c<123) n=c-32;    // a-z -> A-Z
    if (c>223 && c<256) n=c-32;   // а-я -> А-Я
    if (c==184) n=168;            //  ё  ->  Ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}


Функция StringToArrayDouble().

Данная функция выполняет расщепление строки на составляющие её вещественные числа и каждое число добавляется в массив отдельным элементом. Сколько вещественных чисел окажется в строке, столько же элементов и будет добавлено в массив. В качестве разделителя распознаётся точка с запятой. Функция StringToArrayDouble() возвращает количество элементов массива, а принимает следующие обязательный параметры:

  • st - Строка вещественных чисел через точку с запятой.
  • ad - Массив вещественных чисел.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.10.2008                                                     |
//|  Описание : Перенос вещественных чисел из строки в массив                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    st - строка вещественных чисел через точку с запятой                    |
//|    ad - массив вещественных чисел                                          |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//+----------------------------------------------------------------------------+
int StringToArrayDouble(string st, double& ad[]) {
  int    i=0, np;
  string stp;

  ArrayResize(ad, 0);
  while (StringLen(st)>0) {
    np=StringFind(st, ";");
    if (np<0) {
      stp=st;
      st="";
    } else {
      stp=StringSubstr(st, 0, np);
      st=StringSubstr(st, np+1);
    }
    i++;
    ArrayResize(ad, i);
    ad[i-1]=StrToDouble(stp);
  }
  return(ArraySize(ad));
}
 

Функция StringToArrayInt().

Данная функция выполняет расщепление строки на составляющие её целые числа, и каждое число добавляется в массив отдельным элементом. Сколько целых чисел окажется в строке, столько же элементов и будет добавлено в массив. В качестве разделителя распознаётся запятая. Функция StringToArrayDouble() возвращает количество элементов массива, а принимает следующие обязательный параметры:

  • st - Строка целочисленных значений через запятую.
  • ai - Целочисленный массив.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Перенос целочисленных значений из строки в массив              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    st - строка целочисленных значений через запятую                        |
//|    ai - целочисленный массив                                               |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//+----------------------------------------------------------------------------+
int StringToArrayInt(string st, int& ai[]) {
  int    i=0, np;
  string stp;

  ArrayResize(ai, 0);
  while (StringLen(st)>0) {
    np=StringFind(st, ",");
    if (np<0) {
      stp=st;
      st="";
    } else {
      stp=StringSubstr(st, 0, np);
      st=StringSubstr(st, np+1);
    }
    i++;
    ArrayResize(ai, i);
    ai[i-1]=StrToInteger(stp);
  }
  return(ArraySize(ai));
}

Функция StrSplit().

Данная функция выполняет расщепление строки на составляющие её подстроки таким образом, что каждая подстрока становится отдельным элементом массива. Разделитель задаётся параметром и может быть произвольным. Функция StrSplit() возвращает количество элементов массива и принимает следующие параметры:

  • st - Строка с разделителями.
  • as - Массив элементов типа string.
  • de - Разделитель. Необязательный параметр. Значение по умолчанию - "," (запятая).
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 23.06.2008                                                     |
//|  Описание : Разбиение строки на массив элементов                           |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//|  Параметры:                                                                |
//|    st - строка с разделителями                                             |
//|    as - строковый массив                                                   |
//|    de - разделитель                                                        |
//+----------------------------------------------------------------------------+
int StrSplit(string st, string& as[], string de=",") { 
  int    i=0, np;
  string stp;

  ArrayResize(as, 0);
  while (StringLen(st)>0) {
    np=StringFind(st, ",");
    if (np<0) {
      stp=st;
      st="";
    } else {
      stp=StringSubstr(st, 0, np);
      st=StringSubstr(st, np+1);
    }
    i++;
    ArrayResize(as, i);
    as[i-1]=stp;
  }
  return(ArraySize(as));
}
 

Функция StrTran().

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

  • str - Строка, в которой выполняется замена подстроки strFrom.
  • strFrom - Заменяемая подстрока. Если подстрока strFrom будет найдена в строке str, то она будет заменена на подстроку strTo.
  • strTo - Заменяющая подстрока.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  описание : Замена подстроки                                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    str     - текстовая строка, в которой производится замена               |
//|    strFrom - заменяемая подстрока                                          |
//|    strTo   - заменяющая подстрока                                          |
//+----------------------------------------------------------------------------+
string StrTran(string str, string strFrom, string strTo) {
  int    n;
  string strOut="", strTemp;

  for (n=0; n<StringLen(str); n++) {
    strTemp=StringSubstr(str, n, StringLen(strFrom));
    if (strTemp==strFrom) {
      strOut=StringConcatenate(strOut, strTo);
      n=n+StringLen(strFrom)-1;
    } else strOut=StringConcatenate(strOut, StringSubstr(str, n, 1));
  }
  return(strOut);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 23.04.2009                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          po=MarketInfo(OrderSymbol(), MODE_POINT);
          if (OrderType()==OP_BUY) {
            if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
              pp=MarketInfo(OrderSymbol(), MODE_BID);
              if (pp-OrderOpenPrice()>LevelProfit*po) {
                ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
              pp=MarketInfo(OrderSymbol(), MODE_ASK);
              if (OrderOpenPrice()-pp>LevelProfit*po) {
                ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
              }
            }
          }
        }
      }
    }
  }
}
 

Функция isTradeTimeString().

Данная функция возвращает флаг разрешения торговли по времени. Вообще-то, на самом деле проверяется расположение текущего времени торгового сервера внутри некоего временного отрезка. Если внутри, то функция isTradeTimeString() возвращает истину, иначе - ложь. Особенностью данной функции является возможность задания временного отрезка как внутри суток, так и за пределами одних суток. Подробнее это будет показано в примерах использования. Функция isTradeTimeString() принимает следующие необязательные параметры:

  • TimeBegin - Строка в формате "ЧЧ:ММ", задаёт время начала торговли. Значение по умолчанию - "00:00".
  • TimeEnd - Строка в формате "ЧЧ:ММ", задаёт время окончания торговли. Значение по умолчанию - "00:00".
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeBegin - время начала торговли         (ЧЧ:ММ)                       |
//|    TimeEnd   - время окончания торговли      (ЧЧ:ММ)                       |
//+----------------------------------------------------------------------------+
bool isTradeTimeString(string TimeBegin="00:00", string TimeEnd="00:00") {
  datetime dtBegin, dtEnd;        // Время начала и окончания работы
  int      hc, he;                // Часы текущего времени и окончания работы

  dtBegin=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeBegin);
  dtEnd  =StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeEnd);
  hc     =TimeHour(TimeCurrent());
  he     =TimeHour(dtEnd);
  if (dtBegin>=dtEnd) {
    if (hc>=he) dtEnd+=24*60*60; else dtBegin-=24*60*60;
  }

  if (TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd) return(True);
  else return(False);
}

Функция isTradeTimeInt().

Данная функция возвращает флаг разрешения торговли по времени. Возвращаемое значение - истина или ложь. Функция isTradeTimeInt() по принципу распознавания временного интервала аналогична функции isTradeTimeString(), то есть время начала торговли может быть как больше (временной отрезок внутри суток) времени окончания, так и меньше (временной отрезок в разных сутках). Функция isTradeTimeInt() принимает следующие необязательные параметры:

  • hb - Число, задаёт часы времени начала торговли. Значение по умолчанию - 0.
  • mb - Число, задаёт минуты времени начала торговли. Значение по умолчанию - 0.
  • he - Число, задаёт часы времени окончания торговли. Значение по умолчанию - 0.
  • me - Число, задаёт минуты времени окончания торговли. Значение по умолчанию - 0.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0, int mb=0, int he=0, int me=0) {
  datetime db, de;           // Время начала и окончания работы
  int      hc;               // Часы текущего времени торгового сервера

  db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+hb+":"+mb);
  de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+he+":"+me);
  hc=TimeHour(TimeCurrent());
  if (db>=de) {
    if (hc>=he) de+=24*60*60; else db-=24*60*60;
  }

  if (TimeCurrent()>=db && TimeCurrent()<=de) return(True);
  else return(False);
}
 
satop:
В файле все в одном архиве.
Файлы:
kimiv.zip  187 kb
 
Игорь Ким публиковал свои функции и здесь, и на своем сайте в виде "сборников функций", одним файлом. В таком виде применять эти сборники как подключаемые библиотеки не получалось. Но очень удобно, особенно при разработке советников использовать библиотеки для упрощения и уменьшения кода советника. К тому же это снимает все вопросы по корректному использованию торговых операций и позволяет сосредоточиться на стратегии, что особенно ценно для трейдеров с начальными навыками программирования.
В прикрепленных файлах все те же сборники функций, оформленные в виде библиотек. Библиотеки просто помещаются в каталог .../experts/include, компилировать их не надо, пример подключения приведен ниже.
После их подключения достаточно из кода советника вызвать нужную функцию.
#include <b-Positions_include.mqh>       // Библиотека функций для работы с позициями 
#include <b-KimIV_include.mqh>           // Библиотека дополнительных функций
#include <b-Orders_include.mqh>          // Библиотека функций для работы с ордерами
 

Уважаемый, откуда в строке

if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
появляется "JPY"??????

satop:

Функция isCloseLastPosByStop().

Эта функция возвращает флаг закрытия последней позиции по стопу. Флаг поднят - True - сработал StopLoss. Флаг опущен - False - позиция была закрыта по другой причине. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.

 
Я так понимаю, функции писались тогда, когда 5-ти знаков ещё не было. JPY служил как типа пример сравнения.
 
hoz:
Я так понимаю, функции писались тогда, когда 5-ти знаков ещё не было. JPY служил как типа пример сравнения.

Нетрудно на единичку увеличить!
Причина обращения: