Здравствуйте,
Как изменить код чтобы он удалял все ордера? Использую вот такой код, но он не удаляет все ордера и для части ордеров выдает инвалид прайс. Заранее спасибо
После if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; вставьте RefreshRates(); и/или Bid и Ask замените на OrderClosePrice();
вместо
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
использовать
if ( !(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==Symbol()) ) continue;
иначе при закрытии ордеров будут ошибки и потеря времени, когда эксперт стартовавший на одном инструменте будет пытаться закрыть ордера других инструментов по СВОИМ ценам
А что RefreshRates(); уже есть я и не заметил) Попробуйте просто заменить Bid и Ask заменить на OrderClosePrice(). Но влюбом случае полностью избавиться от таких ошибок не удасться. Надо ее обрабатывать. Примитивно и не очень правильно, этот цикл закрытия поместить в цикл, while(OrdersTotal()>0){ "Ваш цикл"}.
иначе при закрытии ордеров будут ошибки и потеря времени, когда эксперт стартовавший на одном инструменте будет пытаться закрыть ордера других инструментов по СВОИМ ценам
Использование OrderClosePrice() по идеи должно избавить от использования чужих цен... Но просто реквоты-то все равно могут быть и их обработка нужна.
void CloseOrders()
{
int cnt = OrdersTotal();
for (int i=cnt-1; i>=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_BUYLIMIT) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket());
RefreshRates();
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice()., 3);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice()., 3);
}
}
Здравствуйте,
Как изменить код чтобы он удалял все ордера? Использую вот такой код, но он не удаляет все ордера и для части ордеров выдает инвалид прайс. Заранее спасибо
void CloseOrders()
{
int cnt = OrdersTotal();
for (int i=cnt-1; i>=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_BUYLIMIT) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket());
RefreshRates();
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}
}
int close_ord1=OrdersTotal(); for (int qe1=0;qe1<close_ord1;qe1++) { OrderSelect(qe1, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY) {RefreshRates();OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3);Sleep(2000);} if(OrderType()==OP_SELL){RefreshRates();OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3);Sleep(2000);} }
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте,
Как изменить код чтобы он удалял все ордера? Использую вот такой код, но он не удаляет все ордера и для части ордеров выдает инвалид прайс. Заранее спасибо
void CloseOrders()
{
int cnt = OrdersTotal();
for (int i=cnt-1; i>=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderType() == OP_BUYSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket());
if (OrderType() == OP_BUYLIMIT) OrderDelete(OrderTicket());
if (OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket());
RefreshRates();
if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3);
if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, 3);
}
}