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

 

Функция ArrayInsertDouble()

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

  • m - Массив элементов типа double.
  • e - Значение вставляемого элемента массива.
  • i - Индекс вставляемого элемента массива. Если значение индекса меньше нуля или больше или равно размеру массива, то элемент будет добавлен в конец массива. Значение по умолчанию -1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize(m);

  ArrayResize(m, k+1);
  if (i>=0 && i<k) {
    for (j=k; j>i; j--) m[j]=m[j-1];
    m[i]=e;
  } else m[k]=e;

  return(k+1);
}

ЗЫ. Во вложении скрипты для тестирования функций ArrayInsertDouble(), ArrayInsertInt(), ArrayInsertString().

ЗЗЫ. На сайте обновил библиотеку b-Array.

 

Игорь раз взялись за массивы, может вернемся к старой моей просьбе, про сортировку массивов ('Полезные функции от KimIV'). То что было сделано раннее немного не то, извиняюсь за некоренное ТЗ.

Нужна сортировка двух мерного массива по заданному столбцу (строке), аналог операции в EXCEL. Данная процедура необходима для использования статистики Спирмена 'Коэффициент ранговой корреляции Спирмена - Spearman's Rank Correlation', в некоторых вариантах анализа корреляционных матриц валют (портфелей).

 

Функция BubbleSort2().

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

  • a - Двумерный массив элементов. Обязательный параметр.
  • r - Номер (индекс) колонки (столбца) сортировки. Значение по умолчанию - 0 - первая колонка (столбец с нулевым индексом).
  • m - Направление сортировки. Допустимые значения: MODE_ASCEND - по возрастанию, MODE_DESCEND - по убыванию. Значение по умолчанию - MODE_ASCEND.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m=MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange(a, 1);      // Количество колонок
  int    n=ArrayRange(a, 0);      // Количество строк

  if (r<0) r=0;
  if (r>k) r=k;

  for (i=n-1; i>0; i--) {
    for (j=0; j<i; j++) {
      if (m==MODE_ASCEND) {
        // по возрастанию
        if (a[j][r]>a[j+1][r]) {
          for (e=0; e<k; e++) {
            t=a[j][e];
            a[j][e]=a[j+1][e];
            a[j+1][e]=t;
          }
        }
      } else {
        // по убыванию
        if (a[j][r]<a[j+1][r]) {
          for (e=0; e<k; e++) {
            t=a[j][e];
            a[j][e]=a[j+1][e];
            a[j+1][e]=t;
          }
        }
      }
    }
  }
}
ЗЫ. Во вложении скрипт для тестирования функции BubbleSort2().
Файлы:
 

Функция GetTypeLastDeleted().

Данная функция возвращает тип последнего удалённого ордера или -1. Бывают ситуации, когда логику работы советника нужно завязать на тип только-что удалённого ордера. Например, если сейчас удалили BuyStop, то сделать то-то, а если BuyLimit, то сделать что-то другое и т.д. Функция GetTypeLastDeleted() принимает следующие необязательные параметры:

  • sy - Наименование инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию - "".
  • mn - Пользовательский идентификатор ордеров (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return(r);
}
 
beginner писал(а) >>

Да, теперь этот

#include "b-KimIV.mqh" // Библиотека дополнительных функций

Здравствуйте, Олег!

Для безошибочной компиляции библиотеки b-Positions.mqh Вам в библиотеке b-kimiv.mqh понадобятся функции, которые уже есть в данной ветке:

  • GetNameOP() - Возвращает наименование торговой операции.
  • GetNameTF() - Возвращает наименование таймфрейма.
  • IIFc() - Возвращает одно из двух значений взависимости от условия.
  • Message() - Вывод сообщения в коммент и в журнал.

Таким образом, Вы можете сделать следующее:

  1. Создать пустой файл с именем b-kimiv.mqh в той же папке, в которой у Вас лежит файл b-Positions.mqh
  2. Вставить в него вышеуказанные функции и скомпилировать файл b-Positions.mqh.

Удачи!

 

Функция iBarLargest().

