Функция удаления отложек при закрытии ордера для советника

 

Господа программисты, помогите написать функцию удаления отложек при закрытии ордера, для советника МТ4.

А то при моей забывчивости их удалить, особенно перед новостями, приводит к печальным последствиям.

Если не понятно в названии темы, попробую поподробней объяснить:

1. Открываю ордер.

2. Ставлю отложку(Buy Stop, Sell Stop, Buy Limit или Sell Limit).

3. Закрываю ордер вручную, или по TP или по SL.

4. Советник удаляет все отложки.

Заранее спасибо тем кто поможет! 

 
Sergey Popov:

Господа программисты, помогите написать функцию удаления отложек при закрытии ордера, для советника МТ4.

А то при моей забывчивости их удалить, особенно перед новостями, приводит к печальным последствиям.

Если не понятно в названии темы, попробую поподробней объяснить:

1. Открываю ордер.

2. Ставлю отложку(Buy Stop, Sell Stop, Buy Limit или Sell Limit).

3. Закрываю ордер вручную, или по TP или по SL.

4. Советник удаляет все отложки.

Заранее спасибо тем кто поможет! 

Наверное имелось ввиду, когда закрываете позиции, то нужно удалить ордера?

Внесите доп.условие на проверку установленных ордеров и отсутствие позиций, если совпало условие - удаляем

Подробности здесь в виде функций:  https://forum.mql4.com/ru/38949#434196

int start() {

 if(!ExistPositions() && ExistOrders()) { проверка установленных ордеров и отсутствие позиций
  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) {
                PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                Print("Error(",err,") delete order ",GetNameOP(ot),
                      ": ",ErrorDescription(err),", try ",it);
                Sleep(1000*5);
              }
            }
          }
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=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()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 
Vitaly Muzichenko:

Наверное имелось ввиду, когда закрываете позиции, то нужно удалить ордера?

Я ничего не понимаю в этих кодах, так что мне это не поможет. Но всё равно спасибо за помощь!
 
Sergey Popov:
Я ничего не понимаю в этих кодах, так что мне это не поможет. Но всё равно спасибо за помощь!

если торгуете вручную, то самое простое заглянуть в CodeBase или Market и взять скрипт или панель закрытия ордеров, чтобы одним нажатием удалять/закрывать всё по инструменту и точно ни один не забыть.

конечно остаётся вариант обратиться во фриланс, и получить желаемое по мин.возможной цене.

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