Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Они уже зарабатывают с помощью Маркета. Зарабатывай и ты!
Sergey Popov
118
Sergey Popov 2016.09.21 11:14 

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

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

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

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

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

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

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

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

Vitaly Muzichenko
3495
Vitaly Muzichenko 2016.09.21 12:19  
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 2016.09.21 15:39  
Vitaly Muzichenko:

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

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

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

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

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