Данная функция возвращает индекс наибольшего бара или -1. Размер бара измеряется функцией одним из двух способов, определяемым входным параметром ty - тип элементов поиска. Либо только размер тела, либо вместе с тенями. Функция iBarLargest() принимает следующие необязательные параметры:

  • sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию - "".
  • tf - Таймфрейм. Значение по умолчанию - 0 - текущий таймфрейм.
  • ty - Тип элементов поиска. Допустимые значения 0 - High-Low, 1 - abs(Open-Close).
  • co - Число элементов таймсерии. Значение по умолчанию - 0 - все элементы.
  • in - Индекс начального бара. Значение по умолчанию - 0 - текущий бар.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (in< 0) in=0;
  if (co<=0) co=iBars(sy, tf)-in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for (i=co+in; i>=in; i--) {
    if (ty>0) r=MathAbs(iOpen(sy, tf, i)-iClose(sy, tf, i));
    else r=iHigh(sy, tf, i)-iLow(sy, tf, i);
    if (rb<r) {
      rb=r;
      nb=i;
    }
  }

  return(nb);
}
ЗЫ. Во вложении скрипт для тестирования функции iBarLargest().
Файлы:
 

Функция iBarOfDayCalc().

Данная функция возвращает расчётный номер бара от начала суток. Бары нумеруются с единицы, то есть бар с самым маленьким временем открытия в заданных сутках будет иметь номер один, следующий бар - номер два и т.д. Эту функцию удобно использовать при оптимизации времени входа/выхода. Если кого-то заинтересуют подробности, задавайте вопросы. Постараюсь ответить. Функция iBarOfDayCalc() принимает следующие необязательные параметры:

  • tf - Таймфрейм. Значение по умолчанию - 0 - текущий таймфрейм.
  • dt - Дата и время открытия бара. Значение по умолчанию - 0 - текущее время.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod(dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor(ms/tf)+1;        // номер бара от начала суток

  return(bd);
}

ЗЫ. Во вложении скрипт для тестирования функции iBarOfDayCalc(). На рисунке ниже показан способ использования скрипта.

Файлы:
 

Функция iBarOfDayReal().

Данная функция возвращает реальный номер бара от начала суток. Бары нумеруются с единицы, то есть бар с самым маленьким временем открытия в заданных сутках будет иметь номер один, следующий бар - номер два и т.д. Практического применения данной функции я пока не нашёл. А написал, чтобы была :-) в паре с функцией iBarOfDayCalc(). Функция iBarOfDayReal() принимает следующие необязательные параметры:

  • sy - Наименование торгового инструмента. NULL или "" - текущий символ. Значение по умолчанию - "".
  • tf - Таймфрейм. Значение по умолчанию - 0 - текущий таймфрейм.
  • dt - Дата и время открытия бара. Значение по умолчанию - 0 - текущее время.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}

ЗЫ. Во вложении скрипт для тестирования функции iBarOfDayReal(). На рисунке ниже показан способ использования скрипта.

Файлы:
 
KimIV писал(а) >>

Функция iBarOfDayReal().

Практического применения данной функции я пока не нашёл.

гг... :)

Я тут в качестве тренировки решил написать скрипт который посчитает пройденый путь.

Если кто знает есть такая програмулька что считает сколько километров пробежала мышь по монитору.

Так и здесь, сложить опен-клос баров текущих суток (недели, месяца или года) или если представить

по другому как нитка с иголкой по стежку шубу шьёт: опен-клос-опен-клос-опен-клос ... по ходу графика.

Тоже самое но по хай-лоу...

*

Затык начался с первых же шагов.

Как отфильтровать для обсчёта бары текущих суток...

Попробую применить Ваши функции для этого баловства.

 

Игорь. Доброго времени суток.

Может черкнете простую для вас задачку: а задачка (для меня ) следующая:

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

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

который будет визуально показывать уровень цены, на котором произойдет пересечение гистограммой MACD нулевой линии (то бишь пересечение одной линии с ценой - линия на графике)

это касается, относится, к процентному MACD, вычисляемому по формуле MACD = (FastEMA/SlowEMA - 1). Периоды 12, 26, сигн.9.

Есть коды для для омеги и метостока. а как это в мт4 реализовать-не нашел пока нигде.

спасибо


Причина обращения: