Функция гарантированного открытия ордера

Функция гарантированного открытия ордера

Ордер точно будет открыт этой функцией.

Во внешние параметры надо вынести уровень проскальзывания и комментарий к ордеру:

input string IsComm = "Тут любой комментарий";
input int Slippage = 30; // 30 - это просто пример

Передаваемые параметры:

  • sy — наименование инструмента   (NULL или «» — текущий символ)
  • op — операция
  • ll — лот
  • sl — уровень стоп
  • tp — уровень тейк
  • mn — MagicNumber

Функция (нажмите на иконку одной из соцсетей):
[sociallocker]

int OpenPosition(string sy,int op,double ll,double sl=0,double tp=0,int mn=0)
  {
   color    clOpen;
   datetime ot;
   double   pp,pa,pb;
   int      dg,err,it,ticket=0;
   
   if(sy=="" || sy=="0") sy=Symbol();
   if(op==OP_BUY) clOpen=Green; else clOpen=Red;
   for(it=1; it<=NumberOfTry; it++)
     {
      if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
        {
         Print("OpenPosition(): Остановка работы функции");
         break;
        }
      while(!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      dg=MarketInfo(sy, MODE_DIGITS);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
      if(op==OP_BUY) pp=pa; else pp=pb;
      pp=NormalizeDouble(pp, dg);
      ot=TimeCurrent();
      ticket=OrderSend(sy,op,ll,pp,Slippage,sl,tp,lsComm,mn,0,clOpen);
      if(ticket>0)
        {
         break;
           } else {
         err=GetLastError();
         if(pa==0 && pb==0) Print("Проверьте в Обзоре рынка наличие символа "+sy);
         // Вывод сообщения об ошибке
         Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
         Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
               " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
         // Блокировка работы советника
         if(err==2 || err==64 || err==65 || err==133)
           {
            gbDisabled=True; break;
           }
         // Длительная пауза
         if(err==4 || err==131 || err==132)
           {
            Sleep(1000*300); break;
           }
         if(err==128 || err==142 || err==143)
           {
            Sleep(1000*66.666);
            if(ExistPositions(sy,op,mn,ot))
              {
               break;
              }
           }
         if(err==140 || err==148 || err==4110 || err==4111) break;
         if(err==141) Sleep(1000*100);
         if(err==145) Sleep(1000*17);
         if(err==146) while(IsTradeContextBusy()) Sleep(1000*11);
         if(err!=135) Sleep(1000*7.7);
        }
     }
   return(ticket);
  }

[/sociallocker]
Вот и все. Функция рабочая 100%. Можете оставить какой-нибудь хороший комментарий.


Поделись с друзьями:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *