Утилита Trade Panel
Форекс стратегии, торговые роботы, индикаторы

Закрывает предварительно выбранную позицию

Rebate service

ForexMq

Функция закрывает предварительно выбранный рыночный ордер (позицию).


// Включаемый файл 
 #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().

Смотреть так же:




Комментарии ()