Функция закрывает предварительно выбранный рыночный ордер (позицию).
// Включаемый файл
#include <stdlib.mqh>
// Входные параметры
input int NumOfTry=10; // Количество попыток закрыть ордер
input color clrCloseBuy=clrRed; // Цвет стрелки закрытия Buy
input color clrCloseSell=clrBlue; // Цвет стрелки закрытия Sell
input int Slippage=40; // Максимально допустимое отклонение цены
//---
void ClosePosBySelect()
{
bool res;
color clrClose;
double lo,opPr;
int err;
if(OrderType()<2)
{
for(int nm=1; nm<=NumOfTry; nm++)
{
// Выходим с цикла если принудительно завершили работу советника
if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
break;
// Если поток для совершения операций занят, ждем 4 секунды
while(!IsTradeAllowed())
Sleep(4000);
// Обновляем данные
RefreshRates();
if(OrderType()==OP_BUY)
{
opPr=MarketInfo(OrderSymbol(),MODE_BID);
clrClose=clrCloseBuy;
}
else
{
opPr=MarketInfo(OrderSymbol(),MODE_ASK);
clrClose=clrCloseSell;
}
lo=OrderLots();
res=OrderClose(OrderTicket(),lo,opPr,Slippage,clrClose);
// Если удалось закрыть ордер, выходим с цикла
if(res)
{
Print("Order: "+(string)OrderTicket()+" has been closed successfully");
break;
}
// Если не удалось закрыть ордер...
else
{
err=GetLastError();
Print("Error("+(string)err+") Order close error: "+ErrorDescription(err));
// Если ошибка не критичная, ждем 2 секунду и пытаемся закрыть ордер повторно
if(ErrorChecking(err))
{
Sleep(2000);
}
// Если ошибка критичная, выходим с цикла
else
{
Print("?losing stopped!");
return;
}
}
}
}
else Print("Incorrect trading operation. Close "+NameOrd(OrderType()));
}
Используемые функции
Для описания кодов ошибок использована функция ErrorDescription из библиотеки stdlib.mqh. Для обработки ошибок применяется функция ErrorChecking(), для вывода типа ордера использована функция NameOrd().
Написать комментарий
Комментарии ()