Функция CloseAll() — Закрыть все открытые ордера. Из названия уже становиться понятно, какую функцию он выполняет.
Функция учитывает Magic ордера, поэтому её необходимо использовать с учётом названия параметра вашего магического номера, либо удалить из условия
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
часть && OrderMagicNumber() == Magic
Т.е. условие будет выглядеть так:
if (OrderSymbol() == Symbol())
Итак, функция:
//+------------------------------------------------------------------+
//| Expert function | //+------------------------------------------------------------------+
void CloseAll()
{
bool IsClosed;
int err = 0,
counter = 0,
MaxTry = 100; // количество попыток на закрытие ордера
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
IsClosed = false;
counter = 0;
while(!IsClosed)
{
IsClosed = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black);
if (!IsClosed)
{
err = GetLastError();
Print("Ошибка закрытия ордера " + IntegerToString(OrderTicket()) +", код ошибки: "+ IntegerToString(err));
counter++;
if (counter >= MaxTry)
break;
Sleep(100);
RefreshRates();
}
}
}
if (OrderType() == OP_SELL)
{
IsClosed = false;
counter = 0;
while(!IsClosed)
{
IsClosed = OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black);
if (!IsClosed)
{
err = GetLastError();
Print("Ошибка закрытия ордера " + IntegerToString(OrderTicket()) +", код ошибки: "+ IntegerToString(err));
counter++;
if (counter >= MaxTry)
break;
Sleep(100);
RefreshRates();
}
}
}
}
Sleep(100);
}
}
}
//+------------------------------------------------------------------+