Полезные функции от KimIV - страница 27

 
SamMan писал (а) >>

Именно. А чем меньше код - тем он проще для восприятия. Терпеть не могу ф-ий "размазанных" на 2-3 экрана. Ф-ия должна быть вся на экране, без перелистывания. Поэтому я - за компактность.


Я тоже их терпеть не могу :) . Моя функция влазит в экран.


А ничего, что у Вас полно необязательных континуев которые, к слову, снова оттягивают на себя внимание читающего?


Нууу, уменьшать сложность функции одно из базовых условий написания ХОРОШЕГО кода.

Если Вам больше так нравится есть 2 варианта :

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

2. И я думаю это как раз про Вас -- вы пользуете этот код, потому как не можете качественно написать свой, как программист Вы не представляете собой ничего, и тогда у Вас нет никакого права осуждать и обсуждать мой пост автору топика. Тем более, что обращался я именно к автору.

Извиняюсь за мой пост автору, зря я писал, т.к. все равно не буду использовать этот код, т.к. имею собственную либку со всем мне необходимым. А т.к. за столь долгое время не было однозначно негативных отзывов, это значит,что авторский код устраивает. Просто не стерпел :), извините.

 
TheXpert писал (а) >>

Извиняюсь за мой пост автору, зря я писал, т.к. все равно не буду использовать этот код, т.к. имею собственную либку со всем мне необходимым. А т.к. за столь долгое время не было однозначно негативных отзывов, это значит,что авторский код устраивает. Просто не стерпел :), извините.

Извиняюсь, что пишу, но не выдержал. Зря будет если уйдете из ветки из-за мнения одного. Тем более автор сказал вам спасибо.

Мне кажется было бы вообще неплохо, если одну и туже задачу можно решить 2 (или более) кодами. Выкладывайте свои коды решающие туже задачу, если считаете что они лучше.

Часто видя как кто то другой спрограммировал тоже самое, но в другом стиле. Можно многое почерпнуть.

P.S. Игорь спасибо, за твой труд.

 
Действительно, Андрей, зря Вы так всё это восприняли. Будьте проще! И не бойтесь меня потеснить. Я не буду против, если Вы внесёте свою лепту и что-то подправите у меня или своё выложите.
 

Функция ArraySearchDouble().

Эта функция выполняет поиск элемента массива по значению типа double и возвращает индекс найденного элемента или -1. Функция находит только один элемент и при положительном результате прекращает поиск.

  • m - Массив, в котором выполняется поиск элемента.
  • e - Значение типа double, которое нужно найти в массиве m.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Выполняет поиск элемента массива по значению                   |
//|             и возвращает индекс найденного элемента или -1.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    e - значение элемента                                                   |
//+----------------------------------------------------------------------------+
int ArraySearchDouble(double& m[], double e) {
  for (int i=0; i<ArraySize(m); i++) {
    if (m[i]==e) return(i);
  }
  return(-1);
}
ЗЫ. Во вложении скрипт для тестирования функции ArraySearchDouble().
Файлы:
 

Функция ArraySearchInt().

Эта функция выполняет поиск элемента массива по значению типа int и возвращает индекс найденного элемента или -1. Функция находит только один элемент и при положительном результате прекращает поиск.

  • m - Массив элементов типа int, в котором выполняется поиск.
  • e - Значение типа int, которое нужно найти в массиве m.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Выполняет поиск элемента массива по значению                   |
//|             и возвращает индекс найденного элемента или -1.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    e - значение элемента                                                   |
//+----------------------------------------------------------------------------+
int ArraySearchInt(int& m[], int e) {
  for (int i=0; i<ArraySize(m); i++) {
    if (m[i]==e) return(i);
  }
  return(-1);
}
ЗЫ. Во вложении скрипт для тестирования функции ArraySearchInt().
Файлы:
 

Функция ArraySearchString().

Эта функция выполняет поиск элемента массива по значению типа string и возвращает индекс найденного элемента или -1. Функция находит только один элемент и при положительном результате прекращает поиск.

  • m - Массив элементов типа string, в котором выполняется поиск.
  • e - Значение типа string, которое нужно найти в массиве m.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.03.2008                                                     |
//|  Описание : Выполняет поиск элемента массива по значению                   |
//|             и возвращает индекс найденного элемента или -1.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    e - значение элемента                                                   |
//+----------------------------------------------------------------------------+
int ArraySearchString(string& m[], string e) {
  for (int i=0; i<ArraySize(m); i++) {
    if (m[i]==e) return(i);
  }
  return(-1);
}
ЗЫ. Во вложении скрипт для тестирования функции ArraySearchString().
Файлы:
 
KimIV писал (а) >>
Действительно, Андрей, зря Вы так всё это восприняли. Будьте проще! И не бойтесь меня потеснить. Я не буду против, если Вы внесёте свою лепту и что-то подправите у меня или своё выложите.

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


Могу выступать в качестве ревьюера Вашего кода, если вы не против, конечно, и предлагать свой вариант его написания или просто давать комментарии.



ЗЫЖ: Спасибо за поддержку, честно говоря не ожидал такого отзыва от Вас.

 
KimIV писал (а) >>

Функция ArraySearchDouble().

Эта функция выполняет поиск элемента массива по значению типа double и возвращает индекс найденного элемента или -1. Функция находит только один элемент и при положительном результате прекращает поиск.

  • m - Массив, в котором выполняется поиск элемента.
  • e - Значение типа double, которое нужно найти в массиве m.
ЗЫ. Во вложении скрипт для тестирования функции ArraySearchDouble().

Double -- штука коварная, предложенный Вами код может работать неправильно в некоторых ситуациях.

Предлагаю возможный выход из ситуации

int ArraySearchDouble(double& array[], double value, double precision = 0.00000000001) 
{ // на то, что я перемещаю скобки не обращайте внимания, мне так читабельней
  for (int i = 0; i < ArraySize(array); i++) 
  {
    if (array[i] > value - precision && array[i] < value + precision) return(i);
  }
  return(-1);
}

Ну и если вдруг надо сделать то же самое только с конца

int ArrayRevertSearchDouble(double& array[], double value, double precision = 0.00000000001) 
{ 
  for (int i = ArraySize(array) - 1; i >= 0; i--) 
  {
    if (array[i] > value - precision && array[i] < value + precision) return(i);
  }
  return(-1);
}
 
TheXpert писал (а)
Могу выступать в качестве ревьюера Вашего кода, если вы не против, конечно, и предлагать свой вариант его написания или просто давать комментарии.
Замечательно! Разносторонний взгляд на вещи всем на пользу будет. Мне в первую очередь :-)
 

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

Функция GetLotLastClosePos().

Эта функция возвращает размер лота последней закрытой позиции или -1. Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Возвращает размер лота последней закрытой позиции или -1       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderCloseTime()) {
                o=OrderCloseTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
ЗЫ. Во вложении скрипт для тестирования функции GetLotLastClosePos().
Файлы: