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

 

Функция TimeOpenLastPos().

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

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает время открытия последней открытой позиций.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime TimeOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(t);
}
ЗЫ. Во вложении скрипт для тестирования функции TimeOpenLastPos().
Файлы:
 
 
Prival:
Есть ли в закромах функция пузырьковой сортировки

Нету, но забацал за 10 минут

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.06.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов массива.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//+----------------------------------------------------------------------------+
void BubbleSort(double& a[]) {
  double t;
  int    i, j, n=ArraySize(a);

  for (i=n-1; i>0; i--) {
    for (j=0; j<i; j++) {
      if (a[j]>a[j+1]) {
        t=a[j];
        a[j]=a[j+1];
        a[j+1]=t;
      }
    }
  }
}
ЗЫ. Во вложении скрипт для тестирования функции BubbleSort().
Файлы:
 

Функция BarsBetweenLastFractals().

Эта функция возвращает количество баров между двумя последними фракталами или -1. Рыночный инструмент и таймфрейм, с которых нужно взять фракталы задаются параметрами:

  • sy - Наименование рыночного инструмента. Значение по умолчанию - "" или NULL означает текущий рыночный инструмент.
  • tf - Таймфрейм (количество минут в баре). Значение по умолчанию 0 - означает текущий таймфрейм.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.06.2008                                                     |
//|  Описание : Возвращает количество баров между двумя последними фракталами. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int BarsBetweenLastFractals(string sy="", int tf=0) {
  double fu=0, fd=0;
  int    i, nu=0, nd=0;

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=2; i<100; i++) {
    fu=iFractals(sy, tf, MODE_UPPER, i);
    if (fu!=0) {
      if (nu==0) nu=i;
    }
    fd=iFractals(sy, tf, MODE_LOWER, i);
    if (fd!=0) {
      if (nd==0) nd=i;
    }
    if (nu>0 && nd>0) return(MathAbs(nu-nd));
  }
  Print("BarsBetweenLastFractals(): Фракталы не найдены");
  return(-1);
}
ЗЫ. Во вложении скрипт для тестирования функции BarsBetweenLastFractals().
 

Функция SecondsAfterCloseLastPos().

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

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после закрытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  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 (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.S. Во вложении скрипт для тестирования функции SecondsAfterCloseLastPos().
 

Здраствуйте

Помогите советом.

Есть советник который выставляет ордера в обе стороны в определенное время

Обьясните на пальцах как сделать чтоб при срабатывании первого, автоматически удалялся второй

Или подправте советник 

Спасибо

 
aceventura:

Здраствуйте

Помогите советом.

Есть советник который выставляет ордера в обе стороны в определенное время

Обьясните на пальцах как сделать чтоб при срабатывании первого, автоматически удалялся второй

Или подправте советник

Спасибо

KimIV

Игорь. А у тебя пальцев хватит?

 
aceventura:

Здраствуйте

Помогите советом.

Есть советник который выставляет ордера в обе стороны в определенное время

Обьясните на пальцах как сделать чтоб при срабатывании первого, автоматически удалялся второй

Или подправте советник

Спасибо

Сначала возьми в этой ветке функцию количества ордеров, а потом, если она вернет "== 1", "< 2" или "== нечетное число", то вызови функцию из этой ветки "закрыть ордера".

 
Vinin:

KimIV

Игорь. А у тебя пальцев хватит?

Наверно, нет... у мну токо два: указательный и хватательный... гы

 
SergNF:

Сначала возьми в этой ветке функцию количества ордеров, а потом, если она вернет "== 1", "< 2" или "== нечетное число", то вызови функцию из этой ветки "закрыть ордера".

Функция количества ордеров не подойдет, т.к. для каждой пары тотже советник настроен по своему. И ставит ордера бывает по разным парам одновременно. Тогда получится если по двум парам поставлено четыре ордера, и один сработал, три удалятся. а надо чтоб удалялся противоположный для каждой

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