Вопрос новичка. Как "вычислить" и удалить второй ордер, если сработал первый?

 

Я новичек в программировании. Ради интереса пытаюсь доработать одного советника основаного на пробое: https://www.mql5.com/ru/code/9321

 Там выставляется один отложеный ордер BuyStop и один SellStop. Период D1. Срок жизни отложенника - сутки.

Вопрос такой: как удалить второй ордер, если один из них сработал?

Пробовал вот так дописать код:

for (int q=0;q<OrdersTotal();q++)
    {
     if (OrderSelect(q, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol())
      {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
        {
          for (int q2=0;q2<OrdersTotal();q2++)
          {
            if (OrderSelect(q2, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol())
            {
               if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP){
                  OrderDelete(OrderTicket());
               }
            }
          }
        }
      if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
        {
          return(0); 
        }
      }  
    }

Тогда ордера удаляются, но тут же открываются новые в этот день.

На ум приходит только анализироваь всю историю, но может быть как-то можно попроще сделать?

 

Чтобы не мучится, - посмотрите, как это сделано у профессионала:

http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=39

 

Спасибо! Понял! Была такая мысля сделать через мэджик, только не знал как. Теперь сделаю.

 

Не все равно не то. Удаление противоположного сделал через мэджик, все ок.

Но когда удаляю ордер, советник в этот же день открывает еще новые ордера, и в день получается по несколько ордеров открывает, хотя должен всего 2. 

Вопрос в том, как заставить советник открывать только 2 отложенника за сутки?

Можно перебрать все закрытые ордера и сверить мэджики при помощи OrdersHistoryTotal, но на каждом тике перебирать наверное неправильно, да и история текущего счета должна быть загружена в терминале

Можно еще привязать время открытия ордера к 00:00 GMT, но у меня часто связь пропадает, могут не открыться ордера.

 

Я, не так давно, решил аналогичную задачу вот таким образом:

//В функцию старт :
// запрет торговли: - в день , если уже были открыты И закрыты позиции 
// то торговля запрещена
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
   Trade=false;       else  Trade=true;
//--------------------------------
//ПРИМЕР :
//============Открытие позиций  ======================================= 
if (Trade==true) {// если торговля разрешена  
if ( NumberOfPositions(NULL , -1, Magic )==0 ) { //если  нет открытых позиций 
// и т.д....



А вне ф-и СТАРТ, в конец самый кода поставьте 

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

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

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) t=OrderCloseTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}
 
Спасибо!
 

А можно сделать так что-бы ордера ставились по очерёди?

Если открылся а потом закрылся ордер sell stop по стопу, выставлялся отложенник byu limit.

И наоборот если открылся а потом закрылся buy limit по стопу, выставляем отложенник sell limit.

Проблема в том что все отложенники выставляются на график вместе.

И ещё маленькая просьба, что б Stop loss после достижения 10 - 15 пунктов переносил на определённое количество пунктов, например на 5. С регулировкой уровней.

Помогите с реализацией задуманного, буду очень благодарен!!!

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