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

 

Примеры использования функции GetNearestDownFractal().

  • Ценовой уровень ближайшего верхнего фрактала на текущем графике. Формула фрактала 2-2 (стандартная).
    Message(GetNearestUpFractal());
  • Ценовой уровень ближайшего верхнего фрактала на графике USDJPY H1. Формула фрактала 5-2.
    Message(GetNearestUpFractal("USDJPY", PERIOD_H1, 5));
  • Провести горизонтальную линию через ценовой уровень ближайшего верхнего фрактала 4-3 на текущем графике.
    double p=GetNearestUpFractal(NULL, 0, 4, 3);
    SetHLine(Red, "", p);

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

Файлы:
 

Функция CorrectTF().

Эту функцию я написал после того, как обнаружил, что иногда я могу запросто во входных параметрах индикатора или советника указать неправильный таймфрейм, который равен целому количеству минут. Например, я ввёл 50 для часовок вместо 60. Ну... типа промахнулся. Так вот оказывается, функция iRSI() для неправильного таймфрейма возвращает ноль. Про другие функции ничего не скажу, ибо не проверял. И чтобы избежать досадных недоразумений из-за своих же ошибок по невнимательности, я написал эту функцию, как элементарную защиту от "дурака". Она выполняет подгонку входного параметра под "ближайший" подходящий правильный таймфрейм и возвращает его значение.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.03.2008                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  if (TimeFrame< PERIOD_M5                         ) return(PERIOD_M1);
  if (TimeFrame>=PERIOD_M5  && TimeFrame<PERIOD_M15) return(PERIOD_M5);
  if (TimeFrame>=PERIOD_M15 && TimeFrame<PERIOD_M30) return(PERIOD_M15);
  if (TimeFrame>=PERIOD_M30 && TimeFrame<PERIOD_H1 ) return(PERIOD_M30);
  if (TimeFrame>=PERIOD_H1  && TimeFrame<PERIOD_H4 ) return(PERIOD_H1);
  if (TimeFrame>=PERIOD_H4  && TimeFrame<PERIOD_D1 ) return(PERIOD_H4);
  if (TimeFrame>=PERIOD_D1  && TimeFrame<PERIOD_W1 ) return(PERIOD_D1);
  if (TimeFrame>=PERIOD_W1  && TimeFrame<PERIOD_MN1) return(PERIOD_W1);
  if (TimeFrame>=PERIOD_MN1                        ) return(PERIOD_MN1);
}
ЗЫ. Во вложении скрипт для тестирования функции CorrectTF().
Файлы:
 

Функция DateBeginQuarter().

Эта функция возвращает дату начала квартала по его номеру. Например, если сейчас 27.08.2008, то датой начала текущего квартала будет 01.07.2008. Функция принимает только один параметр - номер квартала относительно текущего. Например, 0 - текущий квартал, 1 - следующий, а -1 - предыдущий. То есть положительные номера кварталов запросят даты из будущего, а нулевой и отрицательные из прошлого. Возвращаемое значение - количество секунд, прошедшее с 00:00 1 января 1970 года.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату начала квартала                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позапрошлый)                      |
//|                                    (-1 - прошлый)                          |
//|    nq - номер квартала             ( 0 - текущий)                          |
//|                                    ( 1 - следующий)                        |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateBeginQuarter(int nq=0) {
  int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);
  int mo=Month()-MathMod(Month()+2, 3)+3*nq;
  if (mo<1) {
    mo+=12;
    ye--;
  }
  if (mo>12) {
    mo-=12;
    ye++;
  }

  return(StrToTime(ye+"."+mo+".01"));
}

P.S. Во вложении скрипт для тестирования функции DateBeginQuarter().

Файлы:
 

Функция DateOfMonday().

Эта функция возвращает дату начала недели (дату понедельника) по её номеру. Например, если сейчас 29.08.2008, то датой начала текущей недели будет 25.08.2008. Функция принимает только один параметр - номер недели относительно текущей. Например, 0 - текущая неделя, 1 - следующая, а -1 - предыдущая. То есть положительные номера недель запросят даты из будущего, а нулевой и отрицательные из прошлого. Возвращаемое значение - количество секунд, прошедшее с 00:00 1 января 1970 года.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.05.2008                                                     |
//|  Описание : Возвращает дату понедельника по номеру недели                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - предпредыдущая неделя)            |
//|                                    (-1 - предыдущая неделя)                |
//|    nn - номер недели               ( 0 - текущая неделя)                   |
//|                                    ( 1 - следующая неделя)                 |
//|                                    ( 2 - последующая неделя)               |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int nn=0) {
  datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

  while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
  dt+=nn*7*24*60*60;

  return (dt);
}

