Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.
Ситуация такая:
выставляем 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);
}
}
Для примера:
// удаляет отложенные стоп ордера 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("Ордер успешно удален.");
}
}
}
//+------------------------------------------------------------------+
Что за сегрегация по типам? Что это даёт? Будет ли разница в работе, если написать так?
{
bool Del_1 = OrderDelete(OrderTicket());
if(!Del_1)
Print("Ошибка удаления ордера. Код ошибки=",GetLastError());
else
Print("Ордер успешно удален.");
}
Почему в мт4 и мт5 на айфоне бары разные? Хотя время открытия и закрытия баров одинаковы. Это же явно мешает ведь линию то вчера на мт4 не пробил в 14:00.
Почему в мт4 и мт5 на айфоне бары разные? Хотя время открытия и закрытия баров одинаковы. Это же явно мешает ведь линию то вчера на мт4 не пробил в 14:00.
Почему в мт4 и мт5 на айфоне бары разные? Хотя время открытия и закрытия баров одинаковы. Это же явно мешает ведь линию то вчера на мт4 не пробил в 14:00.
- последние четыре строчки в общем понятны, вопрос лишь в функции PlaySound, код которой необходимо вставить после каждой строчки "Print("..." в таком виде:
bool PlaySound(
string payment // имя файла
);
... или тоже как то преобразуется?
Объяви bool PlaySound( в заголовке программы - получишь возможность в сет файле включать и отключать звук extern bool Play = TRUE;
далее, что будет Print печатать? И при каком условии?
Смысл этого действа в чём заключается? Играть звук при закрытии ордера и писать комент ( по ТП или СЛ) ?
Приветствую. Спрашивал уже рядом, но пока не нашел ответа. Подскажите, пожалста, почему при вот такой записи
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 за последние Х бар и выставляет по ним ордера. Далее, при уменьшении максимума или увеличении минимума нужно удалить соотв ордер и открыть по новым данным.
Я вот только начал изучение и вариант с удалением а не модификацией был с целью изучения применения функции, встал вопрос почему не работает.