Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Sergey Popov
118
Sergey Popov  

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

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

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

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

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

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

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

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

Vitaly Muzichenko
4092
Vitaly Muzichenko  
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);
}
Sergey Popov
118
Sergey Popov  
Vitaly Muzichenko:

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

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

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

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

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