P.S. Во вложении скрипт для тестирования функции DateOfMonday().

Файлы:
 

Функция Fibonacci().

Эта функция возвращает элемент ряда Фибоначчи по его порядковому номеру.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.08.2008                                                     |
//|  Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    n - номер элемента ряда                                                 |
//+----------------------------------------------------------------------------+
int Fibonacci(int n) {
  int a=0, b=0, i=1, s=0;

  if (n==1) s=1;
  if (n>1) {
    s=1;
    while (i<n) {
      i++;
      a=b;
      b=s;
      s=a+b;
    }
  }
  return(s);
}

P.S. Во вложении скрипт для тестирования функции Fibonacci().

Файлы:
 

Функция GetNameMA().

Эта функция возвращает наименование метода МА (Moving Averages) по его идентификатору. Данную функцию удобно использовать в комментариях, сообщениях индикаторов, советников.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование метода МА.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mm - идентификатор метода МА                                            |
//+----------------------------------------------------------------------------+
string GetNameMA(int mm) {
  switch (mm) {
    case MODE_SMA : return("SMA");
    case MODE_EMA : return("EMA");
    case MODE_SMMA: return("SMMA");
    case MODE_LWMA: return("LWMA");
    default       : return("Unknown Method");
  }
}
 
KimIV писал (а) >>

Функция GetNameMA().

Эта функция возвращает наименование метода МА (Moving Averages) по его идентификатору. Данную функцию удобно использовать в комментариях, сообщениях индикаторов, советников.

Не сочтите за придирательство....

default       : return("Unknown Method");

Просто если уж быть последовательным, то до конца...
 
TheXpert писал (а) >>

Не сочтите за придирательство....

ни в коем случае... спасибо! Исправил!

 
KimIV

Добрый день !

Помогите экспа переправить самую малость.

Он зараза ордеров понаоткрывает и не закрывает эту пачку по условию.

т.е. если сделка одна всего лиш то он из позы вылезет а если сделки 2 то глохнет.

Файлы:
panzer.mq4  5 kb
 

Функция GetPriceDiffInPoint().

Эта функция возвращает ценовую разницу между двумя барами, которые задаются их номерами. Целью разработки данной функции было определение величины и направления движения курса. Функция GetPriceDiffInPoint() самостоятельно определяет, какие именно опорные точки (Open или High или Low или Close) баров брать в расчёт. Функция принимает следующие необязательные параметры:

  • sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
  • tf - Таймфрейм. Значение по умолчанию 0 - текущий символ.
  • n2 - Номер левого бара. Значение по умолчанию - 2.
  • n1 - номер правого бара. Значение по умолчанию - 1.

Возвращаемое значение:

  • положительное - между барами N2 и N1 был рост курса.
  • отрицательное - между барами N2 и N1 было снижение курса.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает ценовую разницу в пунктах между двумя барами.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий таймфрейм)  |
//|    n2 - номер левого бара               (    2       - второй бар)         |
//|    n1 - номер правого бара              (    1       - первый бар)         |
//|  Возвращаемое значение:                                                    |
//|    положительное - между барами N2 и N1 был рост курса                     |
//|    отрицательное - между барами N2 и N1 было снижение курса                |
//+----------------------------------------------------------------------------+
int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  int    d=MarketInfo(sy, MODE_DIGITS);
  int    dd=0, k=iBars(sy, tf);

  if (n1>k || n2>k)
    Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
  else {
    if (n1>0 && n2>0) {
      int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
      int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);

      if (MathAbs(d1)>MathAbs(d2)) dd=d1;
      if (MathAbs(d1)<MathAbs(d2)) dd=d2;
      if (MathAbs(d1)==MathAbs(d2)) {
        if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
      }
    }
  }

  return(dd);
}
Причина обращения: