Советник игнорирует Магик. MQL5

 

Суть проблемы: с утра выставляются стоповые отложки, они стоят, всё хорошо, ничего не происходит. А когда срабатывает какая-то из них, например, BuyStop, то робот пытается пропихнуть бесконечное количество отолженных ордеров.

Магик в коде есть:

input int Magic = 909090; //Магик

Но используя CTrade в mql5 при установке BuyStop у меня в списке аргументов нет ведь магика:

У меня есть счётчик отложенных ордеров, вот его код:

//|     Счётчик отложенных ордеров                                   |
//+------------------------------------------------------------------+
int CountPendingOrders(ENUM_ORDER_TYPE type)
  {
   int count = 0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
     {
      ulong ticket = OrderGetTicket(i);

      if(ticket != 0)
        {
         if(OrderGetString(ORDER_SYMBOL) == _Symbol /*&& OrderGetInteger(ORDER_MAGIC) == Magic*/ && OrderGetInteger(ORDER_TYPE) == type)
           {
            count++;
           }
        }
     }Print("Отложенных ордеров = ",count);
   return count;
  }


Есть так же счётчик рыночных позиций:

//+------------------------------------------------------------------+
//|             Счётчик позиций                                      |
//+------------------------------------------------------------------+
int CountPos(ENUM_POSITION_TYPE type)
  {
   int county = 0;

   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      ulong ticket = PositionGetTicket(i);

      if(ticket != 0)
        {
         if(PositionGetString(POSITION_SYMBOL) == _Symbol /*&& PositionGetInteger(POSITION_MAGIC) == Magic*/)
           {
            if(PositionGetInteger(POSITION_TYPE) == type)
              {
               county++;
              }
           }
        }
     }
   Print("CountPos = ", county);
   return county;
  }



Самые обычные счётчики. Я там строки с магиком закомментил, чисто для проверки, изменится что-то или нет.


Вот проверка условия на вход:


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   timeStart = iTime(_Symbol, PERIOD_D1, 0) + TimeToStart * 3600;
   timeStop = iTime(_Symbol, PERIOD_D1, 0) + TimeToClose * 3600;

   if(Burner() == true)
     {
      if(TimeCurrent() > timeStart && TimeCurrent() < timeStop)
        {
         double high = iHigh(_Symbol, PERIOD_D1, 1);
         double low = iLow(_Symbol, PERIOD_D1, 1);
         double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

         if(CountPendingOrders(ORDER_TYPE_BUY_STOP) == 0 && CountPos(POSITION_TYPE_BUY) == 0) 
           {
            if(ask < high)
              {
               if(trade.BuyStop(Lot, NormalizeDouble(high + (Step * _Point), _Digits), _Symbol, low) != true)
                 {
                  Print("Error pending order ", GetLastError());
                 }

Счётчик отложенных кстати, возвращает 1, хотя ордеров стоит два.


Как можно решить проблемы?

 
Sergey Izhutov:

Суть проблемы: с утра выставляются стоповые отложки, они стоят, всё хорошо, ничего не происходит. А когда срабатывает какая-то из них, например, BuyStop, то робот пытается пропихнуть бесконечное количество отолженных ордеров.

Магик в коде есть:

Но используя CTrade в mql5 при установке BuyStop у меня в списке аргументов нет ведь магика:

У меня есть счётчик отложенных ордеров, вот его код:


Есть так же счётчик рыночных позиций:



Самые обычные счётчики. Я там строки с магиком закомментил, чисто для проверки, изменится что-то или нет.


Вот проверка условия на вход:


Счётчик отложенных кстати, возвращает 1, хотя ордеров стоит два.


Как можно решить проблемы?

Документацию читайте… 

Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / SetExpertMagicNumber
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / SetExpertMagicNumber
  • www.mql5.com
Устанавливает идентификатор эксперта Параметры magic [in]  Новый идентификатор эксперта. Возвращаемое значение Нет...
 
Sergey Izhutov:

Счётчик отложенных кстати, возвращает 1, хотя ордеров стоит два.

Правильно, у тебя он считает только байстопы и баи.

if(CountPendingOrders(ORDER_TYPE_BUY_STOP) == 0 && CountPos(POSITION_TYPE_BUY) == 0) 

Хотя тут только фрагменты кода, лучше выкладывать весь код целиком т.к. еще какие-то кастомные функции типа 

Burner()
 
Alexey Viktorov #:

Документацию читайте… 

это в OnInit стоит

 
Grigori.S.B #:

Правильно, у тебя он считает только байстопы и баи.

Хотя тут только фрагменты кода, лучше выкладывать весь код целиком т.к. еще какие-то кастомные функции типа 

Burner() это булевая функция поиска определённой свечи на графике, не думаю, что она влияет



Полный код онтика:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   timeStart = iTime(_Symbol, PERIOD_D1, 0) + TimeToStart * 3600;
   timeStop = iTime(_Symbol, PERIOD_D1, 0) + TimeToClose * 3600;

   if(Burner() == true)
     {
      if(TimeCurrent() > timeStart && TimeCurrent() < timeStop)
        {
         double high = iHigh(_Symbol, PERIOD_D1, 1);
         double low = iLow(_Symbol, PERIOD_D1, 1);
         double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

         if(CountPendingOrders(ORDER_TYPE_BUY_STOP) == 0 && CountPos(POSITION_TYPE_BUY) == 0) 
           {
            if(ask < high)
              {
               if(trade.BuyStop(Lot, NormalizeDouble(high + (Step * _Point), _Digits), _Symbol, low) != true)
                 {
                  Print("Error pending order ", GetLastError());
                 }
              }
           }

         if(CountPendingOrders(ORDER_TYPE_SELL_STOP) == 0 && CountPos(POSITION_TYPE_SELL) == 0)
           {
            if(bid > low)
              {
               if(trade.SellStop(Lot, NormalizeDouble(low - (Step * _Point), _Digits), _Symbol, high) != true)
                 {
                  Print("Error pending order. Open market", GetLastError());
                  trade.Sell(Lot, _Symbol, SymbolInfoDouble(_Symbol, SYMBOL_BID), high);
                 }
              }
           }
        }
     }
   if(TimeCurrent() > timeStop)
     {
      DeletePending();
     }
   ControlPositions();
   ClosePositions();

  }


Функция ComtrolPositions() (если открылась отложка, то удалить другую отложку):

//+------------------------------------------------------------------+
//|       контороль открытых позиций                                 |
//+------------------------------------------------------------------+
void ControlPositions()
  {
   int count = 0;

   for(int  i = PositionsTotal() - 1; i >= 0; i--)
     {
      ulong ticket = PositionGetTicket(i);
      if(ticket != 0)
        {
         if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == Magic)
           {
            count++;
           }
        }
     }
   if(count > 0)
     {
      DeletePending();
     }
  }



Ну и напоследок ClosePositions()


//+------------------------------------------------------------------+
//|    Закрываемся по таймингу                                       |
//+------------------------------------------------------------------+
void ClosePositions()
  {
   datetime stopTime = iTime(_Symbol, PERIOD_D1, 0) + TimeToClose * 3600;

   datetime currentTime = TimeCurrent();

   if(currentTime > stopTime)
     {
      for(int  i = PositionsTotal() - 1; i >= 0; i--)
        {
         ulong ticket = PositionGetTicket(i);
         if(ticket != 0)
           {
            trade.PositionClose(ticket);
           }
        }
     }
  }
 
Если работаете со стандартной библиотекой, то для установки магика нужно использовать SetExpertMagicNumber(). В представленном коде нет такой функции. Следовательно, требуемый магик не устанавливается. Наличие настроечного параметра Magic проблему никак не решит.
 
есть такая штука - PositionSelectByTicket или класс Position.SelectByIndex(i) что вроде как нужная в коде штука в коде, но это не точно
 
Aleksey Semenov #:
есть такая штука - PositionSelectByTicket или класс Position.SelectByIndex(i) что вроде как нужная в коде штука в коде, но это не точно

Зачем еще раз выбирать позицию после PositionGetTicket()?

 
Ihor Herasko #:

Зачем еще раз выбирать позицию после PositionGetTicket()?

верно - но я тут противоречие в справке только что нашёл где указано что

PositionGetTicket

PositionGetTicket

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

а если перейти на описание этих самых PositionGetDouble, PositionGetInteger, PositionGetString. - то там в описании нет обратной ссылки указывающей на PositionGetTicket и заполнение от него

пример -

PositionGetDouble

PositionGetDouble

Функция возвращает запрошенное свойство открытой позиции, предварительно выбранной при помощи функции PositionGetSymbol или PositionSelect. - нету тут  PositionGetTicket, не указан

 
Aleksey Semenov #:
есть такая штука - PositionSelectByTicket или класс Position.SelectByIndex(i) что вроде как нужная в коде штука в коде, но это не точно

Помогло)) Благодарю!

Просто сколько я писал, как говорится -- всегда прокатывало. Интересно, почему тут "отвалилось"