Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 29

 
yaaarik777:

Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.

Ситуация такая:

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

Буду очень благодарен за помощь.

Спасибо. 

Для примера:

//-------------------------------------------------------------------+
//   удаляет отложенные ордера по type                               +
//+------------------------------------------------------------------+

void DeleteOrders(int type)
{
  int cnt = OrdersTotal();
  for (int i=cnt-1; i>=0; i--) {
        if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        //По желанию
        if (OrderSymbol() != Symbol()) continue;
        //По желанию
        if (OrderMagicNumber() != mn) continue;
        
        if (OrderType() != type) continue;
        
        if (type == OP_BUYSTOP || type == OP_SELLSTOP)
            {
            bool Del_1 = OrderDelete(OrderTicket());
               if(!Del_1)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
        if (type == OP_BUYLIMIT || type == OP_SELLLIMIT)
            {
            bool Del_2 = OrderDelete(OrderTicket());  
               if(!Del_2)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
  }
}
//+------------------------------------------------------------------+


 

 

Ну и определим перед этим, что появилась позиция, и пора замочить лишний ордер

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
 
Vladimir Zubov:

Для примера:

//-------------------------------------------------------------------+
//   удаляет отложенные стоп ордера SELLSTOP или BUYSTOP по type     +
//+------------------------------------------------------------------+

void DeleteOrders(int type)
{
  int cnt = OrdersTotal();
  for (int i=cnt-1; i>=0; i--) {
        if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
        //По желанию
        if (OrderSymbol() != Symbol()) continue;
        //По желанию
        if (OrderMagicNumber() != mn) continue;
        
        if (OrderType() != type) continue;
        
        if (type == OP_BUYSTOP || type == OP_SELLSTOP)
            {
            bool Del_1 = OrderDelete(OrderTicket());
               if(!Del_1)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
        if (type == OP_BUYLIMIT || type == OP_SELLLIMIT)
            {
            bool Del_2 = OrderDelete(OrderTicket());  
               if(!Del_2)
                  Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
               else
                  Print("Ордер успешно удален.");
            }
  }
}
//+------------------------------------------------------------------+

Что за сегрегация по типам? Что это даёт? Будет ли разница в работе, если написать так?

if (type > 1 && type < 6)
   {
     bool Del_1 = OrderDelete(OrderTicket());
     if(!Del_1)
     Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
     else
     Print("Ордер успешно удален.");
   }
 
Почему в мт4 и мт5 на айфоне бары разные? Хотя время открытия и закрытия баров одинаковы. Это же явно мешает ведь линию то вчера на мт4 не пробил в 14:00.
Файлы:
image.png  82 kb
image.png  81 kb
 
Добрый день! скажите пожалуйста, Скачал версию мт4 636 на андроид, но не видит список брокеров. Версия терминала уже не поддерживается?((  если поддерживается, то где скачать рабочую
 
MetaGSss:
Почему в мт4 и мт5 на айфоне бары разные? Хотя время открытия и закрытия баров одинаковы. Это же явно мешает ведь линию то вчера на мт4 не пробил в 14:00.
Хотят чтобы Вы знали заранее - куда цена пойдет
 
MetaGSss:
Почему в мт4 и мт5 на айфоне бары разные? Хотя время открытия и закрытия баров одинаковы. Это же явно мешает ведь линию то вчера на мт4 не пробил в 14:00.
спред для экстрималов конечно)))
 
MetaGSss:
Почему в мт4 и мт5 на айфоне бары разные? Хотя время открытия и закрытия баров одинаковы. Это же явно мешает ведь линию то вчера на мт4 не пробил в 14:00.
символы тоже немножко разные)
 

- последние четыре строчки в общем понятны, вопрос лишь в функции PlaySound,  код которой необходимо вставить после каждой строчки "Print("..." в таком виде: 

bool  PlaySound(

string  payment      // имя файла

);

 ... или тоже как то преобразуется? 

Объяви bool  PlaySound( в заголовке программы - получишь возможность в сет файле включать и отключать звук extern bool Play = TRUE;

далее, что будет Print печатать? И при каком условии?

Смысл этого действа в чём заключается? Играть звук при закрытии ордера и писать комент ( по ТП или СЛ) ?






Спасибо A1exPit за подробный и понятный ответ ответ ... "Смысл действа" заключается в озвучивании событий "закрытия ордеров по Тейкпрофиту и Стоплоссу " = для каждого свой звук ...
 

Приветствую. Спрашивал уже рядом, но пока не нашел ответа. Подскажите, пожалста, почему при вот такой записи

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);} 

сплошняком выдает ошибки

: invalid ticket for OrderDeletefunction

: OrderDelete error 4051

по справочнику это 

Недопустимое значение параметра функции 

хотя параметры, вроде, такие-же.  

Хотя если убрать условие и оставить только

OrderDelete(ticketD);

OrderDelete(ticketUP); 

то удаляет успешно (но надо то по условию). Что я делаю не так? Вот целиком: 

https://www.mql5.com/ru/forum/160683/page31#comment_3911573 

Советник считает min и max за последние Х бар и выставляет по ним ордера. Далее, при уменьшении максимума или увеличении минимума нужно удалить соотв ордер и открыть по новым данным. 

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

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