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

 
KimIV:
Каждый мужчина имеет право на лево... гы... В связи с этим я немного развлекусь

Ильнар, в теме отложенный ордер по фракталу спрашивал, Как сделать так чтобы ставились отложенные ордера по фракталам?


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


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
Функция FindNearFractal() выполняет поиск на заданном символе, на заданном таймфрейме ближайшего фрактала заданного типа и возвращает его ценовой уровень. Зная ценовой уровень расположения фрактала, уже легко установить ордер на этот уровень.
Возможно ли, чтобы функция возвращала два значения, например еще и номер бара где находится фрактал, или надо подключать еще одну?
 
xrust писал (а):
Возможно ли, чтобы функция возвращала два значения, например еще и номер бара где находится фрактал, или надо подключать еще одну?
А зачем возвращать два значения, когда достаточно одного - номера бара? Для этого в операторе:
return(NormalizeDouble(f, d));
запишите передачу не ценового уровня, а значения счётчика баров s. На выхлопе получите номер бара фрактала. А ценовой уровень возьмёте одной из функций iHigh() или iLow() взависимости от типа фрактала.
 
нет, тут все понятно, я в принципе спрашиваю. Спасибо вам, ваши посты очень помогают.
 
xrust:
нет, тут все понятно, я в принципе спрашиваю.
ааа... ну если в принципе, то можно воспользоваться массивом, передаваемым по ссылке. Тогда количество возвращаемых параметров будет ограничено размером массива.
 

Функция ExistOrdersByLot().

Возвращает флаг существования ордера с заданным размером лота. True - ордер существует (установлен), False - ордер отсутствует (не установлен). Ограничить перечень проверяемых ордеров можно параметрами функции:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Операция, тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой тип ордера.
  • mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
  • lo - Размер лота с точностью до двух знаков после запятой. Значение по умолчанию 0 - любой размер лота.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает флаг существования ордера по размеру лота.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    lo - лот                        ( 0   - любой лот)                      |
//+----------------------------------------------------------------------------+
bool ExistOrdersByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), ot;
  lo=NormalizeDouble(lo, 2);

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (lo<=0 || NormalizeDouble(OrderLots(), 2)==lo) return(True);
          }
        }
      }
    }
  }
  return(False);
}
 

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

  1. Проверить наличие любого ордера с размером лота 0.2
    ExistOrdersByLot("", -1, -1, 0.2);
  2. Проверить наличие любого ордера с размером лота 0.3 по инструменту текущего графика
    ExistOrdersByLot(NULL, -1, -1, 0.3);
  3. Проверить наличие ордера BuyLimit с лотом 0.5 по любому инструменту
    ExistOrdersByLot("", OP_BUYLIMIT, -1, 0.5);
  4. Проверить наличие ордера SellStop с лотом 0.1 с магиком 123456 по EURUSD
    ExistOrdersByLot("EURUSD", OP_SELLSTOP, 123456, 0.1);
  5. Проверить наличие любого ордера с лотом 0.4 с магиком 987 по USDJPY
    ExistOrdersByLot("USDJPY", -1, 987, 0.4);

В аттаче, как обычно, рабочий скрипт с вышеприведёнными примерами.

Файлы:
 

Функция GetLotLastOrder().

Возвращает размер лота последнего выставленного ордера или -1. Ограничить перечень проверяемых ордеров можно параметрами функции:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Операция, тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой ордер.
  • mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает размер лота последнего выставленного ордера или -1  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  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()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
 

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

  1. Узнать размер лота последнего выставленного ордера
    GetLotLastOrder();
  2. Узнать размер лота последнего выставленного ордера по текущему инструменту
    GetLotLastOrder(NULL);
  3. Узнать размер лота последнего ордера BuyLimit по любому инструменту
    GetLotLastOrder("", OP_BUYLIMIT);
  4. Узнать размер лота последнего ордера SellStop с магиком 123456 по EURUSD
    GetLotLastOrder("EURUSD", OP_SELLSTOP, 123456);
  5. Узнать размер лота последнего ордера с магиком 2345 по текущему инструменту
    GetLotLastOrder(NULL, -1, 2345);

В аттаче традиционно рабочий скрипт с вышеприведёнными примерами.

Файлы:
 

Функция GetOrderOpenPrice().

Возвращает цену установки последнего выставленного ордера или 0. Ограничить перечень проверяемых ордеров можно параметрами функции:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит ордера только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Операция, тип отложенного ордера. Допустимые значения: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 - означает любой ордер.
  • mn - Идентификатор ордера (MagicNumber). Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает цену установки последнего ордера или 0.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  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()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

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

  1. Узнать цену установки любого последнего выставленного ордера
    GetOrderOpenPrice();
  2. Узнать цену установки последнего выставленного ордера по текущему инструменту
    GetOrderOpenPrice(NULL);
  3. Узнать цену установки последнего ордера BuyLimit по любому инструменту
    GetOrderOpenPrice("", OP_BUYLIMIT);
  4. Узнать цену установки последнего ордера SellStop с магиком 123456 по EURUSD
    GetOrderOpenPrice("EURUSD", OP_SELLSTOP, 123456);
  5. Узнать цену установки последнего ордера с магиком 2345 по текущему инструменту
    GetOrderOpenPrice(NULL, -1, 2345);

В аттаче совершенно рабочий скрипт с вышеуказанными примерами.

Файлы:
Причина обращения: