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

 

Cпасибо тебе KimIV !

 

Функция DeleteOrders(). Версия для тестера.

Функция DeleteOrders() предназначена для удаления отложенных ордеров BuyLimit, BuyStop, SellLimit и SellStop. Функция DeleteOrders() является универсальной, то есть она может быть применена как для удаления всех имеющихся отложенных ордеров, так и конкретных, удовлетворяющим условиям отбора, которые задаются параметрами функции:

sy - Наименование инструмента. Так как в тестере торговля может вестись только по текущему инструменту, то этот параметр в версии для тестера не актуален и нужен только для совместимости с онлайн версией данной функции. В тестере лучше всего использовать значения "" или NULL. Значение по умолчанию "" - означает любой символ.
op
- Тип торговой операции, тип отложенного ордера. Возможны одно из пяти значений: -1, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT или OP_SELLSTOP. Значение по умолчанию -1 - означает любой ордер.
mn
- MagicNumber, идентификационный номер отложенного ордера. Значение по умолчанию -1 - означает любой магик.

//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 13.06.2007                                                      |
//| Описание : Удаление ордеров. Версия функции для тестов на истории.         |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//| sy - наименование инструмента   (NULL - текущий символ)                    |
//| op - операция                   ( -1  - любой ордер)                       |
//| mn - MagicNumber                ( -1  - любой магик)                       |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), ot;
 
  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
        if (OrderSymbol()==sy && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            OrderDelete(OrderTicket(), clDelete);
          }
        }
      }
    }
  }
}
 

Функция DeleteOrders(). Версия для онлайн.


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 28.11.2006                                                      |
//| Описание : Удаление ордеров                                                |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента   ( ""  - любой символ,                    |
//|                                    NULL - текущий символ)                  |
//|   op - операция                   (  -1 - любой ордер)                     |
//|   mn - MagicNumber                (  -1 - любой магик)                     |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  bool fd;
  int err, i, it, k=OrdersTotal(), ot;
  
  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; 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) {
            for (it=1; it<=NumberOfTry; it++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              fd=OrderDelete(OrderTicket(), clDelete);
              if (fd) {
                if (UseSound) PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                Print("Error(",err,") delete order ",GetNameOP(ot),
                      ": ",ErrorDescription(err),", try ",it);
                Sleep(1000*5);
              }
            }
          }
        }
      }
    }
  }
}
 

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


1. Удалить все ордера:

DeleteOrders();
2. Удалить все ордера BuyStop:
DeleteOrders(NULL, OP_BUYSTOP);

3. Удалить все ордера с магиком 123456:

DeleteOrders(NULL, -1, 123456);

ЗЫ. В прицепе работающий скрипт с этими же примерами.

Файлы:
 
KimIV:

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

С такими темпами до библиотеки мы так и не дойдем. Придется все таки в гости ехать. Если конечно пригласишь. Я ж без приглашения ни-ни.
 
Каждый мужчина имеет право на лево... гы... В связи с этим я немного развлекусь

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


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


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. 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() выполняет поиск на заданном символе, на заданном таймфрейме ближайшего фрактала заданного типа и возвращает его ценовой уровень. Зная ценовой уровень расположения фрактала, уже легко установить ордер на этот уровень.
 
KimIV:
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
Вопрос... Связи с чем d может равняться 0 ???
 
kharko:
KimIV:
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
Вопрос... Связи с чем d может равняться 0 ???
Не знаю... У меня в практике был один случай, когда было d=0. Пришлось сделать проверку на равенство нулю. С тех пор и тащу этот код везде, где-только можно. Возможно, это уже лишнее, но я считаю, что лучше перебдеть, чем недобдеть.
 
Vinin:
KimIV:

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

С такими темпами до библиотеки мы так и не дойдем. Придется все таки в гости ехать. Если конечно пригласишь. Я ж без приглашения ни-ни.

Витёк, какие проблемы? Канешна, приезжай Скоро огород копать... поможешь...

 
KimIV:
Vinin:
KimIV:

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

С такими темпами до библиотеки мы так и не дойдем. Придется все таки в гости ехать. Если конечно пригласишь. Я ж без приглашения ни-ни.

Витёк, какие проблемы? Канешна, приезжай Скоро огород копать... поможешь...

С огородом проблем нет, хотя уже и не тот возраст. Может для этого дела взять кого помоложе. А мы с тобой в баньку сходим, выпьем кваску ( у тебя же аллергия, у меня тоже когда-то была). Посмотрим как молодежь работает. А так не серьезно будет.
Причина обращения: